feat: Introduce advanced permissions (#7844)
This PR introduces the possibility of inviting new users with an `admin` role and changing the role of already invited users. Also using scoped permission checks where applicable instead of using user role checks. --------- Co-authored-by: Val <68596159+valya@users.noreply.github.com> Co-authored-by: Alex Grozav <alex@grozav.com> Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
This commit is contained in:
@@ -303,14 +303,6 @@ export const useCredentialsStore = defineStore(STORES.CREDENTIALS, {
|
||||
credentialId: credential.id,
|
||||
ownedBy: data.ownedBy,
|
||||
});
|
||||
|
||||
const usersStore = useUsersStore();
|
||||
if (data.sharedWith && data.ownedBy.id === usersStore.currentUserId) {
|
||||
await this.setCredentialSharedWith({
|
||||
credentialId: credential.id,
|
||||
sharedWith: data.sharedWith,
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.upsertCredential(credential);
|
||||
@@ -365,7 +357,10 @@ export const useCredentialsStore = defineStore(STORES.CREDENTIALS, {
|
||||
ownedBy: payload.ownedBy,
|
||||
};
|
||||
},
|
||||
async setCredentialSharedWith(payload: { sharedWith: IUser[]; credentialId: string }) {
|
||||
async setCredentialSharedWith(payload: {
|
||||
sharedWith: IUser[];
|
||||
credentialId: string;
|
||||
}): Promise<ICredentialsResponse> {
|
||||
if (useSettingsStore().isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)) {
|
||||
await setCredentialSharedWith(useRootStore().getRestApiContext, payload.credentialId, {
|
||||
shareWithIds: payload.sharedWith.map((sharee) => sharee.id),
|
||||
@@ -376,6 +371,7 @@ export const useCredentialsStore = defineStore(STORES.CREDENTIALS, {
|
||||
sharedWith: payload.sharedWith,
|
||||
};
|
||||
}
|
||||
return this.credentials[payload.credentialId];
|
||||
},
|
||||
addCredentialSharee(payload: { credentialId: string; sharee: Partial<IUser> }): void {
|
||||
this.credentials[payload.credentialId] = {
|
||||
|
||||
@@ -71,6 +71,7 @@ import {
|
||||
isValidTheme,
|
||||
updateTheme,
|
||||
} from './ui.utils';
|
||||
import { useUsersStore } from './users.store';
|
||||
|
||||
let savedTheme: ThemeOption = 'system';
|
||||
try {
|
||||
@@ -373,6 +374,7 @@ export const useUIStore = defineStore(STORES.UI, {
|
||||
let linkUrl = '';
|
||||
|
||||
const searchParams = new URLSearchParams();
|
||||
const { isInstanceOwner } = useUsersStore();
|
||||
|
||||
if (deploymentType === 'cloud' && hasPermission(['instanceOwner'])) {
|
||||
const adminPanelHost = new URL(window.location.href).host.split('.').slice(1).join('.');
|
||||
|
||||
@@ -95,7 +95,7 @@ export const useUsersStore = defineStore(STORES.USERS, {
|
||||
return (resource: ICredentialsResponse): boolean => {
|
||||
const permissions = getCredentialPermissions(this.currentUser, resource);
|
||||
|
||||
return permissions.use;
|
||||
return permissions.read;
|
||||
};
|
||||
},
|
||||
},
|
||||
@@ -301,10 +301,16 @@ export const useUsersStore = defineStore(STORES.USERS, {
|
||||
const users = await getUsers(rootStore.getRestApiContext);
|
||||
this.addUsers(users);
|
||||
},
|
||||
async inviteUsers(params: Array<{ email: string }>): Promise<IInviteResponse[]> {
|
||||
async inviteUsers(params: Array<{ email: string; role: IRole }>): Promise<IInviteResponse[]> {
|
||||
const rootStore = useRootStore();
|
||||
const users = await inviteUsers(rootStore.getRestApiContext, params);
|
||||
this.addUsers(users.map(({ user }) => ({ isPending: true, ...user })));
|
||||
this.addUsers(
|
||||
users.map(({ user }, index) => ({
|
||||
isPending: true,
|
||||
globalRole: { name: params[index].role },
|
||||
...user,
|
||||
})),
|
||||
);
|
||||
return users;
|
||||
},
|
||||
async reinviteUser(params: { email: string }): Promise<void> {
|
||||
|
||||
Reference in New Issue
Block a user