Пример #1
0
/**
* Check Rule against Message Information
*/
function check_rule(&$rules, &$rule_row, &$message_row, $user_id)
{
    global $user, $config;
    if (!isset($rules[$rule_row['rule_check']][$rule_row['rule_connection']])) {
        return false;
    }
    $check_ary = $rules[$rule_row['rule_check']][$rule_row['rule_connection']];
    $result = false;
    $check0 = $message_row[$check_ary['check0']];
    switch ($rule_row['rule_connection']) {
        case RULE_IS_LIKE:
            $result = preg_match("/" . preg_quote($rule_row['rule_string'], '/') . '/i', $check0);
            break;
        case RULE_IS_NOT_LIKE:
            $result = !preg_match("/" . preg_quote($rule_row['rule_string'], '/') . '/i', $check0);
            break;
        case RULE_IS:
            $result = $check0 == $rule_row['rule_string'];
            break;
        case RULE_IS_NOT:
            $result = $check0 != $rule_row['rule_string'];
            break;
        case RULE_BEGINS_WITH:
            $result = preg_match("/^" . preg_quote($rule_row['rule_string'], '/') . '/i', $check0);
            break;
        case RULE_ENDS_WITH:
            $result = preg_match("/" . preg_quote($rule_row['rule_string'], '/') . '$/i', $check0);
            break;
        case RULE_IS_FRIEND:
        case RULE_IS_FOE:
        case RULE_ANSWERED:
        case RULE_FORWARDED:
            $result = $check0 == 1;
            break;
        case RULE_IS_USER:
            $result = $check0 == $rule_row['rule_user_id'];
            break;
        case RULE_IS_GROUP:
            $result = in_array($rule_row['rule_group_id'], $check0);
            break;
        case RULE_TO_GROUP:
            $result = in_array('g_' . $message_row[$check_ary['check2']], $check0) || in_array('g_' . $message_row[$check_ary['check2']], $message_row[$check_ary['check1']]);
            break;
        case RULE_TO_ME:
            $result = in_array('u_' . $user_id, $check0) || in_array('u_' . $user_id, $message_row[$check_ary['check1']]);
            break;
    }
    if (!$result) {
        return false;
    }
    switch ($rule_row['rule_action']) {
        case ACTION_PLACE_INTO_FOLDER:
            return array('action' => $rule_row['rule_action'], 'folder_id' => $rule_row['rule_folder_id']);
            break;
        case ACTION_MARK_AS_READ:
        case ACTION_MARK_AS_IMPORTANT:
            return array('action' => $rule_row['rule_action'], 'pm_unread' => $message_row['pm_unread'], 'pm_marked' => $message_row['pm_marked']);
            break;
        case ACTION_DELETE_MESSAGE:
            global $db, $auth;
            // Check for admins/mods - users are not allowed to remove those messages...
            // We do the check here to make sure the data we use is consistent
            $sql = 'SELECT user_id, user_type, user_permissions
				FROM ' . USERS_TABLE . '
				WHERE user_id = ' . (int) $message_row['author_id'];
            $result = $db->sql_query($sql);
            $userdata = $db->sql_fetchrow($result);
            $db->sql_freeresult($result);
            $auth2 = new \src\auth\auth();
            $auth2->acl($userdata);
            if (!$auth2->acl_get('a_') && !$auth2->acl_get('m_') && !$auth2->acl_getf_global('m_')) {
                return array('action' => $rule_row['rule_action'], 'pm_unread' => $message_row['pm_unread'], 'pm_marked' => $message_row['pm_marked']);
            }
            return false;
            break;
        default:
            return false;
    }
    return false;
}