Пример #1
0
 public static function rpc_post_subscribe(Context $ctx)
 {
     $data = $ctx->post;
     if (empty($data['sections'])) {
         throw new InvalidArgumentException("Не выбраны разделы для подписки.");
     }
     if (false === strpos($data['email'], '@')) {
         throw new InvalidArgumentException(t('Введённый email не похож на email.'));
     }
     // В массиве могут быть и другие данные, поэтому мы
     // выбираем только то, что нам нужно завернуть.
     $bulk = array('email' => $data['email'], 'sections' => $data['sections']);
     $link = new url(array('args' => array('q' => 'subscription.rpc', 'action' => 'confirm', 'code' => base64_encode(serialize($bulk)))));
     $sections = Node::findXML(array('class' => 'tag', 'deleted' => 0, 'published' => 1, 'id' => $data['sections'], '#sort' => 'name'), $ctx->db, 'section');
     if (empty($sections)) {
         throw new InvalidArgumentException("Выбраны несуществующие разделы для подписки.");
     }
     $xml = html::em('message', array('mode' => 'confirm', 'host' => MCMS_HOST_NAME, 'email' => $data['email'], 'base' => $ctx->url()->getBase($ctx), 'confirmLink' => $link->string()), html::em('sections', $sections));
     $xsl = $ctx->config->get('modules/subscription/stylesheet', os::path('lib', 'modules', 'subscription', 'message.xsl'));
     if (false === ($body = xslt::transform($xml, $xsl, null))) {
         throw new RuntimeException(t('Возникла ошибка при форматировании почтового сообщения.'));
     }
     $subject = t('Подписка на новости сайта %host', array('%host' => MCMS_HOST_NAME));
     // mcms::debug($data['email'], $subject, $body);
     BebopMimeMail::send(null, $data['email'], $subject, $body);
 }
 /**
  * @mcms_message ru.molinos.cms.cron
  */
 public static function taskRun(Context $ctx)
 {
     $types = $ctx->config->get('modules/subscription/types', array());
     $xsl = $ctx->config->get('modules/subscription/stylesheet', os::path('lib', 'modules', 'subscription', 'message.xsl'));
     $sub = $ctx->config->get('modules/subscription/subject', 'Новости сайта %host');
     if (empty($types)) {
         return;
     }
     $ctx->db->beginTransaction();
     $users = Node::find(array('class' => 'subscription', 'deleted' => 0, 'published' => 1, '#sort' => 'name'), $ctx->db);
     // Обрабатываем активных пользователей.
     foreach ($users as $user) {
         $olast = $last = intval($user->last);
         if ($sections = (array) $user->tags) {
             list($sql, $params) = Query::build(array('class' => $types, 'tags' => $sections, 'published' => 1, 'deleted' => 0, 'id' => array('>' . ($olast + 1))))->getSelect(array('id', 'xml'));
             $nodes = $ctx->db->getResultsKV('id', 'xml', $sql, $params);
             // Отправляем документы.
             foreach ($nodes as $nid => $node) {
                 $xml = html::em('message', array('mode' => 'regular', 'unsubscribe' => 'subscription.rpc?action=remove&name=' . urlencode($user->name) . '&id=' . $user->id, 'base' => $ctx->url()->getBase($ctx), 'host' => MCMS_HOST_NAME), $node);
                 $body = xslt::transform($xml, $xsl, null);
                 $subject = t($sub, array('%host' => $ctx->url()->host()));
                 BebopMimeMail::send(null, $user->name, $subject, $body);
                 $last = max($last, $nid);
             }
             // Запоминаем последнее отправленное сообщение.
             $user->last = $last;
             $user->save();
         }
     }
     $ctx->db->commit();
 }
Пример #3
0
 protected function sendEmail($to, $mode)
 {
     if (empty($to)) {
         Logger::log($mode . ' not sent: email not found', 'cart');
         return;
     }
     if (!($xslt = Context::last()->config->get("modules/cart/{$mode}_templates"))) {
         Logger::log($mode . ' not sent: XSLT file not set', 'cart');
         return;
     }
     if ($html = xslt::process($this->getXML(), $xslt)) {
         $subject = t('Заказ на %host', array('%host' => MCMS_HOST_NAME));
         BebopMimeMail::send(null, $to, $subject, $html);
     }
 }
Пример #4
0
 /**
  * @mcms_message ru.molinos.cms.hook.node
  */
 public static function hookNodeUpdate(Context $ctx, Node $node, $op)
 {
     $config = $ctx->config->get('modules/moderator');
     if (!empty($config['skip_types']) and in_array($node->class, $config['skip_types'])) {
         return;
     }
     // Некоторые известные типы не модерируем.
     if (in_array($node->class, array('domain', 'widget', 'user', 'group', 'field', 'cronstats'))) {
         return;
     }
     // Пользователь сам себе публикатор.
     if ($ctx->user->hasAccess(ACL::PUBLISH, $node->class)) {
         return;
     }
     switch ($op) {
         case 'update':
             $prepend = 'Пользователь %user <strong>изменил</strong> документ типа «%type»:';
             break;
         case 'create':
             $prepend = 'Пользователь %user <strong>создал</strong> документ типа «%type»:';
             break;
         case 'delete':
             $prepend = 'Пользователь %user <strong>удалил</strong> (в корзину) документ типа «%type»:';
             break;
         case 'restore':
             $prepend = 'Пользователь %user <strong>восстановил из корзины</strong> документ типа «%type»:';
             break;
         case 'publish':
             $prepend = 'Пользователь %user просит <strong>опубликовать</strong> документ типа «%type»:';
             $node->onSave("UPDATE `node` SET `published` = 0 WHERE `id` = %ID%");
             break;
         case 'unpublish':
             $prepend = 'Пользователь %user просит <strong>скрыть</strong> документ типа «%type»:';
             $node->onSave("UPDATE `node` SET `published` = 1 WHERE `id` = %ID%");
             break;
         default:
             return;
     }
     $user = $ctx->user->getNode();
     $body = '<p>' . t($prepend, array('%user' => $user ? $user->getName() : null, '%type' => isset($schema['title']) ? $schema['title'] : $node->class)) . '</p>' . self::getNodeBody($node);
     if (count($to = self::getRecipients($ctx))) {
         $rc = BebopMimeMail::send(null, $to, t('Редакторская активность на сайте %site', array('%site' => MCMS_HOST_NAME)), $body);
     }
 }
