/** * Returns uri * * @return string */ PHP_METHOD(Phalcon_Http_Uri, build){ zval *parts, *uri, *scheme, *host, *user, *pass, *port, *path, *query, *fragment, *tmp = NULL; PHALCON_MM_GROW(); parts = phalcon_read_property(getThis(), SL("_parts"), PH_NOISY); PHALCON_INIT_VAR(uri); if (phalcon_array_isset_str_fetch(&scheme, parts, SL("scheme")) && PHALCON_IS_NOT_EMPTY(scheme)) { if (phalcon_array_isset_str_fetch(&host, parts, SL("host")) && PHALCON_IS_NOT_EMPTY(host)) { if (phalcon_array_isset_str_fetch(&user, parts, SL("user")) && PHALCON_IS_NOT_EMPTY(user)) { if (phalcon_array_isset_str_fetch(&pass, parts, SL("pass")) && PHALCON_IS_NOT_EMPTY(pass)) { PHALCON_CONCAT_VSVSVSV(uri, scheme, "://", user, ":", pass, "@", host); } else { PHALCON_CONCAT_VSVSV(uri, scheme, "://", user, "@", host); } } else { PHALCON_CONCAT_VSV(uri, scheme, "://", host); } } else { PHALCON_CONCAT_VS(uri, scheme, ":"); } } if (phalcon_array_isset_str_fetch(&port, parts, SL("port")) && PHALCON_IS_NOT_EMPTY(port)) { PHALCON_SCONCAT_SV(uri, ":", port); } if (phalcon_array_isset_str_fetch(&path, parts, SL("path")) && PHALCON_IS_NOT_EMPTY(path)) { if (!phalcon_start_with_str(path, SL("/"))) { PHALCON_SCONCAT_SV(uri, "/", path); } else { PHALCON_INIT_NVAR(tmp); PHALCON_CONCAT_VV(tmp, uri, path); PHALCON_CPY_WRT(uri, tmp); } } if (phalcon_array_isset_str_fetch(&query, parts, SL("query")) && PHALCON_IS_NOT_EMPTY(query)) { PHALCON_INIT_NVAR(tmp); phalcon_http_build_query(tmp, query, "&"); PHALCON_SCONCAT_SV(uri, "?", tmp); } if (phalcon_array_isset_str_fetch(&fragment, parts, SL("fragment")) && PHALCON_IS_NOT_EMPTY(fragment)) { PHALCON_SCONCAT_SV(uri, "#", fragment); } RETURN_CTOR(uri); }
/** * Returns uri * * @return string */ PHP_METHOD(Phalcon_Http_Uri, build) { zval parts = {}, uri = {}, scheme = {}, host = {}, user = {}, pass = {}, port = {}, path = {}, query = {}, fragment = {}, tmp = {}; phalcon_read_property(&parts, getThis(), SL("_parts"), PH_NOISY); if (phalcon_array_isset_fetch_str(&scheme, &parts, SL("scheme")) && PHALCON_IS_NOT_EMPTY(&scheme)) { if (phalcon_array_isset_fetch_str(&host, &parts, SL("host")) && PHALCON_IS_NOT_EMPTY(&host)) { if (phalcon_array_isset_fetch_str(&user, &parts, SL("user")) && PHALCON_IS_NOT_EMPTY(&user)) { if (phalcon_array_isset_fetch_str(&pass, &parts, SL("pass")) && PHALCON_IS_NOT_EMPTY(&pass)) { PHALCON_CONCAT_VSVSVSV(&uri, &scheme, "://", &user, ":", &pass, "@", &host); } else { PHALCON_CONCAT_VSVSV(&uri, &scheme, "://", &user, "@", &host); } } else { PHALCON_CONCAT_VSV(&uri, &scheme, "://", &host); } } else { PHALCON_CONCAT_VS(&uri, &scheme, ":"); } } if (phalcon_array_isset_fetch_str(&port, &parts, SL("port")) && PHALCON_IS_NOT_EMPTY(&port)) { PHALCON_SCONCAT_SV(&uri, ":", &port); } if (phalcon_array_isset_fetch_str(&path, &parts, SL("path")) && PHALCON_IS_NOT_EMPTY(&path)) { if (!phalcon_start_with_str(&path, SL("/"))) { PHALCON_SCONCAT_SV(&uri, "/", &path); } else { PHALCON_SCONCAT(&uri, &path); } } if (phalcon_array_isset_fetch_str(&query, &parts, SL("query")) && PHALCON_IS_NOT_EMPTY(&query)) { phalcon_http_build_query(&tmp, &query, "&"); PHALCON_SCONCAT_SV(&uri, "?", &tmp); } if (phalcon_array_isset_fetch_str(&fragment, &parts, SL("fragment")) && PHALCON_IS_NOT_EMPTY(&fragment)) { PHALCON_SCONCAT_SV(&uri, "#", &fragment); } RETURN_CTORW(&uri); }
/** * Check whether a role is allowed to access an action from a resource * * <code> * //Does andres have access to the customers resource to create? * $acl->isAllowed('andres', 'Products', 'create'); * * //Do guests have access to any resource to edit? * $acl->isAllowed('guests', '*', 'edit'); * </code> * * @param string $role * @param string $resource * @param string $access * @return boolean */ PHP_METHOD(Phalcon_Acl_Adapter_Memory, isAllowed){ zval *role, *resource, *access, *events_manager; zval *event_name = NULL, *status, *default_access, *roles_names; zval *have_access = NULL, *access_list, *access_key = NULL; zval *role_inherits, *inherited_roles = NULL, *inherited_role = NULL; HashTable *ah0, *ah1, *ah2; HashPosition hp0, hp1, hp2; zval **hd; PHALCON_MM_GROW(); phalcon_fetch_params(1, 3, 0, &role, &resource, &access); phalcon_update_property_this(this_ptr, SL("_activeRole"), role TSRMLS_CC); phalcon_update_property_this(this_ptr, SL("_activeResource"), resource TSRMLS_CC); phalcon_update_property_this(this_ptr, SL("_activeAccess"), access TSRMLS_CC); PHALCON_OBS_VAR(events_manager); phalcon_read_property_this(&events_manager, this_ptr, SL("_eventsManager"), PH_NOISY_CC); if (Z_TYPE_P(events_manager) == IS_OBJECT) { PHALCON_INIT_VAR(event_name); ZVAL_STRING(event_name, "acl:beforeCheckAccess", 1); PHALCON_INIT_VAR(status); phalcon_call_method_p2(status, events_manager, "fire", event_name, this_ptr); if (PHALCON_IS_FALSE(status)) { RETURN_CCTOR(status); } } PHALCON_OBS_VAR(default_access); phalcon_read_property_this(&default_access, this_ptr, SL("_defaultAccess"), PH_NOISY_CC); /** * Check if the role exists */ PHALCON_OBS_VAR(roles_names); phalcon_read_property_this(&roles_names, this_ptr, SL("_rolesNames"), PH_NOISY_CC); if (!phalcon_array_isset(roles_names, role)) { RETURN_CCTOR(default_access); } PHALCON_INIT_VAR(have_access); PHALCON_OBS_VAR(access_list); phalcon_read_property_this(&access_list, this_ptr, SL("_access"), PH_NOISY_CC); PHALCON_INIT_VAR(access_key); PHALCON_CONCAT_VSVSV(access_key, role, "!", resource, "!", access); /** * Check if there is a direct combination for role-resource-access */ if (phalcon_array_isset(access_list, access_key)) { PHALCON_OBS_NVAR(have_access); phalcon_array_fetch(&have_access, access_list, access_key, PH_NOISY); } /** * Check in the inherits roles */ if (Z_TYPE_P(have_access) == IS_NULL) { PHALCON_OBS_VAR(role_inherits); phalcon_read_property_this(&role_inherits, this_ptr, SL("_roleInherits"), PH_NOISY_CC); if (phalcon_array_isset(role_inherits, role)) { PHALCON_OBS_VAR(inherited_roles); phalcon_array_fetch(&inherited_roles, role_inherits, role, PH_NOISY); } else { PHALCON_INIT_NVAR(inherited_roles); } if (Z_TYPE_P(inherited_roles) == IS_ARRAY) { phalcon_is_iterable(inherited_roles, &ah0, &hp0, 0, 0); while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_HVALUE(inherited_role); PHALCON_INIT_NVAR(access_key); PHALCON_CONCAT_VSVSV(access_key, inherited_role, "!", resource, "!", access); /** * Check if there is a direct combination in one of the inherited roles */ if (phalcon_array_isset(access_list, access_key)) { PHALCON_OBS_NVAR(have_access); phalcon_array_fetch(&have_access, access_list, access_key, PH_NOISY); break; } zend_hash_move_forward_ex(ah0, &hp0); } } } /** * If access wasn't found yet, try role-resource-* */ if (Z_TYPE_P(have_access) == IS_NULL) { PHALCON_INIT_NVAR(access_key); PHALCON_CONCAT_VSVS(access_key, role, "!", resource, "!*"); /** * In the direct role */ if (phalcon_array_isset(access_list, access_key)) { PHALCON_OBS_NVAR(have_access); phalcon_array_fetch(&have_access, access_list, access_key, PH_NOISY); } else { if (Z_TYPE_P(inherited_roles) == IS_ARRAY) { phalcon_is_iterable(inherited_roles, &ah1, &hp1, 0, 0); while (zend_hash_get_current_data_ex(ah1, (void**) &hd, &hp1) == SUCCESS) { PHALCON_GET_HVALUE(inherited_role); PHALCON_INIT_NVAR(access_key); PHALCON_CONCAT_VSVS(access_key, inherited_role, "!", resource, "!*"); /** * In the inherited roles */ if (phalcon_array_isset(access_list, access_key)) { PHALCON_OBS_NVAR(have_access); phalcon_array_fetch(&have_access, access_list, access_key, PH_NOISY); break; } zend_hash_move_forward_ex(ah1, &hp1); } } } } /** * If access wasn't found yet, try role-*-* */ if (Z_TYPE_P(have_access) == IS_NULL) { PHALCON_INIT_NVAR(access_key); PHALCON_CONCAT_VS(access_key, role, "!*!*"); /** * Try in the direct role */ if (phalcon_array_isset(access_list, access_key)) { PHALCON_OBS_NVAR(have_access); phalcon_array_fetch(&have_access, access_list, access_key, PH_NOISY); } else { if (Z_TYPE_P(inherited_roles) == IS_ARRAY) { phalcon_is_iterable(inherited_roles, &ah2, &hp2, 0, 0); while (zend_hash_get_current_data_ex(ah2, (void**) &hd, &hp2) == SUCCESS) { PHALCON_GET_HVALUE(inherited_role); PHALCON_INIT_NVAR(access_key); PHALCON_CONCAT_VS(access_key, inherited_role, "!*!*"); if (phalcon_array_isset(access_list, access_key)) { PHALCON_OBS_NVAR(have_access); phalcon_array_fetch(&have_access, access_list, access_key, PH_NOISY); break; } zend_hash_move_forward_ex(ah2, &hp2); } } } } phalcon_update_property_this(this_ptr, SL("_accessGranted"), have_access TSRMLS_CC); if (Z_TYPE_P(events_manager) == IS_OBJECT) { PHALCON_INIT_NVAR(event_name); ZVAL_STRING(event_name, "acl:afterCheckAccess", 1); phalcon_call_method_p3_noret(events_manager, "fire", event_name, this_ptr, have_access); } if (Z_TYPE_P(have_access) == IS_NULL) { PHALCON_MM_RESTORE(); RETURN_LONG(0); } RETURN_CCTOR(have_access); }
/** * Checks if a role has access to a resource * * @param string $roleName * @param string $resourceName * @param string $access * @param string $action */ PHP_METHOD(Phalcon_Acl_Adapter_Memory, _allowOrDeny){ zval *role_name, *resource_name, *access, *action; zval *roles_names, *exception_message = NULL, *resources_names; zval *default_access, *access_list, *internal_access; zval *access_name = NULL, *access_key = NULL, *access_key_all = NULL; HashTable *ah0, *ah1; HashPosition hp0, hp1; zval **hd; PHALCON_MM_GROW(); phalcon_fetch_params(1, 4, 0, &role_name, &resource_name, &access, &action); PHALCON_OBS_VAR(roles_names); phalcon_read_property_this(&roles_names, this_ptr, SL("_rolesNames"), PH_NOISY_CC); if (!phalcon_array_isset(roles_names, role_name)) { PHALCON_INIT_VAR(exception_message); PHALCON_CONCAT_SVS(exception_message, "Role \"", role_name, "\" does not exist in ACL"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_acl_exception_ce, exception_message); return; } PHALCON_OBS_VAR(resources_names); phalcon_read_property_this(&resources_names, this_ptr, SL("_resourcesNames"), PH_NOISY_CC); if (!phalcon_array_isset(resources_names, resource_name)) { PHALCON_INIT_NVAR(exception_message); PHALCON_CONCAT_SVS(exception_message, "Resource \"", resource_name, "\" does not exist in ACL"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_acl_exception_ce, exception_message); return; } PHALCON_OBS_VAR(default_access); phalcon_read_property_this(&default_access, this_ptr, SL("_defaultAccess"), PH_NOISY_CC); PHALCON_OBS_VAR(access_list); phalcon_read_property_this(&access_list, this_ptr, SL("_accessList"), PH_NOISY_CC); PHALCON_OBS_VAR(internal_access); phalcon_read_property_this(&internal_access, this_ptr, SL("_access"), PH_NOISY_CC); if (Z_TYPE_P(access) == IS_ARRAY) { phalcon_is_iterable(access, &ah0, &hp0, 0, 0); while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_HVALUE(access_name); PHALCON_INIT_NVAR(access_key); PHALCON_CONCAT_VSV(access_key, resource_name, "!", access_name); if (!phalcon_array_isset(access_list, access_key)) { PHALCON_INIT_NVAR(exception_message); PHALCON_CONCAT_SVSVS(exception_message, "Acccess '", access_name, "' does not exist in resource '", resource_name, "'"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_acl_exception_ce, exception_message); return; } zend_hash_move_forward_ex(ah0, &hp0); } phalcon_is_iterable(access, &ah1, &hp1, 0, 0); while (zend_hash_get_current_data_ex(ah1, (void**) &hd, &hp1) == SUCCESS) { PHALCON_GET_HVALUE(access_name); PHALCON_INIT_NVAR(access_key); PHALCON_CONCAT_VSVSV(access_key, role_name, "!", resource_name, "!", access_name); phalcon_update_property_array(this_ptr, SL("_access"), access_key, action TSRMLS_CC); if (!PHALCON_IS_STRING(access_name, "*")) { PHALCON_INIT_NVAR(access_key_all); PHALCON_CONCAT_VSVS(access_key_all, role_name, "!", resource_name, "!*"); if (!phalcon_array_isset(internal_access, access_key_all)) { phalcon_update_property_array(this_ptr, SL("_access"), access_key_all, default_access TSRMLS_CC); } } zend_hash_move_forward_ex(ah1, &hp1); } } else { if (!PHALCON_IS_STRING(access, "*")) { PHALCON_INIT_NVAR(access_key); PHALCON_CONCAT_VSV(access_key, resource_name, "!", access); if (!phalcon_array_isset(access_list, access_key)) { PHALCON_INIT_NVAR(exception_message); PHALCON_CONCAT_SVSVS(exception_message, "Acccess '", access, "' does not exist in resource '", resource_name, "'"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_acl_exception_ce, exception_message); return; } } PHALCON_INIT_NVAR(access_key); PHALCON_CONCAT_VSVSV(access_key, role_name, "!", resource_name, "!", access); /** * Define the access action for the specified accessKey */ phalcon_update_property_array(this_ptr, SL("_access"), access_key, action TSRMLS_CC); if (!PHALCON_IS_STRING(access, "*")) { PHALCON_INIT_NVAR(access_key); PHALCON_CONCAT_VSVS(access_key, role_name, "!", resource_name, "!*"); /** * If there is no default action for all the rest actions in the resource set the * default one */ if (!phalcon_array_isset(internal_access, access_key)) { phalcon_update_property_array(this_ptr, SL("_access"), access_key, default_access TSRMLS_CC); } } } PHALCON_MM_RESTORE(); }
/** * Transforms an intermediate representation for a expression into a database system valid expression * * @param array $expression * @param string $escapeChar * @return string */ PHP_METHOD(Phalcon_Db_Dialect, getSqlExpression){ zval *expression, *escape_char = NULL, *type, *name = NULL, *escaped_name = NULL; zval *domain, *escaped_domain = NULL, *value = NULL, *operator = NULL; zval *left = NULL, *expression_left = NULL, *right = NULL, *expression_right = NULL; zval *binary_expr, *unary_expr = NULL, *expression_group; zval *sql_arguments, *arguments, *argument = NULL, *argument_expression = NULL; zval *arguments_joined, *function_expression = NULL; zval *sql_items, *items, *item = NULL, *item_expression = NULL; zval *list_expression, *group_expression; zval *exception_message; HashTable *ah0, *ah1; HashPosition hp0, hp1; zval **hd; PHALCON_MM_GROW(); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|z", &expression, &escape_char) == FAILURE) { RETURN_MM_NULL(); } if (!escape_char) { PHALCON_INIT_VAR(escape_char); } else { PHALCON_SEPARATE_PARAM(escape_char); } if (PHALCON_GLOBAL(db).escape_identifiers) { if (Z_TYPE_P(escape_char) == IS_NULL) { PHALCON_OBS_NVAR(escape_char); phalcon_read_property(&escape_char, this_ptr, SL("_escapeChar"), PH_NOISY_CC); } } if (Z_TYPE_P(expression) != IS_ARRAY) { PHALCON_THROW_EXCEPTION_STR(phalcon_db_exception_ce, "Invalid SQL expression"); return; } if (!phalcon_array_isset_string(expression, SS("type"))) { PHALCON_THROW_EXCEPTION_STR(phalcon_db_exception_ce, "Invalid SQL expression"); return; } PHALCON_OBS_VAR(type); phalcon_array_fetch_string(&type, expression, SL("type"), PH_NOISY_CC); /** * Resolve qualified expressions */ if (PHALCON_IS_STRING(type, "qualified")) { PHALCON_OBS_VAR(name); phalcon_array_fetch_string(&name, expression, SL("name"), PH_NOISY_CC); if (PHALCON_GLOBAL(db).escape_identifiers) { PHALCON_INIT_VAR(escaped_name); PHALCON_CONCAT_VVV(escaped_name, escape_char, name, escape_char); } else { PHALCON_CPY_WRT(escaped_name, name); } /** * A domain could be a table/schema */ if (phalcon_array_isset_string(expression, SS("domain"))) { PHALCON_OBS_VAR(domain); phalcon_array_fetch_string(&domain, expression, SL("domain"), PH_NOISY_CC); if (PHALCON_GLOBAL(db).escape_identifiers) { PHALCON_INIT_VAR(escaped_domain); PHALCON_CONCAT_VVVSV(escaped_domain, escape_char, domain, escape_char, ".", escaped_name); } else { PHALCON_INIT_NVAR(escaped_domain); PHALCON_CONCAT_VSV(escaped_domain, domain, ".", escaped_name); } RETURN_CTOR(escaped_domain); } RETURN_CCTOR(escaped_name); } /** * Resolve literal expressions */ if (PHALCON_IS_STRING(type, "literal")) { PHALCON_OBS_VAR(value); phalcon_array_fetch_string(&value, expression, SL("value"), PH_NOISY_CC); RETURN_CCTOR(value); } /** * Resolve binary operations expressions */ if (PHALCON_IS_STRING(type, "binary-op")) { PHALCON_OBS_VAR(operator); phalcon_array_fetch_string(&operator, expression, SL("op"), PH_NOISY_CC); PHALCON_OBS_VAR(left); phalcon_array_fetch_string(&left, expression, SL("left"), PH_NOISY_CC); PHALCON_INIT_VAR(expression_left); PHALCON_CALL_METHOD_PARAMS_2(expression_left, this_ptr, "getsqlexpression", left, escape_char); PHALCON_OBS_VAR(right); phalcon_array_fetch_string(&right, expression, SL("right"), PH_NOISY_CC); PHALCON_INIT_VAR(expression_right); PHALCON_CALL_METHOD_PARAMS_2(expression_right, this_ptr, "getsqlexpression", right, escape_char); PHALCON_INIT_VAR(binary_expr); PHALCON_CONCAT_VSVSV(binary_expr, expression_left, " ", operator, " ", expression_right); RETURN_CTOR(binary_expr); } /** * Resolve unary operations expressions */ if (PHALCON_IS_STRING(type, "unary-op")) { PHALCON_OBS_NVAR(operator); phalcon_array_fetch_string(&operator, expression, SL("op"), PH_NOISY_CC); /** * Some unary operators uses the left operand... */ if (phalcon_array_isset_string(expression, SS("left"))) { PHALCON_OBS_NVAR(left); phalcon_array_fetch_string(&left, expression, SL("left"), PH_NOISY_CC); PHALCON_INIT_NVAR(expression_left); PHALCON_CALL_METHOD_PARAMS_2(expression_left, this_ptr, "getsqlexpression", left, escape_char); PHALCON_INIT_VAR(unary_expr); PHALCON_CONCAT_VV(unary_expr, expression_left, operator); RETURN_CTOR(unary_expr); } /** * ...Others uses the right operand */ if (phalcon_array_isset_string(expression, SS("right"))) { PHALCON_OBS_NVAR(right); phalcon_array_fetch_string(&right, expression, SL("right"), PH_NOISY_CC); PHALCON_INIT_NVAR(expression_right); PHALCON_CALL_METHOD_PARAMS_2(expression_right, this_ptr, "getsqlexpression", right, escape_char); PHALCON_INIT_NVAR(unary_expr); PHALCON_CONCAT_VV(unary_expr, operator, expression_right); RETURN_CTOR(unary_expr); } } /** * Resolve placeholder */ if (PHALCON_IS_STRING(type, "placeholder")) { PHALCON_OBS_NVAR(value); phalcon_array_fetch_string(&value, expression, SL("value"), PH_NOISY_CC); RETURN_CCTOR(value); } /** * Resolve parentheses */ if (PHALCON_IS_STRING(type, "parentheses")) { PHALCON_OBS_NVAR(left); phalcon_array_fetch_string(&left, expression, SL("left"), PH_NOISY_CC); PHALCON_INIT_NVAR(expression_left); PHALCON_CALL_METHOD_PARAMS_2(expression_left, this_ptr, "getsqlexpression", left, escape_char); PHALCON_INIT_VAR(expression_group); PHALCON_CONCAT_SVS(expression_group, "(", expression_left, ")"); RETURN_CTOR(expression_group); } /** * Resolve function calls */ if (PHALCON_IS_STRING(type, "functionCall")) { PHALCON_OBS_NVAR(name); phalcon_array_fetch_string(&name, expression, SL("name"), PH_NOISY_CC); PHALCON_INIT_VAR(sql_arguments); array_init(sql_arguments); if (phalcon_array_isset_string(expression, SS("arguments"))) { PHALCON_OBS_VAR(arguments); phalcon_array_fetch_string(&arguments, expression, SL("arguments"), PH_NOISY_CC); if (!phalcon_is_iterable(arguments, &ah0, &hp0, 0, 0 TSRMLS_CC)) { return; } while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_FOREACH_VALUE(argument); PHALCON_INIT_NVAR(argument_expression); PHALCON_CALL_METHOD_PARAMS_2(argument_expression, this_ptr, "getsqlexpression", argument, escape_char); phalcon_array_append(&sql_arguments, argument_expression, PH_SEPARATE TSRMLS_CC); zend_hash_move_forward_ex(ah0, &hp0); } PHALCON_INIT_VAR(arguments_joined); phalcon_fast_join_str(arguments_joined, SL(", "), sql_arguments TSRMLS_CC); PHALCON_INIT_VAR(function_expression); PHALCON_CONCAT_VSVS(function_expression, name, "(", arguments_joined, ")"); } else { PHALCON_INIT_NVAR(function_expression); PHALCON_CONCAT_VS(function_expression, name, "()"); } RETURN_CTOR(function_expression); } /** * Resolve lists */ if (PHALCON_IS_STRING(type, "list")) { PHALCON_INIT_VAR(sql_items); array_init(sql_items); PHALCON_OBS_VAR(items); phalcon_array_fetch_long(&items, expression, 0, PH_NOISY_CC); if (!phalcon_is_iterable(items, &ah1, &hp1, 0, 0 TSRMLS_CC)) { return; } while (zend_hash_get_current_data_ex(ah1, (void**) &hd, &hp1) == SUCCESS) { PHALCON_GET_FOREACH_VALUE(item); PHALCON_INIT_NVAR(item_expression); PHALCON_CALL_METHOD_PARAMS_2(item_expression, this_ptr, "getsqlexpression", item, escape_char); phalcon_array_append(&sql_items, item_expression, PH_SEPARATE TSRMLS_CC); zend_hash_move_forward_ex(ah1, &hp1); } PHALCON_INIT_VAR(list_expression); phalcon_fast_join_str(list_expression, SL(", "), sql_items TSRMLS_CC); PHALCON_INIT_VAR(group_expression); PHALCON_CONCAT_SVS(group_expression, "(", list_expression, ")"); RETURN_CTOR(group_expression); } /** * Resolve * */ if (PHALCON_IS_STRING(type, "all")) { PHALCON_MM_RESTORE(); RETURN_STRING("*", 1); } /** * Expression type wasn't found */ PHALCON_INIT_VAR(exception_message); PHALCON_CONCAT_SVS(exception_message, "Invalid SQL expression type '", type, "'"); PHALCON_THROW_EXCEPTION_ZVAL(phalcon_db_exception_ce, exception_message); return; }
PHP_METHOD(Phalcon_Http_Client_Adapter_Stream, buildBody){ zval *stream, *header, *data, *file, *username, *password, *authtype, *digest, *method, *entity_body; zval *key = NULL, *value = NULL, *realm, *qop, *nonce, *nc, *cnonce, *qoc, *ha1 = NULL, *path = NULL, *md5_entity_body = NULL, *ha2 = NULL; zval *http, *option = NULL, *body, *headers = NULL, *uniqid = NULL, *boundary; zval *path_parts = NULL, *filename, *basename, *filedata = NULL, *tmp = NULL; HashTable *ah0; HashPosition hp0; zval **hd; PHALCON_MM_GROW(); stream = phalcon_fetch_nproperty_this(this_ptr, SL("_stream"), PH_NOISY TSRMLS_CC); header = phalcon_fetch_nproperty_this(this_ptr, SL("_header"), PH_NOISY TSRMLS_CC); data = phalcon_fetch_nproperty_this(this_ptr, SL("_data"), PH_NOISY TSRMLS_CC); file = phalcon_fetch_nproperty_this(this_ptr, SL("_file"), 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); digest = phalcon_fetch_nproperty_this(this_ptr, SL("_digest"), PH_NOISY TSRMLS_CC); method = phalcon_fetch_nproperty_this(this_ptr, SL("_method"), PH_NOISY TSRMLS_CC); entity_body = phalcon_fetch_nproperty_this(this_ptr, SL("_entity_body"), PH_NOISY TSRMLS_CC); if (PHALCON_IS_NOT_EMPTY(username)) { if (PHALCON_IS_STRING(authtype, "basic")) { PHALCON_INIT_NVAR(key); ZVAL_STRING(key, "Authorization", 1); PHALCON_INIT_NVAR(value); PHALCON_CONCAT_SVSV(value, "Basic ", username, ":", password); PHALCON_CALL_METHOD(NULL, header, "set", key, value); } else if (PHALCON_IS_STRING(authtype, "digest") && PHALCON_IS_NOT_EMPTY(digest)) { if (phalcon_array_isset_string_fetch(&realm, digest, SS("realm"))) { PHALCON_INIT_VAR(realm); ZVAL_NULL(realm); } PHALCON_INIT_NVAR(tmp); PHALCON_CONCAT_VSVSV(tmp, username, ":", realm, ":", password); PHALCON_CALL_FUNCTION(&ha1, "md5", tmp); if (!phalcon_array_isset_string_fetch(&qop, digest, SS("qop"))) { PHALCON_INIT_VAR(qop); ZVAL_NULL(qop); } if (PHALCON_IS_EMPTY(qop) || phalcon_memnstr_str(qop, SL("auth"))) { PHALCON_CALL_SELF(&path, "getpath"); PHALCON_INIT_NVAR(tmp); PHALCON_CONCAT_VSV(tmp, method, ":", path); PHALCON_CALL_FUNCTION(&ha2, "md5", tmp); } else if (phalcon_memnstr_str(qop, SL("auth-int"))) { PHALCON_CALL_SELF(&path, "getpath"); PHALCON_CALL_FUNCTION(&md5_entity_body, "md5", entity_body); PHALCON_INIT_NVAR(tmp); PHALCON_CONCAT_VSVSV(tmp, method, ":", path, ":", md5_entity_body); PHALCON_CALL_FUNCTION(&ha2, "md5", tmp); } PHALCON_INIT_NVAR(key); ZVAL_STRING(key, "Authorization", 1); if (phalcon_array_isset_string_fetch(&nonce, digest, SS("nonce"))) { PHALCON_INIT_VAR(nonce); ZVAL_NULL(nonce); } if (PHALCON_IS_EMPTY(qop)) { PHALCON_INIT_NVAR(tmp); PHALCON_CONCAT_VSVSV(tmp, ha1, ":", nonce, ":", ha2); PHALCON_CALL_FUNCTION(&value, "md5", tmp); PHALCON_INIT_NVAR(tmp); PHALCON_CONCAT_SV(tmp, "Digest ", value); PHALCON_CALL_METHOD(NULL, header, "set", key, tmp); } else { if (phalcon_array_isset_string_fetch(&nc, digest, SS("nc"))) { PHALCON_INIT_VAR(nc); ZVAL_NULL(nc); } if (phalcon_array_isset_string_fetch(&cnonce, digest, SS("cnonce"))) { PHALCON_INIT_VAR(cnonce); ZVAL_NULL(cnonce); } if (phalcon_array_isset_string_fetch(&qoc, digest, SS("qoc"))) { PHALCON_INIT_VAR(qoc); ZVAL_NULL(qoc); } if (phalcon_array_isset_string_fetch(&qoc, digest, SS("qoc"))) { PHALCON_INIT_VAR(qoc); ZVAL_NULL(qoc); } PHALCON_INIT_NVAR(tmp); PHALCON_CONCAT_VSVSVS(tmp, ha1, ":", nonce, ":", nc, ":"); PHALCON_SCONCAT_VSVSV(tmp, cnonce, ":", qoc, ":", ha2); PHALCON_CALL_FUNCTION(&value, "md5", tmp); PHALCON_INIT_NVAR(tmp); PHALCON_CONCAT_SV(tmp, "Digest ", value); PHALCON_CALL_METHOD(NULL, header, "set", key, tmp); } } } PHALCON_INIT_VAR(http); ZVAL_STRING(http, "http", 1); PHALCON_CALL_FUNCTION(&uniqid, "uniqid"); PHALCON_INIT_VAR(boundary); PHALCON_CONCAT_SV(boundary, "--------------", uniqid); PHALCON_INIT_VAR(body); if (PHALCON_IS_NOT_EMPTY(data) && Z_TYPE_P(data) == IS_STRING){ PHALCON_INIT_NVAR(key); ZVAL_STRING(key, "Content-Type", 1); PHALCON_INIT_NVAR(value); ZVAL_STRING(value, "application/x-www-form-urlencoded", 1); PHALCON_CALL_METHOD(NULL, header, "set", key, value); PHALCON_INIT_NVAR(option); ZVAL_LONG(option, PHALCON_HTTP_CLIENT_HEADER_BUILD_FIELDS); PHALCON_CALL_METHOD(&headers, header, "build", option); PHALCON_INIT_NVAR(option); ZVAL_STRING(option, "header", 1); PHALCON_CALL_FUNCTION(NULL, "stream_context_set_option", stream, http, option, headers); PHALCON_INIT_NVAR(option); ZVAL_STRING(option, "content", 1); PHALCON_CALL_FUNCTION(NULL, "stream_context_set_option", stream, http, option, data); RETURN_MM(); } 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 (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"); } } 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_INIT_NVAR(option); ZVAL_LONG(option, PHALCON_HTTP_CLIENT_HEADER_BUILD_FIELDS); PHALCON_CALL_METHOD(&headers, header, "build", option); PHALCON_INIT_NVAR(option); ZVAL_STRING(option, "header", 1); PHALCON_CALL_FUNCTION(NULL, "stream_context_set_option", stream, http, option, headers); PHALCON_INIT_NVAR(option); ZVAL_STRING(option, "content", 1); PHALCON_CALL_FUNCTION(NULL, "stream_context_set_option", stream, http, option, body); } PHALCON_MM_RESTORE(); }