editing file permissions in settings

This commit is contained in:
antelle 2021-04-25 19:59:52 +02:00
parent 9826965803
commit 42cb5a6c36
No known key found for this signature in database
GPG Key ID: 63C9777AAB7C563C
6 changed files with 155 additions and 13 deletions

View File

@ -230,6 +230,14 @@ const BrowserExtensionConnector = {
} else {
ProtocolImpl.deleteConnection(connectionId);
}
},
getClientPermissions(clientId) {
return ProtocolImpl.getClientPermissions(clientId);
},
setClientPermissions(clientId, permissions) {
ProtocolImpl.setClientPermissions(clientId, permissions);
}
};

View File

@ -447,6 +447,17 @@ const ProtocolImpl = {
Events.emit('browser-extension-sessions-changed');
},
getClientPermissions(clientId) {
return connectedClients.get(clientId)?.permissions;
},
setClientPermissions(clientId, permissions) {
const client = connectedClients.get(clientId);
if (client?.permissions) {
client.permissions = { ...client.permissions, ...permissions };
}
},
errorToResponse(e, request) {
return {
action: request?.action,

View File

@ -666,8 +666,12 @@
"setBrowserSessionsInactiveText": "This session is inactive. The extension is connected to KeeWeb, however, it hasn't tried to exchange data. When the extension requests anything, you will be able to choose what you want to share.",
"setBrowserSessionsDeniedTooltip": "Access denied",
"setBrowserSessionsDeniedText": "This session is inactive. The extension is connected to KeeWeb, however, you denied access to data.",
"setBrowserConnectedDate": "Connected",
"setBrowserTerminateSession": "Terminate this session",
"setBrowserSessionsConnectedDate": "Connected",
"setBrowserSessionsTerminate": "Terminate this session",
"setBrowserSessionsAccessToFiles": "Allow access to files",
"setBrowserSessionsNoFileAccess": "The extension doesn't have access to any file, it won't be able to fetch passwords from KeeWeb.",
"setBrowserSessionsPasswordsRead": "Passwords read",
"setBrowserSessionsPasswordsWritten": "Passwords saved",
"setDevicesTitle": "Devices",
"setDevicesEnableUsb": "Enable interaction with USB devices",

View File

@ -20,6 +20,8 @@ class SettingsBrowserView extends View {
events = {
'change .check-enable-for-browser': 'changeEnableForBrowser',
'change .settings__browser-focus-if-locked': 'changeFocusIfLocked',
'change .settings__browser-session-ask-get': 'changeSessionAskGet',
'change .settings__browser-session-file-check': 'changeSessionFileAccess',
'click .settings__browser-btn-terminate-session': 'terminateSession'
};
@ -34,10 +36,15 @@ class SettingsBrowserView extends View {
desktop: Features.isDesktop,
icon: Features.browserIcon,
focusIfLocked: AppSettingsModel.extensionFocusIfLocked,
sessions: BrowserExtensionConnector.sessions.map((session) => ({
...session,
connectedDate: DateFormat.dtStr(session.connectedDate)
}))
sessions: BrowserExtensionConnector.sessions.map((session) => {
const fileAccess = this.getSessionFileAccess(session);
return {
...session,
fileAccess,
noFileAccess: fileAccess && !fileAccess.some((f) => f.checked),
connectedDate: DateFormat.dtStr(session.connectedDate)
};
})
};
if (Features.isDesktop) {
data.extensionNames = ['KeeWeb Connect', 'KeePassXC-Browser'];
@ -74,6 +81,37 @@ class SettingsBrowserView extends View {
});
}
getSessionFileAccess(session) {
if (!session.permissions) {
return undefined;
}
const files = this.appModel.files.map((file) => ({
id: file.id,
name: file.name,
checked: session.permissions.files.includes(file.id) || session.permissions.allFiles
}));
for (const fileId of session.permissions.files) {
if (!this.appModel.files.get(fileId)) {
const fileInfo = this.appModel.fileInfos.get(fileId);
if (fileInfo) {
files.push({ id: fileId, name: fileInfo.name, checked: true });
}
}
}
files.push({
id: 'all',
name: files.length
? Locale.extensionConnectAllOtherFiles
: Locale.extensionConnectAllFiles,
checked: session.permissions.allFiles
});
return files;
}
changeEnableForBrowser(e) {
const enabled = e.target.checked;
const browser = e.target.dataset.browser;
@ -117,6 +155,42 @@ class SettingsBrowserView extends View {
this.render();
}
changeSessionAskGet(e) {
const clientId = e.target.dataset.clientId;
const askGet = e.target.value;
BrowserExtensionConnector.setClientPermissions(clientId, { askGet });
}
changeSessionFileAccess(e) {
const clientId = e.target.dataset.clientId;
const fileId = e.target.dataset.fileId;
const enabled = e.target.checked;
if (fileId === 'all') {
const allFiles = enabled;
const permChanges = { allFiles };
if (allFiles) {
permChanges.files = this.appModel.files.map((f) => f.id);
}
BrowserExtensionConnector.setClientPermissions(clientId, permChanges);
} else {
const permissions = BrowserExtensionConnector.getClientPermissions(clientId);
let files;
if (enabled) {
files = permissions.files.concat(fileId);
} else {
files = permissions.files.filter((f) => f !== fileId);
}
const permChanges = { files };
if (!enabled) {
permChanges.allFiles = false;
}
BrowserExtensionConnector.setClientPermissions(clientId, permChanges);
}
this.render();
}
terminateSession(e) {
const connectionId = e.target.dataset.connectionId;
BrowserExtensionConnector.terminateConnection(connectionId);

View File

@ -325,6 +325,13 @@
&-session-buttons {
margin-top: $base-padding-h;
}
&-session-files {
display: flex;
flex-wrap: wrap;
}
&-session-file {
margin: $base-padding;
}
}
&__donate-btn {
background: #fff;

View File

@ -99,18 +99,56 @@
></div>
{{session.extensionName}} ({{session.appName}})
</h3>
<p>{{res 'setBrowserConnectedDate'}}: {{session.connectedDate}}</p>
<p>{{res 'setBrowserSessionsConnectedDate'}}: {{session.connectedDate}}</p>
<p>
{{#if session.permissions}}
{{res 'setBrowserSessionsActiveText'}}
{{else if session.permissionsDenied}}
{{res 'setBrowserSessionsDeniedText'}}
{{else}}
{{res 'setBrowserSessionsInactiveText'}}
{{/if}}
</p>
{{#if session.permissions}}
{{res 'setBrowserSessionsActiveText'}}
{{else if session.permissionsDenied}}
{{res 'setBrowserSessionsDeniedText'}}
{{else}}
{{res 'setBrowserSessionsInactiveText'}}
<div>
<label>{{res 'setBrowserSessionsAccessToFiles'}}:</label>
<div class="settings__browser-session-files">
{{#each session.fileAccess as |file|}}
<div class="settings__browser-session-file">
<input type="checkbox" class="input-base settings__browser-session-file-check"
data-client-id="{{session.clientId}}"
data-file-id="{{file.id}}"
id="settings__browser-session-file-check--{{file.id}}"
{{#if file.checked}}checked{{/if}}
/>
<label for="settings__browser-session-file-check--{{file.id}}">{{file.name}}</label>
</div>
{{/each}}
</div>
</div>
{{#if session.noFileAccess}}
<p class="error-color">{{res 'setBrowserSessionsNoFileAccess'}}</p>
{{/if}}
<div>
<label for="settings__browser-session-ask-get--{{session.connectionId}}">{{res 'extensionConnectAskGet'}}</label>
<select id="settings__browser-session-ask-get--{{session.connectionId}}"
data-client-id="{{session.clientId}}"
class="settings__browser-session-ask-get settings__select input-base">
<option value="multiple" {{#ifeq session.permissions.askGet 'multiple'}}selected{{/ifeq}}>
{{res 'extensionConnectAskGetMultiple'}}
</option>
<option value="always" {{#ifeq session.permissions.askGet 'always'}}selected{{/ifeq}}>
{{res 'extensionConnectAskGetAlways'}}
</option>
</select>
</div>
{{/if}}
{{#if session.passwordsRead}}<p>{{res 'setBrowserSessionsPasswordsRead'}}: {{session.passwordsRead}}</p>{{/if}}
{{#if session.passwordsWritten}}<p>{{res 'setBrowserSessionsPasswordsWritten'}}: {{session.passwordsWritten}}</p>{{/if}}
<div class="settings__browser-session-buttons">
<button class="btn btn-error settings__browser-btn-terminate-session"
data-connection-id="{{session.connectionId}}"
>{{res 'setBrowserTerminateSession'}}</button>
>{{res 'setBrowserSessionsTerminate'}}</button>
</div>
{{/each}}
{{else}}