neko/server/internal/config/member.go

160 lines
5.6 KiB
Go
Raw Permalink Normal View History

2021-03-14 13:08:50 +13:00
package config
import (
"github.com/rs/zerolog/log"
2021-03-14 13:08:50 +13:00
"github.com/spf13/cobra"
"github.com/spf13/viper"
2021-03-17 03:28:40 +13:00
"github.com/demodesk/neko/internal/member/file"
2023-01-13 12:00:09 +13:00
"github.com/demodesk/neko/internal/member/multiuser"
"github.com/demodesk/neko/internal/member/object"
2023-09-26 05:28:05 +13:00
"github.com/demodesk/neko/pkg/types"
"github.com/demodesk/neko/pkg/utils"
2021-03-14 13:08:50 +13:00
)
type Member struct {
2021-03-17 03:24:58 +13:00
Provider string
2021-03-17 03:28:40 +13:00
// providers
2023-01-13 12:00:09 +13:00
File file.Config
Object object.Config
Multiuser multiuser.Config
2021-03-14 13:08:50 +13:00
}
func (Member) Init(cmd *cobra.Command) error {
2023-01-13 12:59:00 +13:00
cmd.PersistentFlags().String("member.provider", "multiuser", "choose member provider")
2021-03-17 03:24:58 +13:00
if err := viper.BindPFlag("member.provider", cmd.PersistentFlags().Lookup("member.provider")); err != nil {
2021-03-14 13:08:50 +13:00
return err
}
2021-03-17 03:24:58 +13:00
// file provider
cmd.PersistentFlags().String("member.file.path", "", "member file provider: storage path")
if err := viper.BindPFlag("member.file.path", cmd.PersistentFlags().Lookup("member.file.path")); err != nil {
2021-03-14 13:08:50 +13:00
return err
}
2023-11-20 03:31:18 +13:00
cmd.PersistentFlags().Bool("member.file.hash", true, "member file provider: whether to hash passwords using sha256 (recommended)")
if err := viper.BindPFlag("member.file.hash", cmd.PersistentFlags().Lookup("member.file.hash")); err != nil {
return err
}
2021-03-17 03:24:58 +13:00
// object provider
cmd.PersistentFlags().String("member.object.users", "[]", "member object provider: users in JSON format")
if err := viper.BindPFlag("member.object.users", cmd.PersistentFlags().Lookup("member.object.users")); err != nil {
2021-03-14 13:08:50 +13:00
return err
}
2023-01-13 12:00:09 +13:00
// multiuser provider
2023-01-13 12:59:00 +13:00
cmd.PersistentFlags().String("member.multiuser.user_password", "neko", "member multiuser provider: user password")
2023-01-13 12:00:09 +13:00
if err := viper.BindPFlag("member.multiuser.user_password", cmd.PersistentFlags().Lookup("member.multiuser.user_password")); err != nil {
return err
}
2023-01-13 12:59:00 +13:00
cmd.PersistentFlags().String("member.multiuser.admin_password", "admin", "member multiuser provider: admin password")
2023-01-13 12:00:09 +13:00
if err := viper.BindPFlag("member.multiuser.admin_password", cmd.PersistentFlags().Lookup("member.multiuser.admin_password")); err != nil {
return err
}
2023-09-26 05:28:05 +13:00
cmd.PersistentFlags().String("member.multiuser.user_profile", "{}", "member multiuser provider: user profile in JSON format")
if err := viper.BindPFlag("member.multiuser.user_profile", cmd.PersistentFlags().Lookup("member.multiuser.user_profile")); err != nil {
return err
}
cmd.PersistentFlags().String("member.multiuser.admin_profile", "{}", "member multiuser provider: admin profile in JSON format")
if err := viper.BindPFlag("member.multiuser.admin_profile", cmd.PersistentFlags().Lookup("member.multiuser.admin_profile")); err != nil {
return err
}
2021-03-14 13:08:50 +13:00
return nil
}
2024-07-19 07:48:09 +12:00
func (Member) InitV2(cmd *cobra.Command) error {
2024-07-19 07:54:53 +12:00
cmd.PersistentFlags().String("password", "", "V2: password for connecting to stream")
2024-07-19 07:48:09 +12:00
if err := viper.BindPFlag("password", cmd.PersistentFlags().Lookup("password")); err != nil {
return err
}
2024-07-19 07:54:53 +12:00
cmd.PersistentFlags().String("password_admin", "", "V2: admin password for connecting to stream")
2024-07-19 07:48:09 +12:00
if err := viper.BindPFlag("password_admin", cmd.PersistentFlags().Lookup("password_admin")); err != nil {
return err
}
return nil
}
2021-03-14 13:08:50 +13:00
func (s *Member) Set() {
2021-03-17 03:24:58 +13:00
s.Provider = viper.GetString("member.provider")
// file provider
2021-03-17 03:28:40 +13:00
s.File.Path = viper.GetString("member.file.path")
2023-11-20 03:31:18 +13:00
s.File.Hash = viper.GetBool("member.file.hash")
2021-03-17 03:24:58 +13:00
// object provider
if err := viper.UnmarshalKey("member.object.users", &s.Object.Users, viper.DecodeHook(
utils.JsonStringAutoDecode(s.Object.Users),
)); err != nil {
log.Warn().Err(err).Msgf("unable to parse member object users")
}
2023-01-13 12:00:09 +13:00
// multiuser provider
s.Multiuser.UserPassword = viper.GetString("member.multiuser.user_password")
s.Multiuser.AdminPassword = viper.GetString("member.multiuser.admin_password")
2023-09-26 05:28:05 +13:00
// default user profile
s.Multiuser.UserProfile = types.MemberProfile{
IsAdmin: false,
CanLogin: true,
CanConnect: true,
CanWatch: true,
CanHost: true,
CanShareMedia: true,
CanAccessClipboard: true,
SendsInactiveCursor: true,
CanSeeInactiveCursors: false,
}
// override user profile
if err := viper.UnmarshalKey("member.multiuser.user_profile", &s.Multiuser.UserProfile, viper.DecodeHook(
utils.JsonStringAutoDecode(s.Multiuser.UserProfile),
)); err != nil {
log.Warn().Err(err).Msgf("unable to parse member multiuser user profile")
}
// default admin profile
s.Multiuser.AdminProfile = types.MemberProfile{
IsAdmin: true,
CanLogin: true,
CanConnect: true,
CanWatch: true,
CanHost: true,
CanShareMedia: true,
CanAccessClipboard: true,
SendsInactiveCursor: true,
CanSeeInactiveCursors: true,
}
// override admin profile
if err := viper.UnmarshalKey("member.multiuser.admin_profile", &s.Multiuser.AdminProfile, viper.DecodeHook(
utils.JsonStringAutoDecode(s.Multiuser.AdminProfile),
)); err != nil {
log.Warn().Err(err).Msgf("unable to parse member multiuser admin profile")
}
2021-03-14 13:08:50 +13:00
}
2024-07-19 07:48:09 +12:00
func (s *Member) SetV2() {
if viper.IsSet("password") || viper.IsSet("password_admin") {
s.Provider = "multiuser"
if userPassword := viper.GetString("password"); userPassword != "" {
s.Multiuser.UserPassword = userPassword
} else {
s.Multiuser.UserPassword = "neko"
}
if adminPassword := viper.GetString("password_admin"); adminPassword != "" {
s.Multiuser.AdminPassword = adminPassword
} else {
s.Multiuser.AdminPassword = "admin"
}
log.Warn().Msg("you are using v2 configuration 'NEKO_PASSWORD' and 'NEKO_PASSWORD_ADMIN' which are deprecated, please use 'NEKO_MEMBER_MULTIUSER_USER_PASSWORD' and 'NEKO_MEMBER_MULTIUSER_ADMIN_PASSWORD' with 'NEKO_MEMBER_PROVIDER=multiuser' instead")
}
}