permissions_validators.gno

2.78 Kb ยท 126 lines
  1package boards2
  2
  3import (
  4	"errors"
  5	"std"
  6)
  7
  8// validateBoardCreate validates PermissionBoardCreate.
  9//
 10// Expected `args` values:
 11// 1. Caller address
 12// 2. Board name
 13// 3. Board ID
 14// 4. Is board listed
 15func validateBoardCreate(_ Permissions, args Args) error {
 16	caller, ok := args[0].(std.Address)
 17	if !ok {
 18		return errors.New("expected a valid caller address")
 19	}
 20
 21	name, ok := args[1].(string)
 22	if !ok {
 23		return errors.New("expected board name to be a string")
 24	}
 25
 26	if err := checkBoardNameIsNotAddress(name); err != nil {
 27		return err
 28	}
 29
 30	if err := checkBoardNameBelongsToAddress(caller, name); err != nil {
 31		return err
 32	}
 33	return nil
 34}
 35
 36// validateBoardRename validates PermissionBoardRename.
 37//
 38// Expected `args` values:
 39// 1. Caller address
 40// 2. Board ID
 41// 3. Current board name
 42// 4. New board name
 43func validateBoardRename(_ Permissions, args Args) error {
 44	caller, ok := args[0].(std.Address)
 45	if !ok {
 46		return errors.New("expected a valid caller address")
 47	}
 48
 49	newName, ok := args[3].(string)
 50	if !ok {
 51		return errors.New("expected new board name to be a string")
 52	}
 53
 54	if err := checkBoardNameIsNotAddress(newName); err != nil {
 55		return err
 56	}
 57
 58	if err := checkBoardNameBelongsToAddress(caller, newName); err != nil {
 59		return err
 60	}
 61	return nil
 62}
 63
 64// validateMemberInvite validates PermissionMemberInvite.
 65//
 66// Expected `args` values:
 67// 1. Caller address
 68// 2. Board ID
 69// 3. User address
 70// 4. Role
 71func validateMemberInvite(perms Permissions, args Args) error {
 72	caller, ok := args[0].(std.Address)
 73	if !ok {
 74		return errors.New("expected a valid caller address")
 75	}
 76
 77	// Make sure that only owners invite other owners
 78	role, ok := args[3].(Role)
 79	if !ok {
 80		return errors.New("expected a valid new member role")
 81	}
 82
 83	if role == RoleOwner {
 84		if !perms.HasRole(caller, RoleOwner) {
 85			return errors.New("only owners are allowed to invite other owners")
 86		}
 87	}
 88	return nil
 89}
 90
 91// validateRoleChange validates PermissionRoleChange.
 92//
 93// Expected `args` values:
 94// 1. Caller address
 95// 2. Board ID
 96// 3. Member address
 97// 4. Role
 98func validateRoleChange(perms Permissions, args Args) error {
 99	caller, ok := args[0].(std.Address)
100	if !ok {
101		return errors.New("expected a valid caller address")
102	}
103
104	// Owners and Admins can change roles.
105	// Admins should not be able to assign or remove the Owner role from members.
106	if perms.HasRole(caller, RoleAdmin) {
107		role, ok := args[3].(Role)
108		if !ok {
109			return errors.New("expected a valid member role")
110		}
111
112		if role == RoleOwner {
113			return errors.New("admins are not allowed to promote members to Owner")
114		} else {
115			member, ok := args[2].(std.Address)
116			if !ok {
117				return errors.New("expected a valid member address")
118			}
119
120			if perms.HasRole(member, RoleOwner) {
121				return errors.New("admins are not allowed to remove the Owner role")
122			}
123		}
124	}
125	return nil
126}