refactoring permission banner

This commit is contained in:
msramalho
2025-02-06 20:11:27 +00:00
parent ddb803a82f
commit 021d2587fc
8 changed files with 67 additions and 47 deletions

View File

@@ -85,7 +85,7 @@ export default {
}, },
activeUserMessage() { activeUserMessage() {
if (this.user && this.user.active) { if (this.user && this.user.active) {
return "This account is active and can use the tool."; return "This account has access to at least one feature.";
} }
return "This account is inactive, please reach out to the Bellingcat team for access."; return "This account is inactive, please reach out to the Bellingcat team for access.";
} }

View File

@@ -0,0 +1,26 @@
<template>
<v-alert color="orange" icon="mdi-information" class="text-center" style="font-size:x-large">
To use the <strong>{{ feature }}</strong> feature, you need <strong>permission from Bellingcat's tech
team</strong>.
<br />
You can ask for access via <a href="https://forms.gle/crqBXUtyZcbLhiRQ9" target="_blank">this form</a>.
<br/>
<small>
<strong>NB: </strong>We do not allow law enforcement, military or intelligence agencies to use this tool.
</small>
</v-alert>
</template>
<script>
export default {
name: 'PermissionNeeded',
props: {
feature: {
type: String,
required: false
}
}
}
</script>
<style scoped></style>

View File

