]> jfr.im git - solanum.git/blobdiff - extensions/m_mkpasswd.c
m_shedding: user shedding module based on oftc-hybrid
[solanum.git] / extensions / m_mkpasswd.c
index b8fad447cb893369fc1b29ccc6908d14c641a6a6..66d7d6b080774f4996c538e909623e5aed476561 100644 (file)
 #include "numeric.h"
 #include "s_conf.h"
 #include "modules.h"
+#include "messages.h"
+#include "send.h"
 
 #include <string.h>
 
-static int m_mkpasswd(struct Client *client_p, struct Client *source_p,
+const char mkpasswd_desc[] = "Hash a password for use in ircd.conf";
+
+static void m_mkpasswd(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p,
                      int parc, const char *parv[]);
-static int mo_mkpasswd(struct Client *client_p, struct Client *source_p,
+static void mo_mkpasswd(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p,
                       int parc, const char *parv[]);
 
 static char *make_md5_salt(int);
@@ -28,31 +32,32 @@ static char saltChars[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmno
        /* 0 .. 63, ascii - 64 */
 
 struct Message mkpasswd_msgtab = {
-       "MKPASSWD", 0, 0, 0, MFLG_SLOW,
+       "MKPASSWD", 0, 0, 0, 0,
        {mg_unreg, {m_mkpasswd, 2}, mg_ignore, mg_ignore, mg_ignore, {mo_mkpasswd, 2}}
 };
 
 mapi_clist_av1 mkpasswd_clist[] = { &mkpasswd_msgtab, NULL };
 
-DECLARE_MODULE_AV1(mkpasswd, NULL, NULL, mkpasswd_clist, NULL, NULL, "$Revision$");
+DECLARE_MODULE_AV2(mkpasswd, NULL, NULL, mkpasswd_clist, NULL, NULL, NULL, NULL, mkpasswd_desc);
 
 
 /* m_mkpasswd - mkpasswd message handler
  *     parv[1] = password
  *     parv[2] = type
  */
-static int
-m_mkpasswd(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
+static void
+m_mkpasswd(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
        static time_t last_used = 0;
        char *salt;
+       const char *crypted;
        const char *hashtype;
        const char hashdefault[] = "SHA512";
 
        if(EmptyString(parv[1]))
        {
                sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS), me.name, source_p->name, "MKPASSWD");
-               return 0;
+               return;
        }
 
        if(parc < 3)
@@ -64,7 +69,7 @@ m_mkpasswd(struct Client *client_p, struct Client *source_p, int parc, const cha
        {
                /* safe enough to give this on a local connect only */
                sendto_one(source_p, form_str(RPL_LOAD2HI), me.name, source_p->name, "MKPASSWD");
-               return 0;
+               return;
        }
        else
                last_used = rb_current_time();
@@ -79,28 +84,29 @@ m_mkpasswd(struct Client *client_p, struct Client *source_p, int parc, const cha
        {
                sendto_one_notice(source_p,
                                  ":MKPASSWD syntax error:  MKPASSWD pass [SHA256|SHA512|MD5]");
-               return 0;
+               return;
        }
 
-       sendto_one_notice(source_p, ":Hash [%s] for %s: %s", hashtype, parv[1], rb_crypt(parv[1], salt));
-       return 0;
+       crypted = rb_crypt(parv[1], salt);
+       sendto_one_notice(source_p, ":Hash [%s] for %s: %s", hashtype, parv[1], crypted ? crypted : "???");
 }
 
 /* mo_mkpasswd - mkpasswd message handler
  *     parv[1] = password
  *     parv[2] = type
  */
-static int
-mo_mkpasswd(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
+static void
+mo_mkpasswd(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
        char *salt;
+       const char *crypted;
        const char *hashtype;
        const char hashdefault[] = "SHA512";
 
        if(EmptyString(parv[1]))
        {
                sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS), me.name, source_p->name, "MKPASSWD");
-               return 0;
+               return;
        }
 
        if(parc < 3)
@@ -118,11 +124,11 @@ mo_mkpasswd(struct Client *client_p, struct Client *source_p, int parc, const ch
        {
                sendto_one_notice(source_p,
                                  ":MKPASSWD syntax error:  MKPASSWD pass [SHA256|SHA512|MD5]");
-               return 0;
+               return;
        }
 
-       sendto_one_notice(source_p, ":Hash [%s] for %s: %s", hashtype, parv[1], rb_crypt(parv[1], salt));
-       return 0;
+       crypted = rb_crypt(parv[1], salt);
+       sendto_one_notice(source_p, ":Hash [%s] for %s: %s", hashtype, parv[1], crypted ? crypted : "???");
 }
 
 char *
@@ -183,34 +189,31 @@ char *
 generate_poor_salt(char *salt, int length)
 {
        int i;
+
        srand(time(NULL));
        for(i = 0; i < length; i++)
-       {
                salt[i] = saltChars[rand() % 64];
-       }
+
        return (salt);
 }
 
 char *
 generate_random_salt(char *salt, int length)
 {
-       char *buf;
        int fd, i;
-       if((fd = open("/dev/random", O_RDONLY)) < 0)
-       {
+
+       if((fd = open("/dev/urandom", O_RDONLY)) < 0)
                return (generate_poor_salt(salt, length));
-       }
-       buf = calloc(1, length);
-       if(read(fd, buf, length) != length)
+
+       if(read(fd, salt, (size_t)length) != length)
        {
-               free(buf);
+               close(fd);
                return (generate_poor_salt(salt, length));
        }
 
        for(i = 0; i < length; i++)
-       {
-               salt[i] = saltChars[abs(buf[i]) % 64];
-       }
-       free(buf);
+               salt[i] = saltChars[abs(salt[i]) % 64];
+
+       close(fd);
        return (salt);
 }