Пример #5
0
 /**
  * @mcms_message ru.molinos.cms.cron
  */
 public static function taskRun(Context $ctx)
 {
     $parts = array();
     if (null !== ($message = self::checkAccessRights($ctx))) {
         $parts[] = $message;
     }
     if (class_exists('UpdateMenu') and $message = UpdateMenu::getMessage()) {
         $parts[] = $message;
     }
     if (null !== ($message = self::checkDbAccess($ctx))) {
         $parts[] = $message;
     }
     if (!empty($parts) and $email = self::getEmail($ctx)) {
         $subject = t('Отчёт о состоянии %host', array('%host' => MCMS_HOST_NAME));
         $body = t('<p>Анализ сайта %host выявил следующие аномалии:</p>!list<p>!signature</p>', array('%host' => MCMS_HOST_NAME, '!list' => '<ol><li>' . join('</li><li>', $parts) . '</li></ol>', '!signature' => mcms::getSignature()));
         if (!BebopMimeMail::send(null, $email, $subject, $body)) {
             throw new RuntimeException(t('Не удалось отправить почту администратору сайта.'));
         }
     }
 }
Пример #6
0
 /**
  * Восстановление пароля.
  * 
  * @param Context $ctx 
  * @param array $params 
  * @return void
  * @mcms_message ru.molinos.cms.auth.process.basicpw
  */
 public static function on_register(Context $ctx, array $params)
 {
     if (false === strpos($params['email'], '@')) {
         throw new BadRequestException(t('Неверно введён почтовый адрес.'));
     }
     $node = Node::load(array('class' => 'user', 'name' => $params['email']));
     if ($node->deleted) {
         throw new ForbiddenException(t('Этот пользователь был удалён.'));
     } elseif (!$node->published) {
         throw new ForbiddenException(t('Этот пользователь заблокирован.'));
     }
     $salt = md5($_SERVER['REMOTE_ADDR'] . microtime(true) . $node->name . rand());
     $node->otp = $salt;
     $ctx->db->beginTransaction();
     $node->save();
     $ctx->db->commit();
     $xml = html::em('request', array('email' => $node->name, 'host' => MCMS_HOST_NAME, 'base' => $ctx->url()->getBase($ctx), 'link' => 'authbasic/restore.rpc?email=' . urlencode($node->name) . '&otp=' . urlencode($salt)));
     $xsl = $ctx->config->get('modules/authbasic/restoretpl', os::path('lib', 'modules', 'authbasic', 'restore.xsl'));
     $html = xslt::transform($xml, $xsl, null);
     BebopMimeMail::send(null, $node->name, t('Восстановление пароля'), $html);
 }
Пример #7
0
 public function save()
 {
     if (empty($this->id)) {
         try {
             $dst = Node::load(array('class' => 'user', 'id' => $this->re));
             if (!empty($dst->email)) {
                 $email = $dst->email;
             } elseif (false !== strstr($dst->name, '@')) {
                 $email = $dst->name;
             }
             if (!empty($email) and class_exists('BebopMimeMail')) {
                 BebopMimeMail::send(null, $email, $this->name, $this->text);
                 $this->data['sent'] = 1;
             }
             // Сохраняем в базе только если пользователь найден.
             // Чтобы можно было спокойно вызывать mcms::mail() для
             // любых объектов, не парясь с проверкой на class=user.
             return parent::save();
         } catch (ObjectNotFoundException $e) {
         }
     }
 }
Пример #8
0
 /**
  * Отправляет сообщение об ошибке куда следует.
  */
 private static function send_error($message = "undefined", $extra = null)
 {
     Logger::trace($message);
     if (class_exists('BebopMimeMail')) {
         $message = wordwrap(strip_tags($message), 75, "\n         ");
         $referer = empty($_SERVER['HTTP_REFERER']) ? null : "Referer: {$_SERVER['HTTP_REFERER']}\n";
         $subject = "Error at " . MCMS_HOST_NAME;
         $content = "<pre>Message: {$message}\nMethod:  {$_SERVER['REQUEST_METHOD']}\n" . "URL:     http://" . MCMS_HOST_NAME . MCMS_REQUEST_URI . "\n{$extra}\n{$referer}" . "Backtrace follows.\n\n" . Logger::backtrace() . '</pre>';
         BebopMimeMail::send(null, Context::last()->config->get('main/errors/mail'), $subject, $content);
     }
 }