Просмотр исходного кода

* Added cmds: encrypt, decrypt, md5, sha1.
* Added AUTH cmds: md5, sha1.
* Added SHA1()
* changed md5() to MD5()


svn: 791

Bryan Drewery 22 лет назад
Родитель
Сommit
8c834e18ed
14 измененных файлов с 165 добавлено и 48 удалено
  1. 1 1
      doc/CREDITS
  2. 2 0
      doc/UPDATES
  3. 23 0
      misc/help.txt
  4. 1 1
      pack/pack.cfg.sample
  5. 4 4
      scripts/mIRC/wraith.mrc
  6. 1 1
      src/auth.c
  7. 76 0
      src/cmds.c
  8. 16 1
      src/crypt.c
  9. 3 2
      src/crypt.h
  10. 0 13
      src/crypto/sha.c
  11. 0 1
      src/crypto/sha.h
  12. 3 8
      src/dcc.c
  13. 34 15
      src/mod/irc.mod/msgcmds.c
  14. 1 1
      src/modules.c

+ 1 - 1
doc/CREDITS

@@ -9,7 +9,7 @@ Wraith botpack by bryan, with credits and thanks to the following:
 * passwd for beta testing, and his dedication to finding bugs.
 * passwd for beta testing, and his dedication to finding bugs.
 * extort for finding misc bugs.
 * extort for finding misc bugs.
 * pgpkeys for finding bugs, and providing input.
 * pgpkeys for finding bugs, and providing input.
-* qFox for providing an mIRC $md5() alias, not requiring a dll or >6.03
+* qFox for providing an mIRC $MD5() alias, not requiring a dll or >6.03
 * Sith_Lord helping test ipv6 on the bot (admin@elitepackets.com)
 * Sith_Lord helping test ipv6 on the bot (admin@elitepackets.com)
 * Excelsior for finding a bug on BSD with the ipv6, and for celdrop which inspired many features.
 * Excelsior for finding a bug on BSD with the ipv6, and for celdrop which inspired many features.
 * syt for giving me inspiration to code a more secure bot.
 * syt for giving me inspiration to code a more secure bot.

+ 2 - 0
doc/UPDATES

@@ -5,6 +5,8 @@ This is a summary of ChangeLog basically.
 2.Auth system was broken similar to the channel ctcp bug.
 2.Auth system was broken similar to the channel ctcp bug.
 3.Added config option 'cmdprefix' back.
 3.Added config option 'cmdprefix' back.
 4.Fixed two bugs in the auto-email code for bad uname.
 4.Fixed two bugs in the auto-email code for bad uname.
+5.Added cmds: encrypt, decrypt, md5, sha1.
+6.Added AUTH cmds: md5, sha1.
 
 
 1.1.3
 1.1.3
 1.Fixed a very fatal bug with channel ctcps.
 1.Fixed a very fatal bug with channel ctcps.

+ 23 - 0
misc/help.txt

@@ -1,3 +1,4 @@
+
 ::+ban
 ::+ban
 ###  %b+ban%b <hostmask> [channel] [%%<XdXhXm>] [comment]
 ###  %b+ban%b <hostmask> [channel] [%%<XdXhXm>] [comment]
    Adds a ban to the list of bans stored on the bot, with optional comment and
    Adds a ban to the list of bans stored on the bot, with optional comment and
@@ -1108,6 +1109,26 @@ See also: unlink, newleaf%{+a}, -bot%{-}
      .match *.edu 16 25
      .match *.edu 16 25
    This would show results 16 through 25 matching any users with a hostmask
    This would show results 16 through 25 matching any users with a hostmask
    that ends with ".edu".
    that ends with ".edu".
