summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2007-08-08 02:41:12 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 15:01:33 -0500
commitedca65915afbfde51ab75a27d5ebcb5ab0c85f20 (patch)
treef9023730f06815f61e7019926bc9c86e474f8bd2 /source4
parentc4e5fcc349ae8648e50c5fa893fd3fd47336fed2 (diff)
downloadsamba-edca65915afbfde51ab75a27d5ebcb5ab0c85f20.tar.gz
samba-edca65915afbfde51ab75a27d5ebcb5ab0c85f20.tar.bz2
samba-edca65915afbfde51ab75a27d5ebcb5ab0c85f20.zip
r24273: Fix bug #4817 by <mwallnoefer@yahoo.de>. (Unable to add a computer
from MMC Active Directory Users and Computers). Windows sets a 14 UCS2 char buffer as the password in this case. We need to allow random buffers to be accepted as complex passwords, even if they don't have ASCII upper or lower case characters. (If half the bytes are > 127, then it's likely a random buffer). Also make the test match the documented windows behaviour of '3 of the 4 classes: upper, lower, digit, special'. Andrew Bartlett (This used to be commit 5ef26a2ba3561580f0a73ee61eb707573cc98cd3)
Diffstat (limited to 'source4')
-rw-r--r--source4/lib/util/genrand.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/source4/lib/util/genrand.c b/source4/lib/util/genrand.c
index b1fde41ee3..2c3875750e 100644
--- a/source4/lib/util/genrand.c
+++ b/source4/lib/util/genrand.c
@@ -265,19 +265,24 @@ _PUBLIC_ uint32_t generate_random(void)
**/
_PUBLIC_ BOOL check_password_quality(const char *s)
{
- int has_digit=0, has_capital=0, has_lower=0;
+ int has_digit=0, has_capital=0, has_lower=0, has_special=0, has_high=0;
while (*s) {
if (isdigit((unsigned char)*s)) {
- has_digit++;
+ has_digit |= 1;
} else if (isupper((unsigned char)*s)) {
- has_capital++;
+ has_capital |= 1;
} else if (islower((unsigned char)*s)) {
- has_lower++;
+ has_lower |= 1;
+ } else if (isascii((unsigned char)*s)) {
+ has_special |= 1;
+ } else {
+ has_high++;
}
s++;
}
- return has_digit && has_lower && has_capital;
+ return ((has_digit + has_lower + has_capital + has_special) >= 3
+ || (has_high > strlen(s)/2));
}
/**