#include <tzplatform_config.h>
#include "abstract_parcelable.hh"
+#include "cynara_checker.hh"
+#include "db_change_observer.hh"
#include "request_handler_factory.hh"
#include "server/database/db_handle_provider.hh"
+#include "server/database/update_pending_cache_handler.hh"
#include "utils/logging.hh"
#include "pkgmgrinfo_debug.h"
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 {
if (req == nullptr)
return;
+ if (!req->GetPrivilegeChecked()) {
+ if (!req->ReceiveData()) {
+ LOG(ERROR) << "Fail to receive data";
+ continue;
+ }
+
+ pkgmgr_common::ReqType type = req->GetRequestType();
+ if (pkgmgr_common::IsDbWriteRequest(type))
+ StopDbChangeListening();
+ 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();
+ << " pid: " << req->GetSenderPID() << " tid: " << req->GetSenderTID();
auto handler = factory.GetRequestHandler(type);
if (handler == nullptr)
continue;
handler->PreExec();
handler->SetUID(ConvertUID(req->GetSenderUID()));
handler->SetPID(req->GetSenderPID());
- if (!handler->HandleRequest(req->GetData(), req->GetSize(),
+ if (!handler->HandleRequest(req->DetachData(), req->GetSize(),
locale_.GetObject()))
LOG(ERROR) << "Failed to handle request";
- std::vector<uint8_t> result_data = handler->ExtractResult();
- if (req->SendData(result_data.data(), result_data.size()) == false)
+ if (req->SendData(handler->ExtractResult()) == false)
LOG(ERROR) << "Failed to send response pid: " << req->GetSenderPID();
else
- LOG(WARNING) << "Success response pid: " << req->GetSenderPID();
+ LOG(WARNING) << "Success response pid: " << req->GetSenderPID()
+ << " tid: " << req->GetSenderTID();
} catch (const std::exception& err) {
LOG(ERROR) << "Exception occurred: " << err.what()
<< ", pid: " << req->GetSenderPID();
h->timer_ = 0;
}
- if (database::DBHandleProvider::IsCrashedWriteRequest())
- database::DBHandleProvider::GetInst(getuid()).UnsetMemoryMode(getpid());
+ auto crashed_writer_pids =
+ database::DBHandleProvider::CrashedWriteRequestPIDs();
+ if (!crashed_writer_pids.empty()) {
+ database::UpdatePendingCacheHandler db(getuid(), std::move(crashed_writer_pids), {});
+ db.SetLocale(h->locale_.GetObject());
+ db.Execute();
+ }
sqlite3_release_memory(-1);
malloc_trim(0);
0, pkgmgr_common::parcel::ParcelableType::Unknown, PMINFO_R_ERROR);
tizen_base::Parcel p;
p.WriteParcelable(parcelable);
- std::vector<uint8_t> raw = p.GetRaw();
- req->SendData(&raw[0], raw.size());
+ req->SendData(p);
+}
+
+void WorkerThread::StopDbChangeListening() {
+ auto& db_observer = pkgmgr_common::DbChangeObserver::GetInst();
+
+ if (db_observer.GetDisposed())
+ return;
+
+ LOG(WARNING) << "Try stop listening db change";
+ db_observer.StopListening();
}
} // namespace pkgmgr_server