+::encrypt
+###  %bencrypt%b <key> <string>
+   Encrypts the string using the specified key.
+
+See also: decrypt, randstring, md5, sha1
+::decrypt
+###  %decrypt%b <key> <string>
+   Decrypts the string using the specified key.
+
+See also: encrypt, randstring, md5, sha1
+::sha1
+###  %bsha1%b <string>
+   Returns the SHA1 hash of the specified string.
+
+See also: randstring, md5, encrypt, decrypt
+::md5
+###  %bmd5%b <string>
+   Returns the MD5 hash of the specified string.
+ 
+See also: randstring, sha1, encrypt, decrypt
 :leaf:mdop:
 :leaf:mdop:
 ###  %bmdop%b <#channel> [bots=n] [alines=n] [slines=n] [overlap=n] [bitch] [simul]
 ###  %bmdop%b <#channel> [bots=n] [alines=n] [slines=n] [overlap=n] [bitch] [simul]
    For those of us who do not wish to be rocket scientists in the mdop department, 
    For those of us who do not wish to be rocket scientists in the mdop department, 
@@ -1279,6 +1300,8 @@ See also: echo, color
 ::randstring
 ::randstring
 ###  %brandstring%b <len>
 ###  %brandstring%b <len>
    Displays a random string of length 'len' up to 300 chars.
    Displays a random string of length 'len' up to 300 chars.
+
+See also: md5, sha1, encrypt, decrypt
 ::relay
 ::relay
 ###  %brelay%b <bot>
 ###  %brelay%b <bot>
    Relays you via telnet to another bot, whether or not it is currently linked.
    Relays you via telnet to another bot, whether or not it is currently linked.

+ 1 - 1
pack/pack.cfg.sample

@@ -11,7 +11,7 @@ PACKNAME <name>
  */
  */
 
 
 /* SHELLHASH: 32 char md5 hash used for binary password 
 /* SHELLHASH: 32 char md5 hash used for binary password 
- * in mIRC: //echo -a $md5(SOMEWORD)
+ * in mIRC: //echo -a $MD5(SOMEWORD)
  * URL: http://edge.codebin.dk/md5.php
  * URL: http://edge.codebin.dk/md5.php
  */
  */
 SHELLHASH <md5hash>
 SHELLHASH <md5hash>

+ 4 - 4
scripts/mIRC/wraith.mrc

@@ -55,7 +55,7 @@ ALIAS -l psy {
 ON *:CHAT:*:{
 ON *:CHAT:*:{
   var %c = %auth. [ $+ [ $nick ] ]
   var %c = %auth. [ $+ [ $nick ] ]
   if (($1 === -Auth || $1 === ÿû-Auth) && $len($2) == 50) {
   if (($1 === -Auth || $1 === ÿû-Auth) && $len($2) == 50) {
-    msg =$nick +Auth $wmd5($2 $+ $wsecpass($3) $+ $wauthkey($3))
+    msg =$nick +Auth $wMD5($2 $+ $wsecpass($3) $+ $wauthkey($3))
   }
   }
 }
 }
 
 
@@ -79,7 +79,7 @@ ON *:TEXT:*:?:{
   var %c = %auth. [ $+ [ $nick ] ]
   var %c = %auth. [ $+ [ $nick ] ]
   if (!$psy($left($nick, 1)) && !%c) { return }
   if (!$psy($left($nick, 1)) && !%c) { return }
   if (($1 === -Auth || $1 === ÿû-Auth) && $len($2) == 50) {
   if (($1 === -Auth || $1 === ÿû-Auth) && $len($2) == 50) {
-    msg $nick +Auth $wmd5($2 $+ $wsecpass($3) $+ $wauthkey($3))
+    msg $nick +Auth $wMD5($2 $+ $wsecpass($3) $+ $wauthkey($3))
   }
   }
 }
 }
 
 
