feat: add share list to stat

This commit is contained in:
KernelDeimos 2024-06-16 01:54:14 -04:00
parent 0dbc6aad0f
commit 8c49ba2553
2 changed files with 108 additions and 5 deletions

View File

@ -25,6 +25,8 @@ const { Context } = require("../util/context");
const { MultiDetachable } = require("../util/listenerutil");
const { NodeRawEntrySelector } = require("./node/selectors");
const { DB_READ } = require("../services/database/consts");
const { UserActorType } = require("../services/auth/Actor");
const { PermissionUtil } = require("../services/auth/PermissionService");
/**
* Container for information collected about a node
@ -387,13 +389,55 @@ module.exports = class FSNodeContext {
* then, stores them on the `permissions` property
* of the fsentry.
* @param {bool} force fetch shares if they were already fetched
*
* @deprecated sharing will use user-to-user permissions
*/
async fetchShares (force) {
// NOOP: this was for legacy sharing functionality;
// this is being re-implemented with permissions
return;
if (this.entry.shares && ! force ) return;
const actor = Context.get('actor');
if ( ! actor ) {
this.entry.shares = { users: [], apps: [] };
return;
}
if ( ! (actor.type instanceof UserActorType) ) {
this.entry.shares = { users: [], apps: [] };
return;
}
const svc_permission = this.services.get('permission');
const permissions =
await svc_permission.query_issuer_permissions_by_prefix(
actor.type.user, `fs:${await this.get('uid')}:`);
this.entry.shares = { users: [], apps: [] };
for ( const user_perm of permissions.users ) {
const access =
PermissionUtil.split(user_perm.permission).slice(-1)[0];
this.entry.shares.users.push({
user: {
uid: user_perm.user.uuid,
username: user_perm.user.username,
},
access,
permission: user_perm.permission,
});
}
for ( const app_perm of permissions.apps ) {
const access =
PermissionUtil.split(app_perm.permission).slice(-1)[0];
this.entry.shares.apps.push({
app: {
icon: app_perm.app.icon,
uid: app_perm.app.uid,
name: app_perm.app.name,
},
access,
permission: app_perm.permission,
});
}
}
/**

View File

@ -587,6 +587,13 @@ class PermissionService extends BaseService {
/**
* List the users that have any permissions granted to the
* specified user.
*
* This is a "flat" (non-cascading) view.
*
* Use History:
* - This was written for use in ll_listusers to display
* home directories of users that shared files with the
* current user.
*/
async list_user_permission_issuers (user) {
const rows = await this.db.read(
@ -602,6 +609,58 @@ class PermissionService extends BaseService {
return users;
}
/**
* List the permissions that the specified actor (the "issuer")
* has granted to all other users which have some specified
* prefix in the permission key (ex: "fs:FILE-UUID")
*
* Note that if the prefix contains a literal '%' character
* the behavior may not be as expected.
*
* This is a "flat" (non-cascading) view.
*
* Use History:
* - This was written for FSNodeContext.fetchShares to query
* all the "shares" associated with a file.
*/
async query_issuer_permissions_by_prefix (issuer, prefix) {
const user_perms = await this.db.read(
'SELECT DISTINCT holder_user_id, permission ' +
'FROM `user_to_user_permissions` ' +
'WHERE issuer_user_id = ? ' +
'AND permission LIKE ?',
[issuer.id, prefix + '%'],
);
const app_perms = await this.db.read(
'SELECT DISTINCT app_id, permission ' +
'FROM `user_to_app_permissions` ' +
'WHERE user_id = ? ' +
'AND permission LIKE ?',
[issuer.id, prefix + '%'],
);
const retval = { users: [], apps: [] };
for ( const user_perm of user_perms ) {
const { holder_user_id, permission } = user_perm;
retval.users.push({
user: await get_user({ id: holder_user_id }),
permission,
});
}
for ( const app_perm of app_perms ) {
const { app_id, permission } = app_perm;
retval.apps.push({
app: await get_app({ id: app_id }),
permission,
});
}
return retval;
}
get_parent_permissions (permission) {
const parent_perms = [];