@@ -23,25 +23,51 @@ func (p *Permission) IsAdmin() bool {
2323
2424// HasAccess returns true if the current user has at least read access to any unit of this repository
2525func (p * Permission ) HasAccess () bool {
26+ for _ , u := range p .Units {
27+ if u .AllowAnonymous {
28+ return true
29+ }
30+ }
31+
2632 if p .UnitsMode == nil {
2733 return p .AccessMode >= AccessModeRead
2834 }
2935 return len (p .UnitsMode ) > 0
3036}
3137
32- // UnitAccessMode returns current user accessmode to the specify unit of the repository
38+ // UnitAccessMode returns the unit's minial accessmode to be accessed
3339func (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
3845 }
46+ found = true
47+ }
48+ }
49+
50+ if p .UnitsMode == nil {
51+ if found {
52+ return p .AccessMode
3953 }
4054 return AccessModeNone
4155 }
4256 return p .UnitsMode [unitType ]
4357}
4458
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+
4571// CanAccess returns true if user has mode access to the unit of the repository
4672func (p * Permission ) CanAccess (mode AccessMode , unitType UnitType ) bool {
4773 return p .UnitAccessMode (unitType ) >= mode
@@ -96,22 +122,19 @@ func GetUserRepoPermission(repo *Repository, user *User) (Permission, error) {
96122}
97123
98124func 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
106126 if err = repo .getUnits (e ); err != nil {
107127 return
108128 }
109-
110129 perm .Units = repo .Units
111130
112- // anonymous visit public repo
131+ // for anonymous user
113132 if user == nil {
114- perm .AccessMode = AccessModeRead
133+ if repo .IsPrivate {
134+ perm .AccessMode = AccessModeNone
135+ } else {
136+ perm .AccessMode = AccessModeRead
137+ }
115138 return
116139 }
117140
0 commit comments