Compare commits

...

21 Commits

Author SHA1 Message Date
Drew Fitzgerald
58f3c2f46a
Merge 87b4f3e0ff4b4fd97a4f7028d72d33057e5612ee into ba285cb8bddb85fbd93060b3a8b944f35dd7a7ad 2024-12-20 13:26:14 +01:00
Ns2Kracy
ba285cb8bd
fix: update user info retrieval and clean up unused code (#2101)
Some checks failed
Collect Code Coverage / build (push) Has been cancelled
Auto Publish Website / goreleaser (push) Has been cancelled
2024-12-19 11:14:15 +08:00
Drew Fitzgerald
87b4f3e0ff
Merge branch 'main' into main 2024-12-11 21:35:46 +13:00
Sheep26
9c6c8db784 possible fixed potential issue with edit samba password 2024-12-08 09:21:52 +13:00
Sheep26
4591a6c567 Merge branch 'main' of https://github.com/Sheep26/CasaOS 2024-12-07 16:26:11 +13:00
Sheep26
7e98f0f563 fix 2024-12-07 15:44:54 +13:00
Sheep26
479a29ef3a gorm update 2024-12-07 15:44:54 +13:00
Sheep26
601b78d0c8 syntax fixes 2024-12-07 15:44:54 +13:00
Sheep26
f39ae50cd9 change order 2024-12-07 15:44:54 +13:00
Sheep26
571ce2c4ac smb_users 2024-12-07 15:44:54 +13:00
Sheep26
9e7619b481 get samba users 2024-12-07 15:44:54 +13:00
Sheep26
00e17b5b6c send valid_users to api 2024-12-07 15:44:54 +13:00
Sheep26
bc97dfa59d non anonymous samba shares 2024-12-07 15:44:54 +13:00
Sheep26
c8d542dbe3 fix 2024-12-04 11:16:15 +13:00
Sheep26
21492682c3 gorm update 2024-12-03 22:48:31 +13:00
Sheep26
8ca900d6f2 syntax fixes 2024-12-03 22:36:26 +13:00
Sheep26
6407472a23 change order 2024-12-03 21:57:33 +13:00
Sheep26
ea5d050f41 smb_users 2024-12-03 17:35:11 +13:00
Sheep26
873e2a5ac7 get samba users 2024-12-03 17:11:14 +13:00
Sheep26
85a72a6a15 send valid_users to api 2024-12-03 16:48:33 +13:00
Sheep26
94e545b388 non anonymous samba shares 2024-12-03 16:30:25 +13:00
14 changed files with 128 additions and 85 deletions

0
build/scripts/setup/script.d/03-setup-casaos.sh Executable file → Normal file
View File

View File

@ -336,9 +336,16 @@ RestartSMBD(){
$sudo_cmd systemctl restart smbd $sudo_cmd systemctl restart smbd
} }
# edit user password $1:username # edit user password
EditSmabaUserPassword(){ EditSmabaUserPassword(){
$sudo_cmd smbpasswd $1 $sudo_cmd smbpasswd -a $1 <<EOF
$2
$2
EOF
}
ListSambaUsers(){
$sudo_cmd pdbedit -L
} }
AddSmabaUser(){ AddSmabaUser(){

View File

@ -26,6 +26,7 @@ func (d *Onedrive) Config() driver.Config {
func (d *Onedrive) GetAddition() driver.Additional { func (d *Onedrive) GetAddition() driver.Additional {
return &d.Addition return &d.Addition
} }
func (d *Onedrive) Init(ctx context.Context) error { func (d *Onedrive) Init(ctx context.Context) error {
if d.ChunkSize < 1 { if d.ChunkSize < 1 {
d.ChunkSize = 5 d.ChunkSize = 5
@ -35,19 +36,20 @@ func (d *Onedrive) Init(ctx context.Context) error {
} }
return d.refreshToken() return d.refreshToken()
} }
func (d *Onedrive) GetUserInfo(ctx context.Context) (string, error) { func (d *Onedrive) GetUserInfo(ctx context.Context) (string, error) {
return "", nil return "", nil
} }
func (d *Onedrive) GetInfo(ctx context.Context) (string, string, string, error) { func (d *Onedrive) GetInfo(ctx context.Context) (string, string, string, error) {
url := d.GetMetaUrl(false, "/") url := d.GetMetaUrl(false, "/")
user := Info{} user := Info{}
resp, err := d.Request(url, http.MethodGet, nil, &user) _, err := d.Request(url, http.MethodGet, nil, &user)
if err != nil { if err != nil {
return "", "", "", err return "", "", "", err
} }
logger.Info("resp", zap.Any("resp", resp)) return user.CreatedBy.User.Email, user.ParentReference.DriveID, user.ParentReference.DriveType, nil
return user.LastModifiedBy.User.DisplayName, user.ParentReference.DriveID, user.ParentReference.DriveType, nil
} }
func (d *Onedrive) GetSpaceSize(ctx context.Context) (used string, total string, err error) { func (d *Onedrive) GetSpaceSize(ctx context.Context) (used string, total string, err error) {
@ -63,6 +65,7 @@ func (d *Onedrive) GetSpaceSize(ctx context.Context) (used string, total string,
total = strconv.Itoa(size.Total) total = strconv.Itoa(size.Total)
return return
} }
func (d *Onedrive) Drop(ctx context.Context) error { func (d *Onedrive) Drop(ctx context.Context) error {
return nil return nil
} }

View File

@ -43,19 +43,12 @@ type About struct {
} }
type Info struct { type Info struct {
LastModifiedBy struct { CreatedBy struct {
Application struct {
DisplayName string `json:"displayName"`
ID string `json:"id"`
} `json:"application"`
Device struct {
ID string `json:"id"`
} `json:"device"`
User struct { User struct {
Email string `json:"email"`
DisplayName string `json:"displayName"` DisplayName string `json:"displayName"`
ID string `json:"id"`
} `json:"user"` } `json:"user"`
} `json:"lastModifiedBy"` } `json:"createdBy"`
ParentReference struct { ParentReference struct {
DriveID string `json:"driveId"` DriveID string `json:"driveId"`
DriveType string `json:"driveType"` DriveType string `json:"driveType"`

View File

@ -3,11 +3,10 @@ package onedrive
import ( import (
"errors" "errors"
"fmt" "fmt"
"net/url"
"strings"
"github.com/IceWhaleTech/CasaOS-Common/utils/logger" "github.com/IceWhaleTech/CasaOS-Common/utils/logger"
"github.com/IceWhaleTech/CasaOS/drivers/base" "github.com/IceWhaleTech/CasaOS/drivers/base"
"github.com/IceWhaleTech/CasaOS/pkg/utils"
"go.uber.org/zap" "go.uber.org/zap"
) )
@ -15,6 +14,7 @@ var (
client_id = "private build" client_id = "private build"
client_secret = "private build" client_secret = "private build"
) )
var onedriveHostMap = map[string]Host{ var onedriveHostMap = map[string]Host{
"global": { "global": {
Oauth: "https://login.microsoftonline.com", Oauth: "https://login.microsoftonline.com",
@ -34,31 +34,9 @@ var onedriveHostMap = map[string]Host{
}, },
} }
func EncodePath(path string, all ...bool) string {
seg := strings.Split(path, "/")
toReplace := []struct {
Src string
Dst string
}{
{Src: "%", Dst: "%25"},
{"%", "%25"},
{"?", "%3F"},
{"#", "%23"},
}
for i := range seg {
if len(all) > 0 && all[0] {
seg[i] = url.PathEscape(seg[i])
} else {
for j := range toReplace {
seg[i] = strings.ReplaceAll(seg[i], toReplace[j].Src, toReplace[j].Dst)
}
}
}
return strings.Join(seg, "/")
}
func (d *Onedrive) GetMetaUrl(auth bool, path string) string { func (d *Onedrive) GetMetaUrl(auth bool, path string) string {
host := onedriveHostMap[d.Region] host := onedriveHostMap[d.Region]
path = EncodePath(path, true) path = utils.EncodePath(path, true)
if auth { if auth {
return host.Oauth return host.Oauth
} }

2
go.mod
View File

@ -43,7 +43,7 @@ require (
golang.org/x/oauth2 v0.7.0 golang.org/x/oauth2 v0.7.0
golang.org/x/sync v0.3.0 golang.org/x/sync v0.3.0
golang.org/x/sys v0.20.0 golang.org/x/sys v0.20.0
gorm.io/gorm v1.25.0 gorm.io/gorm v1.25.12
gotest.tools v2.2.0+incompatible gotest.tools v2.2.0+incompatible
) )

2
go.sum
View File

@ -389,6 +389,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/gorm v1.25.0 h1:+KtYtb2roDz14EQe4bla8CbQlmb9dN3VejSai3lprfU= gorm.io/gorm v1.25.0 h1:+KtYtb2roDz14EQe4bla8CbQlmb9dN3VejSai3lprfU=
gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
modernc.org/libc v1.22.4 h1:wymSbZb0AlrjdAVX3cjreCHTPCpPARbQXNz6BHPzdwQ= modernc.org/libc v1.22.4 h1:wymSbZb0AlrjdAVX3cjreCHTPCpPARbQXNz6BHPzdwQ=

View File

@ -11,7 +11,8 @@
package model package model
type Shares struct { type Shares struct {
ID uint `json:"id"` ID uint `json:"id"`
Anonymous bool `json:"anonymous"` Anonymous bool `json:"anonymous"`
Path string `json:"path"` Path string `json:"path"`
Valid_users []string `json:"valid_users"`
} }

16
model/smb_users.go Normal file
View File

@ -0,0 +1,16 @@
/*
* @Author: Drew Fitzgerald/Sheep26 drew@sheepland.xyz
* @Date: 2024-12-03
* @LastEditors: Drew Fitzgerald/Sheep26
* @LastEditTime: 2024-12-03
* @FilePath: /CasaOS/service/model/o_smb_users.go
* @Website: https://www.casaos.io
* Copyright (c) 2024 by icewhale, All Rights Reserved.
*/
package model
type SMBUsers struct {
Name string "json:name"
Password string "json:password"
}

View File

@ -176,6 +176,12 @@ func InitV1Router() http.Handler {
v1SharesGroup.DELETE("/:id", v1.DeleteSambaShares) v1SharesGroup.DELETE("/:id", v1.DeleteSambaShares)
v1SharesGroup.GET("/status", v1.GetSambaStatus) v1SharesGroup.GET("/status", v1.GetSambaStatus)
} }
v1SharesGroup = v1SambaGroup.Group("/shares")
v1SharesGroup.Use()
{
v1SharesGroup.GET("/list", v1.ListSambaUsers)
v1SharesGroup.POST("/add", v1.AddSambaUser)
}
} }
v1NotifyGroup := v1Group.Group("/notify") v1NotifyGroup := v1Group.Group("/notify")
v1NotifyGroup.Use() v1NotifyGroup.Use()

View File

@ -16,23 +16,6 @@ import (
) )
func ListStorages(ctx echo.Context) error { func ListStorages(ctx echo.Context) error {
// var req model.PageReq
// if err := ctx.Bind(&req); err != nil {
// return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: err.Error()})
// return
// }
// req.Validate()
// logger.Info("ListStorages", zap.Any("req", req))
// storages, total, err := service.MyService.Storage().GetStorages(req.Page, req.PerPage)
// if err != nil {
// return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
// return
// }
// return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: model.PageResp{
// Content: storages,
// Total: total,
// }})
r, err := service.MyService.Storage().GetStorages() r, err := service.MyService.Storage().GetStorages()
if err != nil { if err != nil {
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
@ -58,12 +41,7 @@ func ListStorages(ctx echo.Context) error {
list := []httper.MountPoint{} list := []httper.MountPoint{}
for _, v := range r.MountPoints { for _, v := range r.MountPoints {
list = append(list, httper.MountPoint{ list = append(list, httper.MountPoint(v))
Fs: v.Fs,
Icon: v.Icon,
MountPoint: v.MountPoint,
Name: v.Name,
})
} }
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list}) return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list})

View File

@ -1,12 +1,12 @@
/* /*
* @Author: LinkLeong link@icewhale.com * @Author: LinkLeong link@icewhale.com
* @Date: 2022-07-26 11:08:48 * @Date: 2022-07-26 11:08:48
* @LastEditors: LinkLeong * @LastEditors: Drew Fitzgerald/Sheep26
* @LastEditTime: 2022-08-17 18:25:42 * @LastEditTime: 2024-12-03
* @FilePath: /CasaOS/route/v1/samba.go * @FilePath: /CasaOS/route/v1/samba.go
* @Description: * @Description:
* @Website: https://www.casaos.io * @Website: https://www.casaos.io
* Copyright (c) 2022 by icewhale, All Rights Reserved. * Copyright (c) 2024 by icewhale, All Rights Reserved.
*/ */
package v1 package v1
@ -18,12 +18,14 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/IceWhaleTech/CasaOS-Common/utils/command"
"github.com/IceWhaleTech/CasaOS-Common/utils/logger" "github.com/IceWhaleTech/CasaOS-Common/utils/logger"
"github.com/IceWhaleTech/CasaOS-Common/utils/systemctl" "github.com/IceWhaleTech/CasaOS-Common/utils/systemctl"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/model"
"github.com/IceWhaleTech/CasaOS/pkg/config"
"github.com/IceWhaleTech/CasaOS/pkg/samba" "github.com/IceWhaleTech/CasaOS/pkg/samba"
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
"github.com/IceWhaleTech/CasaOS/pkg/utils/file" "github.com/IceWhaleTech/CasaOS/pkg/utils/file"
@ -58,14 +60,45 @@ func GetSambaSharesList(ctx echo.Context) error {
shareList := []model.Shares{} shareList := []model.Shares{}
for _, v := range shares { for _, v := range shares {
shareList = append(shareList, model.Shares{ shareList = append(shareList, model.Shares{
Anonymous: v.Anonymous, Anonymous: v.Anonymous,
Path: v.Path, Path: v.Path,
ID: v.ID, Valid_users: v.Valid_users,
ID: v.ID,
}) })
} }
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: shareList}) return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: shareList})
} }
func ListSambaUsers(ctx echo.Context) error {
out, err := command.OnlyExec("source " + config.AppInfo.ShellPath + "/helper.sh ;ListSambaUsers ")
if err != nil {
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR)})
}
users := strings.Split(out, "\n")
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: users})
}
func AddSambaUser(ctx echo.Context) error {
users := []model.SMBUsers{}
ctx.Bind(&users)
out, err := command.OnlyExec("source " + config.AppInfo.ShellPath + "/helper.sh ;ListSambaUsers ")
if err != nil {
return ctx.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR)})
}
for _, v := range users {
if !strings.Contains(out, v.Name) {
command.OnlyExec("source " + config.AppInfo.ShellPath + "/helper.sh ;AddSmabaUser " + v.Name + " " + v.Password)
}
}
return ctx.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: users})
}
func PostSambaSharesCreate(ctx echo.Context) error { func PostSambaSharesCreate(ctx echo.Context) error {
shares := []model.Shares{} shares := []model.Shares{}
ctx.Bind(&shares) ctx.Bind(&shares)
@ -85,8 +118,9 @@ func PostSambaSharesCreate(ctx echo.Context) error {
} }
for _, v := range shares { for _, v := range shares {
shareDBModel := model2.SharesDBModel{} shareDBModel := model2.SharesDBModel{}
shareDBModel.Anonymous = true shareDBModel.Anonymous = v.Anonymous
shareDBModel.Path = v.Path shareDBModel.Path = v.Path
shareDBModel.Valid_users = v.Valid_users
shareDBModel.Name = filepath.Base(v.Path) shareDBModel.Name = filepath.Base(v.Path)
os.Chmod(v.Path, 0o777) os.Chmod(v.Path, 0o777)
service.MyService.Shares().CreateShare(shareDBModel) service.MyService.Shares().CreateShare(shareDBModel)

View File

@ -11,12 +11,13 @@
package model package model
type SharesDBModel struct { type SharesDBModel struct {
ID uint `gorm:"column:id;primary_key" json:"id"` ID uint `gorm:"column:id;primary_key" json:"id"`
Anonymous bool `json:"anonymous"` Anonymous bool `json:"anonymous"`
Path string `json:"path"` Valid_users []string `json:"valid_users"`
Name string `json:"name"` Path string `json:"path"`
Updated int64 `gorm:"autoUpdateTime"` Name string `json:"name"`
Created int64 `gorm:"autoCreateTime"` Updated int64 `gorm:"autoUpdateTime"`
Created int64 `gorm:"autoCreateTime"`
} }
func (p *SharesDBModel) TableName() string { func (p *SharesDBModel) TableName() string {

View File

@ -71,7 +71,7 @@ func (s *sharesStruct) DeleteShare(id string) {
func (s *sharesStruct) UpdateConfigFile() { func (s *sharesStruct) UpdateConfigFile() {
shares := []model2.SharesDBModel{} shares := []model2.SharesDBModel{}
s.db.Select("anonymous,path").Find(&shares) s.db.Select("anonymous,path,valid_users").Find(&shares)
// generated config file // generated config file
configStr := "" configStr := ""
for _, share := range shares { for _, share := range shares {
@ -79,16 +79,40 @@ func (s *sharesStruct) UpdateConfigFile() {
configStr += ` configStr += `
[` + dirName + `] [` + dirName + `]
comment = CasaOS share ` + dirName + ` comment = CasaOS share ` + dirName + `
public = Yes public = ` + func() string {
if share.Anonymous {
return "Yes"
}
return "No"
}() + `
path = ` + share.Path + ` path = ` + share.Path + `
browseable = Yes browseable = Yes
read only = No read only = No
guest ok = Yes guest ok = ` + func() string {
if share.Anonymous {
return "Yes"
}
return "No"
}() + `
create mask = 0777 create mask = 0777
directory mask = 0777 directory mask = 0777
force user = root ` + func() string {
if share.Anonymous {
return `force user = root
` `
}
return `#force user = root
`
}() + func() string {
if !share.Anonymous && len(share.Valid_users) > 0 {
users := `valid users =`
for _, user := range share.Valid_users {
users += " " + user
}
return users + "\n"
}
return ""
}()
} }
// write config file // write config file
file.WriteToPath([]byte(configStr), "/etc/samba", "smb.casa.conf") file.WriteToPath([]byte(configStr), "/etc/samba", "smb.casa.conf")