> = inject('errors') as Recor
{{ data.server.run_mode }}
- {{ data.server.jwt_secret }}
+
- {{ data.server.node_secret }}
+
{{ data.server.start_cmd }}
diff --git a/app/src/views/user/User.vue b/app/src/views/user/User.vue
index 172eca94..ac21398e 100644
--- a/app/src/views/user/User.vue
+++ b/app/src/views/user/User.vue
@@ -1,54 +1,13 @@
diff --git a/app/src/views/user/userColumns.tsx b/app/src/views/user/userColumns.tsx
new file mode 100644
index 00000000..d68fb892
--- /dev/null
+++ b/app/src/views/user/userColumns.tsx
@@ -0,0 +1,63 @@
+import { Tag } from 'ant-design-vue'
+import { h } from 'vue'
+import type { Column, JSXElements } from '@/components/StdDesign/types'
+import { input, password } from '@/components/StdDesign/StdDataEntry'
+import type { customRender } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
+import { datetime } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
+
+const columns: Column[] = [{
+ title: () => $gettext('Username'),
+ dataIndex: 'name',
+ sortable: true,
+ pithy: true,
+ edit: {
+ type: input,
+ },
+ search: true,
+}, {
+ title: () => $gettext('Password'),
+ dataIndex: 'password',
+ sortable: true,
+ pithy: true,
+ edit: {
+ type: password,
+ config: {
+ placeholder: () => $gettext('Leave blank for no change'),
+ generate: true,
+ },
+ },
+ hiddenInTable: true,
+}, {
+ title: () => $gettext('2FA'),
+ dataIndex: 'enabled_2fa',
+ customRender: (args: customRender) => {
+ const template: JSXElements = []
+ const { text } = args
+ if (text === true || text > 0)
+ template.push({$gettext('Enabled')})
+
+ else
+ template.push({$gettext('Disabled')})
+
+ return h('div', template)
+ },
+ sortable: true,
+ pithy: true,
+}, {
+ title: () => $gettext('Created at'),
+ dataIndex: 'created_at',
+ customRender: datetime,
+ sortable: true,
+ pithy: true,
+}, {
+ title: () => $gettext('Updated at'),
+ dataIndex: 'updated_at',
+ customRender: datetime,
+ sortable: true,
+ pithy: true,
+}, {
+ title: () => $gettext('Action'),
+ dataIndex: 'action',
+}]
+
+export default columns
diff --git a/model/auth.go b/model/auth.go
index c463f754..70a6501a 100644
--- a/model/auth.go
+++ b/model/auth.go
@@ -1,12 +1,15 @@
package model
+import "gorm.io/gorm"
+
type Auth struct {
Model
- Name string `json:"name"`
- Password string `json:"-"`
- Status bool `json:"status" gorm:"default:1"`
- OTPSecret []byte `json:"-" gorm:"type:blob"`
+ Name string `json:"name"`
+ Password string `json:"-"`
+ Status bool `json:"status" gorm:"default:1"`
+ OTPSecret []byte `json:"-" gorm:"type:blob"`
+ Enabled2FA bool `json:"enabled_2fa" gorm:"-"`
}
type AuthToken struct {
@@ -15,6 +18,11 @@ type AuthToken struct {
ExpiredAt int64 `json:"expired_at" gorm:"default:0"`
}
+func (u *Auth) AfterFind(tx *gorm.DB) error {
+ u.Enabled2FA = u.EnabledOTP()
+ return nil
+}
+
func (u *Auth) EnabledOTP() bool {
return len(u.OTPSecret) != 0
}