/*! * Переопределение проверки прав доступа. * * Этот фид использует права доступа фида 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); }
/*! * Базовая функция совершения операции над фидом. * * \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); }