Search Apps Documentation Source Content File Folder Download Copy Actions Download

permissions_validators_basic.gno

3.69 Kb · 156 lines
  1package boards2
  2
  3import (
  4	"errors"
  5
  6	"gno.land/p/gnoland/boards"
  7
  8	"gno.land/r/sys/users"
  9)
 10
 11// validateBasicBoardCreate validates PermissionBoardCreate.
 12//
 13// Expected `args` values:
 14// 1. Caller address
 15// 2. Board name
 16// 3. Board ID
 17// 4. Is board listed
 18// 5. Is board open
 19func validateBasicBoardCreate(perms boards.Permissions, args boards.Args) error {
 20	caller, ok := args[0].(address)
 21	if !ok {
 22		return errors.New("expected a valid caller address")
 23	}
 24
 25	name, ok := args[1].(string)
 26	if !ok {
 27		return errors.New("expected board name to be a string")
 28	}
 29
 30	open, ok := args[4].(bool)
 31	if !ok {
 32		return errors.New("expected board open flag to be a boolean")
 33	}
 34
 35	if open && !perms.HasRole(caller, RoleOwner) {
 36		return errors.New("only owners can create open boards")
 37	}
 38
 39	if err := checkBoardNameIsNotAddress(name); err != nil {
 40		return err
 41	}
 42
 43	if err := checkBoardNameBelongsToAddress(caller, name); err != nil {
 44		return err
 45	}
 46	return nil
 47}
 48
 49// validateBasicBoardRename validates PermissionBoardRename.
 50//
 51// Expected `args` values:
 52// 1. Caller address
 53// 2. Board ID
 54// 3. Current board name
 55// 4. New board name
 56func validateBasicBoardRename(_ boards.Permissions, args boards.Args) error {
 57	caller, ok := args[0].(address)
 58	if !ok {
 59		return errors.New("expected a valid caller address")
 60	}
 61
 62	newName, ok := args[3].(string)
 63	if !ok {
 64		return errors.New("expected new board name to be a string")
 65	}
 66
 67	if err := checkBoardNameIsNotAddress(newName); err != nil {
 68		return err
 69	}
 70
 71	if err := checkBoardNameBelongsToAddress(caller, newName); err != nil {
 72		return err
 73	}
 74	return nil
 75}
 76
 77// validateBasicMemberInvite validates PermissionMemberInvite.
 78//
 79// Expected `args` values:
 80// 1. Caller address
 81// 2. Board ID
 82// 3. Invites
 83func validateBasicMemberInvite(perms boards.Permissions, args boards.Args) error {
 84	caller, ok := args[0].(address)
 85	if !ok {
 86		return errors.New("expected a valid caller address")
 87	}
 88
 89	invites, ok := args[2].([]Invite)
 90	if !ok {
 91		return errors.New("expected valid user invites")
 92	}
 93
 94	// Make sure that only owners invite other owners
 95	callerIsOwner := perms.HasRole(caller, RoleOwner)
 96	for _, v := range invites {
 97		if v.Role == RoleOwner && !callerIsOwner {
 98			return errors.New("only owners are allowed to invite other owners")
 99		}
100	}
101	return nil
102}
103
104// validateBasicRoleChange validates PermissionRoleChange.
105//
106// Expected `args` values:
107// 1. Caller address
108// 2. Board ID
109// 3. Member address
110// 4. Role
111func validateBasicRoleChange(perms boards.Permissions, args boards.Args) error {
112	caller, ok := args[0].(address)
113	if !ok {
114		return errors.New("expected a valid caller address")
115	}
116
117	// Owners and Admins can change roles.
118	// Admins should not be able to assign or remove the Owner role from members.
119	if perms.HasRole(caller, RoleAdmin) {
120		role, ok := args[3].(boards.Role)
121		if !ok {
122			return errors.New("expected a valid member role")
123		}
124
125		if role == RoleOwner {
126			return errors.New("admins are not allowed to promote members to Owner")
127		} else {
128			member, ok := args[2].(address)
129			if !ok {
130				return errors.New("expected a valid member address")
131			}
132
133			if perms.HasRole(member, RoleOwner) {
134				return errors.New("admins are not allowed to remove the Owner role")
135			}
136		}
137	}
138	return nil
139}
140
141func checkBoardNameIsNotAddress(s string) error {
142	if address(s).IsValid() {
143		return errors.New("addresses are not allowed as board name")
144	}
145	return nil
146}
147
148func checkBoardNameBelongsToAddress(owner address, name string) error {
149	// When the board name is the name of a registered user
150	// check that caller is the owner of the name.
151	user, _ := users.ResolveName(name)
152	if user != nil && user.Addr() != owner {
153		return errors.New("board name is a user name registered to a different user")
154	}
155	return nil
156}