forked from cory/tildefriends
		
	WIP managing a per-app current identity from the Tilde Friends navigation bar.
This commit is contained in:
		| @@ -144,6 +144,8 @@ function socket(request, response, client) { | |||||||
| 					JSON.stringify({ | 					JSON.stringify({ | ||||||
| 						action: 'session', | 						action: 'session', | ||||||
| 						credentials: credentials, | 						credentials: credentials, | ||||||
|  | 						identities: await ssb.getIdentities(credentials?.session?.name), | ||||||
|  | 						identity: await core.getActiveIdentity(credentials?.session?.name, packageOwner, packageName), | ||||||
| 						parentApp: parentApp, | 						parentApp: parentApp, | ||||||
| 						id: blobId, | 						id: blobId, | ||||||
| 					}), | 					}), | ||||||
| @@ -210,6 +212,10 @@ function socket(request, response, client) { | |||||||
| 				if (process) { | 				if (process) { | ||||||
| 					process.resetPermission(message.permission); | 					process.resetPermission(message.permission); | ||||||
| 				} | 				} | ||||||
|  | 			} else if (message.action == 'setActiveIdentity') { | ||||||
|  | 				process.setActiveIdentity(message.identity); | ||||||
|  | 			} else if (message.action == 'createIdentity') { | ||||||
|  | 				process.createIdentity(); | ||||||
| 			} 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) { | ||||||
|   | |||||||
| @@ -56,6 +56,8 @@ class TfNavigationElement extends LitElement { | |||||||
| 			spark_lines: {type: Object}, | 			spark_lines: {type: Object}, | ||||||
| 			version: {type: Object}, | 			version: {type: Object}, | ||||||
| 			show_version: {type: Boolean}, | 			show_version: {type: Boolean}, | ||||||
|  | 			identity: {type: String}, | ||||||
|  | 			identities: {type: Array}, | ||||||
| 		}; | 		}; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -65,6 +67,7 @@ class TfNavigationElement extends LitElement { | |||||||
| 		this.show_permissions = false; | 		this.show_permissions = false; | ||||||
| 		this.status = {}; | 		this.status = {}; | ||||||
| 		this.spark_lines = {}; | 		this.spark_lines = {}; | ||||||
|  | 		this.identities = []; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| @@ -128,6 +131,37 @@ class TfNavigationElement extends LitElement { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	set_active_identity(event) { | ||||||
|  | 		send({action: 'setActiveIdentity', identity: event.srcElement.value}); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	create_identity(event) { | ||||||
|  | 		send({action: 'createIdentity'}); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	render_identity() { | ||||||
|  | 		if (this.identities?.length) { | ||||||
|  | 			return html` | ||||||
|  | 				<link type="text/css" rel="stylesheet" href="/static/w3.css" /> | ||||||
|  | 				<select | ||||||
|  | 					@change=${this.set_active_identity} | ||||||
|  | 					class="w3-input" | ||||||
|  | 					style="flex: 0 1 auto; width: auto; display: inline-blocktext-overflow: ellipsis; overflow: hidden; white-space: nowrap"> | ||||||
|  | 					${this.identities.map(x => html`<option ?selected=${x === this.identity}>${x}</option>`)} | ||||||
|  | 				</select> | ||||||
|  | 			`; | ||||||
|  | 		} else { | ||||||
|  | 			return html` | ||||||
|  | 				<link type="text/css" rel="stylesheet" href="/static/w3.css" /> | ||||||
|  | 				<button | ||||||
|  | 					@click=${this.create_identity} | ||||||
|  | 					class="w3-button w3-blue"> | ||||||
|  | 					Create an Identity | ||||||
|  | 				</button> | ||||||
|  | 			`; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * TODOC | 	 * TODOC | ||||||
| 	 * @returns | 	 * @returns | ||||||
| @@ -257,6 +291,7 @@ class TfNavigationElement extends LitElement { | |||||||
| 							x, | 							x, | ||||||
| 						])}</span | 						])}</span | ||||||
| 				> | 				> | ||||||
|  | 				${this.render_identity()} | ||||||
| 				<span style="flex: 0 0; white-space: nowrap" | 				<span style="flex: 0 0; white-space: nowrap" | ||||||
| 					>${this.render_login()}</span | 					>${this.render_login()}</span | ||||||
| 				> | 				> | ||||||
| @@ -1125,11 +1160,17 @@ function api_setHash(hash) { | |||||||
| 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); | ||||||
| 		document.getElementsByTagName('tf-navigation')[0].credentials = | 		let navigation = document.getElementsByTagName('tf-navigation')[0]; | ||||||
| 			message.credentials; | 		navigation.credentials = message.credentials; | ||||||
|  | 		navigation.identities = message.identities; | ||||||
|  | 		navigation.identity = message.identity; | ||||||
| 	} else if (message && message.action == 'permissions') { | 	} else if (message && message.action == 'permissions') { | ||||||
| 		document.getElementsByTagName('tf-navigation')[0].permissions = | 		let navigation = document.getElementsByTagName('tf-navigation')[0]; | ||||||
| 			message.permissions ?? {}; | 		navigation.permissions = message.permissions ?? {}; | ||||||
|  | 	} else if (message && message.action == 'identities') { | ||||||
|  | 		let navigation = document.getElementsByTagName('tf-navigation')[0]; | ||||||
|  | 		navigation.identities = message.identities; | ||||||
|  | 		navigation.identity = message.identity; | ||||||
| 	} else if (message && message.action == 'ready') { | 	} else if (message && message.action == 'ready') { | ||||||
| 		setStatusMessage(null); | 		setStatusMessage(null); | ||||||
| 		if (window.location.hash) { | 		if (window.location.hash) { | ||||||
|   | |||||||
							
								
								
									
										51
									
								
								core/core.js
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								core/core.js
									
									
									
									
									
								
							| @@ -508,6 +508,30 @@ async function getProcessBlob(blobId, key, options) { | |||||||
| 					url: options?.url, | 					url: options?.url, | ||||||
| 				}, | 				}, | ||||||
| 			}; | 			}; | ||||||
|  | 			process.sendIdentities = async function() { | ||||||
|  | 				process.app.send({ | ||||||
|  | 					action: 'identities', | ||||||
|  | 					identities: await ssb.getIdentities(process?.credentials?.session?.name), | ||||||
|  | 					identity: await getActiveIdentity(process?.credentials?.session?.name, options.packageOwner, options.packageName), | ||||||
|  | 				}); | ||||||
|  | 			}; | ||||||
|  | 			process.setActiveIdentity = async function(identity) { | ||||||
|  | 				if (process?.credentials?.session?.name && options.packageOwner && options.packageName) { | ||||||
|  | 					await new Database(process?.credentials?.session?.name).set(`id:${options.packageOwner}:${options.packageName}`, identity); | ||||||
|  | 				} | ||||||
|  | 				process.sendIdentities(); | ||||||
|  | 			}; | ||||||
|  | 			process.createIdentity = async function() { | ||||||
|  | 				if ( | ||||||
|  | 					process.credentials && | ||||||
|  | 					process.credentials.session && | ||||||
|  | 					process.credentials.session.name | ||||||
|  | 				) { | ||||||
|  | 					let id = ssb.createIdentity(process.credentials.session.name); | ||||||
|  | 					await process.sendIdentities(); | ||||||
|  | 					return id; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
| 			if (process.credentials?.permissions?.administration) { | 			if (process.credentials?.permissions?.administration) { | ||||||
| 				imports.core.globalSettingsDescriptions = function () { | 				imports.core.globalSettingsDescriptions = function () { | ||||||
| 					let settings = Object.assign({}, k_global_settings); | 					let settings = Object.assign({}, k_global_settings); | ||||||
| @@ -578,15 +602,7 @@ async function getProcessBlob(blobId, key, options) { | |||||||
| 				Object.keys(ssb).map((key) => [key, ssb[key].bind(ssb)]) | 				Object.keys(ssb).map((key) => [key, ssb[key].bind(ssb)]) | ||||||
| 			); | 			); | ||||||
| 			imports.ssb.port = tildefriends.ssb_port; | 			imports.ssb.port = tildefriends.ssb_port; | ||||||
| 			imports.ssb.createIdentity = function () { | 			imports.ssb.createIdentity = () => process.createIdentity(); | ||||||
| 				if ( |  | ||||||
| 					process.credentials && |  | ||||||
| 					process.credentials.session && |  | ||||||
| 					process.credentials.session.name |  | ||||||
| 				) { |  | ||||||
| 					return ssb.createIdentity(process.credentials.session.name); |  | ||||||
| 				} |  | ||||||
| 			}; |  | ||||||
| 			imports.ssb.addIdentity = function (id) { | 			imports.ssb.addIdentity = function (id) { | ||||||
| 				if ( | 				if ( | ||||||
| 					process.credentials && | 					process.credentials && | ||||||
| @@ -613,6 +629,8 @@ async function getProcessBlob(blobId, key, options) { | |||||||
| 					}); | 					}); | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
|  | 			imports.ssb.setActiveIdentity = id => process.setActiveIdentity(id); | ||||||
|  | 			imports.ssb.getActiveIdentity = () => getActiveIdentity(process.credentials?.session?.name, options.packageOwner, options.packageName); | ||||||
| 			imports.ssb.getOwnerIdentities = function () { | 			imports.ssb.getOwnerIdentities = function () { | ||||||
| 				if (options.packageOwner) { | 				if (options.packageOwner) { | ||||||
| 					return ssb.getIdentities(options.packageOwner); | 					return ssb.getIdentities(options.packageOwner); | ||||||
| @@ -1458,10 +1476,25 @@ function storePermission(user, packageOwner, packageName, permission, allow) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async function getActiveIdentity(user, packageOwner, packageName) { | ||||||
|  | 	if (user && packageOwner && packageName) { | ||||||
|  | 		let id = await new Database(user).get(`id:${packageOwner}:${packageName}`); | ||||||
|  | 		if (!id) { | ||||||
|  | 			let ids = await ssb.getIdentities(user); | ||||||
|  | 			if (ids) { | ||||||
|  | 				id = ids[0]; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return id; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| export { | export { | ||||||
| 	gGlobalSettings as globalSettings, | 	gGlobalSettings as globalSettings, | ||||||
| 	setGlobalSettings, | 	setGlobalSettings, | ||||||
| 	enableStats, | 	enableStats, | ||||||
| 	invoke, | 	invoke, | ||||||
| 	getSessionProcessBlob, | 	getSessionProcessBlob, | ||||||
|  | 	getActiveIdentity, | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -474,7 +474,7 @@ static JSValue _httpd_auth_query(JSContext* context, JSValueConst this_val, int | |||||||
| 		JSValue settings_value = settings ? JS_ParseJSON(context, settings, strlen(settings), NULL) : JS_UNDEFINED; | 		JSValue settings_value = settings ? JS_ParseJSON(context, settings, strlen(settings), NULL) : JS_UNDEFINED; | ||||||
| 		JSValue permissions = JS_GetPropertyStr(context, settings_value, "permissions"); | 		JSValue permissions = JS_GetPropertyStr(context, settings_value, "permissions"); | ||||||
| 		JSValue user_permissions = JS_GetPropertyStr(context, permissions, name_string); | 		JSValue user_permissions = JS_GetPropertyStr(context, permissions, name_string); | ||||||
| 		int length = tf_util_get_length(context, user_permissions); | 		int length = !JS_IsUndefined(user_permissions) ? tf_util_get_length(context, user_permissions) : 0 ; | ||||||
| 		for (int i = 0; i < length; i++) | 		for (int i = 0; i < length; i++) | ||||||
| 		{ | 		{ | ||||||
| 			JSValue permission = JS_GetPropertyUint32(context, user_permissions, i); | 			JSValue permission = JS_GetPropertyUint32(context, user_permissions, i); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user