#include <memory>
#include <string>
-#include "common/utils/clist_helpers.h"
+#include "common/utils/glist_range.h"
namespace {
const char kPrivForPlatform[] =
"http://tizen.org/privilege/internal/default/platform";
-bool AddPrivilegeToList(manifest_x* m, const char* priv_str) {
- if (!m->privileges) {
- m->privileges =
- reinterpret_cast<privileges_x*>(calloc(1, sizeof(privileges_x*)));
- if (!m->privileges)
- return false;
- }
- privilege_x* priv =
- reinterpret_cast<privilege_x*>(calloc(1, sizeof(privilege_x)));
- if (!priv)
- return false;
-
- priv->text = strdup(priv_str);
- LISTADD(m->privileges->privilege, priv);
- return true;
-}
-
bool TranslatePrivilegesForCompatibility(manifest_x* m) {
if (!m->api_version) {
LOG(WARNING) << "Skipping privileges mapping because api-version "
if (strcmp(m->api_version, kPlatformVersion) == 0)
return true;
- // calculate number of privileges
- size_t size = 0;
- privileges_x *privileges = nullptr;
- PKGMGR_LIST_MOVE_NODE_TO_HEAD(m->privileges, privileges);
- for (; privileges; privileges = privileges->next) {
- privilege_x* priv = privileges->privilege;
- size += PKGMGR_LIST_LEN(priv);
+ // No privileges to map
+ if (!m->privileges) {
+ return true;
}
// prepare input structure
- std::unique_ptr<const char*[]> input_privileges(new const char*[size]);
+ std::unique_ptr<const char*[]> input_privileges(
+ new const char*[g_list_length(m->privileges)]);
size_t input_size = 0;
- privileges = nullptr;
- PKGMGR_LIST_MOVE_NODE_TO_HEAD(m->privileges, privileges);
- for (; privileges; privileges = privileges->next) {
- privilege_x* priv = nullptr;
- PKGMGR_LIST_MOVE_NODE_TO_HEAD(privileges->privilege, priv);
- for (; priv; priv = priv->next) {
- input_privileges[input_size++] = priv->text;
- }
+ for (const char* priv : GListRange<char*>(m->privileges)) {
+ input_privileges[input_size++] = priv;
}
// get mapping
return false;
}
- // delete pkgmgr old list
- privileges = nullptr;
- privileges_x* privileges_next = nullptr;
- PKGMGR_LIST_MOVE_NODE_TO_HEAD(m->privileges, privileges);
- for (; privileges; privileges = privileges_next) {
- privileges_next = privileges->next;
- privilege_x* priv = nullptr;
- privilege_x* next = nullptr;
- PKGMGR_LIST_MOVE_NODE_TO_HEAD(privileges->privilege, priv);
- for (; priv; priv = next) {
- next = priv->next;
- // mark as const but we actually have ownership
- free(const_cast<char*>(priv->text));
- free(priv);
- }
- free(privileges);
- }
-
// set pkgmgr new list
- m->privileges =
- reinterpret_cast<privileges_x*>(calloc(1, sizeof(privileges_x)));
+ g_list_free_full(m->privileges, free);
+ m->privileges = nullptr;
for (size_t i = 0; i < output_size; ++i) {
- privilege_x* priv =
- reinterpret_cast<privilege_x*>(calloc(1, sizeof(privilege_x)));
- priv->text = strdup(output_privileges[i]);
- LISTADD(m->privileges->privilege, priv);
+ m->privileges = g_list_append(m->privileges, strdup(output_privileges[i]));
}
security_manager_privilege_mapping_free(output_privileges, output_size);
bool ret = true;
switch (context_->privilege_level.get()) {
case common_installer::PrivilegeLevel::PUBLIC:
- ret = AddPrivilegeToList(context_->manifest_data.get(),
- kPrivForPublic);
+ context_->manifest_data.get()->privileges =
+ g_list_append(context_->manifest_data.get()->privileges,
+ strdup(kPrivForPublic));
break;
case common_installer::PrivilegeLevel::PARTNER:
- ret = AddPrivilegeToList(context_->manifest_data.get(),
- kPrivForPartner);
+ context_->manifest_data.get()->privileges =
+ g_list_append(context_->manifest_data.get()->privileges,
+ strdup(kPrivForPartner));
break;
case common_installer::PrivilegeLevel::PLATFORM:
- ret = AddPrivilegeToList(context_->manifest_data.get(),
- kPrivForPlatform);
+ context_->manifest_data.get()->privileges =
+ g_list_append(context_->manifest_data.get()->privileges,
+ strdup(kPrivForPlatform));
break;
default:
// No default privileges for untrusted application.