Took another whack at permissions.

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3958 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
2022-08-14 01:46:11 +00:00
parent fc9c3982c2
commit 3464f1d189
7 changed files with 54 additions and 50 deletions

View File

@ -158,8 +158,6 @@ function socket(request, response, client) {
if (process) {
core.enableStats(process, message.enabled);
}
} else if (message.action == 'permission') {
core.setPermission(process, message.id, message.granted);
} else if (message.message == 'tfrpc') {
if (message.id && g_calls[message.id]) {
if (message.error !== undefined) {

View File

@ -479,23 +479,25 @@ function api_requestPermission(permission, id) {
},
];
div = document.createElement('div');
for (let option of k_options) {
let button = document.createElement('button');
button.innerText = option.text;
button.onclick = function() {
send({action: 'permission', id: id, granted: option.grant[check.checked ? 1 : 0]});
while (permissions.firstChild) {
permissions.removeChild(permissions.firstChild);
return new Promise(function(resolve, reject) {
div = document.createElement('div');
for (let option of k_options) {
let button = document.createElement('button');
button.innerText = option.text;
button.onclick = function() {
resolve(option.grant[check.checked ? 1 : 0]);
while (permissions.firstChild) {
permissions.removeChild(permissions.firstChild);
}
permissions.style.visibility = 'hidden';
}
permissions.style.visibility = 'hidden';
div.appendChild(button);
}
div.appendChild(button);
}
container.appendChild(div);
container.appendChild(div);
permissions.appendChild(container);
permissions.style.visibility = 'visible';
permissions.appendChild(container);
permissions.style.visibility = 'visible';
});
}
function receive(message) {

View File

@ -149,8 +149,6 @@ async function getProcessBlob(blobId, key, options) {
process.task = null;
delete gProcesses[key];
};
process.promises = {};
process.nextPromise = 1;
var imports = {
'core': {
'broadcast': broadcast.bind(process),
@ -179,51 +177,65 @@ async function getProcessBlob(blobId, key, options) {
return [];
}
},
'permissionsGranted': function() {
let user = process?.credentials?.session?.name;
if (user &&
options?.packageOwner &&
options?.packageName &&
gGlobalSettings.userPermissions &&
gGlobalSettings.userPermissions[user] &&
gGlobalSettings.userPermissions[user][options.packageOwner]) {
return gGlobalSettings.userPermissions[user][options.packageOwner][options.packageName];
}
},
'allPermissionsGranted': function() {
let user = process?.credentials?.session?.name;
if (user &&
options?.packageOwner &&
options?.packageName &&
gGlobalSettings.userPermissions &&
gGlobalSettings.userPermissions[user]) {
return gGlobalSettings.userPermissions[user];
}
},
'permissionsForUser': function(user) {
return (gGlobalSettings?.permissions ? gGlobalSettings.permissions[user] : []) ?? [];
},
'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);
return;
} 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);
return true;
} else {
process.promises[id].reject(false);
return false;
}
} else {
process.app.send({action: 'requestPermission', permission: permission, id: id});
promise.then(function(value) {
return process.app.makeFunction(['requestPermission'])(permission).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') {
} else if (value == 'deny') {
storePermission(user, options.packageOwner, options.packageName, permission, false);
return false;
} else if (value == 'deny once') {
return false;
}
return false;
}).catch(function() {
return false;
});
}
return promise;
},
}
};
@ -284,7 +296,11 @@ async function getProcessBlob(blobId, key, options) {
if (process.credentials &&
process.credentials.session &&
process.credentials.session.name) {
return ssb.appendMessageWithIdentity(process.credentials.session.name, id, message);
return imports.core.permissionTest('ssb_append').then(function(value) {
if (value) {
return ssb.appendMessageWithIdentity(process.credentials.session.name, id, message);
}
});
}
};
delete imports.ssb.addRpc;
@ -733,17 +749,6 @@ 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 = {};
@ -769,5 +774,4 @@ export {
enableStats,
invoke,
getSessionProcessBlob,
setPermission,
};