Skip to content

Commit 8a12c2a

Browse files
csoni111cpg
authored andcommitted
Disable auth check to support older clients (#10)
* disabled auth to support older clients * bypass auth if admin user (no auth header supplied) * send 400 on malformed json
1 parent e89ce88 commit 8a12c2a

2 files changed

Lines changed: 74 additions & 36 deletions

File tree

src/fs/auth.go

Lines changed: 67 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,41 @@ func use(h http.HandlerFunc, middleware ...func(http.HandlerFunc) http.HandlerFu
1515
return h
1616
}
1717

18+
func isAdmin(r *http.Request) bool {
19+
// if Authorization header is not present, this is admin user
20+
authToken := r.Header.Get("Authorization")
21+
return authToken == ""
22+
}
23+
1824
func (service *MercuryFsService) authenticate(writer http.ResponseWriter, request *http.Request) {
25+
// decode and parse json request body
26+
defer request.Body.Close()
1927
decoder := json.NewDecoder(request.Body)
2028
data := make(map[string]interface{})
2129
err := decoder.Decode(&data)
2230
if err != nil {
23-
panic(err)
31+
writer.WriteHeader(http.StatusBadRequest)
32+
return
2433
}
25-
defer request.Body.Close()
34+
// read pin from the json body
2635
pin, ok := data["pin"].(string)
2736
if !ok {
28-
// pin is not a string
37+
// pin is not a string, send 400 Bad Request
2938
writer.WriteHeader(http.StatusBadRequest)
3039
return
3140
}
41+
// query user for the given pin from the list of all users
3242
authToken, err := service.Users.queryUser(pin)
3343
switch {
34-
case err == sql.ErrNoRows:
44+
case err == sql.ErrNoRows: // if no such user exits, send 401 Unauthorized
3545
log("No user with pin: %s", pin)
3646
http.Error(writer, "Authentication Failed", http.StatusUnauthorized)
3747
break
38-
case err != nil:
48+
case err != nil: // if some other error, send 500 Internal Server Error
3949
http.Error(writer, "Internal Server Error", http.StatusInternalServerError)
4050
log(err.Error())
4151
break
42-
default:
52+
default: // if no error, send proper auth token for that user
4353
respJson := fmt.Sprintf("{\"auth_token\": \"%s\"}", *authToken)
4454
writer.WriteHeader(http.StatusOK)
4555
size := int64(len(respJson))
@@ -58,6 +68,7 @@ func (service *MercuryFsService) logout(w http.ResponseWriter, r *http.Request)
5868
func (service *MercuryFsService) checkAuthHeader(w http.ResponseWriter, r *http.Request) (user *HdaUser) {
5969
authToken := r.Header.Get("Authorization")
6070
user = service.Users.find(authToken)
71+
// if user is nil, respond with 401 Unauthorized
6172
if user == nil {
6273
http.Error(w, "Authentication Failed", http.StatusUnauthorized)
6374
}
@@ -66,47 +77,71 @@ func (service *MercuryFsService) checkAuthHeader(w http.ResponseWriter, r *http.
6677

6778
func (service *MercuryFsService) authMiddleware(pass http.HandlerFunc) http.HandlerFunc {
6879
return func(w http.ResponseWriter, r *http.Request) {
69-
user := service.checkAuthHeader(w, r)
70-
if user != nil {
80+
if isAdmin(r) {
81+
// auth header is not present, pass as this is admin user
7182
pass(w, r)
83+
} else {
84+
// auth header is present, pass only if a user exists for the given auth_token
85+
user := service.checkAuthHeader(w, r)
86+
if user != nil {
87+
pass(w, r)
88+
}
7289
}
7390
}
7491
}
7592

7693
func (service *MercuryFsService) shareReadAccess(pass http.HandlerFunc) http.HandlerFunc {
7794
return func(w http.ResponseWriter, r *http.Request) {
78-
user := service.checkAuthHeader(w, r)
79-
if user == nil {
80-
return
81-
}
82-
shareName := r.URL.Query().Get("s")
83-
if access, err := user.HasReadAccess(shareName); !access {
84-
if err == nil {
85-
http.Error(w, "Access Forbidden", http.StatusForbidden)
86-
} else {
87-
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
95+
if isAdmin(r) {
96+
// auth header is not present, pass as this is admin user
97+
pass(w, r)
98+
} else {
99+
user := service.checkAuthHeader(w, r)
100+
// if user is nil, we have already responded with 401 Unauthorized, so return
101+
if user == nil {
102+
return
88103
}
89-
return
104+
// check for share name, and if the user has read access for it
105+
// if no access, send 403 Forbidden
106+
// else if error, send 500 Internal Server Error
107+
shareName := r.URL.Query().Get("s")
108+
if access, err := user.HasReadAccess(shareName); !access {
109+
if err == nil {
110+
http.Error(w, "Access Forbidden", http.StatusForbidden)
111+
} else {
112+
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
113+
}
114+
return
115+
}
116+
pass(w, r)
90117
}
91-
pass(w, r)
92118
}
93119
}
94120

95121
func (service *MercuryFsService) shareWriteAccess(pass http.HandlerFunc) http.HandlerFunc {
96122
return func(w http.ResponseWriter, r *http.Request) {
97-
user := service.checkAuthHeader(w, r)
98-
if user == nil {
99-
return
100-
}
101-
shareName := r.URL.Query().Get("s")
102-
if access, err := user.HasWriteAccess(shareName); !access {
103-
if err == nil {
104-
http.Error(w, "Access Forbidden", http.StatusForbidden)
105-
} else {
106-
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
123+
if isAdmin(r) {
124+
// auth header is not present, pass as this is admin user
125+
pass(w, r)
126+
} else {
127+
user := service.checkAuthHeader(w, r)
128+
// if user is nil, we have already responded with 401 Unauthorized, so return
129+
if user == nil {
130+
return
107131
}
108-
return
132+
// check for share name, and if the user has write access for it
133+
// if no access, send 403 Forbidden
134+
// else if error, send 500 Internal Server Error
135+
shareName := r.URL.Query().Get("s")
136+
if access, err := user.HasWriteAccess(shareName); !access {
137+
if err == nil {
138+
http.Error(w, "Access Forbidden", http.StatusForbidden)
139+
} else {
140+
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
141+
}
142+
return
143+
}
144+
pass(w, r)
109145
}
110-
pass(w, r)
111146
}
112147
}

src/fs/service.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -273,13 +273,16 @@ func (service *MercuryFsService) serveFile(writer http.ResponseWriter, request *
273273
}
274274

275275
func (service *MercuryFsService) serveShares(writer http.ResponseWriter, request *http.Request) {
276-
user := service.checkAuthHeader(writer, request)
277-
if user == nil {
278-
return
276+
var user *HdaUser
277+
if !isAdmin(request) {
278+
user = service.checkAuthHeader(writer, request)
279+
if user == nil {
280+
return
281+
}
279282
}
280283
var shares []*HdaShare
281284
var err error
282-
if service.Shares.rootDir == "" {
285+
if service.Shares.rootDir == "" && user != nil {
283286
shares, err = user.AvailableShares()
284287
if err != nil {
285288
http.Error(writer, "Internal Server Error", http.StatusInternalServerError)

0 commit comments

Comments
 (0)