2 | | |
3 | | Before Trac 0.11, it was only possible to define fine-grained permissions checks on the repository browser sub-system. |
4 | | |
5 | | Since 0.11, there's a general mechanism in place that allows custom **permission policy plugins** to grant or deny any action on any kind of Trac resources, even at the level of specific versions of such resources. |
6 | | |
7 | | Note that for Trac 0.12, `authz_policy` has been integrated as an optional module (in `tracopt.perm.authz_policy.*`), so it's installed by default and can simply be activated via the //Plugins// panel in the Trac administration module. |
8 | | |
| 2 | [[PageOutline(2-5, Contents, floated)]] |
| 3 | [[TracGuideToc]] |
| 4 | |
| 5 | There is a general mechanism in place that allows custom **permission policy plugins** to grant or deny any action on any kind of Trac resource, even at the level of specific versions of such resources. |
| 6 | |
| 7 | That mechanism is `authz_policy`, which is an optional module in `tracopt.perm.authz_policy.*`, so it is installed by default. It can be activated via the //Plugins// panel in the Trac administration module. |
31 | | |
32 | | - Install [http://www.voidspace.org.uk/python/configobj.html ConfigObj] (required). |
33 | | - Copy authz_policy.py into your plugins directory. |
34 | | - Put a [http://swapoff.org/files/authzpolicy.conf authzpolicy.conf] file somewhere, preferably on a secured location on the server, not readable for others than the webuser. If the file contains non-ASCII characters, the UTF-8 encoding should be used. |
35 | | - Update your `trac.ini`: |
36 | | 1. modify the [TracIni#trac-section permission_policies] entry in the `[trac]` section |
37 | | {{{ |
| 29 | ==== Configuration ==== |
| 30 | * Install [http://www.voidspace.org.uk/python/configobj.html ConfigObj]. |
| 31 | * Put a [http://swapoff.org/files/authzpolicy.conf authzpolicy.conf] file somewhere, preferably on a secured location on the server, not readable for others than the webuser. If the file contains non-ASCII characters, the UTF-8 encoding should be used. |
| 32 | * Update your `trac.ini`: |
| 33 | 1. modify the [TracIni#trac-section permission_policies] entry in the `[trac]` section: |
| 34 | {{{#!ini |
47 | | 3. enable the single file plugin |
| 44 | 1. enable the plugin through [/admin/general/plugin WebAdmin] or by editing the `[components]` section: |
| 45 | {{{#!ini |
| 46 | [components] |
| 47 | tracopt.perm.authz_policy.* = enabled |
| 48 | }}} |
| 49 | |
| 50 | ==== Usage Notes ==== |
| 51 | |
| 52 | Note the order in which permission policies are specified: policies are implemented in the sequence provided and therefore may override earlier policy specifications. |
| 53 | |
| 54 | A policy will return either `True`, `False` or `None` for a given permission check. `True` is returned if the policy explicitly grants the permission. `False` is returned if the policy explicitly denies the permission. `None` is returned if the policy is unable to either grant or deny the permission. |
| 55 | |
| 56 | NOTE: Only if the return value is `None` will the ''next'' permission policy be consulted. If none of the policies explicitly grants the permission, the final result will be `False`, i.e. permission denied. |
| 57 | |
| 58 | The `authzpolicy.conf` file is a `.ini` style configuration file: |
| 59 | {{{#!ini |
| 60 | [wiki:PrivatePage@*] |
| 61 | john = WIKI_VIEW, !WIKI_MODIFY |
| 62 | jack = WIKI_VIEW |
| 63 | * = |
| 64 | }}} |
| 65 | * Each section of the config is a glob pattern used to match against a Trac resource descriptor. These descriptors are in the form: |
49 | | [components] |
50 | | ... |
51 | | # Trac 0.12 |
52 | | tracopt.perm.authz_policy.* = enabled |
53 | | # for Trac 0.11 use this |
54 | | #authz_policy.* = enabled |
55 | | }}} |
56 | | |
57 | | Note that the order in which permission policies are specified is quite critical, |
58 | | as policies will be examined in the sequence provided. |
59 | | |
60 | | A policy will return either `True`, `False` or `None` for a given permission check. |
61 | | Only if the return value is `None` will the ''next'' permission policy be consulted. |
62 | | If no policy explicitly grants the permission, the final result will be `False` |
63 | | (i.e. no permission). |
| 67 | <realm>:<id>@<version>[/<realm>:<id>@<version> ...] |
| 68 | }}} |
| 69 | |
| 70 | Resources are ordered left to right, from parent to child. If any component is inapplicable, `*` is substituted. If the version pattern is not specified explicitly, all versions (`@*`) is added implicitly. Example: Match the WikiStart page: |
| 71 | {{{#!ini |
| 72 | [wiki:*] |
| 73 | [wiki:WikiStart*] |
| 74 | [wiki:WikiStart@*] |
| 75 | [wiki:WikiStart] |
| 76 | }}} |
| 77 | |
| 78 | Example: Match the attachment `wiki:WikiStart@117/attachment:FOO.JPG@*` on WikiStart: |
| 79 | {{{#!ini |
| 80 | [wiki:*] |
| 81 | [wiki:WikiStart*] |
| 82 | [wiki:WikiStart@*] |
| 83 | [wiki:WikiStart@*/attachment:*] |
| 84 | [wiki:WikiStart@117/attachment:FOO.JPG] |
| 85 | }}} |
| 86 | |
| 87 | * Sections are checked against the current Trac resource descriptor '''IN ORDER''' of appearance in the configuration file. '''ORDER IS CRITICAL'''. |
| 88 | |
| 89 | * Once a section matches, the current username is matched against the keys (usernames) of the section, '''IN ORDER'''. |
| 90 | * If a key (username) is prefixed with a `@`, it is treated as a group. |
| 91 | * If a value (permission) is prefixed with a `!`, the permission is denied rather than granted. |
| 92 | |
| 93 | The username will match any of 'anonymous', 'authenticated', <username> or '*', using normal Trac permission rules. || '''Note:''' Other groups which are created by user (e.g. by 'adding subjects to groups' on web interface page //Admin / Permissions//) cannot be used. See [trac:ticket:5648 #5648] for details about this missing feature. || |
82 | | - All versions of WikiStart will be viewable by everybody (including anonymous) |
83 | | - !PrivatePage will be viewable only by john |
84 | | - other pages will be viewable only by john and jack |
85 | | |
| 112 | * All versions of WikiStart will be viewable by everybody, including anonymous |
| 113 | * !PrivatePage will be viewable only by john |
| 114 | * other pages will be viewable only by john and jack |
| 115 | |
| 116 | Groups: |
| 117 | {{{#!ini |
| 118 | [groups] |
| 119 | admins = john, jack |
| 120 | devs = alice, bob |
| 121 | |
| 122 | [wiki:Dev@*] |
| 123 | @admins = TRAC_ADMIN |
| 124 | @devs = WIKI_VIEW |
| 125 | * = |
| 126 | |
| 127 | [*] |
| 128 | @admins = TRAC_ADMIN |
| 129 | * = |
| 130 | }}} |
| 131 | |
| 132 | Then: |
| 133 | - everything is blocked (whitelist approach), but |
| 134 | - admins get all TRAC_ADMIN everywhere and |
| 135 | - devs can view wiki pages. |
| 136 | |
| 137 | Some repository examples (Browse Source specific): |
| 138 | {{{#!ini |
| 139 | # A single repository: |
| 140 | [repository:test_repo@*] |
| 141 | john = BROWSER_VIEW, FILE_VIEW |
| 142 | # John has BROWSER_VIEW and FILE_VIEW for the entire test_repo |
| 143 | |
| 144 | # The default repository (requires Trac 1.0.2 or later): |
| 145 | [repository:@*] |
| 146 | john = BROWSER_VIEW, FILE_VIEW |
| 147 | # John has BROWSER_VIEW and FILE_VIEW for the entire default repository |
| 148 | |
| 149 | # All repositories: |
| 150 | [repository:*@*] |
| 151 | jack = BROWSER_VIEW, FILE_VIEW |
| 152 | # Jack has BROWSER_VIEW and FILE_VIEW for all repositories |
| 153 | }}} |
| 154 | |
| 155 | Very granular repository access: |
| 156 | {{{#!ini |
| 157 | # John has BROWSER_VIEW and FILE_VIEW access to trunk/src/some/location/ only |
| 158 | [repository:test_repo@*/source:trunk/src/some/location/*@*] |
| 159 | john = BROWSER_VIEW, FILE_VIEW |
| 160 | |
| 161 | # John has BROWSER_VIEW and FILE_VIEW access to only revision 1 of all files at trunk/src/some/location only |
| 162 | [repository:test_repo@*/source:trunk/src/some/location/*@1] |
| 163 | john = BROWSER_VIEW, FILE_VIEW |
| 164 | |
| 165 | # John has BROWSER_VIEW and FILE_VIEW access to all revisions of 'somefile' at trunk/src/some/location only |
| 166 | [repository:test_repo@*/source:trunk/src/some/location/somefile@*] |
| 167 | john = BROWSER_VIEW, FILE_VIEW |
| 168 | |
| 169 | # John has BROWSER_VIEW and FILE_VIEW access to only revision 1 of 'somefile' at trunk/src/some/location only |
| 170 | [repository:test_repo@*/source:trunk/src/some/location/somefile@1] |
| 171 | john = BROWSER_VIEW, FILE_VIEW |
| 172 | }}} |
| 173 | |
| 174 | Note: In order for Timeline to work/visible for John, we must add CHANGESET_VIEW to the above permission list. |
| 175 | |
| 176 | ==== Missing Features ==== |
| 177 | Although possible with the !DefaultPermissionPolicy handling (see Admin panel), fine-grained permissions still miss those grouping features (see [trac:ticket:9573 #9573], [trac:ticket:5648 #5648]). Patches are partially available, see authz_policy.2.patch, part of [trac:ticket:6680 #6680]. |
| 178 | |
| 179 | You cannot do the following: |
| 180 | {{{#!ini |
| 181 | [groups] |
| 182 | team1 = a, b, c |
| 183 | team2 = d, e, f |
| 184 | team3 = g, h, i |
| 185 | departmentA = team1, team2 |
| 186 | }}} |
| 187 | |
| 188 | Permission groups are not supported either, so you cannot do the following: |
| 189 | {{{#!ini |
| 190 | [groups] |
| 191 | permission_level_1 = WIKI_VIEW, TICKET_VIEW |
| 192 | permission_level_2 = permission_level_1, WIKI_MODIFY, TICKET_MODIFY |
| 193 | [*] |
| 194 | @team1 = permission_level_1 |
| 195 | @team2 = permission_level_2 |
| 196 | @team3 = permission_level_2, TICKET_CREATE |
| 197 | }}} |
89 | | At the time of this writing, the old fine grained permissions system from Trac 0.11 and before used for restricting access to the repository has been converted to a permission policy component, but from the user point of view, this makes little if no difference. |
90 | | |
91 | | That kind of fine-grained permission control needs a definition file, which is the one used by Subversion's mod_authz_svn. |
92 | | More information about this file format and about its usage in Subversion is available in the [http://svnbook.red-bean.com/en/1.5/svn.serverconfig.pathbasedauthz.html Path-Based Authorization] section in the Server Configuration chapter of the svn book. |
| 201 | At the time of this writing, the old granular permissions system from Trac 0.11 and before used for restricting access to the repository has been converted to a permission policy component. But from the user's point of view, this makes little if any difference. |
| 202 | |
| 203 | That kind of granular permission control needs a definition file, which is the one used by Subversion's mod_authz_svn. |
| 204 | More information about this file format and about its usage in Subversion is available in the [http://svnbook.red-bean.com/en/1.5/svn.serverconfig.pathbasedauthz.html Path-Based Authorization] section in the Server Configuration chapter of the svn book. |