don't change of directory anymore
[src/app-framework-main.git] / src / wgtpkg-install.c
index b6237b3..ee21d8f 100644 (file)
  limitations under the License.
 */
 
-#define _BSD_SOURCE /* see readdir */
+#define _GNU_SOURCE
 
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <limits.h>
 #include <errno.h>
 #include <syslog.h>
-#include <getopt.h>
+#include <string.h>
 
 #include "verbose.h"
 #include "wgtpkg.h"
 #include "wgt.h"
 #include "wgt-info.h"
 
-static const char appname[] = "wgtpkg-install";
-static const char *root;
-static char **permissions = NULL;
-static int force;
-
-static void install(const char *wgtfile);
-static void add_permissions(const char *list);
-
-static void usage()
-{
-       printf(
-               "usage: %s [-f] [-q] [-v] [-p list] rootdir wgtfile...\n"
-               "\n"
-               "   rootdir       the root directory for installing\n"
-               "   -p list       a list of comma separated permissions to allow\n"
-               "   -f            force overwriting\n"
-               "   -q            quiet\n"
-               "   -v            verbose\n"
-               "\n",
-               appname
-       );
-}
-
-static struct option options[] = {
-       { "permissions", required_argument, NULL, 'p' },
-       { "force",       no_argument,       NULL, 'f' },
-       { "help",        no_argument,       NULL, 'h' },
-       { "quiet",       no_argument,       NULL, 'q' },
-       { "verbose",     no_argument,       NULL, 'v' },
-       { NULL, 0, NULL, 0 }
-};
-
-/* install the widgets of the list */
-int main(int ac, char **av)
+static int check_temporary_constraints(const struct wgt_desc *desc)
 {
-       int i;
-       char *wpath;
-
-       openlog(appname, LOG_PERROR, LOG_AUTH);
-
-       xmlsec_init();
-
-       force = 0;
-       for (;;) {
-               i = getopt_long(ac, av, "hfqvp:", options, NULL);
-               if (i < 0)
-                       break;
-               switch (i) {
-               case 'f':
-                       force = 1;
-                       break;
-               case 'h':
-                       usage();
-                       return 0;
-               case 'q':
-                       if (verbosity)
-                               verbosity--;
-                       break;
-               case 'v':
-                       verbosity++;
-                       break;
-               case 'p':
-                       add_permissions(optarg);
-                       break;
-               case ':':
-                       syslog(LOG_ERR, "missing argument value");
-                       return 1;
-               default:
-                       syslog(LOG_ERR, "unrecognized option");
-                       return 1;
-               }
+       if (!desc->icons) {
+               syslog(LOG_ERR, "widget has not icon defined (temporary constraints)");
+               errno = EINVAL;
+               return -1;
        }
-
-       ac -= optind;
-       if (ac < 2) {
-               syslog(LOG_ERR, "arguments are missing");
-               return 1;
+       if (desc->icons->next) {
+               syslog(LOG_ERR, "widget has more than one icon defined (temporary constraints)");
+               errno = EINVAL;
+               return -1;
        }
-
-       /* canonic names for files */
-       av += optind;
-       for (i = 0 ; av[i] != NULL ; i++) {
-               wpath = realpath(av[i], NULL);
-               if (wpath == NULL) {
-                       syslog(LOG_ERR, "error while getting realpath of %dth widget: %s", i+1, av[i]);
-                       return 1;
-               }
-               av[i] = wpath;
+       if (!desc->content_src) {
+               syslog(LOG_ERR, "widget has not content defined (temporary constraints)");
+               errno = EINVAL;
+               return -1;
+       }
+       if (!desc->content_type) {
+               syslog(LOG_ERR, "widget has not type for its content (temporary constraints)");
+               errno = EINVAL;
+               return -1;
        }
-       root = *av++;
-
-       /* install widgets */
-       for ( ; *av ; av++)
-               install(*av);
-
        return 0;
 }
 
-/* checks if the permission 'name' is granted */
-static int has_permission(const char *name)
+static int check_permissions(const char *name, int required)
 {
-       char **p = permissions;
-       if (p) {
-               while(*p) {
-                       if (0 == strcmp(*p, name))
-                               return 1;
-                       p++;
+       if (permission_exists(name)) {
+               if (request_permission(name)) {
+                       debug("granted permission: %s", name);
+               } else if (required) {
+                       syslog(LOG_ERR, "ungranted permission required: %s", name);
+                       errno = EPERM;
+                       return 0;
+               } else {
+                       notice("ungranted permission optional: %s", name);
                }
        }
-       return 0;
+       return 1;
 }
 
-/* add permissions granted for installation */
-static void add_permissions(const char *list)
+static int check_widget(const struct wgt_desc *desc)
 {
-       char **ps, *p;
-       const char *iter;
-       int n, on;
-       static const char separators[] = " \t\n\r,";
-
-       n = 0;
-       iter = list + strspn(list, separators);
-       while(*iter) {
-               n++;
-               iter += strcspn(iter, separators);
-               iter += strspn(iter, separators);
-       }
-       if (n == 0)
-               return;
-
-       on = 0;
-       ps = permissions;
-       if (ps)
-               while(*ps++)
-                       on++;
-
-       ps = realloc(permissions, (1 + on + n) * sizeof * ps);
-       if (!ps) {
-               syslog(LOG_ERR, "Can't allocate memory for permissions");
-               exit(1);
-       }
-
-       permissions = ps;
-       ps[on] = NULL;
-
-       iter = list + strspn(list, separators);
-       while(*iter) {
-               n = strcspn(iter, separators);
-               p = strndup(iter, n);
-               if (!p) {
-                       syslog(LOG_ERR, "Can't allocate permission");
-                       exit(1);
+       int result;
+       const struct wgt_desc_feature *feature;
+       const char *name;
+
+       result = check_temporary_constraints(desc);
+       feature = desc->features;
+       while(feature) {
+               name = feature->name;
+               if (0 == strcmp(name, AGLWIDGET)) {
+                       
+               } else {
+                       if (!check_permissions(feature->name, feature->required))
+                               result = -1;
                }
-               if (has_permission(p))
-                       free(p);
-               else {
-                       ps[on] = p;
-                       ps[++on] = NULL;
-               }
-               iter += n;
-               iter += strspn(iter, separators);
+               feature = feature->next;
        }
+       return result;
 }
 
-
-static struct wgt *wgt_at_workdir()
+static int place(const char *root, const char *appid, const char *version, int force)
 {
-       int rc, wfd;
-       struct wgt *wgt;
+       char newdir[PATH_MAX];
+       int rc;
 
-       wfd = workdirfd();
-       if (wfd < 0)
-               return NULL;
-
-       wgt = wgt_create();
-       if (!wgt) {
-               syslog(LOG_ERR, "failed to allocate wgt");
-               close(wfd);
-               return NULL;
-       }
-
-       rc = wgt_connectat(wgt, wfd, NULL);
-       if (rc) {
-               syslog(LOG_ERR, "failed to connect wgt to workdir");
-               close(wfd);
-               wgt_unref(wgt);
-               return NULL;
+       rc = snprintf(newdir, sizeof newdir, "%s/%s/%s", root, appid, version);
+       if (rc >= sizeof newdir) {
+               syslog(LOG_ERR, "path to long: %s/%s/%s", root, appid, version);
+               errno = EINVAL;
+               return -1;
        }
 
-       return wgt;
+       rc = move_workdir(newdir, 1, force);
+       return rc;
 }
 
-
-static int check_and_place()
+/* install the widget of the file */
+void install_widget(const char *wgtfile, const char *root, int force)
 {
-       struct wgt *wgt;
        struct wgt_info *ifo;
+       const struct wgt_desc *desc;
 
-       wgt = wgt_at_workdir();
-       if (!wgt)
-               return -1;
-
-       ifo = wgt_info_get(wgt, 1, 1, 1);
-       if (!ifo) {
-               wgt_unref(wgt);
-               return -1;
-       }
-       wgt_info_dump(ifo, 1, "");
-       wgt_info_unref(ifo);
-       wgt_unref(wgt);
-       return 0;
-}
-
-/* install the widget of the file */
-static void install(const char *wgtfile)
-{
        notice("-- INSTALLING widget %s --", wgtfile);
 
        /* workdir */
@@ -255,20 +117,29 @@ static void install(const char *wgtfile)
                goto error1;
        }
 
-       if (enter_workdir(0))
-               goto error2;
-
        if (zread(wgtfile, 0))
                goto error2;
 
        if (check_all_signatures())
                goto error2;
 
+       ifo = wgt_info_createat(workdirfd, NULL, 1, 1, 1);
+       if (!ifo)
+               goto error2;
+
+       desc = wgt_info_desc(ifo);
+       if (check_widget(desc))
+               goto error3;
+
+/*
        if (check_and_place())
                goto error2;
-       
+*/     
        return;
 
+error3:
+       wgt_info_unref(ifo);
+
 error2:
        remove_workdir();
 
@@ -276,4 +147,3 @@ error1:
        return;
 }
 
-