/** * anypy_set_verdict: * @self: AnyPyProxy instance * @args: Python args argument * * sets verdict for the parent proxy * args is (verdict,description) **/ static ZPolicyObj * anypy_set_verdict(AnyPyProxy * self, ZPolicyObj *args) { gint verdict; gchar *description; z_proxy_enter(self); if (!z_policy_var_parse_tuple(args, "is", &verdict, &description)) { z_policy_raise_exception_obj(z_policy_exc_value_error, "Invalid arguments."); z_proxy_return(self, NULL); } if (self->super.parent_proxy) { ZProxyStackIface *iface; iface = z_proxy_find_iface(self->super.parent_proxy, Z_CLASS(ZProxyStackIface)); if (iface) { z_proxy_stack_iface_set_verdict(iface, verdict, description); z_object_unref(&iface->super); } } z_proxy_return(self, z_policy_none_ref()); }
/** * anypy_set_content_hint: * @self: AnyPyProxy instance * @args: Python args argument * * sets verdict for the parent proxy * args is (verdict,description) **/ static ZPolicyObj * anypy_set_content_hint(AnyPyProxy * self, ZPolicyObj *args) { gint64 length; z_proxy_enter(self); if (!z_policy_var_parse_tuple(args, "L", &length)) { z_policy_raise_exception_obj(z_policy_exc_value_error, "Invalid arguments."); z_proxy_leave(self); return NULL; } if (self->super.parent_proxy) { ZProxyStackIface *iface; iface = z_proxy_find_iface(self->super.parent_proxy, Z_CLASS(ZProxyStackIface)); if (iface) { z_proxy_stack_iface_set_content_hint(iface, length); z_object_unref(&iface->super); } } z_proxy_return(self, z_policy_none_ref()); }
ZPolicyObj * smtp_policy_sanitize_address(SmtpProxy *self, ZPolicyObj *args) { gchar *address; gchar *final_end; GString *sanitized_address; ZPolicyObj *res = NULL; z_proxy_enter(self); if (!z_policy_var_parse_tuple(args, "s", &address)) { z_policy_raise_exception_obj(z_policy_exc_value_error, "Invalid arguments"); z_proxy_leave(self); return NULL; } sanitized_address = g_string_new(""); if (!smtp_sanitize_address(self, sanitized_address, address, TRUE, &final_end)) { z_policy_raise_exception_obj(z_policy_exc_value_error, "Invalid address"); goto exit; } res = z_policy_var_build("s", sanitized_address->str); exit: g_string_free(sanitized_address, TRUE); z_proxy_leave(self); return res; }
SmtpRequestTypes smtp_policy_check_request(SmtpProxy *self) { ZPolicyObj *entry; ZPolicyObj *res; ZPolicyObj *process_cmd = NULL; SmtpRequestTypes action; gchar *response = NULL, *response_param = NULL; z_proxy_enter(self); entry = g_hash_table_lookup(self->request_policy, self->request->str); if (!entry) entry = g_hash_table_lookup(self->request_policy, "*"); if (!entry) z_proxy_return(self, SMTP_REQ_REJECT); z_policy_lock(self->super.thread); if (!smtp_hash_get_type(entry, &action)) { /*LOG This message indicates that the policy type is invalid for the given request and Zorp aborts the connection. Check the 'request' attribute. */ z_proxy_log(self, SMTP_POLICY, 1, "Invalid request policy type; request='%s'", self->request->str); z_policy_unlock(self->super.thread); z_proxy_return(self, SMTP_REQ_ABORT); } z_policy_unlock(self->super.thread); z_cp(); switch (action) { case SMTP_REQ_REJECT: z_policy_lock(self->super.thread); if (!z_policy_var_parse_tuple(entry, "i|ss", &action, &response, &response_param)) { /*LOG This message indicates that the parameter of the request policy of the given request is invalid and Zorp aborts the connection. Check the 'request' attribute. */ z_proxy_log(self, SMTP_POLICY, 1, "Error in request policy; request='%s'", self->request->str); action = SMTP_REQ_ABORT; } else { if (response) g_string_assign(self->error_code, response); if (response_param) g_string_assign(self->error_info, response_param); } z_policy_unlock(self->super.thread); break; case SMTP_REQ_ACCEPT: break; case SMTP_REQ_POLICY: z_policy_lock(self->super.thread); if (!z_policy_var_parse(entry, "(iO)", &action, &process_cmd)) { /*LOG This message indicates that the parameter of the request policy of the given request is invalid and Zorp aborts the connection. Check the 'request' attribute. */ z_proxy_log(self, SMTP_POLICY, 1, "Error in request policy; request='%s'", self->request->str); action = SMTP_REQ_ABORT; } else { res = z_policy_call_object(process_cmd, z_policy_var_build("(ss)", self->request->str, self->request_param->str), self->super.session_id); if (res) { if (!z_policy_var_parse(res, "i", &action)) { /*LOG This message indicates that the returned value of the callback for the given request policy is invalid and Zorp aborts the connection. Check the callback function. */ z_proxy_log(self, SMTP_POLICY, 1, "The verdict returned by the policy is not an int; request='%s'", self->request->str); action = SMTP_REQ_ABORT; } else { switch (action) { case SMTP_REQ_ACCEPT: case SMTP_REQ_REJECT: case SMTP_REQ_ABORT: break; default: action = SMTP_REQ_ABORT; break; } } } else { action = SMTP_REQ_ABORT; } } z_policy_unlock(self->super.thread); break; case SMTP_REQ_ABORT: default: action = SMTP_REQ_ABORT; break; } z_proxy_return(self, action); }
SmtpResponseTypes smtp_policy_check_response(SmtpProxy *self) { ZPolicyObj *entry, *process_rsp, *res; gchar *key[2]; gchar *response, *response_param; SmtpResponseTypes action; z_proxy_enter(self); if (self->request->len) key[0] = self->request->str; else key[0] = "Null"; key[1] = self->response->str; entry = z_dim_hash_table_search(self->response_policy, 2, key); if (!entry) z_proxy_return(self, SMTP_RSP_REJECT); z_policy_lock(self->super.thread); if (!smtp_hash_get_type(entry, &action)) { /*LOG This message indicates that the policy type is invalid for the given response and Zorp aborts the connection. Check the 'response' attribute. */ z_proxy_log(self, SMTP_POLICY, 1, "Invalid response policy; request='%s', response='%s'", self->request->str, self->response->str); z_proxy_return(self, SMTP_RSP_ABORT); } z_policy_unlock(self->super.thread); switch (action) { case SMTP_RSP_REJECT: z_policy_lock(self->super.thread); if (!z_policy_var_parse_tuple(entry, "i|ss", &action, &response, &response_param)) { /*LOG This message indicates that the parameter of the response policy of the given request is invalid and Zorp aborts the connection. Check the 'response' attribute. */ z_proxy_log(self, SMTP_POLICY, 1, "Error in response policy; request='%s', response='%s'", self->request->str, self->response->str); action = SMTP_RSP_ABORT; } else { if (response) g_string_assign(self->error_code, response); if (response_param) g_string_assign(self->error_info, response_param); } z_policy_unlock(self->super.thread); break; case SMTP_RSP_ACCEPT: case SMTP_RSP_ABORT: break; case SMTP_RSP_POLICY: z_policy_lock(self->super.thread); if (!z_policy_var_parse(entry, "(iO)", &action, &process_rsp)) { /*LOG This message indicates that the parameter of the response policy of the given request is invalid and Zorp aborts the connection. Check the 'response' attribute. */ z_proxy_log(self, SMTP_POLICY, 1, "Error in response policy; request='%s', response='%s'", self->request->str, self->response->str); action = SMTP_RSP_ABORT; } else { res = z_policy_call_object(process_rsp, z_policy_var_build("(ssss)", self->request->str, self->request_param->str, self->response->str, self->response_param->str), self->super.session_id); if (res) { if (!z_policy_var_parse(res, "i", &action)) { /*LOG This message indicates that the returned value of the callback for the given response policy is invalid and Zorp aborts the connection. Check the callback function. */ z_proxy_log(self, SMTP_POLICY, 1, "The verdict returned by the policy is not an int; request='%s', response='%s'", self->request->str, self->response->str); action = SMTP_RSP_ABORT; } } else { action = SMTP_RSP_ABORT; } } z_policy_unlock(self->super.thread); break; default: action = SMTP_RSP_ABORT; break; } z_proxy_return(self, action); }