mirror of https://github.com/keeweb/keeweb
editing file permissions in settings
parent
9826965803
commit
42cb5a6c36
|
@ -230,6 +230,14 @@ const BrowserExtensionConnector = {
|
|||
} else {
|
||||
ProtocolImpl.deleteConnection(connectionId);
|
||||
}
|
||||
},
|
||||
|
||||
getClientPermissions(clientId) {
|
||||
return ProtocolImpl.getClientPermissions(clientId);
|
||||
},
|
||||
|
||||
setClientPermissions(clientId, permissions) {
|
||||
ProtocolImpl.setClientPermissions(clientId, permissions);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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}}
|
||||
|
|
Loading…
Reference in New Issue