private void HandleUsrS(NotificationConnection c, Command cmd) { Md5AuthDetails auth = c.AuthDetails as Md5AuthDetails; String chResponse = cmd.Params[2]; if (auth == null) { // ordinarily that would be an Exception condition Command response = new Command(Error.AuthenticationFailed, cmd.TrId); Server.Send(c, response); } else { User user; if (AuthenticationService.AuthenticateMd5(auth.UserHandle, auth.Challenge, chResponse, out user) == AuthenticationResult.Success) { Command responseOk = new Command(Verb.Usr, cmd.TrId, "OK", user.UserHandle, user.FriendlyName); Server.Send(c, responseOk); /////////////////////////////////////// // The client will now send SYN // create a session, which is implicit; just bind the user to the connection user.Status = Status.Hdn; // no-longer NLN user.NotificationServer = Server; c.User = user; } else { Command responseFail = new Command(Error.AuthenticationFailed, cmd.TrId); Server.Send(c, responseFail); } } }
private void HandleUsrS(DispatchConnection c, Command cmd) { Md5AuthDetails auth = c.AuthDetails as Md5AuthDetails; String chResponse = cmd.Params[2]; if (auth == null) { // ordinarily that would be an Exception condition Command response = new Command(Error.AuthenticationFailed, cmd.TrId); Server.Send(c, response); } else { User user; if (AuthenticationService.AuthenticateMd5(auth.UserHandle, auth.Challenge, chResponse, out user) == AuthenticationResult.Success) { Command responseOk = new Command(Verb.Usr, cmd.TrId, "OK", user.UserHandle, user.FriendlyName); Server.Send(c, responseOk); ///////////////////////////// // Send XFR, otherwise client will use this Dispatch server as a notification server (it starts by sending SYN) // note that the official client deviates from the IETF draft by requiring an additional "0" parameter on the XFR command // curiously, it seems MSN Messenger 1.x caches the last Notification server and reconnects to it directly // in which case you don't send an XFR and instead begin the rest of an NS server's duties String sendTo = NotificationServer.Instance.GetEndPointForClient(c.Socket.LocalEndPoint).ToString(); Command responseXfr = new Command(Verb.Xfr, cmd.TrId, "NS", sendTo, "0"); Server.Send(c, responseXfr); } else { Command response = new Command(Error.AuthenticationFailed, cmd.TrId); Server.Send(c, response); } } }