@@ -101,7 +101,7 @@ alias -l wmd5 {
     echo 8 -a This script will only work for mIRC 5.8 and up.
     echo 8 -a This script will only work for mIRC 5.8 and up.
   }
   }
   if ($version >= 6.03) {
   if ($version >= 6.03) {
-    return $md5($1)
+    return $MD5($1)
   } 
   } 
   else {
   else {
     if (!$exists($nofile($script) $+ /md5.dll)) { 
     if (!$exists($nofile($script) $+ /md5.dll)) { 
@@ -118,7 +118,7 @@ ALIAS auth {
     echo 8 -a botname is optional. 
     echo 8 -a botname is optional. 
   }
   }
   else {
   else {
-    echo +Auth $wmd5($2 $+ $wsecpass($3) $+ $wauthkey($3))
+    echo +Auth $wMD5($2 $+ $wsecpass($3) $+ $wauthkey($3))
   }
   }
 }
 }
 ALIAS msg { 
 ALIAS msg { 

+ 1 - 1
src/auth.c

@@ -89,7 +89,7 @@ char *makehash(struct userrec *u, char *randstring)
   if (secpass)
   if (secpass)
     free(secpass);
     free(secpass);
 
 
-  return md5(hash);
+  return MD5(hash);
 }
 }
 #endif /* S_AUTHHASH || S_DCCAUTH */
 #endif /* S_AUTHHASH || S_DCCAUTH */
 
 

+ 76 - 0
src/cmds.c

@@ -8,6 +8,7 @@
 #include "common.h"
 #include "common.h"
 #include "cmds.h"
 #include "cmds.h"
 #include "settings.h"
 #include "settings.h"
+#include "salt.h"
 #include "debug.h"
 #include "debug.h"
 #include "dcc.h"
 #include "dcc.h"
 #include "shell.h"
 #include "shell.h"
@@ -1282,6 +1283,7 @@ static void cmd_console(struct userrec *u, int idx, char *par)
   }
   }
   console_dostore(dest);
   console_dostore(dest);
 }
 }
+
 static void cmd_date(struct userrec *u, int idx, char *par)
 static void cmd_date(struct userrec *u, int idx, char *par)
 {
 {
   char date[50] = "", utctime[50] = "", ltime[50] = "";
   char date[50] = "", utctime[50] = "", ltime[50] = "";
@@ -1758,6 +1760,76 @@ static void cmd_randstring(struct userrec *u, int idx, char *par)
     dprintf(idx, "Too long, must be <= 300\n");
     dprintf(idx, "Too long, must be <= 300\n");
 }
 }
 
 
