/*/
/ ChatZilla - IdentD
/ http://rdmsoft.com/
/*/

plugin.id = "ridentd";

plugin.init =
function init(glob)
{
    plugin.major = 0;
    plugin.minor = 2;
    plugin.version = plugin.major + "." + plugin.minor;
    plugin.description = "IdentD for ChatZilla."
}

plugin.disable =
function disable()
{
    plugin.stopIdentD();

    display(plugin.id+' - plugin disabled');

    return true;
}

plugin.enable =
function enable()
{
    plugin.startIdentD();

    display(plugin.id+' - plugin enabled');

    return true;
}

plugin.stopIdentD =
function stopIdentD()
{
plugin.serverSocket.close();
}

plugin.startIdentD =
function startIdentD()
{
var socketListener =
{
  onSocketAccepted : function(serverSocket, transport)
  {
    var iStreamNoScript = transport.openInputStream(0,0,0);
    var iStream = Components.classes["@mozilla.org/scriptableinputstream;1"]
      .createInstance(Components.interfaces.nsIScriptableInputStream);
    iStream.init(iStreamNoScript);

    var oStream = transport.openOutputStream(0,0,0);

    var dataListener =
    {
      onStartRequest: function(request, context)
      {
        this.b = "";
      },
      onStopRequest: function(request, context, status)
      {
        iStream.close();
        oStream.close();
      },
      onDataAvailable: function(request, context, inputStream, offset, count)
      {
        this.b = this.b + iStream.read(count);
        var indexOfEOL = this.b.indexOf("\r\n");
        if(indexOfEOL != -1)
        {
          var requestString = this.b.substr(0, indexOfEOL);
          this.b = this.b.substr(indexOfEOL + 2);
          var host = transport.host;

          var responseString = getIdentResponse(requestString, host) + "\r\n";
          oStream.write(responseString,responseString.length);
        }
      }
    }

    var iPump = Components.classes["@mozilla.org/network/input-stream-pump;1"].
               createInstance(Components.interfaces.nsIInputStreamPump);
    iPump.init(iStreamNoScript, -1, -1, 0, 0, false);
    iPump.asyncRead(dataListener,null);

  },

  onStopListening : function(serverSocket, status){}

};

var serverSocket = Components.classes["@mozilla.org/network/server-socket;1"]
                     .createInstance(Components.interfaces.nsIServerSocket);
serverSocket.init(113,false,-1);
serverSocket.asyncListen(socketListener);
plugin.serverSocket = serverSocket;
}

function getIdentResponse(rString, source)
{
  var ports = String(rString).split(",");

  if(ports.length != 2)
    return rString + " : ERROR : UNKNOWN-ERROR";

  if(isNaN(ports[0]) || ports[0] != Math.floor(ports[0])
  || isNaN(ports[1]) || ports[1] != Math.floor(ports[1])
  || ports[0] < 1 || ports[0] > 65535
  || ports[1] < 1 || ports[1] > 65535)
    return rString + " : ERROR : INVALID-PORT";

  for(i in client.networks)
  {
    if(!("primServ" in client.networks[i]))
      continue;

    if(client.networks[i].primServ.port != ports[1])
      continue;

    if(!("ip" in client.networks[i].primServ))
    {
      try
      {
        var dns = getService("@mozilla.org/network/dns-service;1",
                             "nsIDNSService");
        var entry = dns.resolve(client.networks[i].primServ.hostname, false);

        if(entry.hasMore())
          client.networks[i].primServ.ip = entry.getNextAddrAsString();
      }
      catch(e)
      {
      }
    }

    if(client.networks[i].primServ.ip == source)
    {
      var user = client.networks[i].prefs["username"];
      return rString + " : USERID : OTHER : " + user;
    }
  }

  return rString + " : ERROR : NO-USER";
}
