Code Review
/
src
/
app-framework-main.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
Update copyright
[src/app-framework-main.git]
/
src
/
wgtpkg-permissions.c
diff --git
a/src/wgtpkg-permissions.c
b/src/wgtpkg-permissions.c
index
e20cede
..
091f1ca
100644
(file)
--- a/
src/wgtpkg-permissions.c
+++ b/
src/wgtpkg-permissions.c
@@
-1,5
+1,7
@@
/*
/*
- Copyright 2015 IoT.bzh
+ Copyright (C) 2015-2020 IoT.bzh
+
+ author: José Bollo <jose.bollo@iot.bzh>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@
-17,10
+19,11
@@
#define _GNU_SOURCE
#include <errno.h>
#define _GNU_SOURCE
#include <errno.h>
-#include <syslog.h>
#include <string.h>
#include <string.h>
+#include <stdlib.h>
-#include "wgtpkg.h"
+#include "verbose.h"
+#include "wgtpkg-permissions.h"
struct permission {
char *name;
struct permission {
char *name;
@@
-29,22
+32,14
@@
struct permission {
unsigned level: 3;
};
unsigned level: 3;
};
-static const char prefix_of_permissions[] = PREFIXPERMISSION;
-
-static int nrpermissions = 0;
+static unsigned int nrpermissions = 0;
static struct permission *permissions = NULL;
static struct permission *permissions = NULL;
-static int indexiter = 0;
-
-/* check is the name has the correct prefix for permissions */
-int is_standard_permission(const char *name)
-{
- return 0 == memcmp(name, prefix_of_permissions, sizeof(prefix_of_permissions) - 1);
-}
+static unsigned int indexiter = 0;
/* retrieves the permission of name */
static struct permission *get_permission(const char *name)
{
/* retrieves the permission of name */
static struct permission *get_permission(const char *name)
{
- int i;
+
unsigned
int i;
for (i = 0 ; i < nrpermissions ; i++)
if (0 == strcmp(permissions[i].name, name))
for (i = 0 ; i < nrpermissions ; i++)
if (0 == strcmp(permissions[i].name, name))
@@
-57,7
+52,8
@@
static struct permission *add_permission(const char *name)
{
struct permission *p = get_permission(name);
if (!p) {
{
struct permission *p = get_permission(name);
if (!p) {
- p = realloc(permissions, ((nrpermissions + 8) & ~7) * sizeof(*p));
+ p = realloc(permissions,
+ ((nrpermissions + 8) & ~(unsigned)7) * sizeof(*p));
if (p) {
permissions = p;
p = permissions + nrpermissions;
if (p) {
permissions = p;
p = permissions + nrpermissions;
@@
-65,6
+61,8
@@
static struct permission *add_permission(const char *name)
p->name = strdup(name);
if (!p->name)
p = NULL;
p->name = strdup(name);
if (!p->name)
p = NULL;
+ else
+ nrpermissions++;
}
}
return p;
}
}
return p;
@@
-73,44
+71,53
@@
static struct permission *add_permission(const char *name)
/* remove any granting */
void reset_permissions()
{
/* remove any granting */
void reset_permissions()
{
- int i;
+ unsigned int i;
+ for (i = 0 ; i < nrpermissions ; i++)
+ permissions[i].granted = permissions[i].requested = 0;
+}
+
+/* remove any requested permission */
+void reset_requested_permissions()
+{
+ unsigned int i;
for (i = 0 ; i < nrpermissions ; i++)
for (i = 0 ; i < nrpermissions ; i++)
- permissions[i].
gran
ted = 0;
+ permissions[i].
reques
ted = 0;
}
/* remove any granting */
void crop_permissions(unsigned level)
{
}
/* remove any granting */
void crop_permissions(unsigned level)
{
- int i;
+
unsigned
int i;
for (i = 0 ; i < nrpermissions ; i++)
if (permissions[i].level < level)
permissions[i].granted = 0;
}
/* add permissions granted for installation */
for (i = 0 ; i < nrpermissions ; i++)
if (permissions[i].level < level)
permissions[i].granted = 0;
}
/* add permissions granted for installation */
-
void
grant_permission_list(const char *list)
+
int
grant_permission_list(const char *list)
{
struct permission *p;
char *iter, c;
{
struct permission *p;
char *iter, c;
- int n;
+
unsigned
int n;
static const char separators[] = " \t\n\r,";
iter = strdupa(list);
iter += strspn(iter, separators);
while(*iter) {
static const char separators[] = " \t\n\r,";
iter = strdupa(list);
iter += strspn(iter, separators);
while(*iter) {
- n = strcspn(iter, separators);
+ n =
(unsigned)
strcspn(iter, separators);
c = iter[n];
iter[n] = 0;
p = add_permission(iter);
if (!p) {
c = iter[n];
iter[n] = 0;
p = add_permission(iter);
if (!p) {
-
syslog(LOG_ERR, "Can't allocate permission")
;
-
exit(1)
;
+
errno = ENOMEM
;
+
return -1
;
}
p->granted = 1;
iter += n;
*iter =c;
iter += strspn(iter, separators);
}
}
p->granted = 1;
iter += n;
*iter =c;
iter += strspn(iter, separators);
}
+ return 0;
}
/* checks if the permission 'name' is recorded */
}
/* checks if the permission 'name' is recorded */
@@
-122,13
+129,25
@@
int permission_exists(const char *name)
/* request the permission, returns 1 if granted or 0 otherwise */
int request_permission(const char *name)
{
/* request the permission, returns 1 if granted or 0 otherwise */
int request_permission(const char *name)
{
+#define HACK_ALLOWING_REQUESTED_PERMISSIONS 1
+
struct permission *p = get_permission(name);
struct permission *p = get_permission(name);
+
+#if defined(HACK_ALLOWING_REQUESTED_PERMISSIONS) && HACK_ALLOWING_REQUESTED_PERMISSIONS
+ if (!p)
+ p = add_permission(name);
+#endif
if (p) {
if (p) {
+#if defined(HACK_ALLOWING_REQUESTED_PERMISSIONS) && HACK_ALLOWING_REQUESTED_PERMISSIONS
+ p->granted = 1;
+#endif
p->requested = 1;
if (p->granted)
return 1;
}
return 0;
p->requested = 1;
if (p->granted)
return 1;
}
return 0;
+
+#undef HACK_ALLOWING_REQUESTED_PERMISSIONS
}
/* iteration over granted and requested permissions */
}
/* iteration over granted and requested permissions */