#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);
/* 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;
if(EmptyString(parv[1]))
{
sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS), me.name, source_p->name, "MKPASSWD");
- return 0;
+ return;
}
if(parc < 3)
{
/* 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();
{
sendto_one_notice(source_p,
":MKPASSWD syntax error: MKPASSWD pass [SHA256|SHA512|MD5]");
- return 0;
+ return;
}
crypted = rb_crypt(parv[1], salt);
sendto_one_notice(source_p, ":Hash [%s] for %s: %s", hashtype, parv[1], crypted ? crypted : "???");
- return 0;
}
/* 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;
if(EmptyString(parv[1]))
{
sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS), me.name, source_p->name, "MKPASSWD");
- return 0;
+ return;
}
if(parc < 3)
{
sendto_one_notice(source_p,
":MKPASSWD syntax error: MKPASSWD pass [SHA256|SHA512|MD5]");
- return 0;
+ return;
}
crypted = rb_crypt(parv[1], salt);
sendto_one_notice(source_p, ":Hash [%s] for %s: %s", hashtype, parv[1], crypted ? crypted : "???");
- return 0;
}
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);
}