Pull to refresh

Comments 12

1. Отключите это немедленно! У вас же классическая SQL инъекция через POST.
2. Я много повидал говнокода вокруг битрикса, но чтобы дергали мускул через shell_exec это на черный пояс тянет. Покурите http://dev.1c-bitrix.ru/api_help/main/reference/cuser/getlist.php например.
3. Зачем вы два раза подключаете модуль im?
Затем что я админ и не знаю php. Совсем не знаю. Правда.
Поэтому я его слепил из того, что было и send_from_pbx.php закрыл nginx-ом для всех, кроме IP астериска.
Что закрыли хорошо, но не спасет, если пропущен звонок по сип транку (в него могут напихать что угодно в поле «звонящий», в том числе '; drop table users
В-общем, надо
как-то так
$dbr = CUser::GetList(($by="id"), "asc",["UF_PHONE_INNER" => $_POST["number"]);
while($user = $dbr->Fetch() {
 $to_user_id = $user["ID"];
// дальше как у вас
}


Плюсы:
1. Нет инъекций
2. Найдет и оповестит всех юзеров с данным номером (если например телефон общий на кабинет, а не на сотрудника)
3. На одного сотрудника можно будет повесить несколько номеров (личный плюс общий, или личный плюс телефон коллеги, пока тот в отпуске)
Ооо, спасибо! Сейчас опробую и, если у меня всё получится, поправлю статью.
2. Найдет и оповестит всех юзеров с данным номером (если например телефон общий на кабинет, а не на сотрудника)
3. На одного сотрудника можно будет повесить несколько номеров (личный плюс общий, или личный плюс телефон коллеги, пока тот в отпуске)

Битрикс так не умеет — нельзя несколько внутренних указать и нельзя один внутренний раздать нескольким сотрудникам.
Видимо, ограничения дефолтной установки битрикс 24 (сейчас под рукой нет посмотреть). Ну в общем ещё поле прикрутить не проблема (или заюзать тот же ADMIN_NOTES)
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

if (!(count($_POST) == 2) || !CModule::IncludeModule('iblock') || !CModule::IncludeModule('im')) {
    die('error');
}

$dbr = CUser::GetList(($by = "ID"), ($order = "ACS"), ["ACTIVE" => "Y", "UF_PHONE_INNER" => intval($_POST["number"])]);

while ($user = $dbr->Fetch()) {
    CIMMessenger::Add(array(
        "MESSAGE_TYPE" => "P", # P - private chat, G - group chat, S - notification
        "TO_USER_ID" => $user["ID"],
        "FROM_USER_ID" => 111,
        "MESSAGE" => $_POST['message'],
        "AUTHOR_ID" => 111,
        "EMAIL_TEMPLATE" => "some",
        "NOTIFY_TYPE" => 2,
        "NOTIFY_MODULE" => "main",
        "NOTIFY_EVENT" => "IM_GROUP_INVITE",
        "NOTIFY_TITLE" => "Пропущенный звонок",
    ));
}
Тут ещё выводится success / error по итогам. Тогда надо
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

if (!(count($_POST) == 2) || !CModule::IncludeModule('iblock') || !CModule::IncludeModule('im')) {
    die('error');
}

$dbr = CUser::GetList(($by = "ID"), ($order = "ASC"), ["ACTIVE" => "Y", "UF_PHONE_INNER" => intval($_POST["number"])]);
$count = 0; //счётчик отправленных сообщений
while ($user = $dbr->Fetch()) {
   if (CIMMessenger::Add(array(
        "MESSAGE_TYPE" => "P", # P - private chat, G - group chat, S - notification
        "TO_USER_ID" => $user["ID"],
        "FROM_USER_ID" => 111,
        "MESSAGE" => $_POST['message'],
        "AUTHOR_ID" => 111,
        "EMAIL_TEMPLATE" => "some",
        "NOTIFY_TYPE" => 2,
        "NOTIFY_MODULE" => "main",
        "NOTIFY_EVENT" => "IM_GROUP_INVITE",
        "NOTIFY_TITLE" => "Пропущенный звонок",
    ))) $count++;
}
 if(count)
    echo "success";
else
    echo "error";

да, но после отладки этим выводом можно пренебречь.
Но всё равно — отличные комментарии, спасибо ещё раз.
Спасибо, так гораздо лучше.
Sign up to leave a comment.

Articles