forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

spindle: rework ownership state

ownership is reset upon boot based on config.


Signed-off-by: oppiliappan <me@oppi.li>

oppi.li fce55b57 2975e4bd

verified
Changed files
+28 -10
appview
nix
spindle
+4 -1
appview/state/spindlestream.go
···
)
func Spindlestream(ctx context.Context, c *config.Config, d *db.DB, enforcer *rbac.Enforcer) (*ec.Consumer, error) {
-
spindles, err := db.GetSpindles(d)
+
spindles, err := db.GetSpindles(
+
d,
+
db.FilterIsNot("verified", "null"),
+
)
if err != nil {
return nil, err
}
+1 -1
nix/vm.nix
···
g = config.services.tangled-knot.gitUser;
in [
"d /var/lib/knot 0770 ${u} ${g} - -" # Create the directory first
-
"f+ /var/lib/knot/secret 0660 ${u} ${g} - KNOT_SERVER_SECRET=7387221d57e64499b179a9dff19c5f1abf436470e2976d3585badddad5282970"
+
"f+ /var/lib/knot/secret 0660 ${u} ${g} - KNOT_SERVER_SECRET=168c426fa6d9829fcbe85c96bdf144e800fb9737d6ca87f21acc543b1aa3e440"
];
services.tangled-knot = {
enable = true;
+23 -8
spindle/server.go
···
func (s *Spindle) configureOwner() error {
cfgOwner := s.cfg.Server.Owner
-
serverOwner, err := s.e.GetUserByRole("server:owner", rbacDomain)
+
+
existing, err := s.e.GetSpindleUsersByRole("server:owner", rbacDomain)
if err != nil {
-
return fmt.Errorf("failed to fetch server:owner: %w", err)
+
return err
}
-
if len(serverOwner) == 0 {
-
s.e.AddKnotOwner(rbacDomain, cfgOwner)
-
} else {
-
if serverOwner[0] != cfgOwner {
-
return fmt.Errorf("server owner mismatch: %s != %s", cfgOwner, serverOwner[0])
+
switch len(existing) {
+
case 0:
+
// no owner configured, continue
+
case 1:
+
// find existing owner
+
existingOwner := existing[0]
+
+
// no ownership change, this is okay
+
if existingOwner == s.cfg.Server.Owner {
+
break
+
}
+
+
// remove existing owner
+
err = s.e.RemoveSpindleOwner(rbacDomain, existingOwner)
+
if err != nil {
+
return nil
}
+
default:
+
return fmt.Errorf("more than one owner in DB, try deleting %q and starting over", s.cfg.Server.DBPath)
}
-
return nil
+
+
return s.e.AddSpindleOwner(rbacDomain, cfgOwner)
}