diff options
-rw-r--r-- | src/secmgr-wrap.c | 7 | ||||
-rw-r--r-- | src/secmgr-wrap.h | 1 | ||||
-rw-r--r-- | src/wgtpkg-install.c | 147 |
3 files changed, 131 insertions, 24 deletions
diff --git a/src/secmgr-wrap.c b/src/secmgr-wrap.c index 63704ef..83a2660 100644 --- a/src/secmgr-wrap.c +++ b/src/secmgr-wrap.c @@ -117,7 +117,7 @@ static int addpath(const char *pathname, enum app_install_path_type type) int secmgr_path_public_read_only(const char *pathname) { - return addpath(pathname, SECURITY_MANAGER_PATH_RO); + return addpath(pathname, SECURITY_MANAGER_PATH_PUBLIC_RO); } int secmgr_path_read_only(const char *pathname) @@ -130,6 +130,11 @@ int secmgr_path_read_write(const char *pathname) return addpath(pathname, SECURITY_MANAGER_PATH_RW); } +int secmgr_path_private(const char *pathname) +{ + return addpath(pathname, SECURITY_MANAGER_PATH_PRIVATE); +} + int secmgr_prepare_exec(const char *appid) { return retcode(security_manager_prepare_app(appid)); diff --git a/src/secmgr-wrap.h b/src/secmgr-wrap.h index 2d16a8d..608ed8d 100644 --- a/src/secmgr-wrap.h +++ b/src/secmgr-wrap.h @@ -24,5 +24,6 @@ extern int secmgr_permit(const char *permission); extern int secmgr_path_public_read_only(const char *pathname); extern int secmgr_path_read_only(const char *pathname); extern int secmgr_path_read_write(const char *pathname); +extern int secmgr_path_private(const char *pathname); extern int secmgr_prepare_exec(const char *appid); diff --git a/src/wgtpkg-install.c b/src/wgtpkg-install.c index c7de1f8..03cd78f 100644 --- a/src/wgtpkg-install.c +++ b/src/wgtpkg-install.c @@ -485,22 +485,60 @@ static int install_file_properties(const struct wgt_desc *desc) return rc; } +static int is_path_public(const char *path, const struct wgt_desc *desc) +{ + const struct wgt_desc_icon *icon; + const struct wgt_desc_feature *feat; + const struct wgt_desc_param *param; + size_t len; + + /* icons are public */ + icon = desc->icons; + while (icon != NULL) { + len = strlen(icon->src); + if (!memcmp(path, icon->src, len) && (path[len] == 0 || path[len] == '/')) + return 1; + icon = icon->next; + } + + /* provided bindings are public */ + feat = desc->features; + while (feat != NULL) { + if (strcasecmp(feat->name, "urn:AGL:widget:provided-binding") == 0 + || strcasecmp(feat->name, "urn:AGL:widget:public-files") == 0) { + param = feat->params; + while(param != NULL) { + if (strcmp(param->value, path) == 0) + return 1; + param = param->next; + } + } + feat = feat->next; + } + + /* otherwise no */ + return 0; +} + static int install_security(const struct wgt_desc *desc) { char path[PATH_MAX], *head; - const char *icon, *perm; - int rc; - unsigned int i, n, len, lic, lf; + const char *perm; + int rc, public; + unsigned int i, n, len, lf, j; struct filedesc *f; - + struct pathent { + struct pathent *next; + unsigned int len; + int public; + char name[]; + } *pe0, *pe2, *ppe; + + pe0 = NULL; rc = secmgr_init(desc->id); if (rc) goto error; - rc = secmgr_path_public_read_only(workdir); - if (rc) - goto error2; - /* instal the files */ head = stpcpy(path, workdir); assert(head < path + sizeof path); @@ -512,23 +550,78 @@ static int install_security(const struct wgt_desc *desc) } len--; *head++ = '/'; - icon = desc->icons ? desc->icons->src : NULL; - lic = (unsigned)(icon ? strlen(icon) : 0); + + /* build root entry */ + pe0 = malloc(1 + sizeof *pe0); + if (pe0 == NULL) + goto error2; + pe0->next = NULL; + pe0->len = 0; + pe0->public = 0; + pe0->name[0] = 0; + + /* build list of entries */ n = file_count(); - i = 0; - while(i < n) { - f = file_of_index(i++); - lf = (unsigned)strlen(f->name); - if (lf >= len) { - ERROR("path too long in install_security"); - errno = ENAMETOOLONG; - goto error2; + for (i = 0 ; i < n ; i++) { + f = file_of_index(i); + public = is_path_public(f->name, desc); + pe0->public |= public; + lf = j = 0; + while(f->name[j] == '/') + j++; + while (f->name[j] != 0) { + /* copy next entry of the path */ + while(f->name[j] && f->name[j] != '/') { + if (lf + 1 >= len) { + ERROR("path too long in install_security"); + errno = ENAMETOOLONG; + goto error2; + } + head[lf++] = f->name[j++]; + } + head[lf] = 0; + + /* search if it already exists */ + ppe = pe0; + pe2 = pe0->next; + while (pe2 != NULL && pe2->len < lf) { + ppe = pe2; + pe2 = pe2->next; + } + while (pe2 != NULL && pe2->len == lf && strcmp(head, pe2->name)) { + ppe = pe2; + pe2 = pe2->next; + } + + if (pe2 != NULL && pe2->len == lf) + /* existing, update public status */ + pe2->public |= public; + else { + /* not existing, create it */ + pe2 = malloc(lf + 1 + sizeof *pe2); + if (pe2 == NULL) + goto error2; + pe2->next = ppe->next; + pe2->len = lf; + pe2->public = public; + memcpy(pe2->name, head, 1 + lf); + ppe->next = pe2; + } + + /* prepare next path entry */ + head[lf++] = '/'; + while(f->name[j] == '/') + j++; } - strcpy(head, f->name); - if (lf <= lic && icon && !memcmp(f->name, icon, lf) && (!f->name[lf] || f->name[lf] == '/')) + } + + /* set the path entries */ + for (pe2 = pe0 ; pe2 != NULL ; pe2 = pe2->next) { + strcpy(head, pe2->name); + if (pe2->public) rc = secmgr_path_public_read_only(path); else - rc = secmgr_path_read_only(path); + rc = secmgr_path_private(path); if (rc) goto error2; } @@ -554,11 +647,19 @@ static int install_security(const struct wgt_desc *desc) } rc = secmgr_install(); - return rc; + goto end; error2: secmgr_cancel(); error: - return -1; + rc = -1; +end: + /* free memory of path entries */ + while (pe0 != NULL) { + ppe = pe0; + pe0 = pe0->next; + free(ppe); + } + return rc; } /* install the widget of the file */ |