summaryrefslogtreecommitdiff
path: root/www/caps/login-groups.md
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-09-04 09:05:24 +0200
committercashmere <cashmere@autistici.org>2026-09-04 09:05:24 +0200
commit4f49b16079b27d7ce633619e4cddfdf2bffbc952 (patch)
treec296c1e7f3c3e2f6859c6d3a1b1b208779b89679 /www/caps/login-groups.md
downloadrelic-master.tar.gz
initial commitHEADmaster
Diffstat (limited to 'www/caps/login-groups.md')
-rw-r--r--www/caps/login-groups.md128
1 files changed, 128 insertions, 0 deletions
diff --git a/www/caps/login-groups.md b/www/caps/login-groups.md
new file mode 100644
index 0000000..7cca2d7
--- /dev/null
+++ b/www/caps/login-groups.md
@@ -0,0 +1,128 @@
+# Login Groups
+
+The Admin → Login-Groups UI feature and its corresponding [`login-group`
+command][lg] solve a common problem with Fossil: you’ve created multiple
+repositories that some subset of users need access to, and you
+don’t want to redundantly administer the user credentials for each
+repository.
+
+
+## Restrictions
+
+This feature ties changes to the “`user`” table in one repo to that in
+one or more other repos, keyed by the user’s name. The interactions are
+non-obvious because although the goal is for the end result to “just
+work,” there are practical security and administration matters that
+complicate things:
+
+1. Login group handling only works between joined repositories for the
+ subset of users with the same name.
+
+1. If you’re logged in on one repo in a group, any other repo in that
+ group that has a matching user record will accept your valid login.
+
+1. When you set up a login group between two repos, the user tables
+ aren’t merged, so even though you may have users that appear in
+ both, they will retain their initial passwords, credentials, and so
+ forth.
+
+1. The same is true after the login group is created: changes you make
+ to the user table in one repo in the group only propagate to the
+ other repos in the group when you check the “Apply changes to all
+ repositories“ box in the “Scope” section of the user edit screen.
+ Otherwise, user changes remain local to the repo you made them on.
+
+1. Login groups only affect [the HTTP interfaces][wo]. Contrast things
+ like `ssh://` clones, where unless you [go out of your way][sh] to
+ force them to run over one of the HTTP interfaces that pays
+ attention to Fossil’s RBAC system, login groups aren’t consulted.
+
+
+## Interactions
+
+These restrictions combine in subtle and interesting ways. Examples:
+
+* **#1 and #2**: If you are logged into repo C as “charlie” and then
+ try to visit joined repo A where “charlie” doesn’t exist, your valid
+ login on C won’t get you into A.
+
+* **#2 and #3**: If “alice” exists in both of these same repos,
+ logging in on A gets her into C, but if she has different user
+ capabilities on each from the time before the two repos joined the
+ login group, her caps on A don’t apply to C, nor vice versa.
+
+ Let us say F is a forum-only repo, and W is a wiki-only repo, and
+ that Alice has forum-posting rights on F and wiki-editing rights on
+ W. If both repos are joined by a login group, Alice can log in on F
+ and then access W without logging in on it separately, but she
+ cannot then post a forum message on W even though she could on F.
+
+* **#3 and #4**: If you change the caps for user “alice” on one repo
+ in a group and tell Fossil to apply the changes to all repos in the
+ group, the new caps will *overwrite* those on the other repos, not
+ merge with them.
+
+ To extend the practical example from the prior point, let us say you
+ wish to grant Alice the “write unversioned” capability on both F and
+ W. If you check that single user cap box on F plus the “apply to
+ all” option, then “Apply Changes,” she will end up with forum +
+ unversioned caps on repo W, losing her wiki-editing caps in the
+ process.
+
+ If you want user caps to differ on each repo, you must administer
+ them separately even if there is a common subset of caps between all
+ repos in the group for that user. Remember: selecting the “apply to
+ all” box calls for an overwrite operation, not a merge.
+
+* **#4 and #1**: If you make a change to an existing user “bob” in
+ repo B and select the “apply to all” option, it will only affect
+ other repos in the group that have a user “bob” configured.
+
+ But, if you are instead creating user “bob” for the first time and
+ select that option, that user *will* be created in all repos. The
+ same is true of user deletion: that destructive action will
+ propagate through the group if you request it.
+
+* **#5 and #1**: If you have a user “daisy” on both repos A and B in a
+ login group, logging in over the web to A doesn’t let you push
+ changes into B over SSH. Without the workaround linked above, SSH
+ only pays attention to the operating system’s user authentication
+ system, not Fossil’s.
+
+ Inversely, if Daisy successfully logs in over SSH to repo B, she
+ gains no access to any of the other repos in that group. She needs
+ at least one valid login over HTTP to one of the group’s repos.
+
+
+## Discussion
+
+The end result of all of this is that you can have a subset of users
+with credentials only on repo A, a different subset only on B, and a
+third subset common to both. The only thing selecting which case applies
+is restriction #1 above.
+
+Login groups have names. A repo can be in only one of these named login
+groups at a time.
+
+Trust in login groups is transitive within a single server. Consider
+this sequence:
+
+ $ cd /path/to/A/checkout
+ $ fossil login-group join --name G ~/museum/B.fossil
+ $ cd /path/to/C/checkout
+ $ fossil login-group join ~/museum/B.fossil
+
+That creates login group G joining repo A to B, then joins C to B.
+Although we didn’t explicitly tie C to A, a successful login on C gets
+you into both A and B, within the restrictions set out above.
+
+Changes are transitive in the same way, provided you check that “apply
+to all” box on the user edit screen.
+
+[lg]: /help/login-group
+[sh]: ../server/any/http-over-ssh.md
+[wo]: ./index.md#webonly
+
+-----
+
+*[Back to Administering User Capabilities](./)*