forked from cory/tildefriends
		
	Rigged up some UI to show and allow removing permissions that have been granted or denied by the user to an app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3961 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		| @@ -158,6 +158,10 @@ function socket(request, response, client) { | |||||||
| 				if (process) { | 				if (process) { | ||||||
| 					core.enableStats(process, message.enabled); | 					core.enableStats(process, message.enabled); | ||||||
| 				} | 				} | ||||||
|  | 			} else if (message.action == 'resetPermission') { | ||||||
|  | 				if (process) { | ||||||
|  | 					process.resetPermission(message.permission); | ||||||
|  | 				} | ||||||
| 			} else if (message.message == 'tfrpc') { | 			} else if (message.message == 'tfrpc') { | ||||||
| 				if (message.id && g_calls[message.id]) { | 				if (message.id && g_calls[message.id]) { | ||||||
| 					if (message.error !== undefined) { | 					if (message.error !== undefined) { | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ | |||||||
|  |  | ||||||
| let gSocket; | let gSocket; | ||||||
| let gCredentials; | let gCredentials; | ||||||
|  | let gPermissions; | ||||||
|  |  | ||||||
| let gCurrentFile; | let gCurrentFile; | ||||||
| let gFiles = {}; | let gFiles = {}; | ||||||
| @@ -504,6 +505,64 @@ function api_print() { | |||||||
| 	console.log('app>', ...arguments); | 	console.log('app>', ...arguments); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function hidePermissions() { | ||||||
|  | 	let permissions = document.getElementById('permissions_settings'); | ||||||
|  | 	while (permissions.firstChild) { | ||||||
|  | 		permissions.removeChild(permissions.firstChild); | ||||||
|  | 	} | ||||||
|  | 	permissions.style.visibility = 'hidden'; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function showPermissions() { | ||||||
|  | 	let permissions = document.getElementById('permissions_settings'); | ||||||
|  |  | ||||||
|  | 	let container = document.createElement('div'); | ||||||
|  | 	container.classList.add('permissions_contents'); | ||||||
|  |  | ||||||
|  | 	let div = document.createElement('div'); | ||||||
|  | 	div.appendChild(document.createTextNode('This app has the following permission:')); | ||||||
|  | 	for (let key of Object.keys(gPermissions || {})) { | ||||||
|  | 		let row = document.createElement('div'); | ||||||
|  |  | ||||||
|  | 		let span = document.createElement('span'); | ||||||
|  | 		span.appendChild(document.createTextNode(key)); | ||||||
|  | 		row.appendChild(span); | ||||||
|  |  | ||||||
|  | 		span = document.createElement('span'); | ||||||
|  | 		span.appendChild(document.createTextNode(': ')); | ||||||
|  | 		row.appendChild(span); | ||||||
|  |  | ||||||
|  | 		span = document.createElement('span'); | ||||||
|  | 		span.appendChild(document.createTextNode(gPermissions[key] ? '✅ Allowed' : '❌ Denied')); | ||||||
|  | 		row.appendChild(span); | ||||||
|  | 		 | ||||||
|  | 		span = document.createElement('span'); | ||||||
|  | 		span.appendChild(document.createTextNode(' ')); | ||||||
|  | 		row.appendChild(span); | ||||||
|  |  | ||||||
|  | 		let button = document.createElement('button'); | ||||||
|  | 		button.innerText = 'Reset'; | ||||||
|  | 		button.onclick = function() { | ||||||
|  | 			send({action: "resetPermission", permission: key}); | ||||||
|  | 		}; | ||||||
|  | 		row.appendChild(button); | ||||||
|  | 		div.appendChild(row); | ||||||
|  | 	} | ||||||
|  | 	container.appendChild(div); | ||||||
|  |  | ||||||
|  | 	div = document.createElement('div'); | ||||||
|  | 	let button = document.createElement('button'); | ||||||
|  | 	button.innerText = 'Close'; | ||||||
|  | 	button.onclick = function() { | ||||||
|  | 		hidePermissions(); | ||||||
|  | 	} | ||||||
|  | 	div.appendChild(button); | ||||||
|  | 	container.appendChild(div); | ||||||
|  |  | ||||||
|  | 	permissions.appendChild(container); | ||||||
|  | 	permissions.style.visibility = 'visible'; | ||||||
|  | } | ||||||
|  |  | ||||||
| function _receive_websocket_message(message) { | function _receive_websocket_message(message) { | ||||||
| 	if (message && message.action == "session") { | 	if (message && message.action == "session") { | ||||||
| 		setStatusMessage("🟢 Executing...", kStatusColor); | 		setStatusMessage("🟢 Executing...", kStatusColor); | ||||||
| @@ -513,6 +572,13 @@ function _receive_websocket_message(message) { | |||||||
| 		let parent_enabled = message.parentApp; | 		let parent_enabled = message.parentApp; | ||||||
| 		document.getElementById('push_to_parent').style.display = parent_enabled ? 'inline-block' : 'none'; | 		document.getElementById('push_to_parent').style.display = parent_enabled ? 'inline-block' : 'none'; | ||||||
| 		document.getElementById('pull_from_parent').style.display = parent_enabled ? 'inline-block' : 'none'; | 		document.getElementById('pull_from_parent').style.display = parent_enabled ? 'inline-block' : 'none'; | ||||||
|  | 	} else if (message && message.action == 'permissions') { | ||||||
|  | 		gPermissions = message.permissions; | ||||||
|  | 		let permissions = document.getElementById('permissions_settings'); | ||||||
|  | 		if (permissions.firstChild) { | ||||||
|  | 			hidePermissions(); | ||||||
|  | 			showPermissions(); | ||||||
|  | 		} | ||||||
| 	} else if (message && message.action == "ready") { | 	} else if (message && message.action == "ready") { | ||||||
| 		setStatusMessage(null); | 		setStatusMessage(null); | ||||||
| 		if (window.location.hash) { | 		if (window.location.hash) { | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								core/core.js
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								core/core.js
									
									
									
									
									
								
							| @@ -222,11 +222,13 @@ async function getProcessBlob(blobId, key, options) { | |||||||
| 							return process.app.makeFunction(['requestPermission'])(permission).then(function(value) { | 							return process.app.makeFunction(['requestPermission'])(permission).then(function(value) { | ||||||
| 								if (value == 'allow') { | 								if (value == 'allow') { | ||||||
| 									storePermission(user, options.packageOwner, options.packageName, permission, true); | 									storePermission(user, options.packageOwner, options.packageName, permission, true); | ||||||
|  | 									process.sendPermissions(); | ||||||
| 									return true; | 									return true; | ||||||
| 								} else if (value == 'allow once') { | 								} else if (value == 'allow once') { | ||||||
| 									return true; | 									return true; | ||||||
| 								} else if (value == 'deny') { | 								} else if (value == 'deny') { | ||||||
| 									storePermission(user, options.packageOwner, options.packageName, permission, false); | 									storePermission(user, options.packageOwner, options.packageName, permission, false); | ||||||
|  | 									process.sendPermissions(); | ||||||
| 									throw Error(`Permission denied: ${permission}.`); | 									throw Error(`Permission denied: ${permission}.`); | ||||||
| 								} else if (value == 'deny once') { | 								} else if (value == 'deny once') { | ||||||
| 									throw Error(`Permission denied: ${permission}.`); | 									throw Error(`Permission denied: ${permission}.`); | ||||||
| @@ -322,6 +324,14 @@ async function getProcessBlob(blobId, key, options) { | |||||||
| 					return Object.fromEntries(Object.keys(db).map(x => [x, db[x].bind(db)])); | 					return Object.fromEntries(Object.keys(db).map(x => [x, db[x].bind(db)])); | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | 			process.sendPermissions = function sendPermissions() { | ||||||
|  | 				process.app.send({action: 'permissions', permissions: imports.core.permissionsGranted()}); | ||||||
|  | 			} | ||||||
|  | 			process.resetPermission = function resetPermission(permission) { | ||||||
|  | 				let user = process?.credentials?.session?.name; | ||||||
|  | 				storePermission(user, options?.packageOwner, options?.packageName, permission, undefined); | ||||||
|  | 				process.sendPermissions(); | ||||||
|  | 			} | ||||||
| 			process.task.setImports(imports); | 			process.task.setImports(imports); | ||||||
| 			process.task.activate(); | 			process.task.activate(); | ||||||
| 			let source = await getBlobOrContent(blobId); | 			let source = await getBlobOrContent(blobId); | ||||||
| @@ -346,6 +356,7 @@ async function getProcessBlob(blobId, key, options) { | |||||||
| 			resolveReady(process); | 			resolveReady(process); | ||||||
| 			if (process.app) { | 			if (process.app) { | ||||||
| 				process.app.send({action: "ready"}); | 				process.app.send({action: "ready"}); | ||||||
|  | 				process.sendPermissions(); | ||||||
| 			} | 			} | ||||||
| 			await process.task.execute({name: appSourceName, source: appSource}); | 			await process.task.execute({name: appSourceName, source: appSource}); | ||||||
| 		} catch (error) { | 		} catch (error) { | ||||||
| @@ -759,7 +770,11 @@ function storePermission(user, packageOwner, packageName, permission, allow) { | |||||||
| 		gGlobalSettings.userPermissions[user][packageOwner][packageName] = {}; | 		gGlobalSettings.userPermissions[user][packageOwner][packageName] = {}; | ||||||
| 	} | 	} | ||||||
| 	if (gGlobalSettings.userPermissions[user][packageOwner][packageName][permission] !== allow) { | 	if (gGlobalSettings.userPermissions[user][packageOwner][packageName][permission] !== allow) { | ||||||
|  | 		if (allow === undefined) { | ||||||
|  | 			delete gGlobalSettings.userPermissions[user][packageOwner][packageName][permission]; | ||||||
|  | 		} else { | ||||||
| 			gGlobalSettings.userPermissions[user][packageOwner][packageName][permission] = allow; | 			gGlobalSettings.userPermissions[user][packageOwner][packageName][permission] = allow; | ||||||
|  | 		} | ||||||
| 		setGlobalSettings(gGlobalSettings); | 		setGlobalSettings(gGlobalSettings); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -12,8 +12,10 @@ | |||||||
| 			<a accesskey="h" data-tip="Open home app." href="/" style="color: #fff">Tilde Friends</a> | 			<a accesskey="h" data-tip="Open home app." href="/" style="color: #fff">Tilde Friends</a> | ||||||
| 			<a accesskey="a" data-tip="Open apps list." href="/~core/apps/">apps</a> | 			<a accesskey="a" data-tip="Open apps list." href="/~core/apps/">apps</a> | ||||||
| 			<a accesskey="e" data-tip="Toggle the app editor." href="#" onclick="event.preventDefault(); toggleEdit()">edit</a> | 			<a accesskey="e" data-tip="Toggle the app editor." href="#" onclick="event.preventDefault(); toggleEdit()">edit</a> | ||||||
|  | 			<a accesskey="p" data-tip="View and change permissions." href="#" onclick="showPermissions()">🎛️</a> | ||||||
| 			<span id="status"></span> | 			<span id="status"></span> | ||||||
| 			<span id="requests"></span> | 			<span id="requests"></span> | ||||||
|  | 			<span id="permissions_settings"></span> | ||||||
| 			<span id="permissions"></span> | 			<span id="permissions"></span> | ||||||
| 			<span id="login"></span> | 			<span id="login"></span> | ||||||
| 		</div> | 		</div> | ||||||
|   | |||||||
| @@ -254,7 +254,7 @@ kbd { | |||||||
| 	white-space: nowrap; | 	white-space: nowrap; | ||||||
| } | } | ||||||
|  |  | ||||||
| #permissions { | #permissions, #permissions_settings { | ||||||
| 	visibility: hidden; | 	visibility: hidden; | ||||||
| 	position: absolute; | 	position: absolute; | ||||||
| 	display: block; | 	display: block; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user