コード例 #1
0
ファイル: NodeInfoFeed.cpp プロジェクト: Artanomell/schat
/*!
 * Переопределение проверки прав доступа.
 *
 * Этот фид использует права доступа фида FEED_ACL.
 */
bool NodeInfoFeed::can(Channel *channel, int acl) const
{
  if (!channel && acl != Acl::Read)
    return false;

  FeedPtr feed = m_header.channel()->feed(FEED_NAME_ACL, false, false);
  if (feed)
    return feed->can(channel, acl);

  return Feed::can(channel, acl);
}
コード例 #2
0
ファイル: FeedsCore.cpp プロジェクト: Artanomell/schat
/*!
 * Базовая функция совершения операции над фидом.
 *
 * \param channel Канал владелец фида.
 * \param method  Метод \sa Methods.
 * \param name    Имя фида с опциональным путём запроса.
 * \param sender  Канал создавший запрос.
 * \param json    Данные запроса.
 */
FeedReply FeedsCore::request(ServerChannel *channel, const QString &method, const QString &name, ServerChannel *sender, const QVariantMap &json)
{
  if (!channel || !sender)
    return Notice::InternalError;

  const QPair<QString, QString> split = FeedNotice::split(name);
  FeedPtr feed = channel->feed(split.first, false);
  if (!feed)
    return Notice::NotFound;

  FeedReply reply(Notice::InternalError);
  const int cmd    = methodToInt(method);
  FeedEvent *event = new FeedEvent(channel->id(), sender->id(), method);
  event->request   = json;
  event->name      = split.first;
  event->path      = split.second;
  event->date      = feed->head().date();

  if (!feed->can(sender, Acl::Read))
    return done(event, Notice::Forbidden);

  if (cmd != Get && !feed->can(sender, Acl::Write))
    return done(event, Notice::Forbidden);

  switch (cmd) {
    case Get:
      reply = feed->get(event->path, json, sender);
      break;

    case Post:
      reply = feed->post(event->path, json, sender);
      break;

    case Put:
      reply = feed->put(event->path, json, sender);
      break;

    case Delete:
      reply = feed->del(event->path, sender);
      break;
  }

  if (cmd != Get && reply.status == Notice::OK) {
    const int options = json.value(FEED_KEY_OPTIONS).toInt();
    event->diffTo     = event->date;
    event->date       = reply.date;

    if (reply.date)
      FeedStorage::save(feed, reply.date);

    if (options & Feed::Broadcast) {
      if (channel->type() == SimpleID::ServerId) {
        const QList<QByteArray> channels = m_self->m_subscription.value(event->name);
        QList<quint64> sockets;

        foreach (const QByteArray &id, channels) {
          ChatChannel user = Ch::channel(id, SimpleID::UserId, false);
          if (user)
            Sockets::merge(sockets, user->sockets());
        }

        event->broadcast = sockets;
      }
      else
        event->broadcast = Sockets::channel(channel);
    }