Bryan Drewery 21 лет назад
Родитель
Сommit
40c4d0e8f6
3 измененных файлов с 29 добавлено и 2 удалено
  1. 24 1
      src/crypt.c
  2. 1 0
      src/crypt.h
  3. 4 1
      src/userrec.c

+ 24 - 1
src/crypt.c

@@ -127,6 +127,12 @@ void encrypt_cmd_pass(char *in, char *out)
   free(tmp);
 }
 
+static char *user_key(struct userrec *u)
+{
+  /* FIXME: fix after 1.2.3 */
+  return u->handle;
+}
+
 char *encrypt_pass(struct userrec *u, char *in)
 {
   char *tmp = NULL, buf[101] = "", *ret = NULL;
@@ -137,7 +143,7 @@ char *encrypt_pass(struct userrec *u, char *in)
 
   simple_snprintf(buf, sizeof(buf), "%s-%s", settings.salt2, in);
 
-  tmp = encrypt_string(u->handle, buf);
+  tmp = encrypt_string(user_key(u), buf);
   ret_size = strlen(tmp) + 1 + 1;
   ret = (char *) my_calloc(1, ret_size);
 
@@ -147,6 +153,23 @@ char *encrypt_pass(struct userrec *u, char *in)
   return ret;
 }
 
+char *decrypt_pass(struct userrec *u)
+{
+  char *tmp = NULL, *p = NULL, *ret = NULL, *pass = NULL;
+  
+  pass = (char *) get_user(&USERENTRY_PASS, u);
+  if (pass && pass[0] == '+') {
+    tmp = decrypt_string(user_key(u), &pass[1]);
+    if ((p = strchr(tmp, '-')))
+      ret = strdup(++p); 
+    free(tmp);
+  }
+  if (!ret)
+    ret = (char *) my_calloc(1, 1);
+
+  return ret;
+}
+
 /*
 static char *passkey()
 {

+ 1 - 0
src/crypt.h

@@ -22,6 +22,7 @@ char *encrypt_string(const char *, char *);
 char *decrypt_string(const char *, char *);
 void encrypt_cmd_pass(char *, char *);
 char *encrypt_pass(struct userrec *, char *);
+char *decrypt_pass(struct userrec *);
 char *cryptit (char *);
 char *decryptit (char *);
 int lfprintf (FILE *, const char *, ...) __attribute__((format(printf, 2, 3)));

+ 4 - 1
src/userrec.c

@@ -473,10 +473,13 @@ int change_handle(struct userrec *u, char *newh)
   if (!noshare)
     shareout("h %s %s\n", u->handle, newh);
 
-  char s[HANDLEN + 1] = "";
+  char s[HANDLEN + 1] = "", *pass = NULL;
 
+  pass = decrypt_pass(u);
   strlcpy(s, u->handle, sizeof s);
   strlcpy(u->handle, newh, sizeof u->handle);
+  set_user(&USERENTRY_PASS, u, pass);
+  free(pass);
   for (int i = 0; i < dcc_total; i++)
     if (dcc[i].type && dcc[i].type != &DCC_BOT && !egg_strcasecmp(dcc[i].nick, s)) {
       strlcpy(dcc[i].nick, newh, sizeof dcc[i].nick);