Add alphanumeric char class
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 16 Sep 2012 08:49:33 +0000 (09:49 +0100)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 16 Sep 2012 08:49:33 +0000 (09:49 +0100)
src/modules/rlm_expr/rlm_expr.c

index 27ee046..f467a9c 100644 (file)
@@ -68,8 +68,8 @@ static expr_map_t map[] =
 /*
  *     Lookup tables for randstr char classes
  */
-static char randstr_punc[32] = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
-static char randstr_salt[] = ".0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz/";
+static char randstr_punc[] = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
+static char randstr_salt[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz/.";
 
 static int get_number(REQUEST *request, const char **string, int64_t *answer)
 {
@@ -305,7 +305,7 @@ static size_t randstr_xlat(void *instance, REQUEST *request, const char *fmt,
        rlm_expr_t      *inst = instance;
        char            buffer[256];
        unsigned int    result;
-       size_t          s = outlen;
+       size_t          free = outlen;
        size_t          len;
        char            *p;
        
@@ -321,34 +321,61 @@ static size_t randstr_xlat(void *instance, REQUEST *request, const char *fmt,
        }
        
        p = buffer;
-       while ((len-- > 0) && (--s > 0)) {
+       while ((len-- > 0) && (--free > 0)) {
                result = fr_rand();
                switch (*p) {
+                       /*
+                        *  Lowercase letters
+                        */
                        case 'c':
                                *out++ = 'a' + (result % 26);
                        break;
                        
+                       /*
+                        *  Uppercase letters
+                        */
                        case 'C':
                                *out++ = 'A' + (result % 26);
                        break;
                        
+                       /*
+                        *  Numbers
+                        */
                        case 'n':
                                *out++ = '0' + (result % 10);
                        break;
                        
+                       /*
+                        *  Alpha numeric
+                        */
+                       case 'a':
+                               *out++ = randstr_salt[result % (sizeof(randstr_salt) - 3)];
+                       break;
+                       
+                       /*
+                        *  Punctuation
+                        */
                        case '!':
                                *out++ = randstr_punc[result % (sizeof(randstr_punc) - 1)];
                        break;
                        
+                       /*
+                        *  Alpa numeric + punctuation
+                        */
                        case '.':
                                *out++ = '!' + (result % 95);
                        break;
                        
+                       /*
+                        *  Alpha numeric + salt chars './'
+                        */     
                        case 's':
                                *out++ = randstr_salt[result % (sizeof(randstr_salt) - 1)];
                        break;
                        
                        /*
+                        *  Any binary data.
+                        *
                         *  Don't output NULLs apparently some places in the 
                         *  code still use them instead of the length returned.
                         */
@@ -369,7 +396,7 @@ static size_t randstr_xlat(void *instance, REQUEST *request, const char *fmt,
        
        *out++ = '\0';
        
-       return outlen - s;
+       return outlen - free;
 }
 
 /*