Commit 754f9d30 authored by Kevin Lyda's avatar Kevin Lyda
Browse files

Fix some more complex bugs

parent 3957fec3
Loading
Loading
Loading
Loading
+54 −27
Original line number Diff line number Diff line
@@ -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
@@ -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)
}
+14 −7
Original line number Diff line number Diff line
@@ -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.
//
+14 −3
Original line number Diff line number Diff line
@@ -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
		}
@@ -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 {
@@ -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])
			}
		}
+25 −5
Original line number Diff line number Diff line
@@ -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")
		}
	}
@@ -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")
		}
@@ -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")
			}
@@ -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")
		}
+10 −2
Original line number Diff line number Diff line
@@ -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.")
@@ -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