Loading folders/folders.go +54 −27 Original line number Diff line number Diff line Loading @@ -21,11 +21,18 @@ func ValidFolder(folder string) (storage.Folder, error) { if !IsAlphaNum(folder) { return storage.Folder{}, errors.New("folder can only have letters and numbers") } correct := FindFolder(folder) correct, err := FindFolder(folder) if err != nil { return storage.Folder{}, err } if correct.Name == "" { return storage.Folder{}, errors.New("unable to select the folder") } if !IsFolderReadable(correct.Name, this.User.Login) { readable, err := IsFolderReadable(correct.Name, this.User.Login) if err != nil { return storage.Folder{}, err } if !readable { return storage.Folder{}, errors.New("unable to select the folder") } return correct, nil Loading Loading @@ -60,58 +67,78 @@ func ListFolder() ([]storage.ListFolderRow, error) { } // FindFolder finds a folder based on the prefix. func FindFolder(name string) storage.Folder { func FindFolder(name string) (storage.Folder, error) { ctx := storage.Context() folder, _ := this.Q.FindFolderExact(ctx, name) folder, err := this.Q.FindFolderExact(ctx, name) if err != nil && !errors.Is(err, sql.ErrNoRows) { return storage.Folder{}, err } if folder.Name != "" { return folder return folder, nil } folder, _ = this.Q.FindFolderPrefix(ctx, sql.NullString{ folder, err = this.Q.FindFolderPrefix(ctx, sql.NullString{ String: name, Valid: true, }) return folder if err != nil && !errors.Is(err, sql.ErrNoRows) { return storage.Folder{}, err } return folder, nil } // IsFolderReadable checks if a user can read messages from a folder. func IsFolderReadable(name, login string) bool { func IsFolderReadable(name, login string) (bool, error) { ctx := storage.Context() admin, _ := this.Q.IsUserAdmin(ctx, login) admin, err := this.Q.IsUserAdmin(ctx, login) if err != nil { return false, err } if admin == 1 { return true return true, nil } found, err := this.Q.IsFolderReadable(ctx, name, login) if err != nil { return false, err } found, _ := this.Q.IsFolderReadable(ctx, name, login) return found == 1 return found == 1, nil } // IsFolderWriteable checks if a user can write messages into a folder. func IsFolderWriteable(name, login string) bool { func IsFolderWriteable(name, login string) (bool, error) { ctx := storage.Context() admin, _ := this.Q.IsUserAdmin(ctx, login) admin, err := this.Q.IsUserAdmin(ctx, login) if err != nil { return false, err } if admin == 1 { return true return true, nil } found, _ := this.Q.IsFolderWriteable(ctx, name, login) return found == 1 found, err := this.Q.IsFolderWriteable(ctx, name, login) if err != nil { return false, err } return found == 1, nil } // IsFolderOwner checks if a user is a folder owner. func IsFolderOwner(folder, login string) bool { func IsFolderOwner(folder, login string) (bool, error) { ctx := storage.Context() admin, _ := this.Q.IsUserAdmin(ctx, login) admin, err := this.Q.IsUserAdmin(ctx, login) if err != nil { return false, err } if admin == 1 { return true return true, nil } found, err := this.Q.IsFolderOwner(ctx, folder, login) if err != nil { return false, err } found, _ := this.Q.IsFolderOwner(ctx, folder, login) return found == 1 return found == 1, nil } // DeleteFolder deletes a folder. func DeleteFolder(name string) error { ctx := storage.Context() err := this.Q.DeleteFolder(ctx, name) if err != nil { return err } return nil return this.Q.DeleteFolder(ctx, name) } repl/folders.go +14 −7 Original line number Diff line number Diff line Loading @@ -128,18 +128,25 @@ func ActionSelect(cmd *dclish.Command) error { if strings.Contains(cmd.Args[0], "%") { return errors.New("folder name cannot contain a %") } folder := folders.FindFolder(cmd.Args[0]) folder, err := folders.FindFolder(cmd.Args[0]) if err != nil { return err } if folder.Name == "" { return errors.New("unable to select the folder") } if folders.IsFolderReadable(folder.Name, this.User.Login) { readable, err := folders.IsFolderReadable(folder.Name, this.User.Login) if err != nil { return err } if !readable { return errors.New("unable to select the folder") } this.Folder = folder this.ReadFirstCall = true fmt.Printf("Folder has been set to '%s'.\n", folder.Name) return nil } return errors.New("unable to select the folder") } // ActionModify handles the `MODIFY` command. This modifies a folder. // Loading repl/messages.go +14 −3 Original line number Diff line number Diff line Loading @@ -32,7 +32,11 @@ func ActionDirectory(cmd *dclish.Command) error { fmt.Println("Folder does not exist.") return nil } if !folders.IsFolderReadable(folder.Name, this.User.Login) { readable, err := folders.IsFolderReadable(folder.Name, this.User.Login) if err != nil { return err } if !readable { fmt.Println("No permission to access folder.") return nil } Loading Loading @@ -350,7 +354,10 @@ func ActionChange(cmd *dclish.Command) error { } } isFolderOwner := folders.IsFolderOwner(this.Folder.Name, this.User.Login) isFolderOwner, err := folders.IsFolderOwner(this.Folder.Name, this.User.Login) if err != nil { return err } for i := range msgids { msg, err := folders.GetMessage(this.User.Login, this.Folder.Name, msgids[i]) if err != nil { Loading Loading @@ -729,7 +736,11 @@ func ActionSearch(cmd *dclish.Command) error { if folder.Name != "" { return fmt.Errorf("folder '%s' not found", optFolders[i]) } if !folders.IsFolderReadable(optFolders[i], this.User.Login) { readable, err := folders.IsFolderReadable(optFolders[i], this.User.Login) if err != nil { return err } if !readable { return fmt.Errorf("folder '%s' is not accessible", optFolders[i]) } } Loading repl/set.go +25 −5 Original line number Diff line number Diff line Loading @@ -21,14 +21,22 @@ func setAlert(cmd *dclish.Command, alert int64) error { folder := this.Folder if cmd.Flags["/FOLDER"].Value != "" { folder = folders.FindFolder(cmd.Flags["/FOLDER"].Value) var err error folder, err = folders.FindFolder(cmd.Flags["/FOLDER"].Value) if err != nil { return err } } if folder.Name == "" { return errors.New("folder does not exist") } if optAll || optPerm { if !folders.IsFolderOwner(folder.Name, this.User.Login) { isOwner, err := folders.IsFolderOwner(folder.Name, this.User.Login) if err != nil { return err } if !isOwner { return errors.New("not an admin or folder owner") } } Loading Loading @@ -58,7 +66,11 @@ func ActionSetNoaccess(cmd *dclish.Command) error { login := cmd.Args[0] folder := this.Folder if len(cmd.Args) == 2 { folder = folders.FindFolder(cmd.Args[1]) var err error folder, err = folders.FindFolder(cmd.Args[1]) if err != nil { return err } if folder.Name == "" { return errors.New("folder not found") } Loading Loading @@ -92,7 +104,11 @@ func ActionSetAccess(cmd *dclish.Command) error { } folder := this.Folder if len(cmd.Args) == 1 { folder = folders.FindFolder(cmd.Args[0]) var err error folder, err = folders.FindFolder(cmd.Args[0]) if err != nil { return err } if folder.Name == "" { return errors.New("folder not found") } Loading @@ -112,7 +128,11 @@ func ActionSetAccess(cmd *dclish.Command) error { login := cmd.Args[0] folder := this.Folder if len(cmd.Args) == 2 { folder = folders.FindFolder(cmd.Args[1]) var err error folder, err = folders.FindFolder(cmd.Args[1]) if err != nil { return err } if folder.Name == "" { return errors.New("folder not found") } Loading repl/show.go +10 −2 Original line number Diff line number Diff line Loading @@ -39,7 +39,11 @@ func ActionShowFlags(_ *dclish.Command) error { func ActionShowFolder(cmd *dclish.Command) error { folder := this.Folder if len(cmd.Args) == 1 { folder = folders.FindFolder(cmd.Args[0]) var err error folder, err = folders.FindFolder(cmd.Args[0]) if err != nil { return err } } if folder.Name == "" { fmt.Println("ERROR: Specified folder was not found.") Loading Loading @@ -133,7 +137,11 @@ func ActionShowUser(cmd *dclish.Command) error { folder := this.Folder if cmd.Flags["/FOLDER"].Set { if cmd.Flags["/FOLDER"].Value != "" { folder = folders.FindFolder(cmd.Flags["/FOLDER"].Value) var err error folder, err = folders.FindFolder(cmd.Flags["/FOLDER"].Value) if err != nil { return err } if folder.Name == "" { fmt.Println("ERROR: Folder does not exist.") return nil Loading Loading
folders/folders.go +54 −27 Original line number Diff line number Diff line Loading @@ -21,11 +21,18 @@ func ValidFolder(folder string) (storage.Folder, error) { if !IsAlphaNum(folder) { return storage.Folder{}, errors.New("folder can only have letters and numbers") } correct := FindFolder(folder) correct, err := FindFolder(folder) if err != nil { return storage.Folder{}, err } if correct.Name == "" { return storage.Folder{}, errors.New("unable to select the folder") } if !IsFolderReadable(correct.Name, this.User.Login) { readable, err := IsFolderReadable(correct.Name, this.User.Login) if err != nil { return storage.Folder{}, err } if !readable { return storage.Folder{}, errors.New("unable to select the folder") } return correct, nil Loading Loading @@ -60,58 +67,78 @@ func ListFolder() ([]storage.ListFolderRow, error) { } // FindFolder finds a folder based on the prefix. func FindFolder(name string) storage.Folder { func FindFolder(name string) (storage.Folder, error) { ctx := storage.Context() folder, _ := this.Q.FindFolderExact(ctx, name) folder, err := this.Q.FindFolderExact(ctx, name) if err != nil && !errors.Is(err, sql.ErrNoRows) { return storage.Folder{}, err } if folder.Name != "" { return folder return folder, nil } folder, _ = this.Q.FindFolderPrefix(ctx, sql.NullString{ folder, err = this.Q.FindFolderPrefix(ctx, sql.NullString{ String: name, Valid: true, }) return folder if err != nil && !errors.Is(err, sql.ErrNoRows) { return storage.Folder{}, err } return folder, nil } // IsFolderReadable checks if a user can read messages from a folder. func IsFolderReadable(name, login string) bool { func IsFolderReadable(name, login string) (bool, error) { ctx := storage.Context() admin, _ := this.Q.IsUserAdmin(ctx, login) admin, err := this.Q.IsUserAdmin(ctx, login) if err != nil { return false, err } if admin == 1 { return true return true, nil } found, err := this.Q.IsFolderReadable(ctx, name, login) if err != nil { return false, err } found, _ := this.Q.IsFolderReadable(ctx, name, login) return found == 1 return found == 1, nil } // IsFolderWriteable checks if a user can write messages into a folder. func IsFolderWriteable(name, login string) bool { func IsFolderWriteable(name, login string) (bool, error) { ctx := storage.Context() admin, _ := this.Q.IsUserAdmin(ctx, login) admin, err := this.Q.IsUserAdmin(ctx, login) if err != nil { return false, err } if admin == 1 { return true return true, nil } found, _ := this.Q.IsFolderWriteable(ctx, name, login) return found == 1 found, err := this.Q.IsFolderWriteable(ctx, name, login) if err != nil { return false, err } return found == 1, nil } // IsFolderOwner checks if a user is a folder owner. func IsFolderOwner(folder, login string) bool { func IsFolderOwner(folder, login string) (bool, error) { ctx := storage.Context() admin, _ := this.Q.IsUserAdmin(ctx, login) admin, err := this.Q.IsUserAdmin(ctx, login) if err != nil { return false, err } if admin == 1 { return true return true, nil } found, err := this.Q.IsFolderOwner(ctx, folder, login) if err != nil { return false, err } found, _ := this.Q.IsFolderOwner(ctx, folder, login) return found == 1 return found == 1, nil } // DeleteFolder deletes a folder. func DeleteFolder(name string) error { ctx := storage.Context() err := this.Q.DeleteFolder(ctx, name) if err != nil { return err } return nil return this.Q.DeleteFolder(ctx, name) }
repl/folders.go +14 −7 Original line number Diff line number Diff line Loading @@ -128,18 +128,25 @@ func ActionSelect(cmd *dclish.Command) error { if strings.Contains(cmd.Args[0], "%") { return errors.New("folder name cannot contain a %") } folder := folders.FindFolder(cmd.Args[0]) folder, err := folders.FindFolder(cmd.Args[0]) if err != nil { return err } if folder.Name == "" { return errors.New("unable to select the folder") } if folders.IsFolderReadable(folder.Name, this.User.Login) { readable, err := folders.IsFolderReadable(folder.Name, this.User.Login) if err != nil { return err } if !readable { return errors.New("unable to select the folder") } this.Folder = folder this.ReadFirstCall = true fmt.Printf("Folder has been set to '%s'.\n", folder.Name) return nil } return errors.New("unable to select the folder") } // ActionModify handles the `MODIFY` command. This modifies a folder. // Loading
repl/messages.go +14 −3 Original line number Diff line number Diff line Loading @@ -32,7 +32,11 @@ func ActionDirectory(cmd *dclish.Command) error { fmt.Println("Folder does not exist.") return nil } if !folders.IsFolderReadable(folder.Name, this.User.Login) { readable, err := folders.IsFolderReadable(folder.Name, this.User.Login) if err != nil { return err } if !readable { fmt.Println("No permission to access folder.") return nil } Loading Loading @@ -350,7 +354,10 @@ func ActionChange(cmd *dclish.Command) error { } } isFolderOwner := folders.IsFolderOwner(this.Folder.Name, this.User.Login) isFolderOwner, err := folders.IsFolderOwner(this.Folder.Name, this.User.Login) if err != nil { return err } for i := range msgids { msg, err := folders.GetMessage(this.User.Login, this.Folder.Name, msgids[i]) if err != nil { Loading Loading @@ -729,7 +736,11 @@ func ActionSearch(cmd *dclish.Command) error { if folder.Name != "" { return fmt.Errorf("folder '%s' not found", optFolders[i]) } if !folders.IsFolderReadable(optFolders[i], this.User.Login) { readable, err := folders.IsFolderReadable(optFolders[i], this.User.Login) if err != nil { return err } if !readable { return fmt.Errorf("folder '%s' is not accessible", optFolders[i]) } } Loading
repl/set.go +25 −5 Original line number Diff line number Diff line Loading @@ -21,14 +21,22 @@ func setAlert(cmd *dclish.Command, alert int64) error { folder := this.Folder if cmd.Flags["/FOLDER"].Value != "" { folder = folders.FindFolder(cmd.Flags["/FOLDER"].Value) var err error folder, err = folders.FindFolder(cmd.Flags["/FOLDER"].Value) if err != nil { return err } } if folder.Name == "" { return errors.New("folder does not exist") } if optAll || optPerm { if !folders.IsFolderOwner(folder.Name, this.User.Login) { isOwner, err := folders.IsFolderOwner(folder.Name, this.User.Login) if err != nil { return err } if !isOwner { return errors.New("not an admin or folder owner") } } Loading Loading @@ -58,7 +66,11 @@ func ActionSetNoaccess(cmd *dclish.Command) error { login := cmd.Args[0] folder := this.Folder if len(cmd.Args) == 2 { folder = folders.FindFolder(cmd.Args[1]) var err error folder, err = folders.FindFolder(cmd.Args[1]) if err != nil { return err } if folder.Name == "" { return errors.New("folder not found") } Loading Loading @@ -92,7 +104,11 @@ func ActionSetAccess(cmd *dclish.Command) error { } folder := this.Folder if len(cmd.Args) == 1 { folder = folders.FindFolder(cmd.Args[0]) var err error folder, err = folders.FindFolder(cmd.Args[0]) if err != nil { return err } if folder.Name == "" { return errors.New("folder not found") } Loading @@ -112,7 +128,11 @@ func ActionSetAccess(cmd *dclish.Command) error { login := cmd.Args[0] folder := this.Folder if len(cmd.Args) == 2 { folder = folders.FindFolder(cmd.Args[1]) var err error folder, err = folders.FindFolder(cmd.Args[1]) if err != nil { return err } if folder.Name == "" { return errors.New("folder not found") } Loading
repl/show.go +10 −2 Original line number Diff line number Diff line Loading @@ -39,7 +39,11 @@ func ActionShowFlags(_ *dclish.Command) error { func ActionShowFolder(cmd *dclish.Command) error { folder := this.Folder if len(cmd.Args) == 1 { folder = folders.FindFolder(cmd.Args[0]) var err error folder, err = folders.FindFolder(cmd.Args[0]) if err != nil { return err } } if folder.Name == "" { fmt.Println("ERROR: Specified folder was not found.") Loading Loading @@ -133,7 +137,11 @@ func ActionShowUser(cmd *dclish.Command) error { folder := this.Folder if cmd.Flags["/FOLDER"].Set { if cmd.Flags["/FOLDER"].Value != "" { folder = folders.FindFolder(cmd.Flags["/FOLDER"].Value) var err error folder, err = folders.FindFolder(cmd.Flags["/FOLDER"].Value) if err != nil { return err } if folder.Name == "" { fmt.Println("ERROR: Folder does not exist.") return nil Loading