/* * checks if a request matches the parameters of a URL-Translation, e.g. whether or not * a user is allowed to use certain services. returns 0 if allowed, -1 if not. */ static int check_allowed_translation(URLTranslation *t, Octstr *smsc, Octstr *sender, Octstr *receiver, Octstr *account) { const int IS_ALLOWED = 0; const int NOT_ALLOWED = -1; /* if smsc_id set and accepted_smsc exist, accept * translation only if smsc id is in accept string */ if (smsc && t->accepted_smsc && !gwlist_search(t->accepted_smsc, smsc, octstr_item_match)) return NOT_ALLOWED; if (smsc && t->accepted_smsc_regex && gw_regex_match_pre( t->accepted_smsc_regex, smsc) == 0) return NOT_ALLOWED; /* if account_id set and accepted_account exist, accept * translation only if smsc id is in accept string */ if (account && t->accepted_account && !gwlist_search(t->accepted_account, account, octstr_item_match)) return NOT_ALLOWED; if (account && t->accepted_account_regex && gw_regex_match_pre( t->accepted_account_regex, account) == 0) return NOT_ALLOWED; /* Have allowed for sender */ if (t->allowed_prefix && !t->denied_prefix && does_prefix_match(t->allowed_prefix, sender) != 1) return NOT_ALLOWED; if (t->allowed_prefix_regex && !t->denied_prefix_regex && gw_regex_match_pre(t->allowed_prefix_regex, sender) == 0) return NOT_ALLOWED; /* Have denied for sender */ if (t->denied_prefix && !t->allowed_prefix && does_prefix_match(t->denied_prefix, sender) == 1) return NOT_ALLOWED; if (t->denied_prefix_regex && !t->allowed_prefix_regex && gw_regex_match_pre(t->denied_prefix_regex, sender) == 1) return NOT_ALLOWED; /* Have allowed for receiver */ if (t->allowed_recv_prefix && !t->denied_recv_prefix && does_prefix_match(t->allowed_recv_prefix, receiver) != 1) return NOT_ALLOWED; if (t->allowed_receiver_prefix_regex && !t->denied_receiver_prefix_regex && gw_regex_match_pre(t->allowed_receiver_prefix_regex, receiver) == 0) return NOT_ALLOWED; /* Have denied for receiver */ if (t->denied_recv_prefix && !t->allowed_recv_prefix && does_prefix_match(t->denied_recv_prefix, receiver) == 1) return NOT_ALLOWED; if (t->denied_receiver_prefix_regex && !t->allowed_receiver_prefix_regex && gw_regex_match_pre(t->denied_receiver_prefix_regex, receiver) == 0) return NOT_ALLOWED; if (t->white_list && numhash_find_number(t->white_list, sender) < 1) { return NOT_ALLOWED; } if (t->white_list_regex && gw_regex_match_pre(t->white_list_regex, sender) == 0) { return NOT_ALLOWED; } if (t->black_list && numhash_find_number(t->black_list, sender) == 1) { return NOT_ALLOWED; } if (t->black_list_regex && gw_regex_match_pre(t->black_list_regex, sender) == 1) { return NOT_ALLOWED; } /* Have allowed and denied */ if (t->denied_prefix && t->allowed_prefix && does_prefix_match(t->allowed_prefix, sender) != 1 && does_prefix_match(t->denied_prefix, sender) == 1) return NOT_ALLOWED; if (t->denied_prefix_regex && t->allowed_prefix_regex && gw_regex_match_pre(t->allowed_prefix_regex, sender) == 0 && gw_regex_match_pre(t->denied_prefix_regex, sender) == 1) return NOT_ALLOWED; return IS_ALLOWED; };
int smscconn_usable(SMSCConn *conn, Msg *msg) { gw_assert(conn != NULL); gw_assert(msg != NULL && msg_type(msg) == sms); if (conn->status == SMSCCONN_DEAD || conn->why_killed != SMSCCONN_ALIVE) return -1; /* if allowed-smsc-id set, then only allow this SMSC if message * smsc-id matches any of its allowed SMSCes */ if (conn->allowed_smsc_id && (msg->sms.smsc_id == NULL || gwlist_search(conn->allowed_smsc_id, msg->sms.smsc_id, octstr_item_match) == NULL)) { return -1; } /* ..if no allowed-smsc-id set but denied-smsc-id and message smsc-id * is set, deny message if smsc-ids match */ else if (conn->denied_smsc_id && msg->sms.smsc_id != NULL && gwlist_search(conn->denied_smsc_id, msg->sms.smsc_id, octstr_item_match) != NULL) { return -1; } if (conn->allowed_smsc_id_regex) { if (msg->sms.smsc_id == NULL) return -1; if (gw_regex_match_pre(conn->allowed_smsc_id_regex, msg->sms.smsc_id) == 0) return -1; } else if (conn->denied_smsc_id_regex && msg->sms.smsc_id != NULL) { if (gw_regex_match_pre(conn->denied_smsc_id_regex, msg->sms.smsc_id) == 1) return -1; } /* Have allowed */ if (conn->allowed_prefix && ! conn->denied_prefix && (does_prefix_match(conn->allowed_prefix, msg->sms.receiver) != 1)) return -1; if (conn->allowed_prefix_regex && ! conn->denied_prefix_regex) { if (gw_regex_match_pre(conn->allowed_prefix_regex, msg->sms.receiver) == 0) return -1; } /* Have denied */ if (conn->denied_prefix && ! conn->allowed_prefix && (does_prefix_match(conn->denied_prefix, msg->sms.receiver) == 1)) return -1; if (conn->denied_prefix_regex && ! conn->allowed_prefix_regex) { if (gw_regex_match_pre(conn->denied_prefix_regex, msg->sms.receiver) == 1) return -1; } /* Have allowed and denied */ if (conn->denied_prefix && conn->allowed_prefix && (does_prefix_match(conn->allowed_prefix, msg->sms.receiver) != 1) && (does_prefix_match(conn->denied_prefix, msg->sms.receiver) == 1) ) return -1; if (conn->allowed_prefix_regex && conn->denied_prefix_regex) { if (gw_regex_match_pre(conn->allowed_prefix_regex, msg->sms.receiver) == 0 && gw_regex_match_pre(conn->denied_prefix_regex, msg->sms.receiver) == 1) return -1; } /* then see if it is preferred one */ if (conn->preferred_smsc_id && msg->sms.smsc_id != NULL && gwlist_search(conn->preferred_smsc_id, msg->sms.smsc_id, octstr_item_match) != NULL) { return 1; } if (conn->preferred_prefix) if (does_prefix_match(conn->preferred_prefix, msg->sms.receiver) == 1) return 1; if (conn->preferred_prefix_regex && gw_regex_match_pre(conn->preferred_prefix_regex, msg->sms.receiver) == 1) { return 1; } return 0; }
/* * checks if a request matches the parameters of a URL-Translation, e.g. whether or not * a user is allowed to use certain services. returns 0 if allowed, -1 if not. * reject will be set to 1 is a number is rejected due to white/black-lists. */ static int check_allowed_translation(URLTranslation *t, Octstr *smsc, Octstr *sender, Octstr *receiver, int *reject) { const int IS_ALLOWED = 0; const int NOT_ALLOWED = -1; /* if smsc_id set and accepted_smsc exist, accept * translation only if smsc id is in accept string */ if (smsc && t->accepted_smsc) { if (!list_search(t->accepted_smsc, smsc, octstr_item_match)) return NOT_ALLOWED; }; if (smsc && t->accepted_smsc_regex) if (gw_regex_matches( t->accepted_smsc_regex, smsc) == NO_MATCH) return NOT_ALLOWED; /* Have allowed for sender */ if (t->allowed_prefix && ! t->denied_prefix && (does_prefix_match(t->allowed_prefix, sender) != 1)) return NOT_ALLOWED; if (t->allowed_prefix_regex && ! t->denied_prefix_regex) if (gw_regex_matches( t->allowed_prefix_regex, sender) == NO_MATCH) return NOT_ALLOWED; /* Have denied for sender */ if (t->denied_prefix && ! t->allowed_prefix && (does_prefix_match(t->denied_prefix, sender) == 1)) return NOT_ALLOWED; if (t->denied_prefix_regex && ! t->allowed_prefix_regex) if (gw_regex_matches( t->denied_prefix_regex, sender) == NO_MATCH) return NOT_ALLOWED; /* Have allowed for receiver */ if (t->allowed_recv_prefix && ! t->denied_recv_prefix && (does_prefix_match(t->allowed_recv_prefix, receiver) != 1)) return NOT_ALLOWED; if (t->allowed_receiver_prefix_regex && ! t->denied_receiver_prefix_regex) if (gw_regex_matches( t->allowed_receiver_prefix_regex, receiver) == NO_MATCH) return NOT_ALLOWED; /* Have denied for receiver */ if (t->denied_recv_prefix && ! t->allowed_recv_prefix && (does_prefix_match(t->denied_recv_prefix, receiver) == 1)) return NOT_ALLOWED; if (t->denied_receiver_prefix_regex && ! t->allowed_receiver_prefix_regex) if (gw_regex_matches( t->denied_receiver_prefix_regex, receiver) == NO_MATCH) return NOT_ALLOWED; if (t->white_list && numhash_find_number(t->white_list, sender) < 1) { *reject = 1; return NOT_ALLOWED; } if (t->white_list_regex) if (gw_regex_matches( t->white_list_regex, sender) == NO_MATCH) { *reject = 1; return NOT_ALLOWED; } if (t->black_list && numhash_find_number(t->black_list, sender) == 1) { *reject = 1; return NOT_ALLOWED; } if (t->black_list_regex) if (gw_regex_matches(t->black_list_regex, sender) == MATCH) { *reject = 1; return NOT_ALLOWED; } /* Have allowed and denied */ if (t->denied_prefix && t->allowed_prefix && (does_prefix_match(t->allowed_prefix, sender) != 1) && (does_prefix_match(t->denied_prefix, sender) == 1) ) return NOT_ALLOWED; if (t->denied_prefix_regex && t->allowed_prefix_regex && (gw_regex_matches(t->allowed_prefix_regex, sender) == NO_MATCH) && (gw_regex_matches(t->denied_prefix_regex, sender) == MATCH)) return NOT_ALLOWED; return IS_ALLOWED; };