An experiment in requesting permissions and some related fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3937 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
77
core/core.js
77
core/core.js
@ -149,6 +149,8 @@ async function getProcessBlob(blobId, key, options) {
|
||||
process.task = null;
|
||||
delete gProcesses[key];
|
||||
};
|
||||
process.promises = {};
|
||||
process.nextPromise = 1;
|
||||
var imports = {
|
||||
'core': {
|
||||
'broadcast': broadcast.bind(process),
|
||||
@ -172,6 +174,47 @@ async function getProcessBlob(blobId, key, options) {
|
||||
'user': getUser(process, process),
|
||||
'apps': user => getApps(user, process),
|
||||
'getSockets': getSockets,
|
||||
'permissionTest': function(permission) {
|
||||
let id = process.nextPromise++;
|
||||
let promise = new Promise(function(resolve, reject) {
|
||||
process.promises[id] = {resolve: resolve, reject: reject};
|
||||
});
|
||||
let user = process?.credentials?.session?.name;
|
||||
if (!user || !options?.packageOwner || !options?.packageName) {
|
||||
process.promises[id].reject(false);
|
||||
} else if (gGlobalSettings.userPermissions &&
|
||||
gGlobalSettings.userPermissions[user] &&
|
||||
gGlobalSettings.userPermissions[user][options.packageOwner] &&
|
||||
gGlobalSettings.userPermissions[user][options.packageOwner][options.packageName] &&
|
||||
gGlobalSettings.userPermissions[user][options.packageOwner][options.packageName][permission] !== undefined) {
|
||||
if (gGlobalSettings.userPermissions[user][options.packageOwner][options.packageName][permission]) {
|
||||
process.promises[id].resolve(true);
|
||||
} else {
|
||||
process.promises[id].reject(false);
|
||||
}
|
||||
|
||||
} else {
|
||||
process.app.send({action: 'requestPermission', permission: permission, id: id});
|
||||
promise.then(function(value) {
|
||||
if (value == 'allow') {
|
||||
storePermission(user, options.packageOwner, options.packageName, permission, true);
|
||||
return true;
|
||||
} else if (value == 'allow once') {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}).catch(function(value) {
|
||||
if (value == 'deny') {
|
||||
storePermission(user, options.packageOwner, options.packageName, permission, false);
|
||||
return false;
|
||||
} else if (value == 'deny once') {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
return promise;
|
||||
},
|
||||
}
|
||||
};
|
||||
if (options.api) {
|
||||
@ -646,10 +689,42 @@ loadSettings().then(function() {
|
||||
exit(1);
|
||||
});
|
||||
|
||||
function setPermission(process, id, allow) {
|
||||
if (process.promises[id]) {
|
||||
if (allow == 'allow' || allow == 'allow once') {
|
||||
process.promises[id].resolve(allow);
|
||||
} else {
|
||||
process.promises[id].reject(allow);
|
||||
}
|
||||
delete process.promises[id];
|
||||
}
|
||||
}
|
||||
|
||||
function storePermission(user, packageOwner, packageName, permission, allow) {
|
||||
if (!gGlobalSettings.userPermissions) {
|
||||
gGlobalSettings.userPermissions = {};
|
||||
}
|
||||
if (!gGlobalSettings.userPermissions[user]) {
|
||||
gGlobalSettings.userPermissions[user] = {};
|
||||
}
|
||||
if (!gGlobalSettings.userPermissions[user][packageOwner]) {
|
||||
gGlobalSettings.userPermissions[user][packageOwner] = {};
|
||||
}
|
||||
if (!gGlobalSettings.userPermissions[user][packageOwner][packageName]) {
|
||||
gGlobalSettings.userPermissions[user][packageOwner][packageName] = {};
|
||||
}
|
||||
if (gGlobalSettings.userPermissions[user][packageOwner][packageName][permission] !== allow) {
|
||||
gGlobalSettings.userPermissions[user][packageOwner][packageName][permission] = allow;
|
||||
print('STORE', JSON.stringify(gGlobalSettings));
|
||||
setGlobalSettings(gGlobalSettings);
|
||||
}
|
||||
}
|
||||
|
||||
export {
|
||||
gGlobalSettings as globalSettings,
|
||||
setGlobalSettings,
|
||||
enableStats,
|
||||
invoke,
|
||||
getSessionProcessBlob
|
||||
getSessionProcessBlob,
|
||||
setPermission,
|
||||
};
|
||||
|
Reference in New Issue
Block a user