diff options
author | Roeland Jago Douma <roeland@famdouma.nl> | 2019-04-03 16:00:46 +0200 |
---|---|---|
committer | Roeland Jago Douma <roeland@famdouma.nl> | 2019-05-20 20:50:27 +0200 |
commit | f03eb7ec3c130d19323f7fb4bdb5ba398f1b3e2d (patch) | |
tree | 5af334055b94b3b8119b3f76d974f136d26a0199 /settings/src | |
parent | ae7f89fd9f2bb87c0254f5fa087d0d9472612644 (diff) | |
download | nextcloud-server-f03eb7ec3c130d19323f7fb4bdb5ba398f1b3e2d.tar.gz nextcloud-server-f03eb7ec3c130d19323f7fb4bdb5ba398f1b3e2d.zip |
Remote wipe support
This allows a user to mark a token for remote wipe.
Clients that support this can then wipe the device properly.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'settings/src')
-rw-r--r-- | settings/src/components/AuthToken.vue | 34 | ||||
-rw-r--r-- | settings/src/components/AuthTokenList.vue | 7 | ||||
-rw-r--r-- | settings/src/components/AuthTokenSection.vue | 21 |
3 files changed, 58 insertions, 4 deletions
diff --git a/settings/src/components/AuthToken.vue b/settings/src/components/AuthToken.vue index a8b1bb14437..44365b5f4db 100644 --- a/settings/src/components/AuthToken.vue +++ b/settings/src/components/AuthToken.vue @@ -20,7 +20,8 @@ --> <template> - <tr :data-id="token.id"> + <tr :data-id="token.id" + :class="{wiping}"> <td class="client"> <div :class="iconName.icon"></div> </td> @@ -33,6 +34,8 @@ @blur="cancelRename" @keyup.esc="cancelRename"> <span v-else>{{iconName.name}}</span> + <span v-if="wiping" + class="wiping-warning">({{ t('settings', 'Marked for remote wipe') }})</span> </td> <td> <span class="last-activity" v-tooltip="lastActivity">{{lastActivityRelative}}</span> @@ -142,13 +145,25 @@ text: t('settings', 'Rename'), }); } - if (this.token.canDelete) { + if (this.token.canDelete && this.token.type !== 2) { // TODO: add text/longtext with some description actions.push({ icon: 'icon-delete', action: () => this.$emit('delete', this.token), text: t('settings', 'Revoke'), }); + actions.push({ + icon: 'icon-delete', + action: this.wipe, + text: t('settings', 'Wipe device'), + }); + } else if (this.token.canDelete && this.token.type === 2) { + actions.push({ + icon: 'icon-delete', + action: () => this.$emit('delete', this.token), + text: t('settings', 'Revoke'), + longtext: t('settings', 'Revoking this token might prevent the wiping of your device if it hasn\'t started the wipe yet.'), + }); } return actions; @@ -197,6 +212,9 @@ name, }; }, + wiping() { + return this.token.type === 2; + } }, data () { return { @@ -224,11 +242,20 @@ this.renaming = false; this.$emit('rename', this.token, this.newName); }, + wipe () { + this.actionOpen = false; + + this.$emit('wipe', this.token); + } } } </script> <style lang="scss" scoped> + .wiping { + background-color: var(--color-background-darker); + } + td { border-top: 1px solid var(--color-border); max-width: 200px; @@ -254,6 +281,9 @@ margin: 0; } } + &.token-name .wiping-warning { + color: var(--color-text-lighter); + } &.more { @extend %icon; diff --git a/settings/src/components/AuthTokenList.vue b/settings/src/components/AuthTokenList.vue index 1c83488ed19..a7c0faf1b7b 100644 --- a/settings/src/components/AuthTokenList.vue +++ b/settings/src/components/AuthTokenList.vue @@ -35,7 +35,8 @@ :token="token" @toggleScope="toggleScope" @rename="rename" - @delete="onDelete"/> + @delete="onDelete" + @wipe="onWipe" /> </tbody> </table> </template> @@ -75,6 +76,10 @@ onDelete (token) { // Just pass it on this.$emit('delete', token); + }, + onWipe(token) { + // Just pass it on + this.$emit('wipe', token); } } } diff --git a/settings/src/components/AuthTokenSection.vue b/settings/src/components/AuthTokenSection.vue index 6d70059abd6..0f2da49e053 100644 --- a/settings/src/components/AuthTokenSection.vue +++ b/settings/src/components/AuthTokenSection.vue @@ -26,13 +26,15 @@ <AuthTokenList :tokens="tokens" @toggleScope="toggleTokenScope" @rename="rename" - @delete="deleteToken"/> + @delete="deleteToken" + @wipe="wipeToken" /> <AuthTokenSetupDialogue :add="addNewToken" /> </div> </template> <script> import Axios from 'nextcloud-axios'; + import confirmPassword from 'nextcloud-password-confirmation'; import AuthTokenList from './AuthTokenList'; import AuthTokenSetupDialogue from './AuthTokenSetupDialogue'; @@ -132,6 +134,23 @@ // Restore this.tokens.push(token); }) + }, + wipeToken(token) { + console.debug('wiping app token', token); + + confirmPassword() + .then(() => Axios.post(this.baseUrl + '/wipe/' + token.id)) + .then(tap(() => { + console.debug('app token marked for wipe') + + // Update the type + // TODO: refactor the server-side code to return the updated token + token.type = 2; + })) + .catch(err => { + console.error.bind('could not wipe app token', err); + OC.Notification.showTemporary(t('core', 'Error while wiping the device with the token')); + }) } } } |