From 64d36a111b7fd62641043c21172cd60e07dc5a73 Mon Sep 17 00:00:00 2001 From: YUCLing Date: Sun, 25 Feb 2024 04:55:37 +0800 Subject: [PATCH] rewrite: frontend --- composer.json | 8 +- extend.php | 6 +- js/.gitignore | 2 + js/dist/admin.js | Bin 11146 -> 0 bytes js/dist/admin.js.map | Bin 33035 -> 0 bytes js/dist/forum.js | Bin 7237 -> 0 bytes js/dist/forum.js.map | Bin 24355 -> 0 bytes js/package-lock.json | Bin 405887 -> 0 bytes js/package.json | 19 +- .../admin/components/EditApplicationModal.tsx | 44 +++ js/src/admin/components/EditModelModal.tsx | 87 +++++ .../{SettingsPage.js => SettingsPage.tsx} | 17 +- js/src/admin/index.js | 16 - js/src/admin/index.ts | 36 ++ js/src/admin/pages/ClientsPage.js | 100 ------ js/src/admin/pages/ClientsPage.tsx | 79 +++++ js/src/admin/pages/IndexPage.js | 132 ------- js/src/admin/pages/IndexPage.tsx | 23 ++ js/src/admin/pages/ScopesPage.js | 118 ------ js/src/admin/pages/ScopesPage.tsx | 166 +++++++++ js/src/admin/util.ts | 10 + js/src/common/{extend.js => extend.ts} | 0 js/src/common/models/Client.js | 14 - js/src/common/models/Client.ts | 14 + js/src/common/models/Scope.js | 11 - js/src/common/models/Scope.ts | 11 + .../forum/components/oauth/AuthorizePage.js | 222 ------------ .../forum/components/oauth/AuthorizePage.tsx | 212 +++++++++++ .../{AuthorizedPage.js => AuthorizedPage.tsx} | 4 +- js/src/forum/index.js | 34 -- js/src/forum/index.ts | 14 + js/tsconfig.json | 42 +-- js/webpack.config.js | 35 +- js/yarn.lock | Bin 0 -> 128877 bytes less/forum/oauth.less | 335 +++++++----------- locale/en.yml | 16 +- locale/zh-Hans.yml | 14 +- ...d_default_record_to_oauth_scopes_table.php | 2 +- src/Api/Controller/CreateClientController.php | 17 +- src/Api/Controller/ListScopeController.php | 2 +- src/Api/Controller/ShowClientController.php | 2 +- src/Controllers/AuthorizeController.php | 2 +- src/Middlewares/UserCredentialsMiddleware.php | 2 +- src/OAuth.php | 8 +- 44 files changed, 950 insertions(+), 926 deletions(-) delete mode 100644 js/dist/admin.js delete mode 100644 js/dist/admin.js.map delete mode 100644 js/dist/forum.js delete mode 100644 js/dist/forum.js.map delete mode 100644 js/package-lock.json create mode 100644 js/src/admin/components/EditApplicationModal.tsx create mode 100644 js/src/admin/components/EditModelModal.tsx rename js/src/admin/components/{SettingsPage.js => SettingsPage.tsx} (80%) delete mode 100644 js/src/admin/index.js create mode 100644 js/src/admin/index.ts delete mode 100644 js/src/admin/pages/ClientsPage.js create mode 100644 js/src/admin/pages/ClientsPage.tsx delete mode 100644 js/src/admin/pages/IndexPage.js create mode 100644 js/src/admin/pages/IndexPage.tsx delete mode 100644 js/src/admin/pages/ScopesPage.js create mode 100644 js/src/admin/pages/ScopesPage.tsx create mode 100644 js/src/admin/util.ts rename js/src/common/{extend.js => extend.ts} (100%) delete mode 100644 js/src/common/models/Client.js create mode 100644 js/src/common/models/Client.ts delete mode 100644 js/src/common/models/Scope.js create mode 100644 js/src/common/models/Scope.ts delete mode 100644 js/src/forum/components/oauth/AuthorizePage.js create mode 100644 js/src/forum/components/oauth/AuthorizePage.tsx rename js/src/forum/components/user/{AuthorizedPage.js => AuthorizedPage.tsx} (91%) delete mode 100644 js/src/forum/index.js create mode 100644 js/src/forum/index.ts create mode 100644 js/yarn.lock diff --git a/composer.json b/composer.json index cbe48db..8467d87 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { - "name": "foskym/flarum-oauth-center", - "description": "Allow user to authorize the third clients", + "name": "rhodes-island/flarum-oauth-center", + "description": "Allow user to authorize the third-party clients", "keywords": [ "flarum", "user", @@ -19,6 +19,10 @@ "email": "i@fosky.top", "role": "Developer", "homepage": "https://fosky.top" + }, + { + "name": "Rain", + "role": "Developer" } ], "autoload": { diff --git a/extend.php b/extend.php index 5bae177..0379ef1 100644 --- a/extend.php +++ b/extend.php @@ -48,9 +48,9 @@ return [ ->get('/user', 'user.show', Controllers\ApiUserController::class), (new Extend\Settings) - ->serializeToForum('foskym-oauth-center.allow_implicit', 'foskym-oauth-center.allow_implicit', 'boolval') - ->serializeToForum('foskym-oauth-center.enforce_state', 'foskym-oauth-center.enforce_state', 'boolval') - ->serializeToForum('foskym-oauth-center.require_exact_redirect_uri', 'foskym-oauth-center.require_exact_redirect_uri', 'boolval'), + ->serializeToForum('rhodes-island-oauth-center.allow_implicit', 'rhodes-island-oauth-center.allow_implicit', 'boolval') + ->serializeToForum('rhodes-island-oauth-center.enforce_state', 'rhodes-island-oauth-center.enforce_state', 'boolval') + ->serializeToForum('rhodes-island-oauth-center.require_exact_redirect_uri', 'rhodes-island-oauth-center.require_exact_redirect_uri', 'boolval'), (new Extend\Middleware('api')) ->insertAfter(AuthenticateWithHeader::class, ResourceScopeMiddleware::class), diff --git a/js/.gitignore b/js/.gitignore index adc90f3..d8d1816 100644 --- a/js/.gitignore +++ b/js/.gitignore @@ -7,3 +7,5 @@ !.yarn/versions node_modules + +dist \ No newline at end of file diff --git a/js/dist/admin.js b/js/dist/admin.js deleted file mode 100644 index 6c858cdc423d136851f3c286484953be65c52fca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11146 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 J?<55W{{sqVh`s;- diff --git a/js/dist/admin.js.map b/js/dist/admin.js.map deleted file mode 100644 index 4251e7d0c40c6e3969ddf93cb6b3283c2e007c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33035 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 diff --git a/js/dist/forum.js b/js/dist/forum.js deleted file mode 100644 index 5515709918327db8ccdb4c7641677eea631d460a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7237 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 Z^YE{DxkPvU@}G|x$~*ql^wr^>{{cEL4VC}^ diff --git a/js/dist/forum.js.map b/js/dist/forum.js.map deleted file mode 100644 index 36873d769e9b5f811b86fa4bc04249530a6c41f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24355 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 diff --git a/js/package-lock.json b/js/package-lock.json deleted file mode 100644 index 8480f8f20804bddcee680065ce2367c2e11d24b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405887 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 diff --git a/js/package.json b/js/package.json index bda04ef..b85cb74 100644 --- a/js/package.json +++ b/js/package.json @@ -1,16 +1,18 @@ { - "name": "@foskym/flarum-oauth-center", + "name": "@rhodes-island/flarum-oauth-center", "private": true, "version": "0.0.0", "devDependencies": { - "flarum-webpack-config": "^2.0.0", - "webpack": "^5.65.0", - "webpack-cli": "^4.9.1", - "prettier": "^2.5.1", - "@flarum/prettier-config": "^1.0.0", + "@babel/core": "^7.14.6", + "@types/mithril": "^2.0.11", + "babel-loader": "^8.2.2", "flarum-tsconfig": "^1.0.2", + "flarum-webpack-config": "^2.0.2", + "moment": "^2.29.1", + "ts-loader": "8.1.0", "typescript": "^4.5.4", - "typescript-coverage-report": "^0.6.1" + "webpack": "^5.90.3", + "webpack-cli": "^5.1.4" }, "scripts": { "dev": "webpack --mode development --watch", @@ -23,6 +25,5 @@ "post-build-typings": "find dist-typings -type f -name '*.d.ts' -print0 | xargs -0 sed -i 's,../src/@types,@types,g'", "check-typings": "tsc --noEmit --emitDeclarationOnly false", "check-typings-coverage": "typescript-coverage-report" - }, - "prettier": "@flarum/prettier-config" + } } diff --git a/js/src/admin/components/EditApplicationModal.tsx b/js/src/admin/components/EditApplicationModal.tsx new file mode 100644 index 0000000..b68464a --- /dev/null +++ b/js/src/admin/components/EditApplicationModal.tsx @@ -0,0 +1,44 @@ +import app from "flarum/admin/app"; +import type Client from "src/common/models/Client"; + +import EditModelModal from "./EditModelModal"; +import { NestedStringArray } from "@askvortsov/rich-icu-message-formatter"; +import { randomString } from "../util"; + +export default class EditApplicationModal extends EditModelModal { + modelType(): string { + return "oauth-clients"; + } + + fields() { + return [ + 'client_id', + 'client_secret', + 'redirect_uri', + 'grant_types', + 'scope', + 'client_name', + 'client_desc', + 'client_icon', + 'client_home' + ]; + } + + defaultValues() { + return { + client_id: randomString(32), + client_secret: randomString(32) + }; + } + + translateFieldName(field: string): NestedStringArray { + return app.translator.trans("rhodes-island-oauth-center.admin.clients." + field); + } + + className(): string { + return "OAuth-EditApplication"; + } + title() { + return app.translator.trans("rhodes-island-oauth-center.admin.clients.edit_modal_title_" + (this.model ? "edit" : "add")); + } +} \ No newline at end of file diff --git a/js/src/admin/components/EditModelModal.tsx b/js/src/admin/components/EditModelModal.tsx new file mode 100644 index 0000000..8f930e0 --- /dev/null +++ b/js/src/admin/components/EditModelModal.tsx @@ -0,0 +1,87 @@ +import { type NestedStringArray } from "@askvortsov/rich-icu-message-formatter"; +import app from "flarum/admin/app"; +import type Model from "flarum/common/Model"; +import Button from "flarum/common/components/Button"; +import Modal from "flarum/common/components/Modal"; +import Stream from "flarum/common/utils/Stream"; + +export default abstract class EditModelModal extends Modal { + model: T | undefined; + + saving = false; + fieldValues: { [x: string]: Stream } = {}; + + oninit(vnode: any): void { + super.oninit(vnode); + + this.model = (this.attrs as any).model; + + for (const field of this.fields()) { + this.fieldValues[field] = Stream(this.model ? ((this.model as any)[field]() ?? "") : ""); + } + + if (!this.model) { + const defaults = this.defaultValues(); + for (const field in defaults) { + this.fieldValues[field](defaults[field]); + } + } + } + + abstract modelType(): string; + + abstract fields(): string[]; + + abstract defaultValues(): { [x: string]: string } + + abstract translateFieldName(field: string): NestedStringArray + + className(): string { + return "OAuth-EditModel"; + } + content() { + return ( +
+ {this.fields().map(field =>
+ + +
)} + +
+ ); + } + + save() { + this.saving = true; + if (!this.model) { + this.model = app.store.createRecord(this.modelType()) as T; + } + let modifiedCount = 0; + const attrs: { [x: string]: string } = {}; + Object.entries(this.fieldValues).forEach(val => { + const value = val[1](); + const modelValue = (this.model as any)[val[0]](); + if (value != modelValue && (value != "" || modelValue != null)) { + attrs[val[0]] = value; + modifiedCount++; + } + }); + if (modifiedCount == 0) { + this.saving = false; + return; + }; + this.model.save(attrs).finally(() => { + this.saving = false; + if (typeof (this.attrs as any).createCallback === "function") { + (this.attrs as any).createCallback(); + } + m.redraw(); + }); + } +} \ No newline at end of file diff --git a/js/src/admin/components/SettingsPage.js b/js/src/admin/components/SettingsPage.tsx similarity index 80% rename from js/src/admin/components/SettingsPage.js rename to js/src/admin/components/SettingsPage.tsx index d595d7f..e6102ba 100644 --- a/js/src/admin/components/SettingsPage.js +++ b/js/src/admin/components/SettingsPage.tsx @@ -4,6 +4,7 @@ import Button from 'flarum/common/components/Button'; import IndexPage from "../pages/IndexPage"; import ClientsPage from "../pages/ClientsPage"; import ScopesPage from "../pages/ScopesPage"; + export default class SettingsPage extends ExtensionPage { content() { const page = m.route.param().page || 'index'; @@ -24,42 +25,42 @@ export default class SettingsPage extends ExtensionPage { } // Return button menus - menuButtons(page) { + menuButtons(page: string) { return [ Button.component({ className: `Button ${page === 'index' ? 'item-selected' : ''}`, onclick: () => m.route.set( app.route('extension', { - id: 'foskym-oauth-center' + id: 'rhodes-island-oauth-center' }) ), icon: 'fas fa-home', - }, app.translator.trans('foskym-oauth-center.admin.page.index')), + }, app.translator.trans('rhodes-island-oauth-center.admin.page.index')), Button.component({ className: `Button ${page === 'clients' ? 'item-selected' : ''}`, onclick: () => m.route.set( app.route('extension', { - id: 'foskym-oauth-center', + id: 'rhodes-island-oauth-center', page: 'clients' }) ), icon: 'fas fa-network-wired', - }, app.translator.trans('foskym-oauth-center.admin.page.clients')), + }, app.translator.trans('rhodes-island-oauth-center.admin.page.clients')), Button.component({ className: `Button ${page === 'scopes' ? 'item-selected' : ''}`, onclick: () => m.route.set( app.route('extension', { - id: 'foskym-oauth-center', + id: 'rhodes-island-oauth-center', page: 'scopes' }) ), icon: 'fas fa-user-lock', - }, app.translator.trans('foskym-oauth-center.admin.page.scopes')), + }, app.translator.trans('rhodes-island-oauth-center.admin.page.scopes')), ]; } - pageContent(page) { + pageContent(page: string) { if (page == 'clients') { return } else if (page == 'scopes') { diff --git a/js/src/admin/index.js b/js/src/admin/index.js deleted file mode 100644 index 6f67bfe..0000000 --- a/js/src/admin/index.js +++ /dev/null @@ -1,16 +0,0 @@ -import app from 'flarum/admin/app'; -import SettingsPage from './components/SettingsPage'; -app.initializers.add('foskym/flarum-oauth-center', () => { - app.extensionData - .for('foskym-oauth-center') - .registerPage(SettingsPage) - .registerPermission( - { - icon: 'fas fa-user-friends', - label: app.translator.trans('foskym-oauth-center.admin.permission.use_oauth'), - permission: 'foskym-oauth-center.use-oauth', - }, - 'view', - 95 - ); -}); diff --git a/js/src/admin/index.ts b/js/src/admin/index.ts new file mode 100644 index 0000000..6ac3256 --- /dev/null +++ b/js/src/admin/index.ts @@ -0,0 +1,36 @@ +import app from 'flarum/admin/app'; +import SettingsPage from './components/SettingsPage'; +app.initializers.add('foskym/flarum-oauth-center', () => { + app.extensionData + .for('rhodes-island-oauth-center') + .registerPage(SettingsPage) + .registerPermission( + { + icon: 'fas fa-user-friends', + label: app.translator.trans('rhodes-island-oauth-center.admin.permission.use_oauth'), + permission: 'rhodes-island-oauth-center.use-oauth', + }, + 'view', + 95 + ) + .registerSetting({ + label: app.translator.trans('rhodes-island-oauth-center.admin.settings.allow_implicit'), + setting: "rhodes-island-oauth-center.allow_implicit", + type: "boolean" + }) + .registerSetting({ + label: app.translator.trans('rhodes-island-oauth-center.admin.settings.enforce_state'), + setting: "rhodes-island-oauth-center.enforce_state", + type: "boolean" + }) + .registerSetting({ + label: app.translator.trans('rhodes-island-oauth-center.admin.settings.require_exact_redirect_uri'), + setting: "rhodes-island-oauth-center.require_exact_redirect_uri", + type: "boolean" + }) + .registerSetting({ + label: app.translator.trans('rhodes-island-oauth-center.admin.settings.access_lifetime'), + setting: "rhodes-island-oauth-center.access_lifetime", + type: "number" + }); +}); diff --git a/js/src/admin/pages/ClientsPage.js b/js/src/admin/pages/ClientsPage.js deleted file mode 100644 index b05e0af..0000000 --- a/js/src/admin/pages/ClientsPage.js +++ /dev/null @@ -1,100 +0,0 @@ -import app from 'flarum/admin/app'; -import Page from 'flarum/common/components/Page'; -import Button from 'flarum/common/components/Button'; -export default class ClientsPage extends Page { - translationPrefix = 'foskym-oauth-center.admin.clients.'; - clients = []; - oninit(vnode) { - super.oninit(vnode); - - this.fields = [ - 'client_id', - 'client_secret', - 'redirect_uri', - 'grant_types', - 'scope', - 'client_name', - 'client_desc', - 'client_icon', - 'client_home' - ]; - - app.store.find('oauth-clients').then(r => { - this.clients = r; - this.fields.map(key => console.log(this.clients[0][key])) - m.redraw(); - }); - } - - view() { - return ( -
- { - m('.Form-group', [ - m('table', [ - m('thead', m('tr', [ - this.fields.map(key => m('th', app.translator.trans(this.translationPrefix + key))), - m('th'), - ])), - m('tbody', [ - this.clients.map((client, index) => m('tr', [ - this.fields.map(key => - m('td', m('input.FormControl', { - type: 'text', - value: client[key]() || '', - onchange: (event) => { - this.saveClientInfo(index, key, event.target.value); - }, - })) - ), - m('td', Button.component({ - className: 'Button Button--icon', - icon: 'fas fa-times', - onclick: () => { - this.clients[index].delete(); - this.clients.splice(index, 1); - - }, - })), - ])), - m('tr', m('td', { - colspan: 9, - }, Button.component({ - className: 'Button Button--block', - onclick: () => { - const client = app.store.createRecord('oauth-clients'); - const client_id = this.randomString(32); - const client_secret = this.randomString(32); - client.save({ - client_id: client_id, - client_secret: client_secret, - }).then(this.clients.push(client)); - }, - }, app.translator.trans(this.translationPrefix + 'add_button')))), - ]), - ]), - ]) - } -
- ); - } - - randomString(len) { - len = len || 32; - let $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - let maxPos = $chars.length; - let pwd = ''; - for (let i = 0; i < len; i++) { - //0~32的整数 - pwd += $chars.charAt(Math.floor(Math.random() * (maxPos + 1))); - } - return pwd; - } - - saveClientInfo(index, key, value) { - console.log(index, key, value); - this.clients[index].save({ - [key]: value, - }); - } -} diff --git a/js/src/admin/pages/ClientsPage.tsx b/js/src/admin/pages/ClientsPage.tsx new file mode 100644 index 0000000..630f386 --- /dev/null +++ b/js/src/admin/pages/ClientsPage.tsx @@ -0,0 +1,79 @@ +import app from 'flarum/admin/app'; +import Page from 'flarum/common/components/Page'; +import Button from 'flarum/common/components/Button'; +import LoadingIndicator from "flarum/common/components/LoadingIndicator"; +import type Client from 'src/common/models/Client'; +import EditApplicationModal from '../components/EditApplicationModal'; + +export default class ClientsPage extends Page { + translationPrefix = 'rhodes-island-oauth-center.admin.clients.'; + loading = false; + clients: Client[] = []; + tableFields = [ + "client_id", + "client_name", + "client_desc" + ]; + loadingClients: Client[] = []; + + oninit(vnode: any) { + super.oninit(vnode); + + this.refresh(); + } + + refresh() { + this.loading = true; + app.store.find('oauth-clients').then(r => { + this.clients = r as unknown as Client[]; + this.loading = false; + m.redraw(); + }); + } + + view() { + return ( +
+ {(this.loading ? :
+ + + + {this.tableFields.map(key => )} + + + + + {this.clients.map((client: any) => { + const clientSaving = this.loadingClients.indexOf(client) != -1; + return + {this.tableFields.map(key => )} + + + } + )} + +
{app.translator.trans(this.translationPrefix + key)}{app.translator.trans(this.translationPrefix + "actions")}
{client[key]()} + +   + +
+ +
)} +
+ ); + } +} diff --git a/js/src/admin/pages/IndexPage.js b/js/src/admin/pages/IndexPage.js deleted file mode 100644 index 241bc2d..0000000 --- a/js/src/admin/pages/IndexPage.js +++ /dev/null @@ -1,132 +0,0 @@ -import app from 'flarum/admin/app'; -import Page from 'flarum/common/components/Page'; -import FieldSet from 'flarum/common/components/FieldSet'; -import Button from 'flarum/common/components/Button'; -import saveSettings from 'flarum/admin/utils/saveSettings'; -import Stream from 'flarum/common/utils/Stream'; -import Select from 'flarum/common/components/Select'; -import Switch from 'flarum/common/components/Switch'; - -export default class IndexPage extends Page { - oninit(vnode) { - super.oninit(vnode); - - this.saving = false; - - this.fields = [ - 'foskym-oauth-center.access_lifetime', - 'foskym-oauth-center.allow_implicit', - 'foskym-oauth-center.enforce_state', - 'foskym-oauth-center.require_exact_redirect_uri' - ]; - this.values = {}; - - const settings = app.data.settings; - this.fields.forEach(key => this.values[key] = Stream(settings[key] || "")); - - for (let i = 1; i < this.fields.length; i++) { - this.values[this.fields[i]] = settings[this.fields[i]] === '1'; - } - } - - view() { - return ( -
-
- {FieldSet.component({}, [ -
, - Switch.component({ - state: this.values['foskym-oauth-center.allow_implicit'], - onchange: (value) => this.saveSingleSetting('foskym-oauth-center.allow_implicit', value), - loading: this.saving, - }, app.translator.trans('foskym-oauth-center.admin.settings.allow_implicit')), - ])} - - {FieldSet.component({}, [ -
, - Switch.component({ - state: this.values['foskym-oauth-center.enforce_state'], - onchange: (value) => this.saveSingleSetting('foskym-oauth-center.enforce_state', value), - loading: this.saving, - }, app.translator.trans('foskym-oauth-center.admin.settings.enforce_state')), - ])} - - {FieldSet.component({}, [ -
, - Switch.component({ - state: this.values['foskym-oauth-center.require_exact_redirect_uri'], - onchange: (value) => this.saveSingleSetting('foskym-oauth-center.require_exact_redirect_uri', value), - loading: this.saving, - }, app.translator.trans('foskym-oauth-center.admin.settings.require_exact_redirect_uri')), - ])} -
- {FieldSet.component({}, [ - , -
- {app.translator.trans('foskym-oauth-center.admin.settings.access_lifetime')} -
, - Button.component({ - type: 'submit', - className: 'Button Button--primary', - loading: this.saving - }, app.translator.trans('core.admin.settings.submit_button')) - ])} - -
- -
- ); - } - - saveSingleSetting(setting, value) { - if (this.saving) return; - - this.saving = true; - - this.values[setting] = value; - - let data = {}; - data[setting] = value; - - saveSettings(data) - .then(() => app.alerts.show({type: 'success'}, app.translator.trans('core.admin.settings.saved_message'))) - .catch(() => { - }) - .then(() => { - this.saving = false; - m.redraw(); - }); - } - - onsubmit(e) { - e.preventDefault(); - - if (this.saving) return; - - this.saving = true; - app.alerts.dismiss(this.successAlert); - - const settings = {}; - - settings['foskym-oauth-center.access_lifetime'] = this.values['foskym-oauth-center.access_lifetime'](); - - // this.fields.forEach(key => { - // settings[key] = this.values[key]() - // - // }); - - if (settings['foskym-oauth-center.access_lifetime'] === "") { - settings['foskym-oauth-center.access_lifetime'] = 3600; - } - - saveSettings(settings) - .then(() => app.alerts.show({type: 'success'}, app.translator.trans('core.admin.settings.saved_message'))) - .catch(() => { - }) - .then(() => { - this.saving = false; - m.redraw(); - }); - } -} diff --git a/js/src/admin/pages/IndexPage.tsx b/js/src/admin/pages/IndexPage.tsx new file mode 100644 index 0000000..fff19ad --- /dev/null +++ b/js/src/admin/pages/IndexPage.tsx @@ -0,0 +1,23 @@ +import app from 'flarum/admin/app'; +import AdminPage from 'flarum/admin/components/AdminPage'; + +export default class IndexPage extends AdminPage { + header() { + + } + + content() { + const settings = app.extensionData.getSettings("rhodes-island-oauth-center"); + + return ( +
+
+
+ {settings!!.map(this.buildSettingComponent.bind(this))} +
{this.submitButton()}
+
+
+
+ ); + } +} diff --git a/js/src/admin/pages/ScopesPage.js b/js/src/admin/pages/ScopesPage.js deleted file mode 100644 index 2fb36d0..0000000 --- a/js/src/admin/pages/ScopesPage.js +++ /dev/null @@ -1,118 +0,0 @@ -import app from 'flarum/admin/app'; -import Page from 'flarum/common/components/Page'; -import Button from 'flarum/common/components/Button'; -import Select from 'flarum/common/components/Select'; -import Checkbox from 'flarum/common/components/Checkbox'; - -export default class ScopesPage extends Page { - translationPrefix = 'foskym-oauth-center.admin.scopes.'; - scopes = []; - - oninit(vnode) { - super.oninit(vnode); - - this.fields = [ - 'scope', - 'resource_path', - 'method', - 'is_default', - 'scope_name', - 'scope_icon', - 'scope_desc' - ]; - - app.store.find('oauth-scopes').then(r => { - this.scopes = r; - this.fields.map(key => console.log(this.scopes[0][key])) - m.redraw(); - }); - } - - view() { - return ( -
- { - m('.Form-group', [ - m('table', [ - m('thead', m('tr', [ - this.fields.map(key => m('th', app.translator.trans(this.translationPrefix + key))), - m('th'), - ])), - m('tbody', [ - this.scopes.map((scope, index) => m('tr', [ - this.fields.map(key => - m('td', key === 'method' ? Select.component({ - options: { - 'GET': 'GET', - 'POST': 'POST', - 'PUT': 'PUT', - 'DELETE': 'DELETE', - 'PATCH': 'PATCH', - }, - value: scope[key]() || 'GET', - disabled: scope.resource_path() === '/api/user' && key === 'method', - onchange: (value) => { - this.saveScopeInfo(index, key, value); - }, - }) : key === 'is_default' ? Checkbox.component({ - state: scope[key]() === 1 || false, - disabled: scope.resource_path() === '/api/user' && key === 'is_default', - onchange: (checked) => { - this.scopes[index].is_default((this.scopes[index].is_default() + 1) % 2) - this.saveScopeInfo(index, key, checked ? 1 : 0); - }, - }) : m('input.FormControl', { - type: 'text', - value: scope[key]() || '', - disabled: scope.resource_path() === '/api/user' && key === 'resource_path', - onchange: (event) => { - this.saveScopeInfo(index, key, event.target.value); - }, - })) - ), - (scope.resource_path() !== '/api/user' && m('td', Button.component({ - className: 'Button Button--icon', - icon: 'fas fa-times', - onclick: () => { - this.scopes[index].delete(); - this.scopes.splice(index, 1); - }, - }))), - ])), - m('tr', m('td', { - colspan: 7, - }, Button.component({ - className: 'Button Button--block', - onclick: () => { - const scope = app.store.createRecord('oauth-scopes'); - scope.save({ - 'scope': 'Scope.' + this.randomString(8), - 'resource_path': '/api/' + this.randomString(4), - 'method': 'GET', - }).then(this.scopes.push(scope)); - }, - }, app.translator.trans(this.translationPrefix + 'add_button')))), - ]), - ]), - ]) - } -
- ); - } - randomString(len) { - len = len || 8; - let $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - let maxPos = $chars.length; - let str = ''; - for (let i = 0; i < len; i++) { - //0~32的整数 - str += $chars.charAt(Math.floor(Math.random() * (maxPos + 1))); - } - return str; - } - saveScopeInfo(index, key, value) { - this.scopes[index].save({ - [key]: value, - }); - } -} diff --git a/js/src/admin/pages/ScopesPage.tsx b/js/src/admin/pages/ScopesPage.tsx new file mode 100644 index 0000000..bf7f4ff --- /dev/null +++ b/js/src/admin/pages/ScopesPage.tsx @@ -0,0 +1,166 @@ +import app from 'flarum/admin/app'; +import Page from 'flarum/common/components/Page'; +import Button from 'flarum/common/components/Button'; +import Select from 'flarum/common/components/Select'; +import Checkbox from 'flarum/common/components/Checkbox'; +import type Scope from 'src/common/models/Scope'; +import LoadingIndicator from 'flarum/common/components/LoadingIndicator'; +import Stream from 'flarum/common/utils/Stream'; +import { randomString } from '../util'; + +interface EditingScope { + model?: Scope, + markDeletion?: boolean, + modifiedFields: string[], + scope?: Stream, + resource_path?: Stream, + method?: Stream, + is_default?: Stream, + scope_name?: Stream, + scope_icon?: Stream, + scope_desc?: Stream +} + +export default class ScopesPage extends Page { + translationPrefix = 'rhodes-island-oauth-center.admin.scopes.'; + scopes: Scope[] = []; + fields = [ + 'scope', + 'resource_path', + 'method', + 'is_default', + 'scope_name', + 'scope_icon', + 'scope_desc' + ]; + + bufferedValues: EditingScope[] = []; + + components: { [x: string]: (stream: Stream, disabled: boolean) => any } = { + "method": (stream, disabled) => , + "is_default": (stream, disabled) => stream(val ? 1 : 0)}> + } + + loading = false; + saving = false; + + oninit(vnode: any) { + super.oninit(vnode); + + this.refresh(); + } + + streamMapper(stream: Stream, scope: EditingScope, field: string) { + stream.map((val: any) => { + if (stream.notInitial) { + scope.modifiedFields.push(field); + } else { + stream.notInitial = true; + } + return val; + }); + } + + refresh() { + this.loading = true; + this.bufferedValues = []; + app.store.find('oauth-scopes').then(r => { + this.scopes = r as unknown as Scope[]; + for (const scope of this.scopes) { + const eScope: EditingScope = {model: scope, modifiedFields: []}; + for (const field of this.fields) { + const value = (scope as any)[field](); + const stream = Stream(value ? value : (field == "method" ? "GET" : null)); + (eScope as any)[field] = stream; + this.streamMapper(stream, eScope, field); + } + this.bufferedValues.push(eScope); + } + this.loading = false; + m.redraw(); + }); + } + + view() { + return ( +
+ {(this.loading ? :
+ + + + {this.fields.map(key => )} + + + + {this.bufferedValues.map((scope) => + {this.fields.map((key) => )} + + )} + +
{app.translator.trans(this.translationPrefix + key)}
+ {(this.components[key] && this.components[key]((scope as any)[key], this.saving)) ?? } + + +
+ +
+ +
)} +
+ ); + } + + save() { + const promises = []; + for (const eScope of this.bufferedValues) { + const scope = eScope.model; + if (scope) { + if (eScope.markDeletion) { + promises.push(scope.delete()); + } else { + if (eScope.modifiedFields.length > 0) { + const attrs: any = {}; + for (const field of eScope.modifiedFields) { + attrs[field] = (eScope as any)[field](); + } + promises.push(scope.save(attrs)); + } + } + } else { + const scope = app.store.createRecord("oauth-scopes"); + const attrs: any = {}; + for (const field of this.fields) { + const value = (eScope as any)[field](); + if (value) { + attrs[field] = value; + } + } + promises.push(scope.save(attrs)); + } + } + if (promises.length > 0) { + this.saving = true; + Promise.allSettled(promises).finally(() => { + this.saving = false; + this.refresh(); + }); + } + } +} diff --git a/js/src/admin/util.ts b/js/src/admin/util.ts new file mode 100644 index 0000000..07f2753 --- /dev/null +++ b/js/src/admin/util.ts @@ -0,0 +1,10 @@ +export function randomString(len: number) { + len = len || 32; + let $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let maxPos = $chars.length; + let pwd = ''; + for (let i = 0; i < len; i++) { + pwd += $chars.charAt(Math.floor(Math.random() * (maxPos + 1))); + } + return pwd; +} \ No newline at end of file diff --git a/js/src/common/extend.js b/js/src/common/extend.ts similarity index 100% rename from js/src/common/extend.js rename to js/src/common/extend.ts diff --git a/js/src/common/models/Client.js b/js/src/common/models/Client.js deleted file mode 100644 index 4372b95..0000000 --- a/js/src/common/models/Client.js +++ /dev/null @@ -1,14 +0,0 @@ -import Model from 'flarum/common/Model'; - -export default class Client extends Model { - client_id = Model.attribute('client_id'); - client_secret = Model.attribute('client_secret'); - redirect_uri = Model.attribute('redirect_uri'); - grant_types = Model.attribute('grant_types'); - scope = Model.attribute('scope'); - user_id = Model.attribute('user_id'); - client_name = Model.attribute('client_name'); - client_icon = Model.attribute('client_icon'); - client_desc = Model.attribute('client_desc'); - client_home = Model.attribute('client_home'); -} diff --git a/js/src/common/models/Client.ts b/js/src/common/models/Client.ts new file mode 100644 index 0000000..5c79ca7 --- /dev/null +++ b/js/src/common/models/Client.ts @@ -0,0 +1,14 @@ +import Model from 'flarum/common/Model'; + +export default class Client extends Model { + client_id = Model.attribute('client_id'); + client_secret = Model.attribute('client_secret'); + redirect_uri = Model.attribute('redirect_uri'); + grant_types = Model.attribute('grant_types'); + scope = Model.attribute('scope'); + user_id = Model.attribute('user_id'); + client_name = Model.attribute('client_name'); + client_icon = Model.attribute('client_icon'); + client_desc = Model.attribute('client_desc'); + client_home = Model.attribute('client_home'); +} diff --git a/js/src/common/models/Scope.js b/js/src/common/models/Scope.js deleted file mode 100644 index 2b89440..0000000 --- a/js/src/common/models/Scope.js +++ /dev/null @@ -1,11 +0,0 @@ -import Model from 'flarum/common/Model'; - -export default class Scope extends Model { - scope = Model.attribute('scope'); - resource_path = Model.attribute('resource_path'); - method = Model.attribute('method'); - is_default = Model.attribute('is_default'); - scope_name = Model.attribute('scope_name'); - scope_icon = Model.attribute('scope_icon'); - scope_desc = Model.attribute('scope_desc'); -} diff --git a/js/src/common/models/Scope.ts b/js/src/common/models/Scope.ts new file mode 100644 index 0000000..3a82654 --- /dev/null +++ b/js/src/common/models/Scope.ts @@ -0,0 +1,11 @@ +import Model from 'flarum/common/Model'; + +export default class Scope extends Model { + scope = Model.attribute('scope'); + resource_path = Model.attribute('resource_path'); + method = Model.attribute('method'); + is_default = Model.attribute('is_default'); + scope_name = Model.attribute('scope_name'); + scope_icon = Model.attribute('scope_icon'); + scope_desc = Model.attribute('scope_desc'); +} diff --git a/js/src/forum/components/oauth/AuthorizePage.js b/js/src/forum/components/oauth/AuthorizePage.js deleted file mode 100644 index 522ba40..0000000 --- a/js/src/forum/components/oauth/AuthorizePage.js +++ /dev/null @@ -1,222 +0,0 @@ -import app from 'flarum/forum/app'; -import {extend} from 'flarum/common/extend'; -import Page from 'flarum/common/components/Page'; -import IndexPage from 'flarum/forum/components/IndexPage'; -import LogInModal from 'flarum/forum/components/LogInModal'; -import extractText from 'flarum/common/utils/extractText'; -import Tooltip from 'flarum/common/components/Tooltip'; -import Button from 'flarum/common/components/Button'; - -export default class AuthorizePage extends IndexPage { - params = []; - client = null; - scopes = null; - client_scope = []; - loading = true; - is_authorized = false; - submit_loading = false; - - oninit(vnode) { - super.oninit(vnode); - if (!app.session.user) { - setTimeout(() => app.modal.show(LogInModal), 500); - } - - const params = m.route.param(); - - if (params.client_id == null || params.response_type == null || params.redirect_uri == null) { - m.route.set('/'); - } else { - this.params = params; - app.store.find('oauth-clients', params.client_id).then(client => { - if (client.length === 0) { - m.route.set('/'); - } else { - this.client = client[0]; - let uris = null; - if (this.client.redirect_uri().indexOf(' ') > -1) { - uris = this.client.redirect_uri().split(' '); - } else { - uris = [this.client.redirect_uri()]; - } - - if (app.forum.attribute('foskym-oauth-center.require_exact_redirect_uri') && uris.indexOf(params.redirect_uri) == -1) { - m.route.set('/'); - } - if (!app.forum.attribute('foskym-oauth-center.allow_implicit') && params.response_type == 'token') { - m.route.set('/'); - } - if (app.forum.attribute('foskym-oauth-center.enforce_state') && params.enforce_state == null) { - m.route.set('/'); - } - - app.store.find('oauth-scopes').then((scopes) => { - this.scopes = scopes - let scope = params.scope; - - if (params.scope == null) { - scope = this.client.scope(); - } - - let scopes_temp = []; - if (scope == null) { - scopes_temp = []; - } else if (scope.indexOf(' ') > -1) { - scopes_temp = scope.split(' '); - } else { - scopes_temp = [scope]; - } - - let default_scopes = []; - this.scopes.map(scope => { - let index = scopes_temp.indexOf(scope.scope()); - if (index > -1) { - scopes_temp[index] = scope; - } else { - scopes_temp.slice(index, 1); - } - if (scope.is_default() === 1) { - default_scopes.push(scope); - } - }); - - scopes_temp = scopes_temp.concat(default_scopes); - - this.client_scope = scopes_temp.filter((scope, index) => scopes_temp.indexOf(scope) === index); - console.log(this.client_scope); - this.loading = false; - m.redraw(); - }); - - - } - }); - } - } - - setTitle() { - app.setTitle(extractText(app.translator.trans('foskym-oauth-center.forum.page.title.authorize'))); - app.setTitleCount(0); - } - - view() { - if (!this.client) { - return ''; - } - return ( - !this.loading &&
-
-
-
- -
- -
- - - - - -
-
- { - this.client_scope.length > 0 && this.client_scope.map(scope => { - let scope_info = null; - this.scopes.map(s => { - if (s.scope() === scope.scope()) { - scope_info = s; - } - }); - if (scope_info == null) { - return ''; - } - return ( -
-
- { - (scope_info.scope_icon().indexOf('fa-') > -1) ? - : - - } -
-
-
- {scope_info.scope_name()} -
- - { - scope_info.scope_desc() - .replace('{client_name}', this.client.client_name()) - .replace('{user}', app.session.user.attribute('displayName')) - } - -
-
- ); - }) - } -
-
- {/* - - - - */} - -
- - -
-
- - -
-
-
-
-
- ); - } - deny(e) { - this.is_authorized = false; - } - agree(e) { - this.is_authorized = true; - } - - onsubmit(e) { - e.preventDefault(); - this.submit_loading = true; - app.request({ - method: 'POST', - url: '/oauth/authorize', - body: { - response_type: this.params.response_type, - client_id: this.params.client_id, - redirect_uri: this.params.redirect_uri, - state: this.params.state, - scope: this.params.scope, - is_authorized: this.is_authorized, - } - }).then((params) => { - window.location.href = params.location; - }); - - // Some form handling logic here - } -} diff --git a/js/src/forum/components/oauth/AuthorizePage.tsx b/js/src/forum/components/oauth/AuthorizePage.tsx new file mode 100644 index 0000000..a0158e3 --- /dev/null +++ b/js/src/forum/components/oauth/AuthorizePage.tsx @@ -0,0 +1,212 @@ +import app from 'flarum/forum/app'; +import IndexPage from 'flarum/forum/components/IndexPage'; +import LogInModal from 'flarum/forum/components/LogInModal'; +import Placeholder from "flarum/common/components/Placeholder"; +import extractText from 'flarum/common/utils/extractText'; +import Tooltip from 'flarum/common/components/Tooltip'; +import Button from 'flarum/common/components/Button'; +import type Client from 'src/common/models/Client'; +import type Scope from 'src/common/models/Scope'; +import LoadingIndicator from 'flarum/common/components/LoadingIndicator'; + +interface AuthorizeRequestParams { + response_type: string, + client_id: string, + redirect_uri: string, + state: string, + scope: string, +} + +export default class AuthorizePage extends IndexPage { + params: AuthorizeRequestParams | null = null; + client: Client | null = null; + clientScopes: Scope[] = []; + loading = true; + submitting = false; + + oninit(vnode: any) { + super.oninit(vnode); + + if (!app.session.user) return; + + const rawParams = m.route.param(); + + if (rawParams.client_id == null || rawParams.response_type == null || rawParams.redirect_uri == null) { + m.route.set('/'); + return; + } + + const params = { + client_id: rawParams.client_id, + response_type: rawParams.response_type, + redirect_uri: rawParams.redirect_uri, + state: rawParams.state, + scope: rawParams.scope + }; + this.params = params; + + const scopesPromise = app.store.find('oauth-scopes'); + app.store.find('oauth-clients', params.client_id).then(response => { + const clients = response as unknown as Client[]; + if (clients.length === 0) { + m.route.set('/'); + return; + } + + this.client = clients[0]; + let uris = [this.client.redirect_uri()]; + if (uris[0].indexOf(' ') > -1) { + uris = uris[0].split(' '); + } + + if ((app.forum.attribute('rhodes-island-oauth-center.require_exact_redirect_uri') && uris.indexOf(params.redirect_uri) == -1) && + (!app.forum.attribute('rhodes-island-oauth-center.allow_implicit') && params.response_type == 'token') && + (app.forum.attribute('rhodes-island-oauth-center.enforce_state') && rawParams.enforce_state == null)) { + m.route.set('/'); + } + + scopesPromise.then(scopes => { + const wantedScopes = []; + + const paramScopes = params.scope as string; + if (paramScopes) { + wantedScopes.push(...paramScopes.split(" ")); + } + + const clientScopes = this.client!!.scope(); + if (clientScopes) { + wantedScopes.push(...clientScopes.split(" ")); + } + + const finalScopes = []; + + const definedScopes = (scopes as unknown as Scope[]); + for (const definedScope of definedScopes) { + if (definedScope.is_default() || wantedScopes.indexOf(definedScope.scope()) != -1) { + finalScopes.push(definedScope); + } + } + console.log(wantedScopes, definedScopes, finalScopes); + + this.clientScopes = finalScopes; + this.loading = false; + }); + }); + } + + setTitle() { + app.setTitle(extractText(app.translator.trans('rhodes-island-oauth-center.forum.page.title.authorize'))); + app.setTitleCount(0); + } + + oncreate(vnode: any): void { + super.oncreate(vnode); + + if (!app.session.user) { + app.modal.show(LogInModal); + } + } + + view() { + if (!app.session.user) { + return {app.translator.trans("rhodes-island-oauth-center.forum.authorize.not_logged_in")}; + } + if (this.loading) { + return ; + } + + const user = app.session.user; + const clientHome = this.client!!.client_home(); + const clientIcon = this.client!!.client_icon(); + return ( +
+
+
+

{app.translator.trans("rhodes-island-oauth-center.forum.authorize.title")}

+

{app.translator.trans('rhodes-island-oauth-center.forum.authorize.description')}

+
+
+
+ +
+

{user.attribute("displayName")}

+ {user.attribute("email")} +
+
+
+
+

{app.translator.trans('rhodes-island-oauth-center.forum.authorize.app_text')}

+ {(clientHome && clientHome != "" ? + + {clientIcon && clientIcon != "" ? : } +

{this.client!!.client_name()}

+ {this.client!!.client_desc()} +
+
:
+ {clientIcon && clientIcon != "" ? : } +

{this.client!!.client_name()}

+ {this.client!!.client_desc()} +
)} +
+
+

{app.translator.trans('rhodes-island-oauth-center.forum.authorize.scope_text')}

+ { + this.clientScopes.length > 0 && this.clientScopes.map(scope => { + return
+ { + (scope.scope_icon().indexOf('fa-') > -1) ? + : + + } +
+

+ {scope.scope_name()} +

+ + { + scope.scope_desc() + .replace('{client_name}', this.client!!.client_name()) + .replace('{user}', user.attribute('displayName')) + } + +
+
+ }) + } +
+
+
+ + +
+
+
+
+ ); + } + + submit(authorized: boolean) { + this.submitting = true; + app.request({ + method: 'POST', + url: '/oauth/authorize', + body: { + response_type: this.params!!.response_type, + client_id: this.params!!.client_id, + redirect_uri: this.params!!.redirect_uri, + state: this.params!!.state, + scope: this.params!!.scope, + is_authorized: authorized, + } + }).then((params: any) => { + window.location.href = params.location; + }); + } +} diff --git a/js/src/forum/components/user/AuthorizedPage.js b/js/src/forum/components/user/AuthorizedPage.tsx similarity index 91% rename from js/src/forum/components/user/AuthorizedPage.js rename to js/src/forum/components/user/AuthorizedPage.tsx index e55e596..daeacc8 100644 --- a/js/src/forum/components/user/AuthorizedPage.js +++ b/js/src/forum/components/user/AuthorizedPage.tsx @@ -1,7 +1,9 @@ import UserPage from 'flarum/forum/components/UserPage'; + export default class AuthorizedPage extends UserPage { - oninit(vnode) { + oninit(vnode: any) { super.oninit(vnode); + this.loadUser(m.route.param('username')); } content() { diff --git a/js/src/forum/index.js b/js/src/forum/index.js deleted file mode 100644 index c6ee2f4..0000000 --- a/js/src/forum/index.js +++ /dev/null @@ -1,34 +0,0 @@ -import app from 'flarum/forum/app'; -import {extend} from 'flarum/common/extend'; -import UserPage from 'flarum/forum/components/UserPage'; -import LinkButton from 'flarum/common/components/LinkButton'; -import AuthorizePage from "./components/oauth/AuthorizePage"; -import AuthorizedPage from "./components/user/AuthorizedPage"; -app.initializers.add('foskym/flarum-oauth-center', () => { - app.routes['oauth.authorize'] = { - path: '/oauth/authorize', - component: AuthorizePage - }; - - app.routes['user.authorized'] = { - path: '/u/:username/authorized', - component: AuthorizedPage - }; - extend(UserPage.prototype, 'navItems', function (items) { - if (app.session.user && app.session.user.id() === this.user.id()) { - // items.add( - // 'authorized', - // LinkButton.component( - // { - // href: app.route('user.authorized', { username: this.user.username() }), - // icon: 'fas fa-user-friends', - // }, - // [ - // app.translator.trans('foskym-oauth-center.forum.page.label.authorized'), - // ] - // ), - // -110 - // ); - } - }); -}); diff --git a/js/src/forum/index.ts b/js/src/forum/index.ts new file mode 100644 index 0000000..7260327 --- /dev/null +++ b/js/src/forum/index.ts @@ -0,0 +1,14 @@ +import app from 'flarum/forum/app'; +import AuthorizePage from "./components/oauth/AuthorizePage"; +import AuthorizedPage from "./components/user/AuthorizedPage"; +app.initializers.add('foskym/flarum-oauth-center', () => { + app.routes['oauth.authorize'] = { + path: '/oauth/authorize', + component: AuthorizePage + }; + + app.routes['user.authorized'] = { + path: '/u/:username/authorized', + component: AuthorizedPage + }; +}); diff --git a/js/tsconfig.json b/js/tsconfig.json index 504f800..7e26bc5 100644 --- a/js/tsconfig.json +++ b/js/tsconfig.json @@ -1,24 +1,24 @@ { - // Use Flarum's tsconfig as a starting point "extends": "flarum-tsconfig", - // This will match all .ts, .tsx, .d.ts, .js, .jsx files in your `src` folder - // and also tells your Typescript server to read core's global typings for - // access to `dayjs` and `$` in the global namespace. - "include": [ - "src/**/*", - "../vendor/*/*/js/dist-typings/@types/**/*", -// -// - "@types/**/*" -], "compilerOptions": { - // This will output typings to `dist-typings` - "declarationDir": "./dist-typings", - "baseUrl": ".", - "paths": { - "flarum/*": ["../vendor/flarum/core/js/dist-typings/*"], -// -// - } - } -} + "module": "ES2020", + "moduleResolution": "Node", + "target": "ES6", + "sourceMap": true, + "allowJs": true, + "jsx": "react", + "jsxFactory": "m", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "declarationDir": "./dist-typings", + "baseUrl": ".", + "paths": { + "flarum/*": ["../vendor/flarum/core/js/dist-typings/*"] + } + }, + "exclude": [ + "node_modules", + "**/node_modules" + ], + "include": ["src/**/*", "../vendor/flarum/core/js/dist-typings/@types/**/*"] +} \ No newline at end of file diff --git a/js/webpack.config.js b/js/webpack.config.js index ef35ea0..ec205a7 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -1 +1,34 @@ -module.exports = require('flarum-webpack-config')(); +const config = require("flarum-webpack-config"); + +module.exports = env => { + // Determine build mode + let mode = "development"; + if (env.production) {mode = "production";} + console.log("Compilation Mode: " + mode); + let flarumConfig = config({ + resolve: { + extenstions: [".wasm", ".mjs", ".ts", ".tsx", ".js", ".json"] + }, + module: { + rules: [ + { + resource: { + and: [/\.(js|ts)$/], + not: [/node_modules/] + }, + use: [ + "babel-loader", + { + loader: "ts-loader", + options: { + transpileOnly: true + } + } + ] + } + ] + } + }); + flarumConfig.mode = mode; + return flarumConfig; +}; \ No newline at end of file diff --git a/js/yarn.lock b/js/yarn.lock new file mode 100644 index 0000000000000000000000000000000000000000..5e9f01c6c25c12d7ecd8500c7cb426a8175f2188 GIT binary patch literal 128877 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 literal 0 HcmV?d00001 diff --git a/less/forum/oauth.less b/less/forum/oauth.less index 55c3d0e..8b41d05 100644 --- a/less/forum/oauth.less +++ b/less/forum/oauth.less @@ -1,227 +1,132 @@ -.oauth-area { - display: block !important; - position: relative; - left: 0; - top: 0; - padding: 110px 0; - min-height: 100%; - box-sizing: border-box; -} +.AuthorizePage { + .OAuth-Header { + text-align: center; + margin-bottom: 30px; -.oauth-main { - position: relative; - width: 376px; - margin: 0 auto; - box-sizing: border-box; - box-shadow: 0px 0px 15px 0px #bdbdbd; - border-radius: 12px; -} + h2 { + font-size: 3em; + margin-bottom: .1em; + } -.oauth-main::before { - backdrop-filter: blur(20px); - content: ''; - position: absolute; - width: 100%; - height: 100%; - left: 0; - top: 0; - background: hsla(0, 0%, 100%, .3); - border-radius: 12px; -} - -.oauth-box { - padding: 20px; - background-color: #f3f3f3; -} - -.oauth-header { - backdrop-filter: blur(0); - text-align: center; - box-shadow: 0 5px 10px -5px #d2d2d2; - border-radius: 12px 12px 0 0; -} - -.oauth-header h2 { - margin-bottom: 8px; - font-weight: 600; - font-size: 40px; - color: #000; -} - -.oauth-header p { - font-weight: 400; - font-size: 20px; - color: #333; -} - -.oauth-body { - border-radius: 0 0 12px 12px; -} - -.oauth-body .oauth-form-item { - position: relative; - margin-bottom: 15px; - clear: both; - *zoom: 1; -} - -.oauth-body .oauth-form-item:after { - content: '\20'; - clear: both; - *zoom: 1; - display: block; - height: 0; -} - -.oauth-icon { - position: absolute; - left: 4px; - top: 1px; - width: auto; - line-height: 35px; - text-align: center; - color: #999; - padding: 0 8px; - font-size: 14px; -} - -label:before { - color: #999; -} - -@media screen and (max-width: 768px) { - .oauth-area { - padding-top: 60px + p { + font-size: 1.2em; + margin-top: .1em; + } } - .oauth-main { - width: 300px - } + .OAuth-Body { + max-width: 60%; + margin: 0 auto; - .oauth-box { - padding: 10px - } + .OAuth-User { + display: flex; + align-items: center; + justify-content: center; - .oauth-main::before { - backdrop-filter: none; - } + .OAuth-User-Avatar { + width: 48px; + height: 48px; + border-radius: 50%; + } - .oauth-header { - // background-color: #fff; - } + .OAuth-User-Info { + margin-left: 10px; + white-space: nowrap; - body { - margin: 0 + h4 { + margin: 0; + } + + small { + opacity: .5; + } + } + } + + .OAuth-Details { + display: flex; + + .OAuth-App { + min-width: 300px; + } + + .OAuth-Scopes { + flex: 1; + } + } + + .OAuth-App, .OAuth-Scopes { + margin: 20px 0; + + > p { + font-weight: bold; + font-size: 1.2em; + } + } + + .OAuth-App { + text-align: center; + + .OAuth-App-Info { + color: @text-color; + display: inline-block; + text-decoration: none; + + .OAuth-App-Icon { + width: 64px; + height: 64px; + } + + p { + font-weight: bolder; + font-size: 2em; + margin-bottom: 0; + } + small { + font-size: 1.2em; + opacity: .5; + } + } + } + + .OAuth-Scopes { + text-align: center; + + .OAuth-Scope { + display: flex; + text-align: left; + + .OAuth-ScopeIcon { + width: 40px; + height: 40px; + } + + .OAuth-ScopeDetail { + margin-left: 10px; + + h4 { + margin: 0; + } + } + } + } + + .OAuth-Action { + margin: 30px 0; + } } } -@media screen and (max-width: 600px) { - .oauth-area { - padding-top: 0 +@media screen and (max-width: @screen-phone-max) { + .AuthorizePage .OAuth-Body { + max-width: 100%; + + .OAuth-Details { + flex-direction: column; + + .OAuth-Scopes { + padding: 0 30px; + } + } } - - body { - background: #f3f3f3 !important; - } - - .oauth-main { - width: 100%; - } - - .oauth-main::before { - box-shadow: none !important; - } - - .oauth-header { - box-shadow: none; - } - - .oauth-box:last-child { - box-shadow: 0 5px 10px -5px #d2d2d2; - } -} - -.oauth-top { - text-align: center; - padding-bottom: 20px; - position: relative; -} - -.oauth-top img { - width: 64px; - border-radius: 50%; - border: #4950578c solid 1px; - box-shadow: 1px 0 0 0 #e8e8e8, 0 1px 0 0 #e8e8e8, 1px 1px 0 0 #e8e8e8, inset 1px 0 0 0 #e8e8e8, inset 0 1px 0 0 #e8e8e8; - transition: all .3s; -} - -.oauth-top img:hover { - box-shadow: 0 2px 8px rgba(0, 0, 0, .3); -} - -.oauth-top i { - top: -24px; - position: relative; - padding-left: 10px; - padding-right: 10px; - color: #111; -} - -.oauth-scope-area { - padding-top: 10px; - padding-bottom: 10px; - overflow: auto; - max-height: 350px; - position: relative; -} - -.oauth-scope { - margin-top: 15px; -} - -.oauth-scope:first-child { - margin-top: 0; -} - -.oauth-scope, .oauth-scope-body { - overflow: hidden; - zoom: 1; -} - -.oauth-scope-body, .oauth-scope-left, .oauth-scope-right { - display: table-cell; - vertical-align: top; -} - -.oauth-scope-left, .oauth-scope > .pull-left { - padding-right: 10px; - min-width: 42px; - text-align: center; -} - -img.oauth-scope-object { - display: block; - vertical-align: middle; - border: 0; - width: 32px; - height: 32px; -} - -.oauth-scope-body { - width: 10000px; - padding-left: 8px; -} - -.oauth-scope-heading { - margin-top: 0; - font-weight: 800; - color: #382e2e; - margin-block-end: 0; - font-size: 12px; -} - -.oauth-scope-body small { - font-weight: 500; - font-size: 12px; - color: #aaa; -} +} \ No newline at end of file diff --git a/locale/en.yml b/locale/en.yml index 064e788..e08603c 100644 --- a/locale/en.yml +++ b/locale/en.yml @@ -1,4 +1,4 @@ -foskym-oauth-center: +rhodes-island-oauth-center: admin: permission: use_oauth: Use OAuth @@ -20,8 +20,12 @@ foskym-oauth-center: client_name: Name client_desc: Description client_icon: Icon - client_home: HomePage + client_home: Homepage + actions: Actions add_button: Add Client + edit_modal_title_add: New application + edit_modal_title_edit: Edit application + edit_modal_save: Save scopes: scope: Scope resource_path: Resource Path @@ -31,6 +35,7 @@ foskym-oauth-center: scope_icon: Icon scope_desc: Description add_button: Add Scope + save: Save scopes forum: page: @@ -39,6 +44,11 @@ foskym-oauth-center: label: authorized: Authorized Logs authorize: - access: Access to + title: Third party application authorization + description: Authorize third party application to use your identity + app_text: You are about to authorize + to_app_homepage: Go to {name}'s homepage + scope_text: To use the following privileges agree: Agree deny: Deny + not_logged_in: Please continue after log in diff --git a/locale/zh-Hans.yml b/locale/zh-Hans.yml index de3d7b8..01b2926 100644 --- a/locale/zh-Hans.yml +++ b/locale/zh-Hans.yml @@ -1,4 +1,4 @@ -foskym-oauth-center: +rhodes-island-oauth-center: admin: permission: use_oauth: 使用 OAuth 授权 @@ -21,7 +21,11 @@ foskym-oauth-center: client_desc: 描述 client_icon: 图标 client_home: 主页 + actions: 操作 add_button: 添加应用 + edit_modal_title_add: 新建应用 + edit_modal_title_edit: 编辑应用 + edit_modal_save: 保存应用 scopes: scope: 权限标识 resource_path: 资源路径 @@ -31,6 +35,7 @@ foskym-oauth-center: scope_icon: 图标 scope_desc: 描述 add_button: 添加权限 + save: 保存权限 forum: page: @@ -39,6 +44,11 @@ foskym-oauth-center: label: authorized: 授权记录 authorize: - access: 授权访问 + title: 第三方应用授权 + description: 授权第三方应用以你的身份使用部分权限 + app_text: 你即将授权 + to_app_homepage: 前往 {name} 的主页 + scope_text: 获得以下权限 agree: 授权 deny: 拒绝 + not_logged_in: 请登录后再继续操作 diff --git a/migrations/2023_10_02_add_default_record_to_oauth_scopes_table.php b/migrations/2023_10_02_add_default_record_to_oauth_scopes_table.php index bda0bc2..205a982 100644 --- a/migrations/2023_10_02_add_default_record_to_oauth_scopes_table.php +++ b/migrations/2023_10_02_add_default_record_to_oauth_scopes_table.php @@ -20,7 +20,7 @@ return [ 'scope' => 'user.read', 'resource_path' => '/api/user', 'method' => 'GET', - 'is_default' => 1, + 'is_default' => true, 'scope_name' => '获取用户信息', 'scope_icon' => 'fas fa-user', 'scope_desc' => '访问该用户({user})的个人信息等', diff --git a/src/Api/Controller/CreateClientController.php b/src/Api/Controller/CreateClientController.php index 866b73b..14863c2 100644 --- a/src/Api/Controller/CreateClientController.php +++ b/src/Api/Controller/CreateClientController.php @@ -20,10 +20,17 @@ class CreateClientController extends AbstractCreateController $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - return Client::create([ - 'client_id' => Arr::get($attributes, 'client_id'), - 'client_secret' => Arr::get($attributes, 'client_secret'), - 'user_id' => $actor->id, - ]); + $validAttrs = [ + 'user_id' => $actor->id + ]; + + collect(['client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'client_name', 'client_desc', 'client_icon', 'client_home']) + ->each(function (string $attribute) use (&$validAttrs, $attributes) { + if (($val = Arr::get($attributes, $attribute)) !== null) { + $validAttrs[$attribute] = $val; + } + }); + + return Client::create($validAttrs); } } diff --git a/src/Api/Controller/ListScopeController.php b/src/Api/Controller/ListScopeController.php index d9f38e3..1597d16 100644 --- a/src/Api/Controller/ListScopeController.php +++ b/src/Api/Controller/ListScopeController.php @@ -21,7 +21,7 @@ class ListScopeController extends AbstractListController $actor->assertAdmin(); } catch (\Exception $e) { $actor->assertRegistered(); - if (!$actor->hasPermission('foskym-oauth-center.use-oauth')) { + if (!$actor->hasPermission('rhodes-island-oauth-center.use-oauth')) { return []; } $this->serializer = ScopeUserSerializer::class; diff --git a/src/Api/Controller/ShowClientController.php b/src/Api/Controller/ShowClientController.php index 9b4ebe5..c904992 100644 --- a/src/Api/Controller/ShowClientController.php +++ b/src/Api/Controller/ShowClientController.php @@ -20,7 +20,7 @@ class ShowClientController extends AbstractListController $actor = RequestUtil::getActor($request); $actor->assertRegistered(); - if (!$actor->hasPermission('foskym-oauth-center.use-oauth')) { + if (!$actor->hasPermission('rhodes-island-oauth-center.use-oauth')) { return []; } diff --git a/src/Controllers/AuthorizeController.php b/src/Controllers/AuthorizeController.php index 2a57c5e..28d5eb4 100644 --- a/src/Controllers/AuthorizeController.php +++ b/src/Controllers/AuthorizeController.php @@ -33,7 +33,7 @@ class AuthorizeController implements RequestHandlerInterface $actor = RequestUtil::getActor($request); $actor->assertRegistered(); - if (!$actor->hasPermission('foskym-oauth-center.use-oauth')) { + if (!$actor->hasPermission('rhodes-island-oauth-center.use-oauth')) { return new JsonResponse([ 'error' => 'no_permission', 'error_description' => 'Don\'t have the permissions of oauth' ]); } diff --git a/src/Middlewares/UserCredentialsMiddleware.php b/src/Middlewares/UserCredentialsMiddleware.php index 5273a5d..c0428ab 100644 --- a/src/Middlewares/UserCredentialsMiddleware.php +++ b/src/Middlewares/UserCredentialsMiddleware.php @@ -22,7 +22,7 @@ class UserCredentialsMiddleware implements MiddlewareInterface $path = $request->getUri()->getPath(); if (in_array($path, $uri) && Arr::get($request->getParsedBody(), 'grant_type', '') === 'password') { if ($user = User::where('username', Arr::get($request->getParsedBody(), 'username', ''))->first()) { - if (!$user->hasPermission('foskym-oauth-center.use-oauth')) { + if (!$user->hasPermission('rhodes-island-oauth-center.use-oauth')) { return new JsonResponse([ 'error' => 'no_permission', 'error_description' => 'Don\'t have the permissions of oauth' ]); } } diff --git a/src/OAuth.php b/src/OAuth.php index 66c67a8..60da284 100644 --- a/src/OAuth.php +++ b/src/OAuth.php @@ -45,10 +45,10 @@ class OAuth { $storage = new Storage; $server = new Server($storage, array( - 'allow_implicit' => $this->settings->get('foskym-oauth-center.allow_implicit') == "1", - 'enforce_state' => $this->settings->get('foskym-oauth-center.enforce_state') == "1", - 'require_exact_redirect_uri' => $this->settings->get('foskym-oauth-center.require_exact_redirect_uri') == "1", - 'access_lifetime' => $this->settings->get('foskym-oauth-center.access_lifetime') == "" ? 3600 : $this->settings->get('foskym-oauth-center.access_lifetime'), + 'allow_implicit' => $this->settings->get('rhodes-island-oauth-center.allow_implicit') == "1", + 'enforce_state' => $this->settings->get('rhodes-island-oauth-center.enforce_state') == "1", + 'require_exact_redirect_uri' => $this->settings->get('rhodes-island-oauth-center.require_exact_redirect_uri') == "1", + 'access_lifetime' => $this->settings->get('rhodes-island-oauth-center.access_lifetime') == "" ? 3600 : $this->settings->get('rhodes-island-oauth-center.access_lifetime'), )); $server->addGrantType(new AuthorizationCode($storage)); $server->addGrantType(new ClientCredentials($storage));