@@ -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+
1824func (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)
5868func (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
6778func (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
7693func (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
95121func (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}
0 commit comments