+static void cmd_md5(struct userrec *u, int idx, char *par)
+{
+  if (!par[0]) {
+    dprintf(idx, "Usage: md5 <string>\n");
+    return;
+  }
+
+  putlog(LOG_CMDS, "*", STR("#%s# md5 ..."), dcc[idx].nick);
+  dprintf(idx, "MD5(%s) = %s\n", par, MD5(par));
+}
+
+static void cmd_sha1(struct userrec *u, int idx, char *par)
+{
+  if (!par[0]) {
+    dprintf(idx, "Usage: sha1 <string>\n");
+    return;
+  }
+
+  putlog(LOG_CMDS, "*", STR("#%s# sha1 ..."), dcc[idx].nick);
+  dprintf(idx, "SHA1(%s) = %s\n", par, SHA1(par));
+}
+
+static void cmd_encrypt(struct userrec *u, int idx, char *par)
+{
+  char *key = NULL, *buf = NULL;
+
+  if (!par[0]) {
+    dprintf(idx, "Usage: encrypt <key> <string>\n");
+    return;
+  }
+
+  putlog(LOG_CMDS, "*", STR("#%s# encrypt ..."), dcc[idx].nick);
+  
+  key = newsplit(&par);
+  if (!par[0]) {
+    dprintf(idx, "Usage: encrypt <key> <string>\n");
+    return;
+
+  }
+
+  buf = encrypt_string(key ? key : SALT2, par);
+
+  dprintf(idx, "encrypt(%s) = %s\n", par, buf);
+  free(buf);
+}
+
+static void cmd_decrypt(struct userrec *u, int idx, char *par)
+{
+  char *key = NULL, *buf = NULL;
+
+  if (!par[0]) {
+    dprintf(idx, "Usage: decrypt <key> <string>\n");
+    return;
+  }
+
+  putlog(LOG_CMDS, "*", STR("#%s# decrypt ..."), dcc[idx].nick);
+  
+  key = newsplit(&par);
+  if (!par[0]) {
+    dprintf(idx, "Usage: decrypt <key> <string>\n");
+    return;
+
+  }
+
+  buf = decrypt_string(key ? key : SALT2, par);
+
+  dprintf(idx, "decrypt(%s) = %s\n", par, buf);
+  free(buf);
+}
+
 static void cmd_restart(struct userrec *u, int idx, char *par)
 static void cmd_restart(struct userrec *u, int idx, char *par)
 {
 {
   putlog(LOG_CMDS, "*", STR("#%s# restart"), dcc[idx].nick);
   putlog(LOG_CMDS, "*", STR("#%s# restart"), dcc[idx].nick);
@@ -4073,6 +4145,10 @@ cmd_t C_dcc[] =
   {"w", 		"n", 	(Function) cmd_w, 		NULL},
   {"w", 		"n", 	(Function) cmd_w, 		NULL},
   {"channels", 		"", 	(Function) cmd_channels, 	NULL},
   {"channels", 		"", 	(Function) cmd_channels, 	NULL},
   {"randstring", 	"", 	(Function) cmd_randstring, 	NULL},
   {"randstring", 	"", 	(Function) cmd_randstring, 	NULL},
+  {"md5",		"",	(Function) cmd_md5,		NULL},
+  {"sha1",		"",	(Function) cmd_sha1,		NULL},
+  {"encrypt",		"",	(Function) cmd_encrypt,		NULL},
+  {"decrypt",		"",	(Function) cmd_decrypt,		NULL},
 #ifdef HUB
 #ifdef HUB
   {"botcmd",		"i",	(Function) cmd_botcmd, 		NULL},
   {"botcmd",		"i",	(Function) cmd_botcmd, 		NULL},
   {"bc",		"i",	(Function) cmd_botcmd, 		NULL},
   {"bc",		"i",	(Function) cmd_botcmd, 		NULL},

+ 16 - 1
src/crypt.c

@@ -265,7 +265,7 @@ void DecryptFile(char *infile, char *outfile)
 }
 }
 
 
 
 
-char *md5(const char *string) 
+char *MD5(const char *string) 
 {
 {
   static char	  md5string[MD5_HASH_LENGTH + 1] = "";
   static char	  md5string[MD5_HASH_LENGTH + 1] = "";
   unsigned char   md5out[MD5_HASH_LENGTH + 1] = "";
   unsigned char   md5out[MD5_HASH_LENGTH + 1] = "";
@@ -275,5 +275,20 @@ char *md5(const char *string)
   MD5_Update(&ctx, string, strlen(string));
   MD5_Update(&ctx, string, strlen(string));
   MD5_Final(md5out, &ctx);
   MD5_Final(md5out, &ctx);
   strncpyz(md5string, btoh(md5out, MD5_DIGEST_LENGTH), sizeof(md5string));
   strncpyz(md5string, btoh(md5out, MD5_DIGEST_LENGTH), sizeof(md5string));
+  OPENSSL_cleanse(&ctx, sizeof(ctx));
   return md5string;
   return md5string;
 }
 }
+
+char *SHA1(const char *string)
+{
+  static char	  sha1string[SHA_HASH_LENGTH + 1] = "";
+  unsigned char   sha1out[SHA_HASH_LENGTH + 1] = "";
+  SHA_CTX ctx;
+
+  SHA1_Init(&ctx);
+  SHA1_Update(&ctx, string, strlen(string));
+  SHA1_Final(sha1out, &ctx);
+  strncpyz(sha1string, btoh(sha1out, SHA_DIGEST_LENGTH), sizeof(sha1string));
+  OPENSSL_cleanse(&ctx, sizeof(ctx));
+  return sha1string;
+}

