X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fm_pass.c;h=e34e6819aba9b17c7a183417cf5ab76632b2ee44;hb=46f401ef80a4bede99ed5034d03836f6e7ca6936;hp=5848c0e7883a7ffb8f5282ea04a6d9494f9c88b2;hpb=56f512008e81aeae915b2b7f6bcdd54b549188d3;p=ircu2.10.12-pk.git diff --git a/ircd/m_pass.c b/ircd/m_pass.c index 5848c0e..e34e681 100644 --- a/ircd/m_pass.c +++ b/ircd/m_pass.c @@ -82,32 +82,43 @@ #include "config.h" #include "client.h" +#include "ircd_log.h" #include "ircd_reply.h" #include "ircd_string.h" +#include "s_auth.h" #include "send.h" -#include +/* #include -- Now using assert in ircd_log.h */ /* * mr_pass - registration message handler */ int mr_pass(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { - const char* password = parc > 1 ? parv[1] : 0; + char password[BUFSIZE]; + int arg, len; assert(0 != cptr); assert(cptr == sptr); assert(!IsRegistered(sptr)); - if (EmptyString(password)) + /* Some clients (brokenly) send "PASS x y" rather than "PASS :x y" + * when the user enters "x y" as the password. Unsplit arguments to + * work around this. + */ + for (arg = 1, len = 0; arg < parc; ++arg) + { + ircd_strncpy(password + len, parv[arg], sizeof(password) - len); + len += strlen(parv[arg]); + password[len++] = ' '; + } + if (len > 0) + --len; + password[len] = '\0'; + + if (password[0] == '\0') return need_more_params(cptr, "PASS"); - /* TODO: For protocol negotiation */ -#if 0 - if (ircd_strcmp(password,"PROT")==0) { - /* Do something here */ - } -#endif ircd_strncpy(cli_passwd(cptr), password, PASSWDLEN); - return 0; + return cli_auth(cptr) ? auth_set_password(cli_auth(cptr), password) : 0; }