1
- /*
2
- * Copyright 2011 gitblit.com.
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import com.gitblit.GitBlit
17
- import com.gitblit.models.RepositoryModel
18
- import com.gitblit.models.UserModel
19
-
20
- import org.eclipse.jgit.transport.ReceiveCommand
21
- import org.eclipse.jgit.transport.ReceiveCommand.Result
22
- import org.eclipse.jgit.transport.ReceiveCommand.Type
23
- import org.slf4j.Logger
24
-
25
- /**
26
- * Sample Gitblit Pre-Receive Hook: protect-refs
27
- *
28
- * This script provides basic authorization for receive command types for a list
29
- * of known ref patterns. Command types and unmatched ref patterns will be
30
- * ignored, meaning this script has an "allow by default" policy.
31
- *
32
- * This script works best when a repository requires authentication on push, but
33
- * can be used to enforce fast-forward commits or prohibit ref deletion by
34
- * setting the authorizedTeams variable to an empty list.
35
- *
36
- * The Pre-Receive hook is executed after an incoming push has been parsed,
37
- * validated, and objects have been written but BEFORE the refs are updated.
38
- * This is the appropriate point to block a push for some reason.
39
- *
40
- * This script is only executed when pushing to *Gitblit*, not to other Git
41
- * tooling you may be using.
42
- *
43
- * If this script is specified in *groovy.preReceiveScripts* of gitblit.properties
44
- * or web.xml then it will be executed by any repository when it receives a
45
- * push. If you choose to share your script then you may have to consider
46
- * tailoring control-flow based on repository access restrictions.
47
- *
48
- * Scripts may also be specified per-repository in the repository settings page.
49
- * Shared scripts will be excluded from this list of available scripts.
50
- *
51
- * This script is dynamically reloaded and it is executed within it's own
52
- * exception handler so it will not crash another script nor crash Gitblit.
53
- *
54
- * If you want this hook script to fail and abort all subsequent scripts in the
55
- * chain, "return false" at the appropriate failure points.
56
- *
57
- * Bound Variables:
58
- * gitblit Gitblit Server com.gitblit.GitBlit
59
- * repository Gitblit Repository com.gitblit.models.RepositoryModel
60
- * user Gitblit User com.gitblit.models.UserModel
61
- * commands JGit commands Collection<org.eclipse.jgit.transport.ReceiveCommand>
62
- * url Base url for Gitblit String
63
- * logger Logger instance org.slf4j.Logger
64
- *
65
- */
66
-
67
- def protectedCmds = [ Type . UPDATE_NONFASTFORWARD , Type . DELETE ]
68
- def protectedRefs = [ " refs/heads/master" , " refs/tags/.+" ]
69
- def authorizedTeams = [ " admins" ]
70
- def blocked = false
71
-
72
- for (ReceiveCommand command : commands) {
73
- def updateType = command. type
74
- def updatedRef = command. refName
75
-
76
- // find first regex which matches updated ref
77
- def protectedRef = protectedRefs. find { updatedRef. matches ~it }
78
-
79
- // ...and check if command type requires authz check
80
- if (protectedRef && updateType in protectedCmds) {
81
-
82
- // verify user is a member of any authorized team
83
- def team = authorizedTeams. find { user. isTeamMember it }
84
- if (team) {
85
- logger. info " authorized ${ command} for ${ team} member ${ user.username} "
86
- } else {
87
- command. setResult(Result . REJECTED_OTHER_REASON , " ${ user.username} cannot ${ updateType} protected ref ${ repository.name} :${ updatedRef} (matched pattern ${ protectedRef} )" )
88
- blocked = true
89
- }
90
- }
91
- }
92
-
93
- if (blocked) {
94
- // return false to break the push hook chain
95
- return false
96
- }
1
+ /*
2
+ * Copyright 2012 Philip L. McMahon.
3
+ *
4
+ * Derived from blockpush.groovy, copyright 2011 gitblit.com.
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+ import com.gitblit.GitBlit
19
+ import com.gitblit.models.RepositoryModel
20
+ import com.gitblit.models.UserModel
21
+
22
+ import org.eclipse.jgit.transport.ReceiveCommand
23
+ import org.eclipse.jgit.transport.ReceiveCommand.Result
24
+ import org.slf4j.Logger
25
+
26
+ /**
27
+ * Sample Gitblit Pre-Receive Hook: protect-refs
28
+ *
29
+ * This script provides basic authorization of receive command types for a list
30
+ * of known ref patterns. Command types and unmatched ref patterns will be
31
+ * ignored, meaning this script has an "allow by default" policy.
32
+ *
33
+ * This script works best when a repository requires authentication on push, but
34
+ * can be used to enforce fast-forward commits or prohibit ref deletion by
35
+ * setting the *authorizedTeams* variable to an empty list and adding a ".+"
36
+ * entry to the *protectedRefs* list.
37
+ *
38
+ * The Pre-Receive hook is executed after an incoming push has been parsed,
39
+ * validated, and objects have been written but BEFORE the refs are updated.
40
+ * This is the appropriate point to block a push for some reason.
41
+ *
42
+ * This script is only executed when pushing to *Gitblit*, not to other Git
43
+ * tooling you may be using.
44
+ *
45
+ * If this script is specified in *groovy.preReceiveScripts* of gitblit.properties
46
+ * or web.xml then it will be executed by any repository when it receives a
47
+ * push. If you choose to share your script then you may have to consider
48
+ * tailoring control-flow based on repository access restrictions.
49
+ *
50
+ * Scripts may also be specified per-repository in the repository settings page.
51
+ * Shared scripts will be excluded from this list of available scripts.
52
+ *
53
+ * This script is dynamically reloaded and it is executed within it's own
54
+ * exception handler so it will not crash another script nor crash Gitblit.
55
+ *
56
+ * This script may reject one or more commands, but will never return false.
57
+ * Subsequent scripts, if any, will always be invoked.
58
+ *
59
+ * Bound Variables:
60
+ * gitblit Gitblit Server com.gitblit.GitBlit
61
+ * repository Gitblit Repository com.gitblit.models.RepositoryModel
62
+ * user Gitblit User com.gitblit.models.UserModel
63
+ * commands JGit commands Collection<org.eclipse.jgit.transport.ReceiveCommand>
64
+ * url Base url for Gitblit String
65
+ * logger Logger instance org.slf4j.Logger
66
+ *
67
+ */
68
+
69
+ // map of protected command types to returned results type
70
+ // commands not included will skip authz check
71
+ def protectedCmds = [
72
+ UPDATE_NONFASTFORWARD : Result . REJECTED_NONFASTFORWARD ,
73
+ DELETE : Result . REJECTED_NODELETE
74
+ ]
75
+
76
+ // list of regex patterns for protected refs
77
+ def protectedRefs = [
78
+ " refs/heads/master" ,
79
+ " refs/tags/.+"
80
+ ]
81
+
82
+ // teams which are authorized to perform protected commands on protected refs
83
+ def authorizedTeams = [ " admins" ]
84
+
85
+ for (ReceiveCommand command : commands) {
86
+ def updateType = command. type
87
+ def updatedRef = command. refName
88
+
89
+ // find first regex which matches updated ref, if any
90
+ def refPattern = protectedRefs. find { updatedRef. matches ~it }
91
+
92
+ // find rejection result for update type, if any
93
+ def result = protectedCmds[updateType. name()]
94
+
95
+ // command requires authz if ref is protected and has a mapped rejection result
96
+ if (refPattern && result) {
97
+
98
+ // verify user is a member of any authorized team
99
+ def team = authorizedTeams. find { user. isTeamMember it }
100
+ if (team) {
101
+ // don't adjust command result
102
+ logger. info " ${ user.username} authorized for ${ updateType} of protected ref ${ repository.name} :${ updatedRef} (${ command.oldId.name} -> ${ command.newId.name} )"
103
+ } else {
104
+ // mark command result as rejected
105
+ command. setResult(result, " ${ user.username} cannot ${ updateType} protected ref ${ repository.name} :${ updatedRef} matching pattern ${ refPattern} " )
106
+ }
107
+ }
108
+ }
0 commit comments