/** * Magic method to get or set services using setters/getters * * @param string $method * @param array $arguments * @return mixed */ PHP_METHOD(Phalcon_DI, __call){ zval *method, *arguments = NULL, possible_service = {}, name = {}, definition = {}; phalcon_fetch_params(0, 1, 1, &method, &arguments); PHALCON_ENSURE_IS_STRING(method); if (!arguments) { arguments = &PHALCON_GLOBAL(z_null); } phalcon_substr(&possible_service, method, 3, 0); phalcon_lcfirst(&name, &possible_service); /** * If the magic method starts with "get" we try to get a service with that name */ if (phalcon_start_with_str(method, SL("get"))) { if (phalcon_isset_property_array(getThis(), SL("_services"), &name)) { PHALCON_RETURN_CALL_SELFW("get", &name, arguments); return; } } /** * If the magic method starts with "set" we try to set a service using that name */ if (phalcon_start_with_str(method, SL("set"))) { if (phalcon_array_isset_fetch_long(&definition, arguments, 0)) { PHALCON_CALL_SELFW(NULL, "set", &name, &definition); return; } } /** * The method doesn't start with set/get throw an exception */ zend_throw_exception_ex(phalcon_di_exception_ce, 0, "Call to undefined method or service '%s'", Z_STRVAL_P(method)); }
/** * Magic method to get or set services using setters/getters * * @param string $method * @param array $arguments * @return mixed */ PHP_METHOD(Phalcon_DI, __call){ zval *method, *arguments = NULL, *services, *service_name = NULL; zval *possible_service = NULL, *handler, *exception_message; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 1, &method, &arguments); if (!arguments) { PHALCON_INIT_VAR(arguments); } /** * If the magic method starts with 'get' we try to get a service with that name */ if (phalcon_start_with_str(method, SL("get"))) { PHALCON_OBS_VAR(services); phalcon_read_property_this(&services, this_ptr, SL("_services"), PH_NOISY_CC); PHALCON_INIT_VAR(service_name); phalcon_substr(service_name, method, 3, 0); PHALCON_INIT_VAR(possible_service); phalcon_lcfirst(possible_service, service_name); if (phalcon_array_isset(services, possible_service)) { if (phalcon_fast_count_ev(arguments TSRMLS_CC)) { phalcon_call_method_p2(return_value, this_ptr, "get", possible_service, arguments); RETURN_MM(); } phalcon_call_method_p1(return_value, this_ptr, "get", possible_service); RETURN_MM(); } } /** * If the magic method starts with 'set' we try to set a service using that name */ if (phalcon_start_with_str(method, SL("set"))) { if (phalcon_array_isset_long(arguments, 0)) { PHALCON_INIT_NVAR(service_name); phalcon_substr(service_name, method, 3, 0); PHALCON_INIT_NVAR(possible_service); phalcon_lcfirst(possible_service, service_name); PHALCON_OBS_VAR(handler); phalcon_array_fetch_long(&handler, arguments, 0, PH_NOISY); phalcon_call_method_p2_noret(this_ptr, "set", possible_service, handler); RETURN_MM_NULL(); } } /** * The method doesn't start with set/get throw an exception */ PHALCON_INIT_VAR(exception_message); PHALCON_CONCAT_SVS(exception_message, "Call to undefined method or service '", method, "'"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_di_exception_ce, exception_message); return; }
/** * Set the background color of an image. This is only useful for images * with alpha transparency. * * @param string $color hexadecimal color value * @param int $opacity background opacity: 0-100 * @return Phalcon\Image\Adapter */ PHP_METHOD(Phalcon_Image_Adapter, background) { zval *color, *opacity = NULL; zval *tmp_color = NULL, *r = NULL, *g = NULL, *b = NULL; long i; char *c; zval tmp; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 1, &color, &opacity); if (Z_TYPE_P(color) != IS_STRING) { PHALCON_SEPARATE_PARAM(color); convert_to_string(color); } c = Z_STRVAL_P(color); if (Z_STRLEN_P(color) > 0 && c[0] == '#') { PHALCON_INIT_NVAR(tmp_color); phalcon_substr(tmp_color, color, 1, 0); } else { PHALCON_CPY_WRT_CTOR(tmp_color, color); } if (Z_STRLEN_P(tmp_color) == 3) { /* Convert RGB to RRGGBB */ c = Z_STRVAL_P(tmp_color); if (!IS_INTERNED(c)) { STR_REALLOC(c, 7); } else { char* tmp = ecalloc(7, 1); memcpy(tmp, c, Z_STRLEN_P(tmp_color)); c = tmp; } c[6] = '\0'; c[5] = c[2]; c[4] = c[2]; c[3] = c[1]; c[2] = c[1]; c[1] = c[0]; ZVAL_STRING(tmp_color, c, 0); } if (Z_STRLEN_P(tmp_color) < 6) { PHALCON_THROW_EXCEPTION_STR(phalcon_image_exception_ce, "Color is not valid"); return; } INIT_ZVAL(tmp); Z_TYPE(tmp) = IS_STRING; ZVAL_STRINGL(&tmp, Z_STRVAL_P(tmp_color), 2, 0); PHALCON_INIT_NVAR(r); _php_math_basetozval(&tmp, 16, r); Z_STRVAL(tmp) += 2; PHALCON_INIT_NVAR(g); _php_math_basetozval(&tmp, 16, g); Z_STRVAL(tmp) += 2; PHALCON_INIT_NVAR(b); _php_math_basetozval(&tmp, 16, b); if (!opacity) { PHALCON_INIT_NVAR(opacity); ZVAL_LONG(opacity, 100); } else { PHALCON_SEPARATE_PARAM(opacity); i = phalcon_get_intval(opacity); if (i < 1) { PHALCON_INIT_NVAR(opacity); ZVAL_LONG(opacity, 1); } else if (i > 100) { PHALCON_INIT_NVAR(opacity); ZVAL_LONG(opacity, 100); } } PHALCON_CALL_METHOD(NULL, this_ptr, "_background", r, g, b, opacity); RETURN_THIS(); }
/** * Add a text to an image with a specified opacity. * * @param string text * @param int $offset_x offset from the left, If less than 0 offset from the right, If true right the x offset * @param int $offset_y offset from the top, If less than 0 offset from the bottom, If true bottom the Y offset * @param int $opacity opacity of text: 1-100 * @param string $color hexadecimal color value * @param int $size font pointsize * @param string $fontfile font path * @return Phalcon\Image\Adapter */ PHP_METHOD(Phalcon_Image_Adapter, text) { zval **text, **ofs_x = NULL, **ofs_y = NULL, **op = NULL, **fontcolor = NULL, **fontsize = NULL, **fontfile = NULL; zval *offset_x = NULL, *offset_y = NULL, *opacity, *color, *size; zval *r, *g, *b; char *c; zval tmp; phalcon_fetch_params_ex(1, 6, &text, &ofs_x, &ofs_y, &op, &fontcolor, &fontsize, &fontfile); PHALCON_MM_GROW(); if (!ofs_x || Z_TYPE_PP(ofs_x) == IS_NULL) { PHALCON_INIT_VAR(offset_x); ZVAL_FALSE(offset_x); } else { PHALCON_CPY_WRT_CTOR(offset_x, *ofs_x); } if (!ofs_y || Z_TYPE_PP(ofs_y) == IS_NULL) { PHALCON_INIT_VAR(offset_y); ZVAL_FALSE(offset_y); } else { PHALCON_CPY_WRT_CTOR(offset_y, *ofs_y); } PHALCON_INIT_VAR(opacity); if (!op || Z_TYPE_PP(op) == IS_NULL) { ZVAL_LONG(opacity, 100); } else { PHALCON_ENSURE_IS_LONG(op); if (Z_LVAL_PP(op) < 1) { ZVAL_LONG(opacity, 1); } else if (Z_LVAL_PP(op) > 100) { ZVAL_LONG(opacity, 100); } else { ZVAL_LONG(opacity, Z_LVAL_PP(op)); } } PHALCON_INIT_VAR(color); if (!fontcolor || Z_TYPE_PP(fontcolor) == IS_NULL) { ZVAL_STRING(color, "000000", 1); } else { PHALCON_ENSURE_IS_STRING(fontcolor); if (Z_STRLEN_PP(fontcolor) > 1 && Z_STRVAL_PP(fontcolor)[0] == '#') { phalcon_substr(color, *fontcolor, 1, 0); } else { ZVAL_STRINGL(color, Z_STRVAL_PP(fontcolor), Z_STRLEN_PP(fontcolor), 1); } } PHALCON_INIT_VAR(size); if (!fontsize || Z_TYPE_PP(fontsize) == IS_NULL) { ZVAL_LONG(size, 12); } else { PHALCON_ENSURE_IS_LONG(fontsize); ZVAL_LONG(size, Z_LVAL_PP(fontsize)); } if (!fontfile) { fontfile = &PHALCON_GLOBAL(z_null); } if (Z_STRLEN_P(color) == 3) { /* Convert RGB to RRGGBB */ c = Z_STRVAL_P(color); assert(!IS_INTERNED(c)); STR_REALLOC(c, 7); c[6] = '\0'; c[5] = c[2]; c[4] = c[2]; c[3] = c[1]; c[2] = c[1]; c[1] = c[0]; ZVAL_STRING(color, c, 0); } if (Z_STRLEN_P(color) < 6) { PHALCON_THROW_EXCEPTION_STR(phalcon_image_exception_ce, "color is not valid"); return; } INIT_ZVAL(tmp); Z_TYPE(tmp) = IS_STRING; ZVAL_STRINGL(&tmp, Z_STRVAL_P(color), 2, 0); PHALCON_INIT_VAR(r); _php_math_basetozval(&tmp, 16, r); Z_STRVAL(tmp) += 2; PHALCON_INIT_VAR(g); _php_math_basetozval(&tmp, 16, g); Z_STRVAL(tmp) += 2; PHALCON_INIT_VAR(b); _php_math_basetozval(&tmp, 16, b); PHALCON_CALL_METHOD(NULL, this_ptr, "_text", *text, offset_x, offset_y, opacity, r, g, b, size, *fontfile); RETURN_THIS(); }
PHP_METHOD(Phalcon_Http_Client_Adapter_Curl, sendInternal){ zval *uri = NULL, *url = NULL, *method, *useragent, *data, *type, *files, *timeout, *curl, *username, *password, *authtype; zval *file = NULL, *body, *uniqid = NULL, *boundary, *key = NULL, *value = NULL; zval *path_parts = NULL, *filename, *basename, *filedata = NULL; zval *constant, *header, *headers = NULL; zval *content = NULL, *errorno = NULL, *error = NULL, *headersize = NULL, *httpcode = NULL, *headerstr, *bodystr, *response, *tmp = NULL; zend_class_entry *curlfile_ce; HashTable *ah0, *ah1; HashPosition hp0, hp1; zval **hd; PHALCON_MM_GROW(); PHALCON_CALL_SELF(&uri, "geturi"); PHALCON_CALL_METHOD(&url, uri, "build"); method = phalcon_fetch_nproperty_this(this_ptr, SL("_method"), PH_NOISY TSRMLS_CC); useragent = phalcon_fetch_nproperty_this(this_ptr, SL("_useragent"), PH_NOISY TSRMLS_CC); data = phalcon_fetch_nproperty_this(this_ptr, SL("_data"), PH_NOISY TSRMLS_CC); type = phalcon_fetch_nproperty_this(this_ptr, SL("_type"), PH_NOISY TSRMLS_CC); files = phalcon_fetch_nproperty_this(this_ptr, SL("_files"), PH_NOISY TSRMLS_CC); timeout = phalcon_fetch_nproperty_this(this_ptr, SL("_timeout"), PH_NOISY TSRMLS_CC); curl = phalcon_fetch_nproperty_this(this_ptr, SL("_curl"), PH_NOISY TSRMLS_CC); username = phalcon_fetch_nproperty_this(this_ptr, SL("_username"), PH_NOISY TSRMLS_CC); password = phalcon_fetch_nproperty_this(this_ptr, SL("_password"), PH_NOISY TSRMLS_CC); authtype = phalcon_fetch_nproperty_this(this_ptr, SL("_authtype"), PH_NOISY TSRMLS_CC); PHALCON_INIT_VAR(constant); if (!zend_get_constant(SL("CURLOPT_URL"), constant TSRMLS_CC)) { RETURN_MM_FALSE; } PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, url); PHALCON_INIT_NVAR(constant); if (zend_get_constant(SL("CURLOPT_CONNECTTIMEOUT"), constant TSRMLS_CC)) { PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, timeout); } PHALCON_INIT_NVAR(constant); if (zend_get_constant(SL("CURLOPT_TIMEOUT"), constant TSRMLS_CC)) { PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, timeout); } PHALCON_INIT_NVAR(constant); if (PHALCON_IS_NOT_EMPTY(method) && zend_get_constant(SL("CURLOPT_CUSTOMREQUEST"), constant TSRMLS_CC)) { PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, method); } PHALCON_INIT_NVAR(constant); if (zend_get_constant(SL("CURLOPT_USERAGENT"), constant TSRMLS_CC) && PHALCON_IS_NOT_EMPTY(useragent)) { PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, useragent); } header = phalcon_fetch_nproperty_this(this_ptr, SL("_header"), PH_NOISY TSRMLS_CC); if (PHALCON_IS_NOT_EMPTY(username)) { if (PHALCON_IS_STRING(authtype, "any")) { PHALCON_INIT_NVAR(constant); PHALCON_INIT_NVAR(tmp); if (zend_get_constant(SL("CURLOPT_HTTPAUTH"), constant TSRMLS_CC) && zend_get_constant(SL("CURLAUTH_ANY"), tmp TSRMLS_CC)) { PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, tmp); PHALCON_INIT_NVAR(constant); if (zend_get_constant(SL("CURLOPT_USERPWD"), constant TSRMLS_CC)) { PHALCON_INIT_NVAR(tmp); PHALCON_CONCAT_VSV(tmp, username, ":", password); PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, tmp); } } } else if (PHALCON_IS_STRING(authtype, "basic")) { PHALCON_INIT_NVAR(constant); PHALCON_INIT_NVAR(tmp); if (zend_get_constant(SL("CURLOPT_HTTPAUTH"), constant TSRMLS_CC) && zend_get_constant(SL("CURLAUTH_BASIC"), tmp TSRMLS_CC)) { PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, tmp); PHALCON_INIT_NVAR(constant); if (zend_get_constant(SL("CURLOPT_USERPWD"), constant TSRMLS_CC)) { PHALCON_INIT_NVAR(tmp); PHALCON_CONCAT_VSV(tmp, username, ":", password); PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, tmp); } } } else if (PHALCON_IS_STRING(authtype, "digest")) { PHALCON_INIT_NVAR(constant); PHALCON_INIT_NVAR(tmp); if (zend_get_constant(SL("CURLOPT_HTTPAUTH"), constant TSRMLS_CC) && zend_get_constant(SL("CURLAUTH_DIGEST"), tmp TSRMLS_CC)) { PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, tmp); PHALCON_INIT_NVAR(constant); if (zend_get_constant(SL("CURLOPT_USERPWD"), constant TSRMLS_CC)) { PHALCON_INIT_NVAR(tmp); PHALCON_CONCAT_VSV(tmp, username, ":", password); PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, tmp); } } } } PHALCON_INIT_NVAR(constant); if (zend_get_constant(SL("CURLOPT_SAFE_UPLOAD"), constant TSRMLS_CC)) { PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, PHALCON_GLOBAL(z_true)); } if (Z_TYPE_P(data) == IS_STRING && PHALCON_IS_NOT_EMPTY(data)) { PHALCON_INIT_NVAR(key); ZVAL_STRING(key, "Content-Type", 1); if (PHALCON_IS_EMPTY(type)) { PHALCON_INIT_NVAR(type); ZVAL_STRING(type, "application/x-www-form-urlencoded", 1); } PHALCON_CALL_METHOD(NULL, header, "set", key, type); PHALCON_INIT_NVAR(constant); zend_get_constant(SL("CURLOPT_POSTFIELDS"), constant TSRMLS_CC); PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, data); } else if (phalcon_class_exists(SL("CURLFile"), 0 TSRMLS_CC)) { if (Z_TYPE_P(data) != IS_ARRAY) { PHALCON_INIT_NVAR(data); array_init(data); } if (Z_TYPE_P(files) == IS_ARRAY) { phalcon_is_iterable(files, &ah0, &hp0, 0, 0); while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_HVALUE(file); if (PHALCON_IS_NOT_EMPTY(file)) { curlfile_ce = zend_fetch_class(SL("CURLFile"), ZEND_FETCH_CLASS_AUTO TSRMLS_CC); PHALCON_INIT_NVAR(tmp); object_init_ex(tmp, curlfile_ce); PHALCON_CALL_METHOD(NULL, tmp, "__construct", file); phalcon_array_append(&data, tmp, PH_COPY); } zend_hash_move_forward_ex(ah0, &hp0); } } PHALCON_INIT_NVAR(constant); zend_get_constant(SL("CURLOPT_POSTFIELDS"), constant TSRMLS_CC); PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, data); } else { PHALCON_CALL_FUNCTION(&uniqid, "uniqid"); PHALCON_INIT_VAR(boundary); PHALCON_CONCAT_SV(boundary, "--------------", uniqid); PHALCON_INIT_VAR(body); if (Z_TYPE_P(data) == IS_ARRAY) { phalcon_is_iterable(data, &ah0, &hp0, 0, 0); while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_HKEY(key, ah0, hp0); PHALCON_GET_HVALUE(value); PHALCON_SCONCAT_SVS(body, "--", boundary, "\r\n"); PHALCON_SCONCAT_SVSVS(body, "Content-Disposition: form-data; name=\"", key, "\"\r\n\r\n", value, "\r\n"); zend_hash_move_forward_ex(ah0, &hp0); } } if (Z_TYPE_P(files) == IS_ARRAY) { phalcon_is_iterable(files, &ah1, &hp1, 0, 0); while (zend_hash_get_current_data_ex(ah1, (void**) &hd, &hp1) == SUCCESS) { PHALCON_GET_HVALUE(file); if (PHALCON_IS_NOT_EMPTY(file)) { PHALCON_CALL_FUNCTION(&path_parts, "pathinfo", file); if (phalcon_array_isset_string_fetch(&filename, path_parts, SS("filename")) && phalcon_array_isset_string_fetch(&basename, path_parts, SS("basename"))) { PHALCON_CALL_FUNCTION(&filedata, "file_get_contents", file); PHALCON_SCONCAT_SVS(body, "--", boundary, "\r\n"); PHALCON_SCONCAT_SVSVS(body, "Content-Disposition: form-data; name=\"", filename, "\"; filename=\"", basename, "\"\r\n"); PHALCON_SCONCAT_SVS(body, "Content-Type: application/octet-stream\r\n\r\n", filedata, "\r\n"); } } zend_hash_move_forward_ex(ah1, &hp1); } } if (!PHALCON_IS_EMPTY(body)) { PHALCON_SCONCAT_SVS(body, "--", boundary, "--\r\n"); PHALCON_INIT_NVAR(key); ZVAL_STRING(key, "Content-Type", 1); PHALCON_INIT_NVAR(value); PHALCON_CONCAT_SV(value, "multipart/form-data; boundary=", boundary); PHALCON_CALL_METHOD(NULL, header, "set", key, value); PHALCON_INIT_NVAR(key); ZVAL_STRING(key, "Content-Length", 1); PHALCON_INIT_NVAR(value); ZVAL_LONG(value, Z_STRLEN_P(body)); PHALCON_CALL_METHOD(NULL, header, "set", key, value); PHALCON_CALL_METHOD(&headers, header, "build"); PHALCON_INIT_NVAR(constant); zend_get_constant(SL("CURLOPT_POSTFIELDS"), constant TSRMLS_CC); PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, body); PHALCON_INIT_NVAR(constant); zend_get_constant(SL("CURLOPT_HTTPHEADER"), constant TSRMLS_CC); PHALCON_CALL_FUNCTION(NULL, "curl_setopt", curl, constant, headers); } } PHALCON_CALL_FUNCTION(&content, "curl_exec", curl); PHALCON_CALL_FUNCTION(&errorno, "curl_errno", curl); if (PHALCON_IS_TRUE(errorno)) { PHALCON_CALL_FUNCTION(&error, "curl_error", curl); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_http_client_exception_ce, error); return; } PHALCON_INIT_VAR(response); object_init_ex(response, phalcon_http_client_response_ce); PHALCON_CALL_METHOD(NULL, response, "__construct"); PHALCON_INIT_NVAR(constant); if (zend_get_constant(SL("CURLINFO_HTTP_CODE"), constant TSRMLS_CC)) { PHALCON_CALL_FUNCTION(&httpcode, "curl_getinfo", curl, constant); PHALCON_CALL_METHOD(NULL, response, "setstatuscode", httpcode); } PHALCON_INIT_NVAR(constant); if (zend_get_constant(SL("CURLINFO_HEADER_SIZE"), constant TSRMLS_CC)) { PHALCON_CALL_FUNCTION(&headersize, "curl_getinfo", curl, constant); PHALCON_INIT_VAR(headerstr); phalcon_substr(headerstr, content, 0 , Z_LVAL_P(headersize)); PHALCON_INIT_VAR(bodystr); phalcon_substr(bodystr, content, Z_LVAL_P(headersize) , Z_STRLEN_P(content)); PHALCON_CALL_METHOD(NULL, response, "setheader", headerstr); PHALCON_CALL_METHOD(NULL, response, "setbody", bodystr); } RETURN_CTOR(response); }
/** * Decrypts an encrypted text * *<code> * echo $crypt->decrypt($encrypted, "decrypt password"); *</code> * * @param string $text * @param string $key * @return string */ PHP_METHOD(Phalcon_Crypt, decrypt){ zval *text, *key = NULL, *decrypt_key = NULL, *cipher, *mode, *iv_size = NULL; zval *key_size, *text_size, *iv, *text_to_decipher, *decrypted = NULL; zval *padding_type, *block_size = NULL; zval *handler, *arguments = NULL, *value = NULL; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 1, &text, &key); if (phalcon_function_exists_ex(SS("mcrypt_get_iv_size") TSRMLS_CC) == FAILURE) { PHALCON_THROW_EXCEPTION_STR(phalcon_crypt_exception_ce, "mcrypt extension is required"); return; } PHALCON_OBS_VAR(handler); phalcon_read_property_this(&handler, this_ptr, SL("_beforeDecrypt"), PH_NOISY TSRMLS_CC); if (phalcon_is_callable(handler TSRMLS_CC)) { PHALCON_SEPARATE_PARAM(text); PHALCON_INIT_NVAR(arguments); array_init_size(arguments, 1); phalcon_array_append(&arguments, text, 0); PHALCON_INIT_NVAR(value); PHALCON_CALL_USER_FUNC_ARRAY(value, handler, arguments); PHALCON_CPY_WRT(text, value); } if (!key || Z_TYPE_P(key) == IS_NULL) { decrypt_key = phalcon_fetch_nproperty_this(this_ptr, SL("_key"), PH_NOISY TSRMLS_CC); } else { decrypt_key = key; } if (PHALCON_IS_EMPTY(decrypt_key)) { PHALCON_THROW_EXCEPTION_STR(phalcon_crypt_exception_ce, "Decryption key cannot be empty"); return; } cipher = phalcon_fetch_nproperty_this(this_ptr, SL("_cipher"), PH_NOISY TSRMLS_CC); mode = phalcon_fetch_nproperty_this(this_ptr, SL("_mode"), PH_NOISY TSRMLS_CC); PHALCON_CALL_FUNCTION(&iv_size, "mcrypt_get_iv_size", cipher, mode); if (unlikely(Z_TYPE_P(iv_size) != IS_LONG)) { convert_to_long(iv_size); } PHALCON_INIT_VAR(key_size); phalcon_fast_strlen(key_size, decrypt_key); if (PHALCON_GT(key_size, iv_size)) { PHALCON_THROW_EXCEPTION_STR(phalcon_crypt_exception_ce, "Size of key is too large for this algorithm"); return; } PHALCON_INIT_VAR(text_size); phalcon_fast_strlen(text_size, text); if (PHALCON_GT(key_size, text_size)) { PHALCON_THROW_EXCEPTION_STR(phalcon_crypt_exception_ce, "Size of IV is larger than text to decrypt"); return; } PHALCON_INIT_VAR(iv); phalcon_substr(iv, text, 0, Z_LVAL_P(iv_size)); PHALCON_INIT_VAR(text_to_decipher); phalcon_substr(text_to_decipher, text, Z_LVAL_P(iv_size), 0); PHALCON_CALL_FUNCTION(&decrypted, "mcrypt_decrypt", cipher, decrypt_key, text_to_decipher, mode, iv); if (unlikely(Z_TYPE_P(decrypted) != IS_STRING)) { convert_to_string(decrypted); } PHALCON_CALL_FUNCTION(&block_size, "mcrypt_get_block_size", cipher, mode); if (unlikely(Z_TYPE_P(block_size) != IS_LONG)) { convert_to_long(block_size); } padding_type = phalcon_fetch_nproperty_this(this_ptr, SL("_padding"), PH_NOISY TSRMLS_CC); assert(Z_TYPE_P(padding_type) == IS_LONG); assert(Z_TYPE_P(block_size) == IS_LONG); assert(Z_TYPE_P(mode) == IS_STRING); assert(Z_TYPE_P(decrypted) == IS_STRING); phalcon_crypt_unpad_text(return_value, decrypted, mode, Z_LVAL_P(block_size), Z_LVAL_P(padding_type) TSRMLS_CC); PHALCON_OBS_NVAR(handler); phalcon_read_property_this(&handler, this_ptr, SL("_afterDecrypt"), PH_NOISY TSRMLS_CC); if (phalcon_is_callable(handler TSRMLS_CC)) { PHALCON_INIT_NVAR(arguments); array_init_size(arguments, 1); phalcon_array_append(&arguments, return_value, 0); PHALCON_INIT_NVAR(value); PHALCON_CALL_USER_FUNC_ARRAY(value, handler, arguments); RETURN_CTOR(value); } RETURN_MM(); }
/** * @brief Removes padding @a padding_type from @a text * @param return_value Result, possibly unpadded * @param text Message to be unpadded * @param mode Encryption mode; unpadding is applied only in CBC or ECB mode * @param block_size Cipher block size * @param padding_type Padding scheme * @note If the function detects that the text was not padded, it will return it unmodified */ static void phalcon_crypt_unpad_text(zval *return_value, zval *text, zval *mode, uint block_size, int padding_type TSRMLS_DC) { uint padding_size; char padding[256]; int i; char *str_mode; char *str_text; uint text_len; assert(Z_TYPE_P(text) == IS_STRING); assert(Z_TYPE_P(mode) == IS_STRING); padding_size = 0; str_mode = Z_STRVAL_P(mode); str_text = Z_STRVAL_P(text); text_len = Z_STRLEN_P(text); if (text_len && (text_len % block_size == 0) && (!strcmp(str_mode, "ecb") || !strcmp(str_mode, "cbc"))) { switch (padding_type) { case PHALCON_CRYPT_PADDING_ANSI_X_923: if ((unsigned char)(str_text[text_len - 1]) <= block_size) { padding_size = str_text[text_len - 1]; memset(padding, 0, padding_size - 1); padding[padding_size-1] = (unsigned char)padding_size; if (memcmp(padding, str_text + text_len - padding_size, padding_size)) { padding_size = 0; } } break; case PHALCON_CRYPT_PADDING_PKCS7: if ((unsigned char)(str_text[text_len-1]) <= block_size) { padding_size = str_text[text_len-1]; memset(padding, padding_size, padding_size); if (memcmp(padding, str_text + text_len - padding_size, padding_size)) { padding_size = 0; } } break; case PHALCON_CRYPT_PADDING_ISO_10126: padding_size = str_text[text_len-1]; break; case PHALCON_CRYPT_PADDING_ISO_IEC_7816_4: i = text_len - 1; while (i > 0 && str_text[i] == 0x00 && padding_size < block_size) { ++padding_size; --i; } padding_size = ((unsigned char)str_text[i] == 0x80) ? (padding_size + 1) : 0; break; case PHALCON_CRYPT_PADDING_ZERO: i = text_len - 1; while (i >= 0 && str_text[i] == 0x00 && padding_size <= block_size) { ++padding_size; --i; } break; case PHALCON_CRYPT_PADDING_SPACE: i = text_len - 1; while (i >= 0 && str_text[i] == 0x20 && padding_size <= block_size) { ++padding_size; --i; } break; default: break; } if (padding_size && padding_size <= block_size) { assert(padding_size <= text_len); if (padding_size < text_len) { phalcon_substr(return_value, text, 0, text_len - padding_size); } else { ZVAL_EMPTY_STRING(return_value); } } else { padding_size = 0; } } if (!padding_size) { ZVAL_ZVAL(return_value, text, 1, 0); } }
/** * Decrypts an encrypted text * *<code> * echo $crypt->decrypt($encrypted, "decrypt password"); *</code> * * @param string $text * @param string $key * @param int $options * @return string */ PHP_METHOD(Phalcon_Crypt, decrypt){ zval *source, *key = NULL, *options = NULL, handler = {}, arguments = {}, value = {}, text = {}, encrypt_key = {}, encrypt_options = {}; zval method = {}, iv_size = {}, iv = {}, text_to_decipher = {}; phalcon_fetch_params(0, 1, 2, &source, &key, &options); if (phalcon_function_exists_ex(SL("openssl_encrypt")) == FAILURE) { PHALCON_THROW_EXCEPTION_STRW(phalcon_crypt_exception_ce, "openssl extension is required"); return; } phalcon_read_property(&handler, getThis(), SL("_beforeDecrypt"), PH_NOISY); if (phalcon_is_callable(&handler)) { PHALCON_SEPARATE_PARAM(source); array_init_size(&arguments, 1); phalcon_array_append(&arguments, source, PH_COPY); PHALCON_CALL_USER_FUNC_ARRAYW(&value, &handler, &arguments); source = &value; } /* Do not use make_printable_zval() here: we need the conversion with type juggling */ if (Z_TYPE_P(source) != IS_STRING) { phalcon_cast(&text, source, IS_STRING); } else { PHALCON_CPY_WRT_CTOR(&text, source); } if (!key || Z_TYPE_P(key) == IS_NULL) { phalcon_return_property(&encrypt_key, getThis(), SL("_key")); } else { PHALCON_CPY_WRT_CTOR(&encrypt_key, key); if (Z_TYPE(encrypt_key) != IS_STRING) { convert_to_string(&encrypt_key); } } if (!options || Z_TYPE_P(options) == IS_NULL) { phalcon_return_property(&encrypt_options, getThis(), SL("_options")); } else { PHALCON_CPY_WRT_CTOR(&encrypt_options, options); } phalcon_read_property(&method, getThis(), SL("_method"), PH_NOISY); PHALCON_CALL_FUNCTIONW(&iv_size, "openssl_cipher_iv_length", &method); if (Z_LVAL(iv_size) <= 0) { ZVAL_NULL(&iv); PHALCON_CPY_WRT_CTOR(&text_to_decipher, &text); } else { phalcon_substr(&iv, &text, 0, Z_LVAL(iv_size)); phalcon_substr(&text_to_decipher, &text, Z_LVAL(iv_size), 0); } PHALCON_CALL_FUNCTIONW(return_value, "openssl_decrypt", &text_to_decipher, &method, &encrypt_key, &encrypt_options, &iv); if (unlikely(Z_TYPE_P(return_value) != IS_STRING)) { convert_to_string(return_value); } phalcon_read_property(&handler, getThis(), SL("_afterDecrypt"), PH_NOISY); if (phalcon_is_callable(&handler)) { array_init_size(&arguments, 1); phalcon_array_append(&arguments, return_value, PH_COPY); PHALCON_CALL_USER_FUNC_ARRAYW(&value, &handler, &arguments); RETURN_CTORW(&value); } }