+ 3 - 2
src/crypt.h

@@ -18,11 +18,12 @@
 
 
 #define SHA_HASH_LENGTH (SHA_DIGEST_LENGTH * 2)
 #define SHA_HASH_LENGTH (SHA_DIGEST_LENGTH * 2)
 #define MD5_HASH_LENGTH (MD5_DIGEST_LENGTH * 2)
 #define MD5_HASH_LENGTH (MD5_DIGEST_LENGTH * 2)
-#define md5cmp(hash, string)            strcmp(hash, md5(string))
+#define md5cmp(hash, string)            strcmp(hash, MD5(string))
 
 
 
 
 #ifndef MAKING_MODS
 #ifndef MAKING_MODS
-char *md5(const char *);
+char *MD5(const char *);
+char *SHA1(const char *);
 char *encrypt_string(const char *, char *);
 char *encrypt_string(const char *, char *);
 char *decrypt_string(const char *, char *);
 char *decrypt_string(const char *, char *);
 void encrypt_pass(char *, char *);
 void encrypt_pass(char *, char *);

+ 0 - 13
src/crypto/sha.c

@@ -485,16 +485,3 @@ void SHA1_Transform (SHA_CTX *c, const unsigned char *data)
         sha1_block_data_order (c,data,1);
         sha1_block_data_order (c,data,1);
         }
         }
 
 
-unsigned char *SHA(const unsigned char *d, unsigned long n, unsigned char *md)
-        {
-        SHA_CTX c;
-        static unsigned char m[SHA_DIGEST_LENGTH];
-
-        if (md == NULL) md=m;
-        SHA1_Init(&c);
-        SHA1_Update(&c,d,n);
-        SHA1_Final(md,&c);
-        OPENSSL_cleanse(&c, sizeof(c));
-        return(md);
-        }
-

+ 0 - 1
src/crypto/sha.h

@@ -66,7 +66,6 @@ typedef struct SHAstate_st
 int SHA1_Init(SHA_CTX *);
 int SHA1_Init(SHA_CTX *);
 int SHA1_Update(SHA_CTX *, const void *, unsigned long);
 int SHA1_Update(SHA_CTX *, const void *, unsigned long);
 int SHA1_Final(unsigned char *, SHA_CTX *);
 int SHA1_Final(unsigned char *, SHA_CTX *);
-unsigned char *SHA1(const unsigned char *, unsigned long, unsigned char *);
 void SHA1_Transform(SHA_CTX *, const unsigned char *);
 void SHA1_Transform(SHA_CTX *, const unsigned char *);
 
 
 #endif /* !_SHA_H */
 #endif /* !_SHA_H */

+ 3 - 8
src/dcc.c

