public_lock.gno

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