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,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAxwSURBVHhe7d15rFxlHcbxjhVQQCu4tBY0omIE0RZBwSURTBSFgMS4JCbGmhjrH0b5B8JfYjQaBRORf6SJURMSQwgoAapiosaNTZDFBSVhMdDSKotQyiK01+c5772my7n3znv6vnfOmd/3kzy577R3mXPufZ+ZOTPvmdHMzMwyADE9b/YjgIAoACAwCgAIjAIAAqMAgMAoACAwCgAIjAIAAqMAgMAoACAwCgAIjAIAAqMAgMAoACAwCgAIjAIAAqMAgMAoACAwCgAIjAIAAqtyUtDRaNR8UA5WjlM+oZymrFIoHWB+O5UtykblR8otyhOKpmqFuVqpADz5Pdk/p6xXVioA8mxVNigXK1tqNECtW2Pf8nvyf1Fh8gPdeO54DvlG1HOquFoF4Lv9vtIrmksAuvIc8o2p51RxtQrAj/m55QfK8FzynCqu1jGATfqwOl0CUMBmzdXDZsfF1CqAHfrA0X6gnJ2aq8tnx8XUmqRMfqCsKnOKiQoERgEAgVEAQGAUABAYBQAEVutpwC7f9HvKH9IQmGrvUj6ThuPTXG1W2RXlAigdf9sOWacAEfhvvW0OLJg951mJ8BAACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAIbzczMzA7LGY1GXb7pp5UfpmERH1BOSMOxbVUuTsO9nKS8Jw3H9phyYRp2dqByjLJGWaksVybNv99typ3KTcojymJeo3wqDbN8R/lPGu5mlbI+DbNsULak4cSsU36QhuPTXB3NDstxAZSOv22HeKeU9G2l7ecslFuV+ZyntH3NQrlX6cq/7Fcr31T+pDys7FDafs5SZ6eyXblLuUR5t7JYMblA277XYnFxtFmrtH3+YvHXTZr/1tuu24LZc56VCA8B+uulyneVzyvHKocqffl9uZx8z+RI5eOKb6Xfq/D3NDD8wvppf8X3YE5VPNH6bD/lrcrXlaP9DxgOCqCfTlROT8PBOF45Q3EhYCAogH7y5H9hGg7Kh5QD0hBDQAH001HKEG9J/RCgD89SYEwUQD8dpJR/yqe+oV7vsCgAlMTkHxgKAAiMAgACowCAwCgAIDAKYHo8odxXMP9SMOUogOlxuXJEwXRZaYeBoQCAwCgAIDAKAAiMAgACowCAwKb5nIA+ocZZaTi2Tcq30nAvpyg+z2AOnyvvq2m4F59+7DdpuJdfKz6FVg7vO+/DUs5UfpKGWQ5R2s7h5+3xduX6ivJoGu5mtXJ2Gma5QNmchrt5XPl+GlbHOQFb0odzAi5lfP3m44nS9jULJfsPahEugLafs1heorTpek7Apcq+nL8xF+cEBDB5FAAQGAUABEYBAIFRAEBg01wAc0dP0Q/+XfgdhdAj01wADylPpSF6wL8L/07QI9NcAH4/vQfTED3g8wvcnIboi2kugBuVG5TnmkuYNJfxRqXtVX2YkGkuAP+h+U0r/9xcwqQ9o1yjXKnw0KwnprkA7BblC8r1zSVM2v3K1xSvW3AhYMKmvQB81Pk65aPKZ5VrFS/48WKV3Dyt5PLPb/teTulbQb+jsF+HXyp+l5/S/EzAPco5it//8FLlbsX31tr20ULZpnThr2v7fl4MFE/bAoF9jb9th5ReDFTaeUrb9V4oXReYdFkM1Je4PJbCWqXt5y8Wf92ksRgIwORRAEBgFAAQGAUABEYBAIFRAP3ko75DNNTrHRYF0E9+TnqIK+ceUyiBAaEA+ukO5dk0HJTbFNZeDAgF0E9XKH633yHxPZbLFF7iOyAUQD/drlykDGXRjO+t+D0EvNiHewADQgH0l1cyetHMv5tL/fWk4jUW5ysP+B8wHBRAf/mA2peVLylXK55cfbl19YE+Xz8vtPLEP1fxyT44ADgw0/zWYKW9cTY5fOv4izTszKv8DldepaxQ+lDa/v16daTfYsur+7YrS8374uQ0zOKFVi6vSeKtwVrS99WAQCmsBgQweRQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAAQ28nuElzYajbp8028o16YhMNVOUc5Nw/Fpro5mh8X0qQAALKBGAfAQAAiMAgACowCAwCgAIDAKAAiMAgACowCAwCgAIDAKAAiMAgACowCAwCgAILA+LQY6W7k8DYGp9hHlgjQcX43FQP6mxeNv2yHrFCAC/623zYEFs+c8KxEeAgCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEFifFgNdqdyWhsvmFj3MfR9f3nVsvjz37/P9/67aPtfavtb2/Ny5/1vsa+e+znI/d+5zFvtoHtuul+fGtuv/L/S5c/83NLtuV46uX5droZ+zRjkzDcenuVr8evPWYMBA1CgAHgIAgVEAQGAUABAYBQAERgEAgdUqgB2zHwGUUWVO1SqAe2Y/AiijypyqVQA/nf0IoIwqc6pWAVyq/DMNAewjzyXPqeJqFcAdykXKw80lAF15DnkueU4VV+ulwP5wiPJJ5RzlMP8DgCyblPOVS5RHq8zVigVgy5UjlI8ppymrlFr3OobgAMX7IPc13c8oDynPNpf6bz/lZYq3N4f/GLco3t6odireBxuVy5R7leYZgBpz9f/vEFIymNepypOKd1JOfq68ThkKX1df57ZtWSjeNx9U0KJtru1rIt8aLzXf6p+u7N9cGp/b/wbFtwpD4et6o5L73LX3jfdR8VVvaEcBLB0fB3mb4odFOR5Uble2N5eGwbfkPreDr3sO7xvvo9XNJVRHASydE5VXpmGWvyt/TcPB8N15X2df91ye/O9IQ9RGASwNHxQ7WXlFc2l8/1VuVe5uLg2Lr7PvBXgbcrxc8b7yPkNlFMDSOFI5Rnl+c2l8fiz9e2WIayt8nX+n5B678MT3vvI+Q2UUQH0+oPUWJfcP2nejH1Buai4N0x8Vb4O3JYf31ZsVDgZWRgHUd7CyVsm9+/+c4iPpW5tLw+RbfxeYtyWH99WxivcdKqIA6vNBrS5H/59WvAAk99azT3zd/YIWb0sOng1YIhRAXb4L+3rl7c2lPH4Z6G/TcNB8HMDbkssF4H3Hw4CKKIC6DlROUrrclf2xknsEvY/8sl5vS64XKd533oeohAKo68XK+9Mwiyf+1Wk4Fa5RupTZ+xTvQ1RCAdR1tHJUGmb5i3JXGk6Ffyjeplzed132H8ZEAdTl17V3eUHLzxS/nHZaeFu8Tbnm1gagEgqgnhcoH07DLI8rv1SmaUmst+VXyrbmUh7vQ+9LVEAB1OMDWCvTMMv1ik8BNeSn//bkbblPua65lMfnT/C+RAUUQB1+6uoMJfe5f7981gUw5Bf/zMfb5GXNuS9r9j70vuTpwAoogDr8Ahav/sstgCEu/R3X3BLh3LUB3ocnKF1WUmIRFEAdXs7qu6657lT+loZTxw8DvG1dts+T/51piJIogPK84s/LWX1OvBx+nty3/tP8pio+v53Pbpt7bkPvSx8HyF1NiUVQAOW9QfFKttyn/3z33y+bzV04MySe+H558+bm0vi8L7usqMQiKICyfKBqjeLXsOfw3eP7FS+fnXY3K12WCHufelUlBwMLogDK8mv+vYw1d+mvbxk9+XMPkA2R7+l4W3MfBnifugAOai6hCAqgLJ/48zgl9+j/U4pfKTdNz/3Px9vobfU25/A+PV45vLmEIiiAcnzX1OfD9x9prrnH/1F4W7vc23G5vlbhYUAhFEA5vmvqI9VdVq9doeSeNGPIfOvvbc61QvE+5mFAIbXfGmxoDlX8qrMuvH59vfKm5lKeCxU/BRiJD5aelYZZfLrxDUqXdQV2lfJIGg5LlblKAezGB5l8Gm5MLx+k9SsSB6fGXOUhABAYBQAERgEAgVEAQGAUABAYBQAERgEAgVEAQGAUABAYBQAERgEAgVEAQGBVFgMBGAbuAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAIS1bNn/ABMRUfm704XyAAAAAElFTkSuQmCC'); } +.pat { + overflow-wrap: break-word; +} + .fadeInOut-enter-active { animation: fadeIn 500ms