@@ -329,10 +329,8 @@ static void cont_link(int idx, char *buf, int ii)
 {
 {
   /* Now set the initial link key (incoming only, we're not sending more until we get an OK)... */
   /* Now set the initial link key (incoming only, we're not sending more until we get an OK)... */
   struct sockaddr_in sa;
   struct sockaddr_in sa;
-  char tmp[256] = "", bufout[SHA_HASH_LENGTH + 1] = "";
-  SHA_CTX ctx;
-  int i;
-  int snum = -1;
+  char tmp[301] = "";
+  int i, snum = -1;
 
 
   for (i = 0; i < MAXSOCKS; i++) {
   for (i = 0; i < MAXSOCKS; i++) {
     if ((socklist[i].sock == dcc[idx].sock) && !(socklist[i].flags & SOCK_UNUSED)) {
     if ((socklist[i].sock == dcc[idx].sock) && !(socklist[i].flags & SOCK_UNUSED)) {
@@ -363,10 +361,7 @@ static void cont_link(int idx, char *buf, int ii)
     /* bdhash myport hubnick mynick */
     /* bdhash myport hubnick mynick */
     getsockname(socklist[snum].sock, (struct sockaddr *) &sa, &i);
     getsockname(socklist[snum].sock, (struct sockaddr *) &sa, &i);
     egg_snprintf(tmp, sizeof tmp, "%s@%4x@%s@%s", bdhash, sa.sin_port, dcc[idx].nick, conf.bot->nick);
     egg_snprintf(tmp, sizeof tmp, "%s@%4x@%s@%s", bdhash, sa.sin_port, dcc[idx].nick, conf.bot->nick);
-    SHA1_Init(&ctx);
-    SHA1_Update(&ctx, tmp, strlen(tmp));
-    SHA1_Final(bufout, &ctx);
-    strncpyz(socklist[snum].ikey, btoh(bufout, SHA_DIGEST_LENGTH), sizeof(socklist[snum].ikey));
+    strncpyz(socklist[snum].ikey, SHA1(tmp), sizeof(socklist[snum].ikey));
     putlog(LOG_DEBUG, "@", "Link hash for %s: %s", dcc[idx].nick, tmp);
     putlog(LOG_DEBUG, "@", "Link hash for %s: %s", dcc[idx].nick, tmp);
     putlog(LOG_DEBUG, "@", "initkey (%d): %s", strlen(socklist[snum].ikey), socklist[snum].ikey);
     putlog(LOG_DEBUG, "@", "initkey (%d): %s", strlen(socklist[snum].ikey), socklist[snum].ikey);
     /* We've send our conf.bot->nick and set the key for the link on the sock, wait for 'elink' back to verify key */
     /* We've send our conf.bot->nick and set the key for the link on the sock, wait for 'elink' back to verify key */

+ 34 - 15
src/mod/irc.mod/msgcmds.c

@@ -451,9 +451,6 @@ static int msgc_op(char *nick, char *host, struct userrec *u, char *par, char *c
   int force = 0;
   int force = 0;
   memberlist *m = NULL;
   memberlist *m = NULL;
 
 
-  if (match_my_nick(nick))
-    return BIND_RET_BREAK;
-
   if (chname && chname[0]) {
   if (chname && chname[0]) {
     chan = findchan_by_dname(chname);
     chan = findchan_by_dname(chname);
     if (chan) 
     if (chan) 
@@ -504,9 +501,6 @@ static int msgc_voice(char *nick, char *host, struct userrec *u, char *par, char
   int force = 0;
   int force = 0;
   memberlist *m = NULL;
   memberlist *m = NULL;
 
 
-  if (match_my_nick(nick))
-    return BIND_RET_BREAK;
-
   if (chname && chname[0]) {
   if (chname && chname[0]) {
     chan = findchan_by_dname(chname);
     chan = findchan_by_dname(chname);
     if (chan) 
     if (chan) 
@@ -554,9 +548,6 @@ static int msgc_channels(char *nick, char *host, struct userrec *u, char *par, c
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
   char list[1024] = "";
   char list[1024] = "";
 
 
-  if (match_my_nick(nick))
-    return BIND_RET_BREAK;
-
   putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %sCHANNELS %s", nick, host, u->handle, chname ? chname : "", cmdprefix, par ? par : "");
   putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %sCHANNELS %s", nick, host, u->handle, chname ? chname : "", cmdprefix, par ? par : "");
   for (chan = chanset; chan; chan = chan->next) {
   for (chan = chanset; chan; chan = chan->next) {
     get_user_flagrec(u, &fr, chan->dname);
     get_user_flagrec(u, &fr, chan->dname);
@@ -581,9 +572,6 @@ static int msgc_getkey(char *nick, char *host, struct userrec *u, char *par, cha
   struct chanset_t *chan = NULL;
   struct chanset_t *chan = NULL;
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
 
 
-  if (match_my_nick(nick))
-    return BIND_RET_BREAK;
-
   if (chname && chname[0]) 
   if (chname && chname[0]) 
     return 0;
     return 0;
 
 
@@ -613,15 +601,44 @@ static int msgc_help(char *nick, char *host, struct userrec *u, char *par, char
   return BIND_RET_BREAK;
   return BIND_RET_BREAK;
 }
 }
 
 
+static int msgc_md5(char *nick, char *host, struct userrec *u, char *par, char *chname)
+{
+  struct chanset_t *chan = NULL;
+
+  putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %sMD5 %s", nick, host, u->handle, chname ? chname : "", cmdprefix, par ? par : "");
+  
+  if (chname && chname[0])
+    chan = findchan_by_dname(chname);  
+
+  if (chan)
+    dprintf(DP_HELP, "PRIVMSG %s :MD5(%s) = %s\n", chan->dname, par, MD5(par));
+  else
+    dprintf(DP_HELP, "NOTICE %s :MD5(%s) = %s\n", nick, par, MD5(par));
+  return BIND_RET_BREAK;
+}
+
+static int msgc_sha1(char *nick, char *host, struct userrec *u, char *par, char *chname)
+{
+  struct chanset_t *chan = NULL;
+
+  putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %sSHA1 %s", nick, host, u->handle, chname ? chname : "", cmdprefix, par ? par : "");
+  
+  if (chname && chname[0])
+    chan = findchan_by_dname(chname);  
+
+  if (chan)
+    dprintf(DP_HELP, "PRIVMSG %s :SHA1(%s) = %s\n", chan->dname, par, SHA1(par));
+  else
+    dprintf(DP_HELP, "NOTICE %s :SHA1(%s) = %s\n", nick, par, SHA1(par));
+  return BIND_RET_BREAK;
+}
+
 static int msgc_invite(char *nick, char *host, struct userrec *u, char *par, char *chname)
 static int msgc_invite(char *nick, char *host, struct userrec *u, char *par, char *chname)
 {
 {
   struct chanset_t *chan = NULL;
   struct chanset_t *chan = NULL;
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
   int force = 0;
   int force = 0;
 
 
-  if (match_my_nick(nick))
-    return BIND_RET_BREAK;
-
   if (chname && chname[0])
   if (chname && chname[0])
     return 0;
     return 0;
  
  
@@ -675,6 +692,8 @@ static cmd_t C_msgc[] =
   {"getkey",		"",	(Function) msgc_getkey,		NULL},
   {"getkey",		"",	(Function) msgc_getkey,		NULL},
   {"invite",		"",	(Function) msgc_invite,		NULL},
   {"invite",		"",	(Function) msgc_invite,		NULL},
   {"help",		"",	(Function) msgc_help,		NULL},
   {"help",		"",	(Function) msgc_help,		NULL},
+  {"md5",		"",	(Function) msgc_md5,		NULL},
+  {"sha1",		"",	(Function) msgc_sha1,		NULL},
   {NULL,		NULL,	NULL,				NULL}
   {NULL,		NULL,	NULL,				NULL}
 };
 };
 #endif /* S_AUTHCMDS */
 #endif /* S_AUTHCMDS */

+ 1 - 1
src/modules.c

@@ -245,7 +245,7 @@ Function global_table[] =
   (Function) & global_bans,	 /* struct banrec *			*/
   (Function) & global_bans,	 /* struct banrec *			*/
   (Function) & global_ign,	 /* struct igrec *			*/
   (Function) & global_ign,	 /* struct igrec *			*/
   (Function) 0,
   (Function) 0,
-  (Function) md5,
+  (Function) MD5,
   /* 100 - 103 */
   /* 100 - 103 */
   (Function) & max_dcc,		 /* int					*/
   (Function) & max_dcc,		 /* int					*/
   (Function) shouldjoin, 
   (Function) shouldjoin,