public_lock.gno

1.61 Kb ยท 58 lines
 1package boards2
 2
 3import (
 4	"std"
 5	"strconv"
 6)
 7
 8// LockRealm locks the realm making it readonly.
 9//
10// WARNING: Realm can't be unlocked once locked.
11//
12// Realm can also be locked without locking realm members.
13// Realm members can be locked when locking the realm or afterwards.
14// This is relevant for two reasons, one so members can be modified after lock.
15// The other is for realm owners, which can delete threads and comments after lock.
16func LockRealm(_ realm, lockRealmMembers bool) {
17	assertRealmMembersAreNotLocked()
18
19	// If realm members are not being locked assert that realm is no locked.
20	// Members can be locked after locking the realm, in a second `LockRealm` call.
21	if !lockRealmMembers {
22		assertRealmIsNotLocked()
23	}
24
25	caller := std.PreviousRealm().Address()
26	gPerms.WithPermission(cross, caller, PermissionRealmLock, Args{}, func(realm, Args) {
27		gLocked.realm = true
28		gLocked.realmMembers = lockRealmMembers
29
30		std.Emit(
31			"RealmLocked",
32			"caller", caller.String(),
33			"lockRealmMembers", strconv.FormatBool(lockRealmMembers),
34		)
35	})
36}
37
38// IsRealmLocked checks if boards realm has been locked.
39func IsRealmLocked() bool {
40	return gLocked.realm
41}
42
43// AreRealmMembersLocked checks if realm members has been locked.
44func AreRealmMembersLocked() bool {
45	return gLocked.realmMembers
46}
47
48func assertRealmIsNotLocked() { // TODO: Add filtests for locked realm case to all public functions
49	if gLocked.realm {
50		panic("realm is locked")
51	}
52}
53
54func assertRealmMembersAreNotLocked() { // TODO: Add filtests for locked members case to all public member functions
55	if gLocked.realmMembers {
56		panic("realm and members are locked")
57	}
58}