Receive client's request at each thread 22/275822/4
authorIlho Kim <ilho159.kim@samsung.com>
Thu, 2 Jun 2022 07:21:44 +0000 (16:21 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Fri, 3 Jun 2022 04:12:17 +0000 (13:12 +0900)
Currently, pkginfo-server read each request in the main thread
but if some client sends the request slowly,
there is a possibility that the main thread is blocked

Change-Id: I7cdd27a5c81d2badd6885c2251390eb4ab5d8fcd
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
33 files changed:
src/client/pkginfo_client.cc
src/client/pkginfo_client.hh
src/server/create_cache_request.cc
src/server/create_cache_request.hh
src/server/cynara_checker/cynara_checker.cc
src/server/cynara_checker/cynara_checker.hh
src/server/pkg_request.cc
src/server/pkg_request.hh
src/server/request_handler/abstract_request_handler.hh
src/server/request_handler/command_request_handler.cc
src/server/request_handler/command_request_handler.hh
src/server/request_handler/create_cache_request_handler.cc
src/server/request_handler/create_cache_request_handler.hh
src/server/request_handler/create_db_request_handler.cc
src/server/request_handler/create_db_request_handler.hh
src/server/request_handler/get_appinfo_request_handler.cc
src/server/request_handler/get_appinfo_request_handler.hh
src/server/request_handler/get_cert_request_handler.cc
src/server/request_handler/get_cert_request_handler.hh
src/server/request_handler/get_depinfo_request_handler.cc
src/server/request_handler/get_depinfo_request_handler.hh
src/server/request_handler/get_pkginfo_request_handler.cc
src/server/request_handler/get_pkginfo_request_handler.hh
src/server/request_handler/query_request_handler.cc
src/server/request_handler/query_request_handler.hh
src/server/request_handler/request_handler_direct_access.cc
src/server/request_handler/request_handler_direct_access.h
src/server/request_handler/set_cert_request_handler.cc
src/server/request_handler/set_cert_request_handler.hh
src/server/request_handler/set_pkginfo_request_handler.cc
src/server/request_handler/set_pkginfo_request_handler.hh
src/server/runner.cc
src/server/worker_thread.cc

index 43ad8ff..f552f3c 100644 (file)
@@ -45,22 +45,30 @@ bool PkgInfoClient::SendRequest() {
     return false;
   }
 
+  tizen_base::Parcel p;
+  p.WriteParcelable(*parcel_.get());
+  const auto& raw = p.GetRaw();
+  int len = raw.size();
+
   // CREATE_DB request type need to be executed directly by the caller
   if (req_type_ == pkgmgr_common::ReqType::CREATE_DB) {
     is_offline_ = true;
-    return RequestHandlerDirectAccess();
+    return RequestHandlerDirectAccess(p.GetRaw());
   }
 
   if (!check_server.IsReady()) {
     LOG(WARNING) << "Server is not ready, try to direct access";
     is_offline_ = true;
-    return RequestHandlerDirectAccess();
+    return RequestHandlerDirectAccess(p.GetRaw());
   }
 
+  LOG(WARNING) << "Try to send request, Request type: "
+      << pkgmgr_common::ReqTypeToString(req_type_);
+
   if (!socket_->Connect()) {
     LOG(ERROR) << "Failed to connect client socket, try to direct access";
     is_offline_ = true;
-    return RequestHandlerDirectAccess();
+    return RequestHandlerDirectAccess(p.GetRaw());
   }
 
   if (socket_->SendData(&req_type_, sizeof(req_type_)) != 0) {
@@ -68,11 +76,6 @@ bool PkgInfoClient::SendRequest() {
     return false;
   }
 
-  tizen_base::Parcel p;
-  p.WriteParcelable(*parcel_.get());
-  const auto& raw = p.GetRaw();
-  int len = raw.size();
-
   if (socket_->SendData(&len, sizeof(len)) != 0) {
     LOG(ERROR) << "fail to send data";
     return false;
@@ -121,13 +124,10 @@ PkgInfoClient::GetResultParcel() {
   return res;
 }
 
-bool PkgInfoClient::RequestHandlerDirectAccess() {
-  tizen_base::Parcel p;
-  p.WriteParcelable(*parcel_.get());
-  std::vector<uint8_t> raw = p.GetRaw();
-
+bool PkgInfoClient::RequestHandlerDirectAccess(
+    const std::vector<uint8_t>& raw) {
   static void* handle = nullptr;
-  static void* (*dl_func)(int, unsigned char*, int, const char *);
+  static void* (*dl_func)(int, const unsigned char*, int, const char *);
 
   if (handle == nullptr) {
     handle = dlopen(LIBPKGMGR_INFO, RTLD_GLOBAL | RTLD_LAZY);
@@ -137,7 +137,7 @@ bool PkgInfoClient::RequestHandlerDirectAccess() {
       return false;
     }
     dl_func = reinterpret_cast<void* (*)(
-        int, unsigned char*, int, const char *)>(
+        int, const unsigned char*, int, const char *)>(
             dlsym(handle, DIRECT_ACCESS_FUNC));
     if (dl_func == nullptr) {
       LOG(ERROR) << "cannot find " << DIRECT_ACCESS_FUNC << " symbol in "
index d874e8c..e0634ba 100644 (file)
@@ -23,7 +23,7 @@ class PkgInfoClient {
   std::shared_ptr<pkgmgr_common::parcel::AbstractParcelable> GetResultParcel();
 
  private:
-  bool RequestHandlerDirectAccess();
+  bool RequestHandlerDirectAccess(const std::vector<uint8_t>& raw);
 
   std::shared_ptr<pkgmgr_common::parcel::AbstractParcelable> parcel_;
   std::shared_ptr<pkgmgr_common::parcel::AbstractParcelable> result_parcel_;
index 43bef9e..2ad143a 100644 (file)
@@ -21,7 +21,7 @@
 
 namespace pkgmgr_server {
 
-unsigned char* CreateCacheRequest::GetData() {
+const unsigned char* CreateCacheRequest::GetData() {
   return nullptr;
 }
 
@@ -45,4 +45,8 @@ bool CreateCacheRequest::SendData(unsigned char* data, int size) {
   return true;
 }
 
+bool CreateCacheRequest::GetPrivilegeChecked() {
+  return true;
+}
+
 }  // namespace pkgmgr_server
index a428f4e..88e6372 100644 (file)
@@ -31,12 +31,13 @@ namespace pkgmgr_server {
 class EXPORT_API CreateCacheRequest : public PkgRequest {
  public:
   CreateCacheRequest(uid_t uid) : uid_(uid) {}
-  unsigned char* GetData() override;
+  const unsigned char* GetData() override;
   int GetSize() override;
   pid_t GetSenderPID() override;
   uid_t GetSenderUID() override;
   pkgmgr_common::ReqType GetRequestType() override;
   bool SendData(unsigned char* data, int size) override;
+  bool GetPrivilegeChecked() override;
 
  private:
   uid_t uid_;
index 7fdc588..e100594 100644 (file)
@@ -50,7 +50,7 @@ CynaraChecker& CynaraChecker::GetInst() {
 
 void CynaraChecker::ReplyCb(cynara_check_id id, cynara_async_call_cause cause,
     int resp, void* data) {
-  auto runner = static_cast<Runner*>(data);
+  auto worker_thread = static_cast<WorkerThread*>(data);
   auto& inst = CynaraChecker::GetInst();
   switch (cause) {
   case CYNARA_CALL_CAUSE_ANSWER: {
@@ -64,7 +64,8 @@ void CynaraChecker::ReplyCb(cynara_check_id id, cynara_async_call_cause cause,
     }
 
     LOG(DEBUG) << "Allowed request";
-    runner->QueueRequest(it->second);
+    it->second->SetPrivilegeChecked(true);
+    worker_thread->PushQueue(it->second);
     inst.cynara_id_map_.erase(it);
 
     break;
@@ -112,21 +113,21 @@ void CynaraChecker::StatusCb(int old_fd, int new_fd,
   }
 }
 
-void CynaraChecker::CheckPrivilege(Runner* runner,
+bool CynaraChecker::CheckPrivilege(WorkerThread* worker_thread,
     const std::shared_ptr<PkgRequest>& req,
     const std::vector<std::string>& privileges) {
   if (privileges.empty() || req->GetSenderUID() < REGULAR_USER) {
     LOG(DEBUG) << "Allowed request";
-    runner->QueueRequest(req);
-    return;
+    return true;
   }
 
+  std::unique_lock<std::mutex> u(lock_);
   int ret;
   if (cynara_ == nullptr) {
     ret = cynara_async_initialize(&cynara_, nullptr, StatusCb, nullptr);
     if (ret != CYNARA_API_SUCCESS) {
       LOG(ERROR) << "Failed to initialize cynara_";
-      return;
+      return false;
     }
   }
 
@@ -135,7 +136,7 @@ void CynaraChecker::CheckPrivilege(Runner* runner,
       &smack_label);
   if (ret != CYNARA_API_SUCCESS) {
     LOG(ERROR) << "Failed to get smack label";
-    return;
+    return false;
   }
 
   std::unique_ptr<char, decltype(std::free)*> lblPtr(smack_label, std::free);
@@ -143,7 +144,7 @@ void CynaraChecker::CheckPrivilege(Runner* runner,
   if (session == nullptr) {
     LOG(ERROR) << "Failed to get client session for pid:"
         << req->GetSenderPID();
-    return;
+    return false;
   }
 
   std::unique_ptr<char, decltype(std::free)*> sessPtr(session, std::free);
@@ -152,12 +153,14 @@ void CynaraChecker::CheckPrivilege(Runner* runner,
   for (auto& priv : privileges) {
     ret = cynara_async_create_request(cynara_, smack_label, session,
         std::to_string(req->GetSenderUID()).c_str(), priv.c_str(),
-        &id, ReplyCb, runner);
+        &id, ReplyCb, worker_thread);
     if (check == false) {
       cynara_id_map_[id] = req;
       check = true;
     }
   }
+
+  return false;
 }
 
 }  // namespace pkgmgr_server
index 98bc3ea..5a7ddc5 100644 (file)
 #include <glib.h>
 #include <cynara-client-async.h>
 
+#include <mutex>
 #include <string>
 #include <unordered_map>
 #include <vector>
 
 #include "pkg_request.hh"
-#include "runner.hh"
+#include "worker_thread.hh"
 
 namespace pkgmgr_server {
 
@@ -38,7 +39,7 @@ class EXPORT_API CynaraChecker {
   static CynaraChecker& GetInst();
   void Init();
   void Fini();
-  void CheckPrivilege(Runner* runner,
+  bool CheckPrivilege(WorkerThread* worker_thread,
       const std::shared_ptr<PkgRequest>& req,
       const std::vector<std::string>& privileges);
 
@@ -55,6 +56,7 @@ class EXPORT_API CynaraChecker {
   cynara_async* cynara_ = nullptr;
   guint cynara_sid_ = 0;
   std::unordered_map<cynara_check_id, std::shared_ptr<PkgRequest>> cynara_id_map_;
+  std::mutex lock_;
 };
 
 }  // namespace pkgmgr_server
index 41b7a59..e018219 100644 (file)
 namespace pkgmgr_server {
 
 PkgRequest::PkgRequest()
-    : request_type_(pkgmgr_common::REQ_TYPE_NONE), data_size_(-1) {}
+    : request_type_(pkgmgr_common::REQ_TYPE_NONE), data_size_(-1),
+        privilege_checked_(false) {}
 
 PkgRequest::PkgRequest(int fd)
-    : request_type_(pkgmgr_common::REQ_TYPE_NONE), data_size_(-1) {
+    : request_type_(pkgmgr_common::REQ_TYPE_NONE), data_size_(-1),
+        privilege_checked_(false) {
   socket_ = std::unique_ptr<pkgmgr_common::socket::DataSocket>(
       new (std::nothrow) pkgmgr_common::socket::DataSocket(fd));
   if (socket_ == nullptr)
@@ -38,7 +40,7 @@ PkgRequest::~PkgRequest() {
     delete[] data_;
 }
 
-unsigned char* PkgRequest::GetData() {
+const unsigned char* PkgRequest::GetData() {
   return data_;
 }
 
@@ -105,4 +107,12 @@ bool PkgRequest::SendData(unsigned char* data, int size) {
   return (socket_->SendData(data, size) == 0);
 }
 
+bool PkgRequest::GetPrivilegeChecked() {
+  return privilege_checked_;
+}
+
+void PkgRequest::SetPrivilegeChecked(bool checked) {
+  privilege_checked_ = checked;
+}
+
 }  // namespace pkgmgr_server
index 083b8e3..c0ce81e 100644 (file)
@@ -39,18 +39,21 @@ class EXPORT_API PkgRequest {
   int GetFd();
   bool ReceiveData();
 
-  virtual unsigned char* GetData();
+  virtual const unsigned char* GetData();
   virtual int GetSize();
   virtual pid_t GetSenderPID();
   virtual uid_t GetSenderUID();
   virtual pkgmgr_common::ReqType GetRequestType();
   virtual bool SendData(unsigned char* data, int size);
+  virtual bool GetPrivilegeChecked();
+  virtual void SetPrivilegeChecked(bool cheked);
 
  private:
   std::unique_ptr<pkgmgr_common::socket::DataSocket> socket_;
   unsigned char* data_ = nullptr;
   pkgmgr_common::ReqType request_type_;
   int data_size_;
+  bool privilege_checked_;
 };
 
 }  // namespace pkgmgr_server
index 83da0fc..ce3ca7f 100644 (file)
@@ -21,7 +21,7 @@ namespace request_handler {
 class EXPORT_API AbstractRequestHandler {
  public:
   virtual ~AbstractRequestHandler() = default;
-  virtual bool HandleRequest(unsigned char* data, int size,
+  virtual bool HandleRequest(const unsigned char* data, int size,
       const std::string& locale) = 0;
 
   virtual std::vector<uint8_t> ExtractResult() = 0;
index 0fe00ab..c5a4320 100644 (file)
@@ -20,7 +20,7 @@ namespace pcp = pkgmgr_common::parcel;
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool CommandRequestHandler::HandleRequest(unsigned char* data, int size,
+bool CommandRequestHandler::HandleRequest(const unsigned char* data, int size,
                                              const std::string& locale) {
   auto abstract_parcel =
       pcp::ParcelableFactory::GetInst().CreateParcel(data, size);
index aa4cb4b..c50daee 100644 (file)
@@ -20,7 +20,7 @@ namespace request_handler {
 
 class EXPORT_API CommandRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(unsigned char* data, int size,
+  bool HandleRequest(const unsigned char* data, int size,
       const std::string& locale) override;
 
   std::vector<uint8_t> ExtractResult() override;
index 7193ae6..e83adaa 100644 (file)
@@ -70,7 +70,7 @@ int CreateCacheRequestHandler::Scheduler::Set(int policy,
 CreateCacheRequestHandler::CreateCacheRequestHandler(): scheduler_(gettid()) {
 }
 
-bool CreateCacheRequestHandler::HandleRequest(unsigned char* data, int size,
+bool CreateCacheRequestHandler::HandleRequest(const unsigned char* data, int size,
                                             const std::string& locale) {
   psd::CacheDBHandler db(GetUID(), GetPID());
   db.SetLocale(locale);
index cee35c0..66d5bbd 100644 (file)
@@ -20,7 +20,7 @@ namespace request_handler {
 class EXPORT_API CreateCacheRequestHandler : public AbstractRequestHandler {
  public:
   CreateCacheRequestHandler();
-  bool HandleRequest(unsigned char* data, int size,
+  bool HandleRequest(const unsigned char* data, int size,
       const std::string& locale) override;
   std::vector<uint8_t> ExtractResult() override;
 
index 5cbd424..94b141c 100644 (file)
@@ -22,7 +22,7 @@ namespace psd = pkgmgr_server::database;
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool CreateDBRequestHandler::HandleRequest(unsigned char* data, int size,
+bool CreateDBRequestHandler::HandleRequest(const unsigned char* data, int size,
                                            const std::string& locale) {
   auto abstract_parcel =
       pcp::ParcelableFactory::GetInst().CreateParcel(data, size);
index ff1c50a..b11fd51 100644 (file)
@@ -19,7 +19,7 @@ namespace request_handler {
 
 class EXPORT_API CreateDBRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(unsigned char* data, int size,
+  bool HandleRequest(const unsigned char* data, int size,
       const std::string& locale) override;
 
   std::vector<uint8_t> ExtractResult() override;
index e26069f..fae88c3 100644 (file)
@@ -18,8 +18,8 @@ namespace psd = pkgmgr_server::database;
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool GetAppinfoRequestHandler::HandleRequest(unsigned char* data, int size,
-                                             const std::string& locale) {
+bool GetAppinfoRequestHandler::HandleRequest(const unsigned char* data,
+    int size, const std::string& locale) {
   auto abstract_parcel =
       pcp::ParcelableFactory::GetInst().CreateParcel(data, size);
 
index 0110e36..d5fbb40 100644 (file)
@@ -19,7 +19,7 @@ namespace request_handler {
 
 class EXPORT_API GetAppinfoRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(unsigned char *data, int size,
+  bool HandleRequest(const unsigned char* data, int size,
       const std::string &locale) override;
 
   std::vector<uint8_t> ExtractResult() override;
index cbad2c9..fa405f5 100644 (file)
@@ -18,7 +18,7 @@ namespace psd = pkgmgr_server::database;
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool GetCertRequestHandler::HandleRequest(unsigned char* data, int size,
+bool GetCertRequestHandler::HandleRequest(const unsigned char* data, int size,
                                           const std::string& locale) {
   auto abstract_parcel =
       pcp::ParcelableFactory::GetInst().CreateParcel(data, size);
index 4f9d9af..1d867f0 100644 (file)
@@ -19,7 +19,7 @@ namespace request_handler {
 
 class EXPORT_API GetCertRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(unsigned char* data, int size,
+  bool HandleRequest(const unsigned char* data, int size,
       const std::string& locale) override;
 
   std::vector<uint8_t> ExtractResult() override;
index be7480c..313a78d 100644 (file)
@@ -19,7 +19,7 @@ namespace psd = pkgmgr_server::database;
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool GetDepinfoRequestHandler::HandleRequest(unsigned char* data, int size,
+bool GetDepinfoRequestHandler::HandleRequest(const unsigned char* data, int size,
                                              const std::string& locale) {
   auto abstract_parcel =
       pcp::ParcelableFactory::GetInst().CreateParcel(data, size);
index 44bb7a9..bd44dc2 100644 (file)
@@ -19,7 +19,7 @@ namespace request_handler {
 
 class EXPORT_API GetDepinfoRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(unsigned char* data, int size,
+  bool HandleRequest(const unsigned char* data, int size,
       const std::string& locale) override;
 
   std::vector<uint8_t> ExtractResult() override;
index acd9f67..60b6016 100644 (file)
@@ -19,8 +19,8 @@ namespace psd = pkgmgr_server::database;
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool GetPkginfoRequestHandler::HandleRequest(unsigned char* data, int size,
-    const std::string& locale) {
+bool GetPkginfoRequestHandler::HandleRequest(const unsigned char* data,
+    int size, const std::string& locale) {
   auto abstract_parcel =
       pcp::ParcelableFactory::GetInst().CreateParcel(data, size);
 
index 0bf022f..a930dde 100644 (file)
@@ -19,7 +19,7 @@ namespace request_handler {
 
 class EXPORT_API GetPkginfoRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(unsigned char* data, int size,
+  bool HandleRequest(const unsigned char* data, int size,
       const std::string& locale) override;
 
   std::vector<uint8_t> ExtractResult() override;
index f7dbc19..4a2474d 100644 (file)
@@ -19,7 +19,7 @@ namespace psd = pkgmgr_server::database;
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool QueryRequestHandler::HandleRequest(unsigned char* data, int size,
+bool QueryRequestHandler::HandleRequest(const unsigned char* data, int size,
                                         const std::string& locale) {
   auto abstract_parcel =
       pcp::ParcelableFactory::GetInst().CreateParcel(data, size);
index 7d6d267..9ee9a6c 100644 (file)
@@ -20,7 +20,7 @@ namespace request_handler {
 
 class EXPORT_API QueryRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(unsigned char* data, int size,
+  bool HandleRequest(const unsigned char* data, int size,
       const std::string& locale) override;
 
   std::vector<uint8_t> ExtractResult() override;
index cfdf403..5d0c6a9 100644 (file)
@@ -36,7 +36,7 @@
 #define EXPORT_API __attribute__((visibility("default")))
 
 extern "C" EXPORT_API void* _request_handler_direct_access(int req_type,
-    unsigned char* data, int size, const char *locale) {
+    const unsigned char* data, int size, const char *locale) {
   if (data == nullptr || size < 0 || locale == nullptr) {
     LOG(ERROR) << "Invalid parameter";
     return nullptr;
index e7c2c0e..3c82542 100644 (file)
@@ -21,7 +21,7 @@
 extern "C" {
 #endif
 
-void *_request_handler_direct_access(int req_type, unsigned char* data,
+void *_request_handler_direct_access(int req_type, const unsigned char* data,
                int size, const char *locale);
 
 #ifdef __cplusplus
index 6c105f7..f8ae5c4 100644 (file)
@@ -19,7 +19,7 @@ namespace psd = pkgmgr_server::database;
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool SetCertRequestHandler::HandleRequest(unsigned char* data, int size,
+bool SetCertRequestHandler::HandleRequest(const unsigned char* data, int size,
                                           const std::string& locale) {
   auto abstract_parcel =
       pcp::ParcelableFactory::GetInst().CreateParcel(data, size);
index 828b3de..4ece595 100644 (file)
@@ -21,7 +21,7 @@ class EXPORT_API SetCertRequestHandler : public AbstractRequestHandler {
  public:
   SetCertRequestHandler(bool is_offline = false) :
       AbstractRequestHandler(), is_offline_(is_offline) {}
-  bool HandleRequest(unsigned char* data, int size,
+  bool HandleRequest(const unsigned char* data, int size,
       const std::string& locale) override;
 
   std::vector<uint8_t> ExtractResult() override;
index d8dd915..01813ea 100644 (file)
@@ -21,8 +21,8 @@ namespace psd = pkgmgr_server::database;
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool SetPkginfoRequestHandler::HandleRequest(unsigned char* data, int size,
-                                             const std::string& locale) {
+bool SetPkginfoRequestHandler::HandleRequest(const unsigned char* data,
+    int size, const std::string& locale) {
   auto abstract_parcel =
       pcp::ParcelableFactory::GetInst().CreateParcel(data, size);
 
index 94aa5a4..eb61340 100644 (file)
@@ -21,7 +21,7 @@ class EXPORT_API SetPkginfoRequestHandler : public AbstractRequestHandler {
  public:
   SetPkginfoRequestHandler(bool is_offline = false) :
       AbstractRequestHandler(), is_offline_(is_offline) {}
-  bool HandleRequest(unsigned char* data, int size,
+  bool HandleRequest(const unsigned char* data, int size,
       const std::string& locale) override;
 
   std::vector<uint8_t> ExtractResult() override;
index b9fab8d..03b5be4 100644 (file)
@@ -21,8 +21,6 @@
 
 #include <algorithm>
 #include <string>
-#include <unordered_map>
-#include <vector>
 
 #include "cache_flag.hh"
 #include "create_cache_request.hh"
@@ -46,16 +44,6 @@ static const std::string SOCK_PATH = "/run/pkgmgr-info-server";
 const char PRIVILEGE_PACKAGE_MANAGER_ADMIN[] =
     "http://tizen.org/privilege/packagemanager.admin";
 
-std::vector<std::string> GetPrivileges(pkgmgr_common::ReqType type) {
-  std::vector<std::string> ret;
-  if (type == pkgmgr_common::SET_CERT_INFO)
-    ret.emplace_back(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
-  else if (type == pkgmgr_common::SET_PKG_INFO)
-    ret.emplace_back(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
-
-  return ret;
-}
-
 }  // namespace
 
 Runner::Runner(unsigned int thread_num) {
@@ -100,15 +88,12 @@ int Runner::OnReceiveRequest(int fd, GIOCondition cond, void* user_data) {
   }
 
   auto req = std::make_shared<PkgRequest>(client_fd);
-  if (req->ReceiveData()) {
-    pkgmgr_common::ReqType type = req->GetRequestType();
-    if (CacheFlag::SetPreparing()) {
-      runner->QueueRequest(
-          std::make_shared<CreateCacheRequest>(req->GetSenderUID()));
-    }
-    std::vector<std::string>&& privileges = GetPrivileges(type);
-    CynaraChecker::GetInst().CheckPrivilege(runner, req, privileges);
+
+  if (CacheFlag::SetPreparing()) {
+    runner->QueueRequest(
+        std::make_shared<CreateCacheRequest>(req->GetSenderUID()));
   }
+  runner->QueueRequest(std::move(req));
 
   return G_SOURCE_CONTINUE;
 }
index 34a4e6d..a80bb6d 100644 (file)
@@ -23,6 +23,7 @@
 #include <tzplatform_config.h>
 
 #include "abstract_parcelable.hh"
+#include "cynara_checker.hh"
 #include "request_handler_factory.hh"
 #include "server/database/db_handle_provider.hh"
 #include "utils/logging.hh"
@@ -56,6 +57,19 @@ uid_t ConvertUID(uid_t uid) {
     return uid;
 }
 
+const char PRIVILEGE_PACKAGE_MANAGER_ADMIN[] =
+    "http://tizen.org/privilege/packagemanager.admin";
+
+std::vector<std::string> GetPrivileges(pkgmgr_common::ReqType type) {
+  std::vector<std::string> ret;
+  if (type == pkgmgr_common::SET_CERT_INFO)
+    ret.emplace_back(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
+  else if (type == pkgmgr_common::SET_PKG_INFO)
+    ret.emplace_back(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
+
+  return ret;
+}
+
 }  // namespace
 
 namespace pkgmgr_server {
@@ -105,6 +119,18 @@ void WorkerThread::Run() {
     if (req == nullptr)
       return;
 
+    if (!req->GetPrivilegeChecked()) {
+      if (!req->ReceiveData()) {
+        LOG(ERROR) << "Fail to receive data";
+        continue;
+      }
+
+      pkgmgr_common::ReqType type = req->GetRequestType();
+      std::vector<std::string> privileges = GetPrivileges(type);
+      if (!CynaraChecker::GetInst().CheckPrivilege(this, req, privileges))
+        continue;
+    }
+
     auto type = req->GetRequestType();
     LOG(WARNING) << "Request type: " << pkgmgr_common::ReqTypeToString(type)
                  << " pid: " << req->GetSenderPID();