Parcourir la source

Continue work on protocol interface.

k4be il y a 5 ans
Parent
commit
960cab96bb
2 fichiers modifiés avec 135 ajouts et 17 suppressions
  1. 112 17
      protocol/unrealircd.js
  2. 23 0
      user.js

+ 112 - 17
protocol/unrealircd.js

@@ -22,7 +22,8 @@ var settings = {
 	name: null,
 	description: null,
 	version: null,
-	me: null
+	me: null,
+	maxUsers: null
 };
 
 var prefixes = {
@@ -58,16 +59,6 @@ function connected(){
 	ircSend(null, settings.ID, 'SERVER', [settings.name, '1', settings.description]);
 }
 
-/*
-		this.sender = {
-			'nick': '',
-			'ident': '',
-			'host': '',
-			'server': false,
-			'user': false
-		};
-*/
-
 function processSender(sender){
 	if(sender.nick){
 		if(server = handlers.findServer(sender.nick)){
@@ -110,6 +101,7 @@ function ircSend(tags, from, cmd, args){
 
 var cmdBinds = {
 	'PROTOCTL': function(msg){
+		//TODO parse
 		console.log(msg);
 	},
 	
@@ -124,12 +116,27 @@ var cmdBinds = {
 	},
 	
 	'MD': function(msg){
+		switch(msg.args[0]){
+			case 'client':
+				var user = handlers.findUser(msg.args[1]);
+				if(!user) return;
+				switch(msg.args[2]){
+					case 'certfp':
+						if(!msg.args[3] || msg.args[3].length == 0) break;
+						user.setSecure(true);
+						user.setFingerprint(msg.args[3]);
+						break;
+					default: break;
+				}
+				break;
+			default: break;
+		}
 	},
 	
-	'SMOD': function(msg){
+	'SMOD': function(msg){ // ignore
 	},
 	
-	'EOS': function(msg){
+	'EOS': function(msg){ // ?
 	},
 	
 	'SINFO': function(msg){
@@ -140,8 +147,46 @@ var cmdBinds = {
 		handlers.newServer(msg.args[0], msg.args[2], msg.args[3], msg.args[1], msg.sender);
 	},
 	
-	'UID': function(msg){ // nick, distance, TS, ident, host, uid, account, umodes, vhost, cloakedHost, ip, realname, uplink
-		handlers.newUser(msg.args[0], msg.args[1], msg.args[2], msg.args[3], msg.args[4], msg.args[5], msg.args[6], handlers.parseUmodes(msg.args[7]), msg.args[8], msg.args[9], msg.args[10], msg.args[11], msg.sender.server);
+	'UID': function(msg){
+		var nick = msg.args[0];
+		var distance = msg.args[1];
+		var TS = msg.args[2];
+		var ident = msg.args[3];
+		var host = msg.args[4];
+		var uid = msg.args[5];
+		var account = msg.args[6];
+		var umodes = msg.args[7];
+		var vhost = msg.args[8];
+		var cloakedHost = msg.args[9];
+		var ip = msg.args[10];
+		var realname = msg.args[11];
+		if(ip != '*'){
+			var ipBinary = Buffer.from(ip, 'base64');
+			console.log(ipBinary);
+			if(ipBinary.byteLength == 4){ // IPv4
+				ip = ipBinary[0].toString(10) + '.' + ipBinary[1].toString(10) + '.' + ipBinary[2].toString(10) + '.' + ipBinary[3].toString(10);
+			} else if(ipBinary.byteLength == 16){ // IPv6
+				ip = '';
+				for(var i=0; i<8; i++){
+					if(i > 0) ip += ':';
+					ip += ipBinary[i*2].toString(16).padStart(2, '0') + ipBinary[i*2+1].toString(16).padStart(2, '0');
+				}
+			} else {
+				throw 'unknown IP format';
+			}
+		} else {
+			ip = null;
+		}
+		if(vhost == '*'){
+			vhost = null;
+		}
+		if(cloakedHost == '*'){
+			cloakedHost = null;
+		}
+		if(account == '0'){
+			account = null;
+		}
+		handlers.newUser(nick, distance, TS, ident, host, uid, account, handlers.parseUmodes(umodes), vhost, cloakedHost, ip, realname, msg.sender.server);
 	},
 
 	'SJOIN': function(msg){
@@ -174,19 +219,27 @@ var cmdBinds = {
 	},
 	
 	'SWHOIS': function(msg){
+		//TODO
+	},
+	
+	'MODE': function(msg){
+		//TODO
 	},
 	
 	'TKL': function(msg){
+		//TODO
 	},
 	
 	'METADATA': function(msg){
+		//TODO
 	},
 	
 	'NETINFO': function(msg){
-		console.log(msg);
+		ircSend(null, null, [settings.maxUsers, Math.floor(new Date() / 1000), msg.args[2], msg.args[3], "0", "0", "0", msg.args[7]]);
 	},
 	
 	'SASL': function(msg){
+		//TODO
 	},
 	
 	'PING': function(msg){
@@ -200,6 +253,48 @@ var cmdBinds = {
 	'PART': function(msg){
 		var channel = handlers.getChannel(msg.args[0]);
 		channel.removeUser(msg.sender.user);
-	}
+	},
+	
+	'CHGHOST': function(msg){
+		var user = handlers.findUser(msg.args[0]);
+		if(!user) return;
+		user.changeVHost(msg.args[1]);
+	},
+	
+	'CHGIDENT': function(msg){
+		var user = handlers.findUser(msg.args[0]);
+		if(!user) return;
+		user.changeVIdent(msg.args[1]);
+	},
+	
+	'CHGNAME': function(msg){
+		var user = handlers.findUser(msg.args[0]);
+		if(!user) return;
+		user.setRealname(msg.args[1]);
+	},
+	
+	'SETNAME': function(msg){
+		msg.sender.user.setRealname(msg.args[0]);
+	},
+	
+	'SETHOST': function(msg){
+		//TODO
+	},
+	
+	'SETIDENT': function(msg){
+		//TODO
+	},
+	
+	'NICK': function(msg){
+		//TODO
+	},
+	
+	'SDESC': function(msg){
+		//TODO
+	},
+	
+	'TOPIC': function(msg){
+		//TODO
+	},
 };
 

+ 23 - 0
user.js

@@ -12,6 +12,9 @@ var user = function(){
 	this.uid = null;
 	this.distance = null;
 	this.uplink = null;
+	this.secure = false;
+	this.certfp = null;
+	this.vident = null;
 
 	this.introduce = function(nick, distance, TS, ident, host, uid, account, umodes, vhost, cloakedHost, ip, realname, uplink){ // nick, distance, TS, ident, host, uid, account, umodes, vhost, cloakedHost, ip, realname, uplink
 		this.name = nick;
@@ -28,6 +31,26 @@ var user = function(){
 		this.realname = realname;
 		this.uplink = uplink;
 	}
+	
+	this.setSecure = function(secure){
+		this.secure = secure;
+	}
+	
+	this.setFingerprint = function(certfp){
+		this.certfp = certfp;
+	}
+	
+	this.changeVHost = function(host){
+		this.vhost = host;
+	}
+	
+	this.changeVIdent = function(ident){
+		this.vident = ident;
+	}
+	
+	this.setRealname = function(realname){
+		this.realname = realname;
+	}
 }
 
 module.exports = user;