summaryrefslogtreecommitdiffstats
path: root/settings/src
diff options
context:
space:
mode:
authorRoeland Jago Douma <roeland@famdouma.nl>2019-04-03 16:00:46 +0200
committerRoeland Jago Douma <roeland@famdouma.nl>2019-05-20 20:50:27 +0200
commitf03eb7ec3c130d19323f7fb4bdb5ba398f1b3e2d (patch)
tree5af334055b94b3b8119b3f76d974f136d26a0199 /settings/src
parentae7f89fd9f2bb87c0254f5fa087d0d9472612644 (diff)
downloadnextcloud-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.vue34
-rw-r--r--settings/src/components/AuthTokenList.vue7
-rw-r--r--settings/src/components/AuthTokenSection.vue21
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'));
+ })
}
}
}