@@ -23,25 +23,51 @@ func (p *Permission) IsAdmin() bool {
23
23
24
24
// HasAccess returns true if the current user has at least read access to any unit of this repository
25
25
func (p * Permission ) HasAccess () bool {
26
+ for _ , u := range p .Units {
27
+ if u .AllowAnonymous {
28
+ return true
29
+ }
30
+ }
31
+
26
32
if p .UnitsMode == nil {
27
33
return p .AccessMode >= AccessModeRead
28
34
}
29
35
return len (p .UnitsMode ) > 0
30
36
}
31
37
32
- // UnitAccessMode returns current user accessmode to the specify unit of the repository
38
+ // UnitAccessMode returns the unit's minial accessmode to be accessed
33
39
func (p * Permission ) UnitAccessMode (unitType UnitType ) AccessMode {
34
- if p .UnitsMode == nil {
35
- for _ , u := range p .Units {
36
- if u .Type == unitType {
37
- return p .AccessMode
40
+ var found bool
41
+ for _ , u := range p .Units {
42
+ if u .Type == unitType {
43
+ if u .AllowAnonymous {
44
+ return AccessModeRead
38
45
}
46
+ found = true
47
+ }
48
+ }
49
+
50
+ if p .UnitsMode == nil {
51
+ if found {
52
+ return p .AccessMode
39
53
}
40
54
return AccessModeNone
41
55
}
42
56
return p .UnitsMode [unitType ]
43
57
}
44
58
59
+ // CanAnonymousAccess returns true if anonymous access is enabled
60
+ func (p * Permission ) CanAnonymousAccess (unitType UnitType ) bool {
61
+ for _ , u := range p .Units {
62
+ if u .Type == unitType {
63
+ if u .AllowAnonymous {
64
+ return true
65
+ }
66
+ }
67
+ }
68
+ return false
69
+ }
70
+
45
71
// CanAccess returns true if user has mode access to the unit of the repository
46
72
func (p * Permission ) CanAccess (mode AccessMode , unitType UnitType ) bool {
47
73
return p .UnitAccessMode (unitType ) >= mode
@@ -96,22 +122,19 @@ func GetUserRepoPermission(repo *Repository, user *User) (Permission, error) {
96
122
}
97
123
98
124
func getUserRepoPermission (e Engine , repo * Repository , user * User ) (perm Permission , err error ) {
99
- // anonymous user visit private repo.
100
- // TODO: anonymous user visit public unit of private repo???
101
- if user == nil && repo .IsPrivate {
102
- perm .AccessMode = AccessModeNone
103
- return
104
- }
105
-
125
+ // always load repo unit so that we can read unit's allow_anonymous
106
126
if err = repo .getUnits (e ); err != nil {
107
127
return
108
128
}
109
-
110
129
perm .Units = repo .Units
111
130
112
- // anonymous visit public repo
131
+ // for anonymous user
113
132
if user == nil {
114
- perm .AccessMode = AccessModeRead
133
+ if repo .IsPrivate {
134
+ perm .AccessMode = AccessModeNone
135
+ } else {
136
+ perm .AccessMode = AccessModeRead
137
+ }
115
138
return
116
139
}
117
140
0 commit comments