--- parser3/src/classes/math.C 2002/08/01 11:41:12 1.23 +++ parser3/src/classes/math.C 2003/04/15 07:17:42 1.27 @@ -1,11 +1,11 @@ /** @file Parser: @b math parser class. - Copyright(c) 2001, 2002 ArtLebedev Group(http://www.artlebedev.com) + Copyright(c) 2001, 2003 ArtLebedev Group(http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_MATH_C="$Date: 2002/08/01 11:41:12 $"; +static const char* IDENT_MATH_C="$Date: 2003/04/15 07:17:42 $"; #include "pa_common.h" #include "pa_vint.h" @@ -47,11 +47,11 @@ static void _random(Request& r, const St Pool& pool=r.pool(); Value& range=params->as_junction(0, "range must be expression"); - double top=r.process_to_value(range).as_double(); - if(top<=1) + double top=r.process_to_value(range).as_double(); + if(top<=0) throw Exception("parser.runtime", &method_name, - "top must be above 1(%g)", top); + "top must be above 0(%g)", top); r.write_no_lang(*new(pool) VInt(pool, _random(uint(top)))); } @@ -152,8 +152,9 @@ static void _crypt(Request& r, const Str if(strncmp(normal_salt, PA_MD5PW_ID, PA_MD5PW_IDLEN) == 0) { const size_t sample_size=120; char *sample_buf=(char *)pool.malloc(sample_size); - pa_MD5Encode((const unsigned char *)password, - (const unsigned char *)normal_salt, sample_buf, sample_size); + PA_MD5Encode((const unsigned char *)password, + (const unsigned char *)normal_salt, 1/*TRUE: mix in magic string*/, + sample_buf, sample_size); r.write_pass_lang(*new(pool) String(pool, sample_buf)); } else { #ifdef HAVE_CRYPT @@ -174,6 +175,27 @@ static void _crypt(Request& r, const Str } } +static void _md5(Request& r, const String& method_name, MethodParams *params) { + Pool& pool=r.pool(); + const char *string=params->as_string(0, "parameter must be string").cstr(); + + + PA_MD5_CTX context; + unsigned char digest[16]; + PA_MD5Init(&context); + PA_MD5Update(&context, (const unsigned char*)string, strlen(string)); + PA_MD5Final(digest, &context); + + char *digest_bytes_hex=(char *)pool.malloc(sizeof(digest)*2/*byte->hh*/+1/*for zero-teminator*/); + unsigned char *src=digest; + unsigned char *end=digest+sizeof(digest); + char *dest=digest_bytes_hex; + while(src