From 55a47a75f42cdccc05a6469003cc882c8fc4837f Mon Sep 17 00:00:00 2001
From: Bubka <858858+Bubka@users.noreply.github.com>
Date: Fri, 29 Oct 2021 17:12:58 +0200
Subject: [PATCH] Add OAuth Personal Access Token management
---
resources/js/components/Footer.vue | 2 +-
resources/js/components/SettingTabs.vue | 55 ++++++++
resources/js/components/index.js | 4 +-
resources/js/mixins.js | 7 +
resources/js/routes.js | 10 +-
resources/js/views/settings/Account.vue | 72 +++++++++--
resources/js/views/settings/Index.vue | 84 ------------
resources/js/views/settings/OAuth.vue | 120 ++++++++++++++++++
resources/js/views/settings/Options.vue | 83 +++++++-----
.../js/views/settings/PATokens/Create.vue | 50 ++++++++
resources/js/views/settings/Password.vue | 49 -------
resources/lang/en/commons.php | 4 +-
resources/lang/en/settings.php | 17 ++-
resources/sass/app.scss | 8 ++
14 files changed, 377 insertions(+), 188 deletions(-)
create mode 100644 resources/js/components/SettingTabs.vue
delete mode 100644 resources/js/views/settings/Index.vue
create mode 100644 resources/js/views/settings/OAuth.vue
create mode 100644 resources/js/views/settings/PATokens/Create.vue
delete mode 100644 resources/js/views/settings/Password.vue
diff --git a/resources/js/components/Footer.vue b/resources/js/components/Footer.vue
index 866073a9..c577168a 100644
--- a/resources/js/components/Footer.vue
+++ b/resources/js/components/Footer.vue
@@ -11,7 +11,7 @@
2FAuth - v{{ appVersion }}
-
{{ $t('settings.settings') }} -
{{ $t('auth.sign_out') }}
+
{{ $t('settings.settings') }} -
{{ $t('auth.sign_out') }}
diff --git a/resources/js/components/SettingTabs.vue b/resources/js/components/SettingTabs.vue
new file mode 100644
index 00000000..053cc25f
--- /dev/null
+++ b/resources/js/components/SettingTabs.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/js/components/index.js b/resources/js/components/index.js
index 68f69b4b..4dec27be 100644
--- a/resources/js/components/index.js
+++ b/resources/js/components/index.js
@@ -11,6 +11,7 @@ import FormCheckbox from './FormCheckbox'
import FormButtons from './FormButtons'
import VueFooter from './Footer'
import Kicker from './Kicker'
+import SettingTabs from './SettingTabs'
// Components that are registered globaly.
[
@@ -25,7 +26,8 @@ import Kicker from './Kicker'
FormCheckbox,
FormButtons,
VueFooter,
- Kicker
+ Kicker,
+ SettingTabs
].forEach(Component => {
Vue.component(Component.name, Component)
})
diff --git a/resources/js/mixins.js b/resources/js/mixins.js
index a7ddad38..e269419a 100644
--- a/resources/js/mixins.js
+++ b/resources/js/mixins.js
@@ -19,6 +19,13 @@ Vue.mixin({
this.$router.push({ name: 'login' })
},
+
+ exitSettings: function(event) {
+ if (event) {
+ this.$notify({ clean: true })
+ this.$router.push({ name: 'accounts' })
+ }
+ }
}
})
\ No newline at end of file
diff --git a/resources/js/routes.js b/resources/js/routes.js
index 4d60d481..56b6baf3 100644
--- a/resources/js/routes.js
+++ b/resources/js/routes.js
@@ -16,7 +16,10 @@ import Login from './views/auth/Login'
import Register from './views/auth/Register'
import PasswordRequest from './views/auth/password/Request'
import PasswordReset from './views/auth/password/Reset'
-import Settings from './views/settings/Index'
+import SettingsOptions from './views/settings/Options'
+import SettingsAccount from './views/settings/Account'
+import SettingsOAuth from './views/settings/OAuth'
+import GeneratePAT from './views/settings/PATokens/Create'
import Errors from './views/Error'
const router = new Router({
@@ -34,7 +37,10 @@ const router = new Router({
{ path: '/group/create', name: 'createGroup', component: CreateGroup, meta: { requiresAuth: true } },
{ path: '/group/:groupId/edit', name: 'editGroup', component: EditGroup, meta: { requiresAuth: true }, props: true },
- { path: '/settings', name: 'settings', component: Settings, meta: { requiresAuth: true } },
+ { path: '/settings/options', name: 'settings.options', component: SettingsOptions, meta: { requiresAuth: true } },
+ { path: '/settings/account', name: 'settings.account', component: SettingsAccount, meta: { requiresAuth: true } },
+ { path: '/settings/oauth', name: 'settings.oauth', component: SettingsOAuth, meta: { requiresAuth: true } },
+ { path: '/settings/oauth/pat/create', name: 'settings.oauth.generatePAT', component: GeneratePAT, meta: { requiresAuth: true } },
{ path: '/login', name: 'login', component: Login },
{ path: '/register', name: 'register', component: Register },
diff --git a/resources/js/views/settings/Account.vue b/resources/js/views/settings/Account.vue
index 4fe00f95..2a91326f 100644
--- a/resources/js/views/settings/Account.vue
+++ b/resources/js/views/settings/Account.vue
@@ -1,12 +1,33 @@
-
-
-
+
\ No newline at end of file
diff --git a/resources/js/views/settings/OAuth.vue b/resources/js/views/settings/OAuth.vue
new file mode 100644
index 00000000..6a489892
--- /dev/null
+++ b/resources/js/views/settings/OAuth.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/js/views/settings/Options.vue b/resources/js/views/settings/Options.vue
index 1ef50651..2802fd51 100644
--- a/resources/js/views/settings/Options.vue
+++ b/resources/js/views/settings/Options.vue
@@ -1,40 +1,53 @@
-
-
-
\ No newline at end of file
diff --git a/resources/js/views/settings/Password.vue b/resources/js/views/settings/Password.vue
deleted file mode 100644
index 4b68da85..00000000
--- a/resources/js/views/settings/Password.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/resources/lang/en/commons.php b/resources/lang/en/commons.php
index 89e3eebb..fcbb8e24 100644
--- a/resources/lang/en/commons.php
+++ b/resources/lang/en/commons.php
@@ -15,6 +15,7 @@
'cancel' => 'Cancel',
'update' => 'Update',
+ 'copy' => 'Copy',
'copy_to_clipboard' => 'Copy to clipboard',
'copied_to_clipboard' => 'Copied to clipboard',
'profile' => 'Profile',
@@ -35,5 +36,6 @@
'rename' => 'Rename',
'options' => 'Options',
'reload' => 'Reload',
- 'some_data_have_changed' => 'Some data have changed. You should'
+ 'some_data_have_changed' => 'Some data have changed. You should',
+ 'generate' => 'Generate',
];
\ No newline at end of file
diff --git a/resources/lang/en/settings.php b/resources/lang/en/settings.php
index 8e87b638..84863fa6 100644
--- a/resources/lang/en/settings.php
+++ b/resources/lang/en/settings.php
@@ -15,17 +15,30 @@
'settings' => 'Settings',
'account' => 'Account',
- 'password' => 'Password',
+ 'oauth' => 'OAuth',
+ 'tokens' => 'Tokens',
'options' => 'Options',
'confirm' => [
],
'general' => 'General',
'security' => 'Security',
+ 'profile' => 'Profile',
+ 'change_password' => 'Change password',
+ 'personal_access_tokens' => 'Personal access tokens',
+ 'token_legend' => 'Personal Access Tokens allow any app to authenticate to the 2Fauth API. You should specify the access token as a Bearer token in the authorization header of consumer apps requests.',
+ 'generate_new_token' => 'Generate a new token',
+ 'revoke' => 'Revoke',
+ 'token_revoked' => 'Token successfully revoked',
+ 'confirm' => [
+ 'revoke' => 'Are you sure you want to revoke this token?',
+ ],
+ 'make_sure_copy_token' => 'Make sure to copy your personal access token now. You won’t be able to see it again!',
'data_input' => 'Data input',
'forms' => [
'edit_settings' => 'Edit settings',
'setting_saved' => 'Settings saved',
+ 'new_token' => 'New token',
'language' => [
'label' => 'Language',
'help' => 'Change the language used to translate the app interface.'
@@ -90,4 +103,4 @@
'advanced_form' => 'Advanced form',
],
-];
+];
\ No newline at end of file
diff --git a/resources/sass/app.scss b/resources/sass/app.scss
index 681ce91f..4b79e327 100644
--- a/resources/sass/app.scss
+++ b/resources/sass/app.scss
@@ -76,6 +76,10 @@ a:hover {
margin-top: 55px;
}
+.group-item .tags:not(:last-child) {
+ margin-bottom: inherit;
+}
+
@media screen and (min-width: 769px) {
.accounts {
margin-top: 84px;
@@ -542,6 +546,10 @@ footer .field.is-grouped {
background-image: url('data:image/png;base64,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');
}
+.pat {
+ overflow-wrap: break-word;
+}
+
.fadeInOut-enter-active {
animation: fadeIn 500ms