@@ -1,8 +1,8 @@
import { createRouter, createWebHistory } from 'vue-router'; import { createRouter, createWebHistory } from 'vue-router';
import HomeView from '../views/HomeView.vue'; import HomeView from '../views/HomeView.vue';
import ArchivesView from '../views/ArchivesView.vue'; import ArchiveSearchView from '../views/ArchiveSearchView.vue';
import ArchiveUrl from "../components/ArchiveUrl.vue"; import ArchiveUrlView from "../views/ArchiveUrlView.vue";
const routes = [ const routes = [
{ {
@@ -13,12 +13,12 @@ const routes = [
{ {
path: '/url', path: '/url',
name: 'URL Archiving', name: 'URL Archiving',
component: ArchiveUrl, component: ArchiveUrlView,
}, },
{ {
path: '/archives', path: '/archives',
name: 'Archives search', name: 'Archives search',
component: ArchivesView, component: ArchiveSearchView,
}, },
{ {
path: '/privacy', path: '/privacy',

View File

@@ -60,11 +60,9 @@ export default createStore({
setUserPermissions(state, permissions) { setUserPermissions(state, permissions) {
state.user.permissions = permissions; state.user.permissions = permissions;
state.user.groups = Object.keys(permissions).filter(key => key !== "all"); state.user.groups = Object.keys(permissions).filter(key => key !== "all");
saveToLocalStorage(state);
}, },
setUserUsage(state, usage) { setUserUsage(state, usage) {
state.user.usage = usage; state.user.usage = usage;
saveToLocalStorage(state);
}, },
setSheets(state, sheets) { setSheets(state, sheets) {
state.sheets = sheets; state.sheets = sheets;

View File

@@ -1,5 +1,6 @@
<template> <template>
<v-container class="pane-l" v-if="user?.active"> <PermissionNeeded v-if="user && !featureEnabled" feature="Search Archives" />
<v-container class="pane-l" v-if="user?.active && featureEnabled">
<v-row> <v-row>
<v-col> <v-col>
<v-card elevation="12"> <v-card elevation="12">
@@ -100,9 +101,14 @@
</template> </template>
<script> <script>
import PermissionNeeded from "@/components/PermissionNeeded.vue";
import { urlValidator, getUrlFromResult } from "@/utils/misc.js"; import { urlValidator, getUrlFromResult } from "@/utils/misc.js";
export default { export default {
name: "ArchivesView", name: "ArchiveSearchView",
components: {
PermissionNeeded
},
data() { data() {
return { return {
today: new Date().toISOString().substring(0, 10), today: new Date().toISOString().substring(0, 10),
@@ -136,6 +142,16 @@ export default {
user() { user() {
return this.$store.state.user; return this.$store.state.user;
}, },
featureEnabled() {
const read = this.user?.permissions?.['all']?.read
if (read === true) {
return true;
}
if (Array.isArray(read) && read.length > 0) {
return true;
}
return this.user?.permissions?.['all']?.read_public
},
validUrl() { validUrl() {
return this.queryUrl && this.urlValidator(this.queryUrl) === true; return this.queryUrl && this.urlValidator(this.queryUrl) === true;
}, },

View File

@@ -1,5 +1,6 @@
<template> <template>
<v-container class="pane" v-if="user?.active"> <PermissionNeeded v-if="user && !featureEnabled" feature="Archive URL" />
<v-container class="pane" v-if="user?.active && featureEnabled">
<v-card :loading="loadingArchive"> <v-card :loading="loadingArchive">
<v-card-title class="text-center"> <v-card-title class="text-center">
Archive a single URL Archive a single URL
@@ -82,11 +83,12 @@
<script> <script>
import { urlValidator, getUrlFromResult } from "@/utils/misc"; import { urlValidator, getUrlFromResult } from "@/utils/misc";
import SnackBar from "@/components/SnackBar.vue"; import SnackBar from "@/components/SnackBar.vue";
import PermissionNeeded from "@/components/PermissionNeeded.vue";
export default { export default {
name: "ArchiveUrl", name: "ArchiveUrlView",
components: { components: {
SnackBar, SnackBar, PermissionNeeded
}, },
data() { data() {
return { return {
@@ -110,6 +112,9 @@ export default {
user() { user() {
return this.$store.state.user; return this.$store.state.user;
}, },
featureEnabled() {
return this.user?.permissions?.["all"]?.archive_url;
},
urlValidator() { urlValidator() {
return urlValidator; return urlValidator;
}, },

View File

@@ -1,12 +1,10 @@
<template> <template>
<PermissionNeeded v-if="user && !featureEnabled" feature="Archive Spreadsheets" />
<v-container class="pane" fluid v-if="!user || !user.active"> <v-container class="pane" fluid v-if="!user || !user.active">
<v-row> <v-row>
<v-col> <v-col>
<v-alert color="orange" icon="mdi-information" v-if="user && !user.active" class="text-center" style="font-size:x-large">
To use this tool you need <strong>permission from Bellingcat's tech team</strong>. You can ask for access via <a href="https://forms.gle/crqBXUtyZcbLhiRQ9" target="_blank">this form</a>.
</v-alert>
<v-card> <v-card>
<v-card-text> <v-card-text>
<v-card-title class="text-center"> <v-card-title class="text-center">
Welcome to the Auto Archiver Setup Tool Welcome to the Auto Archiver Setup Tool
</v-card-title> </v-card-title>
@@ -22,28 +20,32 @@
<div class="text-center"> <div class="text-center">
<v-btn v-if="!user" @click="$store.dispatch('signin')" size="large">Sign In</v-btn> <v-btn v-if="!user" @click="$store.dispatch('signin')" size="large">Sign In</v-btn>
</div> </div>
</v-card-text> </v-card-text>
</v-card> </v-card>
</v-col> </v-col>
</v-row> </v-row>
</v-container> </v-container>
<ArchiveSheet v-if="user?.active" /> <ArchiveSheet v-if="user?.active && featureEnabled" />
<ManageSheets v-if="user?.active" /> <ManageSheets v-if="user?.active && featureEnabled" />
</template> </template>
<script> <script>
import ArchiveSheet from "@/components/ArchiveSheet.vue"; import ArchiveSheet from "@/components/ArchiveSheet.vue";
import ManageSheets from "@/components/ManageSheets.vue"; import ManageSheets from "@/components/ManageSheets.vue";
import PermissionNeeded from "@/components/PermissionNeeded.vue";
export default { export default {
name: "HomeView", name: "HomeView",
components: { components: {
ArchiveSheet, ManageSheets ArchiveSheet, ManageSheets, PermissionNeeded
}, },
computed: { computed: {
user() { user() {
return this.$store.state.user; return this.$store.state.user;
}, },
featureEnabled() {
return this.user?.permissions?.["all"]?.archive_sheet;
}
} }
}; };
</script> </script>

View File

@@ -1,27 +0,0 @@
<template>
<ArchiveSheet v-if="user?.active" />
<ManageSheets v-if="user?.active" />
</template>
<script>
import ArchiveSheet from "@/components/ArchiveSheet.vue";
import ManageSheets from "@/components/ManageSheets.vue";
export default {
name: "SheetView",
components: {
ArchiveSheet, ManageSheets
},
data() {
return {
};
},
computed: {
user() {
return this.$store.state.user;
},
},
methods: {},
};
</script>