added gnutls backend and moved backend code into new files
[ircu2.10.12-pk.git] / ircd / m_user.c
index 4a1a9b9f4a80982d439268e3544af6ae1f8f903f..2ef132058735e44ffa1a1284f3cd829310c748f7 100644 (file)
  *            note:   it is guaranteed that parv[0]..parv[parc-1] are all
  *                    non-NULL pointers.
  */
+#include "config.h"
+
 #include "handlers.h"
 #include "client.h"
 #include "ircd.h"
 #include "ircd_chattr.h"
+#include "ircd_log.h"
 #include "ircd_reply.h"
 #include "ircd_string.h"
 #include "numeric.h"
 #include "numnicks.h"
+#include "s_auth.h"
 #include "s_debug.h"
 #include "s_misc.h"
 #include "s_user.h"
 #include "send.h"
 
-#include <assert.h>
+/* #include <assert.h> -- Now using assert in ircd_log.h */
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 int m_user(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
 {
   char*        username;
+  char*        term;
   const char*  info;
-  struct User* user;
+  unsigned int mode_request;
 
   assert(0 != cptr);
   assert(cptr == sptr);
@@ -134,23 +139,31 @@ int m_user(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
   else
     username = "NoUser";
 
-  info     = (EmptyString(parv[4])) ? "No Info" : parv[4];
-
-  user = make_user(cptr);
-
-  user->server = &me;
-  ircd_strncpy(cli_info(cptr), info, REALLEN);
-
-  if ((cli_name(cptr))[0] && cli_cookie(cptr) == COOKIE_VERIFIED) {
-    /*
-     * NICK and PONG already received, now we have USER...
+  if ((mode_request = strtoul(parv[2], &term, 10)) != 0
+      && term != NULL && *term == '\0')
+  {
+    char *invisible[4] = { NULL, NULL, "+i", NULL };
+    char *wallops[4] = { NULL, NULL, "+w" , NULL };
+    /* These bitmask values are codified in RFC 2812, showing
+     * ... well, something that is probably best not said.
      */
-    return register_user(cptr, sptr, cli_name(sptr), username, 0);
+    if (mode_request & 8)
+      set_user_mode(cptr, sptr, 3, invisible, ALLOWMODES_ANY);
+    if (mode_request & 4)
+      set_user_mode(cptr, sptr, 3, wallops, ALLOWMODES_ANY);
   }
-  else {
-    ircd_strncpy(user->username, username, USERLEN);
-    ircd_strncpy(user->host, cli_sockhost(cptr), HOSTLEN);
+  else if (parv[2][0] == '+')
+  {
+    char *user_modes[4];
+    user_modes[0] = NULL;
+    user_modes[1] = NULL;
+    user_modes[2] = parv[2];
+    user_modes[3] = NULL;
+    set_user_mode(cptr, sptr, 3, user_modes, ALLOWMODES_ANY);
   }
-  return 0;
+
+  info     = (EmptyString(parv[4])) ? "No Info" : parv[4];
+
+  return auth_set_user(cli_auth(cptr), username, parv[2], parv[3], info);
 }