mirror of
https://github.com/halejohn/Cloudreve.git
synced 2026-01-27 10:01:56 +08:00
Test: thumbnail and authn / Modify: read thumbnail config from file
This commit is contained in:
@@ -2,12 +2,9 @@ package model
|
||||
|
||||
import (
|
||||
"crypto/sha1"
|
||||
"encoding/binary"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/HFO4/cloudreve/pkg/util"
|
||||
"github.com/duo-labs/webauthn/webauthn"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/pkg/errors"
|
||||
"strings"
|
||||
@@ -59,41 +56,6 @@ type UserOption struct {
|
||||
PreferredTheme string `json:"preferred_theme"`
|
||||
}
|
||||
|
||||
func (user User) WebAuthnID() []byte {
|
||||
bs := make([]byte, 8)
|
||||
binary.LittleEndian.PutUint64(bs, uint64(user.ID))
|
||||
return bs
|
||||
}
|
||||
|
||||
func (user User) WebAuthnName() string {
|
||||
return user.Email
|
||||
}
|
||||
|
||||
func (user User) WebAuthnDisplayName() string {
|
||||
return user.Nick
|
||||
}
|
||||
|
||||
func (user User) WebAuthnIcon() string {
|
||||
return "https://cdn4.buysellads.net/uu/1/46074/1559075156-slack-carbon-red_2x.png"
|
||||
}
|
||||
|
||||
func (user User) WebAuthnCredentials() []webauthn.Credential {
|
||||
var res []webauthn.Credential
|
||||
err := json.Unmarshal([]byte(user.Authn), &res)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (user *User) RegisterAuthn(credential *webauthn.Credential) {
|
||||
res, err := json.Marshal([]webauthn.Credential{*credential})
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
DB.Model(user).UpdateColumn("authn", string(res))
|
||||
}
|
||||
|
||||
// Root 获取用户的根目录
|
||||
func (user *User) Root() (*Folder, error) {
|
||||
var folder Folder
|
||||
@@ -157,18 +119,17 @@ func (user *User) GetPolicyID() uint {
|
||||
return user.Group.PolicyList[0]
|
||||
}
|
||||
return 1
|
||||
} else {
|
||||
// 用户指定时,先检查是否为可用策略列表中的值
|
||||
if util.ContainsUint(user.Group.PolicyList, user.OptionsSerialized.PreferredPolicy) {
|
||||
return user.OptionsSerialized.PreferredPolicy
|
||||
}
|
||||
// 不可用时,返回第一个
|
||||
if len(user.Group.PolicyList) != 0 {
|
||||
return user.Group.PolicyList[0]
|
||||
}
|
||||
return 1
|
||||
|
||||
}
|
||||
// 用户指定时,先检查是否为可用策略列表中的值
|
||||
if util.ContainsUint(user.Group.PolicyList, user.OptionsSerialized.PreferredPolicy) {
|
||||
return user.OptionsSerialized.PreferredPolicy
|
||||
}
|
||||
// 不可用时,返回第一个
|
||||
if len(user.Group.PolicyList) != 0 {
|
||||
return user.Group.PolicyList[0]
|
||||
}
|
||||
return 1
|
||||
|
||||
}
|
||||
|
||||
// GetUserByID 用ID获取用户
|
||||
|
||||
53
models/user_authn.go
Normal file
53
models/user_authn.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/duo-labs/webauthn/webauthn"
|
||||
)
|
||||
|
||||
/*
|
||||
`webauthn.User` 接口的实现
|
||||
*/
|
||||
|
||||
// WebAuthnID 返回用户ID
|
||||
func (user User) WebAuthnID() []byte {
|
||||
bs := make([]byte, 8)
|
||||
binary.LittleEndian.PutUint64(bs, uint64(user.ID))
|
||||
return bs
|
||||
}
|
||||
|
||||
// WebAuthnName 返回用户名
|
||||
func (user User) WebAuthnName() string {
|
||||
return user.Email
|
||||
}
|
||||
|
||||
// WebAuthnDisplayName 获得用于展示的用户名
|
||||
func (user User) WebAuthnDisplayName() string {
|
||||
return user.Nick
|
||||
}
|
||||
|
||||
// WebAuthnIcon 获得用户头像
|
||||
func (user User) WebAuthnIcon() string {
|
||||
return "https://cdn4.buysellads.net/uu/1/46074/1559075156-slack-carbon-red_2x.png"
|
||||
}
|
||||
|
||||
// WebAuthnCredentials 获得已注册的验证器凭证
|
||||
func (user User) WebAuthnCredentials() []webauthn.Credential {
|
||||
var res []webauthn.Credential
|
||||
err := json.Unmarshal([]byte(user.Authn), &res)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// RegisterAuthn 添加新的验证器
|
||||
func (user *User) RegisterAuthn(credential *webauthn.Credential) {
|
||||
res, err := json.Marshal([]webauthn.Credential{*credential})
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
DB.Model(user).UpdateColumn("authn", string(res))
|
||||
}
|
||||
84
models/user_authn_test.go
Normal file
84
models/user_authn_test.go
Normal file
@@ -0,0 +1,84 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"github.com/DATA-DOG/go-sqlmock"
|
||||
"github.com/duo-labs/webauthn/webauthn"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestUser_RegisterAuthn(t *testing.T) {
|
||||
asserts := assert.New(t)
|
||||
credential := webauthn.Credential{}
|
||||
user := User{
|
||||
Model: gorm.Model{ID: 1},
|
||||
}
|
||||
|
||||
{
|
||||
mock.ExpectBegin()
|
||||
mock.ExpectExec("UPDATE(.+)").
|
||||
WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
mock.ExpectCommit()
|
||||
user.RegisterAuthn(&credential)
|
||||
asserts.NoError(mock.ExpectationsWereMet())
|
||||
}
|
||||
}
|
||||
|
||||
func TestUser_WebAuthnCredentials(t *testing.T) {
|
||||
asserts := assert.New(t)
|
||||
user := User{
|
||||
Model: gorm.Model{ID: 1},
|
||||
Authn: `[{"ID":"123","PublicKey":"+4sg1vYcjg/+=","AttestationType":"packed","Authenticator":{"AAGUID":"+lg==","SignCount":0,"CloneWarning":false}}]`,
|
||||
}
|
||||
{
|
||||
credentials := user.WebAuthnCredentials()
|
||||
asserts.Len(credentials, 1)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUser_WebAuthnDisplayName(t *testing.T) {
|
||||
asserts := assert.New(t)
|
||||
user := User{
|
||||
Model: gorm.Model{ID: 1},
|
||||
Nick: "123",
|
||||
}
|
||||
{
|
||||
nick := user.WebAuthnDisplayName()
|
||||
asserts.Equal("123", nick)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUser_WebAuthnIcon(t *testing.T) {
|
||||
asserts := assert.New(t)
|
||||
user := User{
|
||||
Model: gorm.Model{ID: 1},
|
||||
}
|
||||
{
|
||||
icon := user.WebAuthnIcon()
|
||||
asserts.NotEmpty(icon)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUser_WebAuthnID(t *testing.T) {
|
||||
asserts := assert.New(t)
|
||||
user := User{
|
||||
Model: gorm.Model{ID: 1},
|
||||
}
|
||||
{
|
||||
id := user.WebAuthnID()
|
||||
asserts.Len(id, 8)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUser_WebAuthnName(t *testing.T) {
|
||||
asserts := assert.New(t)
|
||||
user := User{
|
||||
Model: gorm.Model{ID: 1},
|
||||
Email: "abslant@foxmail.com",
|
||||
}
|
||||
{
|
||||
name := user.WebAuthnName()
|
||||
asserts.Equal("abslant@foxmail.com", name)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user