lib/util: add generate_random_password()
authorStefan Metzmacher <metze@samba.org>
Thu, 25 Feb 2010 14:58:38 +0000 (15:58 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 26 Feb 2010 07:57:28 +0000 (08:57 +0100)
metze

lib/util/genrand.c
lib/util/util.h

index f0544023f14d29c7c8104d825a246e2cd9a9d48b..02b8d8b478dda200a89b1bb9457d57d008e1d0fa 100644 (file)
@@ -361,6 +361,48 @@ again:
        return retstr;
 }
 
+/**
+ * Generate a random text password.
+ */
+
+_PUBLIC_ char *generate_random_password(TALLOC_CTX *mem_ctx, size_t min, size_t max)
+{
+       char *retstr;
+       const char *c_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_-#.,@$%&!?:;<=>(){}[]~";
+       size_t len = max;
+       size_t diff;
+
+       if (min > max) {
+               errno = EINVAL;
+               return NULL;
+       }
+
+       diff = max - min;
+
+       if (diff > 0 ) {
+               size_t tmp;
+
+               generate_random_buffer((uint8_t *)&tmp, sizeof(tmp));
+
+               tmp %= diff;
+
+               len = min + tmp;
+       }
+
+again:
+       retstr = generate_random_str_list(mem_ctx, len, c_list);
+       if (!retstr) return NULL;
+
+       /* we need to make sure the random string passes basic quality tests
+          or it might be rejected by windows as a password */
+       if (len >= 7 && !check_password_quality(retstr)) {
+               talloc_free(retstr);
+               goto again;
+       }
+
+       return retstr;
+}
+
 /**
  * Generate an array of unique text strings all of the same length.
  * The returned string will be allocated.
index e1608a8ac4baeed75b77ecbf213b290973232817..264396efe611924be88a3c2e758a3d3d1a2a4c77 100644 (file)
@@ -177,6 +177,11 @@ _PUBLIC_ uint32_t generate_random(void);
 **/
 _PUBLIC_ bool check_password_quality(const char *s);
 
+/**
+ * Generate a random text password.
+ */
+_PUBLIC_ char *generate_random_password(TALLOC_CTX *mem_ctx, size_t min, size_t max);
+
 /**
  Use the random number generator to generate a random string.
 **/