From aa6fa5411fe425d10a825b903ebe595df1b71bac Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Tue, 24 Oct 2023 16:20:57 +0800 Subject: [PATCH] Feat: settings --- internal/bootstrap/provider.go | 6 +- internal/conf/oauth2.go | 10 +- internal/conf/server.go | 6 +- internal/db/db.go | 2 +- internal/db/setting.go | 18 ++-- internal/model/setting.go | 12 ++- internal/model/user.go | 8 ++ internal/op/op.go | 17 ++++ internal/op/settings.go | 92 +++++++++++++++++++ internal/op/user.go | 8 ++ internal/provider/{ => plugins}/client.go | 15 +-- .../example}/example_gitee.go | 5 +- internal/provider/{ => plugins}/plugin.go | 10 +- internal/provider/{ => plugins}/server.go | 7 +- internal/provider/provider.go | 47 ---------- internal/provider/providers/baidu-netdisk.go | 8 +- internal/provider/providers/baidu.go | 2 +- internal/provider/providers/gitee.go | 2 +- internal/provider/providers/github.go | 2 +- internal/provider/providers/gitlab.go | 4 +- internal/provider/providers/google.go | 2 +- internal/provider/providers/microsoft.go | 2 +- internal/provider/providers/providers.go | 53 +++++++++++ server/handlers/admin.go | 7 ++ server/handlers/room.go | 11 +++ server/middlewares/auth.go | 9 +- server/oauth2/auth.go | 9 +- server/oauth2/oauth2.go | 4 +- 28 files changed, 269 insertions(+), 109 deletions(-) create mode 100644 internal/op/settings.go rename internal/provider/{ => plugins}/client.go (84%) rename internal/provider/{plugin => plugins/example}/example_gitee.go (93%) rename internal/provider/{ => plugins}/plugin.go (87%) rename internal/provider/{ => plugins}/server.go (92%) create mode 100644 internal/provider/providers/providers.go create mode 100644 server/handlers/admin.go diff --git a/internal/bootstrap/provider.go b/internal/bootstrap/provider.go index f233849..627eee9 100644 --- a/internal/bootstrap/provider.go +++ b/internal/bootstrap/provider.go @@ -10,6 +10,8 @@ import ( "github.com/synctv-org/synctv/cmd/flags" "github.com/synctv-org/synctv/internal/conf" "github.com/synctv-org/synctv/internal/provider" + "github.com/synctv-org/synctv/internal/provider/plugins" + "github.com/synctv-org/synctv/internal/provider/providers" "github.com/synctv-org/synctv/utils" ) @@ -27,7 +29,7 @@ func InitProvider(ctx context.Context) error { log.Errorf("create plugin dir: %s failed: %s", filepath.Dir(op.PluginFile), err) return err } - err = provider.InitProviderPlugins(op.PluginFile, op.Arges, hclog.New(&hclog.LoggerOptions{ + err = plugins.InitProviderPlugins(op.PluginFile, op.Arges, hclog.New(&hclog.LoggerOptions{ Name: op.PluginFile, Level: logLevle, Output: logOur, @@ -39,7 +41,7 @@ func InitProvider(ctx context.Context) error { } } for op, v := range conf.Conf.OAuth2.Providers { - err := provider.InitProvider(op, provider.Oauth2Option{ + err := providers.InitProvider(op, provider.Oauth2Option{ ClientID: v.ClientID, ClientSecret: v.ClientSecret, RedirectURL: v.RedirectURL, diff --git a/internal/conf/oauth2.go b/internal/conf/oauth2.go index 13196fc..a14c45a 100644 --- a/internal/conf/oauth2.go +++ b/internal/conf/oauth2.go @@ -2,7 +2,6 @@ package conf import ( "github.com/synctv-org/synctv/internal/provider" - "github.com/synctv-org/synctv/internal/provider/providers" ) type OAuth2Config struct { @@ -23,12 +22,7 @@ type OAuth2ProviderConfig struct { func DefaultOAuth2Config() OAuth2Config { return OAuth2Config{ - Providers: map[provider.OAuth2Provider]OAuth2ProviderConfig{ - (&providers.GithubProvider{}).Provider(): { - ClientID: "", - ClientSecret: "", - RedirectURL: "", - }, - }, + Providers: map[provider.OAuth2Provider]OAuth2ProviderConfig{}, + Plugins: []Oauth2Plugin{}, } } diff --git a/internal/conf/server.go b/internal/conf/server.go index 97303a8..be1affd 100644 --- a/internal/conf/server.go +++ b/internal/conf/server.go @@ -1,9 +1,9 @@ package conf type ServerConfig struct { - Listen string `yaml:"listen" lc:"default: 0.0.0.0" env:"SERVER_LISTEN"` - Port uint16 `yaml:"port" lc:"default: 8080" env:"SERVER_PORT"` - Quic bool `yaml:"quic" hc:"enable http3/quic, need set cert and key file" env:"SERVER_QUIC"` + Listen string `yaml:"listen" env:"SERVER_LISTEN"` + Port uint16 `yaml:"port" env:"SERVER_PORT"` + Quic bool `yaml:"quic" hc:"enable http3/quic need set cert and key file" env:"SERVER_QUIC"` CertPath string `yaml:"cert_path" env:"SERVER_CERT_PATH"` KeyPath string `yaml:"key_path" env:"SERVER_KEY_PATH"` diff --git a/internal/db/db.go b/internal/db/db.go index 9e7253a..4aa0d74 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -19,7 +19,7 @@ var ( func Init(d *gorm.DB, t conf.DatabaseType) error { db = d dbType = t - return AutoMigrate(new(model.Movie), new(model.Room), new(model.User), new(model.RoomUserRelation), new(model.UserProvider), new(model.SettingItem)) + return AutoMigrate(new(model.Movie), new(model.Room), new(model.User), new(model.RoomUserRelation), new(model.UserProvider), new(model.Setting)) } func AutoMigrate(dst ...any) error { diff --git a/internal/db/setting.go b/internal/db/setting.go index 90baefd..ad0329e 100644 --- a/internal/db/setting.go +++ b/internal/db/setting.go @@ -5,38 +5,38 @@ import ( "gorm.io/gorm/clause" ) -func GetSettingItems() ([]*model.SettingItem, error) { - var items []*model.SettingItem +func GetSettingItems() ([]*model.Setting, error) { + var items []*model.Setting err := db.Find(&items).Error return items, err } -func GetSettingItemByName(name string) (*model.SettingItem, error) { - var item model.SettingItem +func GetSettingItemByName(name string) (*model.Setting, error) { + var item model.Setting err := db.Where("name = ?", name).First(&item).Error return &item, err } -func SaveSettingItem(item *model.SettingItem) error { +func SaveSettingItem(item *model.Setting) error { return db.Clauses(clause.OnConflict{ UpdateAll: true, }).Save(item).Error } -func DeleteSettingItem(item *model.SettingItem) error { +func DeleteSettingItem(item *model.Setting) error { return db.Delete(item).Error } func DeleteSettingItemByName(name string) error { - return db.Where("name = ?", name).Delete(&model.SettingItem{}).Error + return db.Where("name = ?", name).Delete(&model.Setting{}).Error } func GetSettingItemValue(name string) (string, error) { var value string - err := db.Model(&model.SettingItem{}).Where("name = ?", name).Select("value").First(&value).Error + err := db.Model(&model.Setting{}).Where("name = ?", name).Select("value").First(&value).Error return value, err } func SetSettingItemValue(name, value string) error { - return db.Model(&model.SettingItem{}).Where("name = ?", name).Update("value", value).Error + return db.Model(&model.Setting{}).Where("name = ?", name).Assign("value", value).FirstOrCreate(&model.Setting{}).Error } diff --git a/internal/model/setting.go b/internal/model/setting.go index 5dc69e2..82096d0 100644 --- a/internal/model/setting.go +++ b/internal/model/setting.go @@ -1,6 +1,16 @@ package model -type SettingItem struct { +type SettingType string + +const ( + SettingTypeBool SettingType = "bool" + SettingTypeInt64 SettingType = "int64" + SettingTypeFloat64 SettingType = "float64" + SettingTypeString SettingType = "string" +) + +type Setting struct { Name string `gorm:"primaryKey"` Value string + Type SettingType `gorm:"not null;default:string"` } diff --git a/internal/model/user.go b/internal/model/user.go index 7998086..4d718f7 100644 --- a/internal/model/user.go +++ b/internal/model/user.go @@ -49,3 +49,11 @@ func (u *User) BeforeCreate(tx *gorm.DB) error { } return nil } + +func (u *User) IsAdmin() bool { + return u.Role == RoleAdmin +} + +func (u *User) IsBanned() bool { + return u.Role == RoleBanned +} diff --git a/internal/op/op.go b/internal/op/op.go index 8a8f93c..8b1eb8c 100644 --- a/internal/op/op.go +++ b/internal/op/op.go @@ -2,6 +2,8 @@ package op import ( "github.com/bluele/gcache" + "github.com/synctv-org/synctv/internal/db" + "github.com/synctv-org/synctv/internal/model" ) func Init(size int) error { @@ -9,5 +11,20 @@ func Init(size int) error { LRU(). Build() + si, err := db.GetSettingItems() + if err != nil { + panic(err) + } + for _, si2 := range si { + switch si2.Type { + case model.SettingTypeBool: + b, ok := boolSettings[si2.Name] + if ok { + b.value = si2.Value + } + } + } + cleanReg() + return nil } diff --git a/internal/op/settings.go b/internal/op/settings.go new file mode 100644 index 0000000..8cbe72d --- /dev/null +++ b/internal/op/settings.go @@ -0,0 +1,92 @@ +package op + +import ( + "github.com/synctv-org/synctv/internal/db" + "github.com/synctv-org/synctv/internal/model" +) + +var boolSettings map[string]*Bool + +type Setting interface { + Name() string + Raw() string + Type() model.SettingType +} + +type BoolSetting interface { + Setting + Set(value bool) error + Get() (bool, error) +} + +type Bool struct { + name string + value string +} + +func NewBool(name, value string) *Bool { + return &Bool{ + name: name, + value: value, + } +} + +func (b *Bool) Name() string { + return b.name +} + +func (b *Bool) Set(value bool) error { + if value { + b.value = "1" + } else { + b.value = "0" + } + return db.SetSettingItemValue(b.name, b.value) +} + +func (b *Bool) Get() (bool, error) { + return b.value == "1", nil +} + +func (b *Bool) Raw() string { + return b.value +} + +func (b *Bool) Type() model.SettingType { + return model.SettingTypeBool +} + +type Int64Setting interface { + Set(value int64) error + Get() (int64, error) + Raw() string +} + +type Float64Setting interface { + Set(value float64) error + Get() (float64, error) + Raw() string +} + +type StringSetting interface { + Set(value string) error + Get() (string, error) + Raw() string +} + +func cleanReg() { + boolSettings = nil +} + +func newRegBoolSetting(k, v string) BoolSetting { + b := NewBool(k, v) + if boolSettings == nil { + boolSettings = make(map[string]*Bool) + } + boolSettings[k] = b + return b +} + +var ( + DisableCreateRoom = newRegBoolSetting("disable_create_room", "0") +) diff --git a/internal/op/user.go b/internal/op/user.go index 9b7da6d..9207cf1 100644 --- a/internal/op/user.go +++ b/internal/op/user.go @@ -22,6 +22,14 @@ func (u *User) NewMovie(movie model.MovieInfo) model.Movie { } } +func (u *User) IsAdmin() bool { + return u.Role == model.RoleAdmin +} + +func (u *User) IsBanned() bool { + return u.Role == model.RoleBanned +} + func (u *User) HasPermission(roomID uint, permission model.Permission) bool { if u.Role == model.RoleAdmin { return true diff --git a/internal/provider/client.go b/internal/provider/plugins/client.go similarity index 84% rename from internal/provider/client.go rename to internal/provider/plugins/client.go index 1323a2c..c009da4 100644 --- a/internal/provider/client.go +++ b/internal/provider/plugins/client.go @@ -1,18 +1,19 @@ -package provider +package plugins import ( "context" "time" + "github.com/synctv-org/synctv/internal/provider" providerpb "github.com/synctv-org/synctv/proto/provider" "golang.org/x/oauth2" ) type GRPCClient struct{ client providerpb.Oauth2PluginClient } -var _ ProviderInterface = (*GRPCClient)(nil) +var _ provider.ProviderInterface = (*GRPCClient)(nil) -func (c *GRPCClient) Init(o Oauth2Option) { +func (c *GRPCClient) Init(o provider.Oauth2Option) { c.client.Init(context.Background(), &providerpb.InitReq{ ClientId: o.ClientID, ClientSecret: o.ClientSecret, @@ -20,12 +21,12 @@ func (c *GRPCClient) Init(o Oauth2Option) { }) } -func (c *GRPCClient) Provider() OAuth2Provider { +func (c *GRPCClient) Provider() provider.OAuth2Provider { resp, err := c.client.Provider(context.Background(), &providerpb.Enpty{}) if err != nil { return "" } - return OAuth2Provider(resp.Name) + return provider.OAuth2Provider(resp.Name) } func (c *GRPCClient) NewAuthURL(state string) string { @@ -64,7 +65,7 @@ func (c *GRPCClient) RefreshToken(ctx context.Context, tk string) (*oauth2.Token }, nil } -func (c *GRPCClient) GetUserInfo(ctx context.Context, tk *oauth2.Token) (*UserInfo, error) { +func (c *GRPCClient) GetUserInfo(ctx context.Context, tk *oauth2.Token) (*provider.UserInfo, error) { resp, err := c.client.GetUserInfo(ctx, &providerpb.GetUserInfoReq{ Token: &providerpb.Token{ AccessToken: tk.AccessToken, @@ -76,7 +77,7 @@ func (c *GRPCClient) GetUserInfo(ctx context.Context, tk *oauth2.Token) (*UserIn if err != nil { return nil, err } - return &UserInfo{ + return &provider.UserInfo{ Username: resp.Username, ProviderUserID: uint(resp.ProviderUserId), }, nil diff --git a/internal/provider/plugin/example_gitee.go b/internal/provider/plugins/example/example_gitee.go similarity index 93% rename from internal/provider/plugin/example_gitee.go rename to internal/provider/plugins/example/example_gitee.go index c24d3f7..2c0b654 100644 --- a/internal/provider/plugin/example_gitee.go +++ b/internal/provider/plugins/example/example_gitee.go @@ -7,6 +7,7 @@ import ( plugin "github.com/hashicorp/go-plugin" "github.com/synctv-org/synctv/internal/provider" + "github.com/synctv-org/synctv/internal/provider/plugins" "golang.org/x/oauth2" ) @@ -85,10 +86,10 @@ type giteeUserInfo struct { func main() { var pluginMap = map[string]plugin.Plugin{ - "Provider": &provider.ProviderPlugin{Impl: &GiteeProvider{}}, + "Provider": &plugins.ProviderPlugin{Impl: &GiteeProvider{}}, } plugin.Serve(&plugin.ServeConfig{ - HandshakeConfig: provider.HandshakeConfig, + HandshakeConfig: plugins.HandshakeConfig, Plugins: pluginMap, GRPCServer: plugin.DefaultGRPCServer, }) diff --git a/internal/provider/plugin.go b/internal/provider/plugins/plugin.go similarity index 87% rename from internal/provider/plugin.go rename to internal/provider/plugins/plugin.go index ec33f78..d891c62 100644 --- a/internal/provider/plugin.go +++ b/internal/provider/plugins/plugin.go @@ -1,4 +1,4 @@ -package provider +package plugins import ( "context" @@ -7,6 +7,8 @@ import ( "github.com/hashicorp/go-hclog" "github.com/hashicorp/go-plugin" + "github.com/synctv-org/synctv/internal/provider" + "github.com/synctv-org/synctv/internal/provider/providers" sysnotify "github.com/synctv-org/synctv/internal/sysNotify" providerpb "github.com/synctv-org/synctv/proto/provider" "google.golang.org/grpc" @@ -26,11 +28,11 @@ func InitProviderPlugins(name string, arg []string, Logger hclog.Logger) error { if err != nil { return err } - provider, ok := i.(ProviderInterface) + provider, ok := i.(provider.ProviderInterface) if !ok { return fmt.Errorf("%s not implement ProviderInterface", name) } - RegisterProvider(provider) + providers.RegisterProvider(provider) return nil } @@ -46,7 +48,7 @@ var pluginMap = map[string]plugin.Plugin{ type ProviderPlugin struct { plugin.Plugin - Impl ProviderInterface + Impl provider.ProviderInterface } func (p *ProviderPlugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error { diff --git a/internal/provider/server.go b/internal/provider/plugins/server.go similarity index 92% rename from internal/provider/server.go rename to internal/provider/plugins/server.go index 246e9c4..fbe179a 100644 --- a/internal/provider/server.go +++ b/internal/provider/plugins/server.go @@ -1,20 +1,21 @@ -package provider +package plugins import ( "context" "time" + "github.com/synctv-org/synctv/internal/provider" providerpb "github.com/synctv-org/synctv/proto/provider" "golang.org/x/oauth2" ) type GRPCServer struct { providerpb.UnimplementedOauth2PluginServer - Impl ProviderInterface + Impl provider.ProviderInterface } func (s *GRPCServer) Init(ctx context.Context, req *providerpb.InitReq) (*providerpb.Enpty, error) { - s.Impl.Init(Oauth2Option{ + s.Impl.Init(provider.Oauth2Option{ ClientID: req.ClientId, ClientSecret: req.ClientSecret, RedirectURL: req.RedirectUrl, diff --git a/internal/provider/provider.go b/internal/provider/provider.go index b77ad12..d6d4e35 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -2,7 +2,6 @@ package provider import ( "context" - "fmt" "golang.org/x/oauth2" ) @@ -28,49 +27,3 @@ type ProviderInterface interface { RefreshToken(context.Context, string) (*oauth2.Token, error) GetUserInfo(context.Context, *oauth2.Token) (*UserInfo, error) } - -var ( - enabledProviders map[OAuth2Provider]ProviderInterface - allowedProviders = make(map[OAuth2Provider]ProviderInterface) -) - -func InitProvider(p OAuth2Provider, c Oauth2Option) error { - pi, ok := allowedProviders[p] - if !ok { - return FormatErrNotImplemented(p) - } - pi.Init(c) - if enabledProviders == nil { - enabledProviders = make(map[OAuth2Provider]ProviderInterface) - } - enabledProviders[pi.Provider()] = pi - return nil -} - -func RegisterProvider(ps ...ProviderInterface) { - for _, p := range ps { - allowedProviders[p.Provider()] = p - } -} - -func GetProvider(p OAuth2Provider) (ProviderInterface, error) { - pi, ok := enabledProviders[p] - if !ok { - return nil, FormatErrNotImplemented(p) - } - return pi, nil -} - -func AllowedProvider() map[OAuth2Provider]ProviderInterface { - return allowedProviders -} - -func EnabledProvider() map[OAuth2Provider]ProviderInterface { - return enabledProviders -} - -type FormatErrNotImplemented string - -func (f FormatErrNotImplemented) Error() string { - return fmt.Sprintf("%s not implemented", string(f)) -} diff --git a/internal/provider/providers/baidu-netdisk.go b/internal/provider/providers/baidu-netdisk.go index 6e22648..76f8584 100644 --- a/internal/provider/providers/baidu-netdisk.go +++ b/internal/provider/providers/baidu-netdisk.go @@ -67,13 +67,13 @@ func (p *BaiduNetDiskProvider) GetUserInfo(ctx context.Context, tk *oauth2.Token }, nil } -func init() { - provider.RegisterProvider(new(BaiduNetDiskProvider)) -} - type baiduNetDiskProviderUserInfo struct { BaiduName string `json:"baidu_name"` Errmsg string `json:"errmsg"` Errno int `json:"errno"` Uk uint `json:"uk"` } + +func init() { + RegisterProvider(new(BaiduNetDiskProvider)) +} diff --git a/internal/provider/providers/baidu.go b/internal/provider/providers/baidu.go index 8922558..d60e6ef 100644 --- a/internal/provider/providers/baidu.go +++ b/internal/provider/providers/baidu.go @@ -67,7 +67,7 @@ func (p *BaiduProvider) GetUserInfo(ctx context.Context, tk *oauth2.Token) (*pro } func init() { - provider.RegisterProvider(new(BaiduProvider)) + RegisterProvider(new(BaiduProvider)) } type baiduProviderUserInfo struct { diff --git a/internal/provider/providers/gitee.go b/internal/provider/providers/gitee.go index 50b5c3b..748951f 100644 --- a/internal/provider/providers/gitee.go +++ b/internal/provider/providers/gitee.go @@ -68,5 +68,5 @@ type giteeUserInfo struct { } func init() { - provider.RegisterProvider(new(GiteeProvider)) + RegisterProvider(new(GiteeProvider)) } diff --git a/internal/provider/providers/github.go b/internal/provider/providers/github.go index baeed93..7907b25 100644 --- a/internal/provider/providers/github.go +++ b/internal/provider/providers/github.go @@ -66,5 +66,5 @@ type githubUserInfo struct { } func init() { - provider.RegisterProvider(new(GithubProvider)) + RegisterProvider(new(GithubProvider)) } diff --git a/internal/provider/providers/gitlab.go b/internal/provider/providers/gitlab.go index d19ae17..bf34fa7 100644 --- a/internal/provider/providers/gitlab.go +++ b/internal/provider/providers/gitlab.go @@ -48,9 +48,9 @@ func (g *GitlabProvider) GetUserInfo(ctx context.Context, tk *oauth2.Token) (*pr return nil, err } defer resp.Body.Close() - return nil, provider.FormatErrNotImplemented("gitlab") + return nil, FormatErrNotImplemented("gitlab") } func init() { - provider.RegisterProvider(new(GitlabProvider)) + RegisterProvider(new(GitlabProvider)) } diff --git a/internal/provider/providers/google.go b/internal/provider/providers/google.go index 8b85eb0..b6c378f 100644 --- a/internal/provider/providers/google.go +++ b/internal/provider/providers/google.go @@ -61,7 +61,7 @@ func (g *GoogleProvider) GetUserInfo(ctx context.Context, tk *oauth2.Token) (*pr } func init() { - provider.RegisterProvider(new(GoogleProvider)) + RegisterProvider(new(GoogleProvider)) } type googleUserInfo struct { diff --git a/internal/provider/providers/microsoft.go b/internal/provider/providers/microsoft.go index 1e98b23..e2adb7a 100644 --- a/internal/provider/providers/microsoft.go +++ b/internal/provider/providers/microsoft.go @@ -68,5 +68,5 @@ type microsoftUserInfo struct { } func init() { - provider.RegisterProvider(new(MicrosoftProvider)) + RegisterProvider(new(MicrosoftProvider)) } diff --git a/internal/provider/providers/providers.go b/internal/provider/providers/providers.go new file mode 100644 index 0000000..c923224 --- /dev/null +++ b/internal/provider/providers/providers.go @@ -0,0 +1,53 @@ +package providers + +import ( + "fmt" + + "github.com/synctv-org/synctv/internal/provider" +) + +var ( + enabledProviders map[provider.OAuth2Provider]provider.ProviderInterface + allowedProviders = make(map[provider.OAuth2Provider]provider.ProviderInterface) +) + +func InitProvider(p provider.OAuth2Provider, c provider.Oauth2Option) error { + pi, ok := allowedProviders[p] + if !ok { + return FormatErrNotImplemented(p) + } + pi.Init(c) + if enabledProviders == nil { + enabledProviders = make(map[provider.OAuth2Provider]provider.ProviderInterface) + } + enabledProviders[pi.Provider()] = pi + return nil +} + +func RegisterProvider(ps ...provider.ProviderInterface) { + for _, p := range ps { + allowedProviders[p.Provider()] = p + } +} + +func GetProvider(p provider.OAuth2Provider) (provider.ProviderInterface, error) { + pi, ok := enabledProviders[p] + if !ok { + return nil, FormatErrNotImplemented(p) + } + return pi, nil +} + +func AllowedProvider() map[provider.OAuth2Provider]provider.ProviderInterface { + return allowedProviders +} + +func EnabledProvider() map[provider.OAuth2Provider]provider.ProviderInterface { + return enabledProviders +} + +type FormatErrNotImplemented string + +func (f FormatErrNotImplemented) Error() string { + return fmt.Sprintf("%s not implemented", string(f)) +} diff --git a/server/handlers/admin.go b/server/handlers/admin.go new file mode 100644 index 0000000..42704ff --- /dev/null +++ b/server/handlers/admin.go @@ -0,0 +1,7 @@ +package handlers + +import "github.com/gin-gonic/gin" + +func AdminSettings(ctx *gin.Context) { + +} diff --git a/server/handlers/room.go b/server/handlers/room.go index 9a74591..c9fe28c 100644 --- a/server/handlers/room.go +++ b/server/handlers/room.go @@ -30,6 +30,17 @@ func (e FormatErrNotSupportPosition) Error() string { func CreateRoom(ctx *gin.Context) { user := ctx.MustGet("user").(*op.User) + + v, err := op.DisableCreateRoom.Get() + if err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) + return + } + if v && !user.IsAdmin() { + ctx.AbortWithStatusJSON(http.StatusForbidden, model.NewApiErrorStringResp("create room is disabled")) + return + } + req := model.CreateRoomReq{} if err := model.Decode(ctx, &req); err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) diff --git a/server/middlewares/auth.go b/server/middlewares/auth.go index 7413a08..aea25fb 100644 --- a/server/middlewares/auth.go +++ b/server/middlewares/auth.go @@ -8,7 +8,6 @@ import ( "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" "github.com/synctv-org/synctv/internal/conf" - dbModel "github.com/synctv-org/synctv/internal/model" "github.com/synctv-org/synctv/internal/op" "github.com/synctv-org/synctv/server/model" "github.com/zijiren233/stream" @@ -76,7 +75,7 @@ func AuthRoom(Authorization string) (*op.User, *op.Room, error) { if err != nil { return nil, nil, err } - if u.Role == dbModel.RoleBanned { + if u.IsBanned() { return nil, nil, errors.New("user banned") } @@ -105,7 +104,7 @@ func AuthUser(Authorization string) (*op.User, error) { if err != nil { return nil, err } - if u.Role == dbModel.RoleBanned { + if u.IsBanned() { return nil, errors.New("user banned") } @@ -113,7 +112,7 @@ func AuthUser(Authorization string) (*op.User, error) { } func NewAuthUserToken(user *op.User) (string, error) { - if user.Role == dbModel.RoleBanned { + if user.IsBanned() { return "", errors.New("user banned") } t, err := time.ParseDuration(conf.Conf.Jwt.Expire) @@ -131,7 +130,7 @@ func NewAuthUserToken(user *op.User) (string, error) { } func NewAuthRoomToken(user *op.User, room *op.Room) (string, error) { - if user.Role == dbModel.RoleBanned { + if user.IsBanned() { return "", errors.New("user banned") } t, err := time.ParseDuration(conf.Conf.Jwt.Expire) diff --git a/server/oauth2/auth.go b/server/oauth2/auth.go index 273608f..2dda4b8 100644 --- a/server/oauth2/auth.go +++ b/server/oauth2/auth.go @@ -7,6 +7,7 @@ import ( "github.com/gin-gonic/gin" "github.com/synctv-org/synctv/internal/op" "github.com/synctv-org/synctv/internal/provider" + "github.com/synctv-org/synctv/internal/provider/providers" "github.com/synctv-org/synctv/server/middlewares" "github.com/synctv-org/synctv/server/model" "github.com/synctv-org/synctv/utils" @@ -16,7 +17,7 @@ import ( func OAuth2(ctx *gin.Context) { t := ctx.Param("type") - pi, err := provider.GetProvider(provider.OAuth2Provider(t)) + pi, err := providers.GetProvider(provider.OAuth2Provider(t)) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return @@ -30,7 +31,7 @@ func OAuth2(ctx *gin.Context) { func OAuth2Api(ctx *gin.Context) { t := ctx.Param("type") - pi, err := provider.GetProvider(provider.OAuth2Provider(t)) + pi, err := providers.GetProvider(provider.OAuth2Provider(t)) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) } @@ -64,7 +65,7 @@ func OAuth2Callback(ctx *gin.Context) { } p := provider.OAuth2Provider(ctx.Param("type")) - pi, err := provider.GetProvider(p) + pi, err := providers.GetProvider(p) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return @@ -112,7 +113,7 @@ func OAuth2CallbackApi(ctx *gin.Context) { } p := provider.OAuth2Provider(ctx.Param("type")) - pi, err := provider.GetProvider(p) + pi, err := providers.GetProvider(p) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) } diff --git a/server/oauth2/oauth2.go b/server/oauth2/oauth2.go index 702c375..64b27b9 100644 --- a/server/oauth2/oauth2.go +++ b/server/oauth2/oauth2.go @@ -2,12 +2,12 @@ package auth import ( "github.com/gin-gonic/gin" - "github.com/synctv-org/synctv/internal/provider" + "github.com/synctv-org/synctv/internal/provider/providers" "golang.org/x/exp/maps" ) func OAuth2EnabledApi(ctx *gin.Context) { ctx.JSON(200, gin.H{ - "enabled": maps.Keys(provider.EnabledProvider()), + "enabled": maps.Keys(providers.EnabledProvider()), }) }