@@ -2,6 +2,7 @@ package handlers
2
2
3
3
import (
4
4
"OPP/auth/api"
5
+ "OPP/auth/auth"
5
6
"OPP/auth/dao"
6
7
"OPP/auth/jwt"
7
8
"net/http"
@@ -19,6 +20,41 @@ func NewSessionHandler() *SessionHandlers {
19
20
}
20
21
}
21
22
23
+ func getLoggedUser (c * gin.Context , userDao dao.UserDao ) (* api.UserResponse , api.UserRequestRole , error ) {
24
+ curUsername := c .Request .Context ().Value ("username" )
25
+ if curUsername == nil {
26
+ c .JSON (http .StatusUnauthorized , gin.H {"error" : "unauthorized" })
27
+ return nil , "" , nil
28
+ }
29
+ curUsernameStr , ok := curUsername .(string )
30
+ if ! ok {
31
+ c .JSON (http .StatusInternalServerError , gin.H {"error" : "failed to get username" })
32
+ return nil , "" , nil
33
+ }
34
+ user , err := userDao .GetUser (c .Request .Context (), curUsernameStr )
35
+ if err != nil {
36
+ if err == dao .ErrUserNotFound {
37
+ c .JSON (http .StatusNotFound , gin.H {"error" : "User not found" })
38
+ return nil , "" , nil
39
+ }
40
+ c .JSON (http .StatusInternalServerError , gin.H {"error" : "Failed to get user" })
41
+ return nil , "" , err
42
+ }
43
+
44
+ curRole := c .Request .Context ().Value ("role" )
45
+ if curRole == nil {
46
+ c .JSON (http .StatusUnauthorized , gin.H {"error" : "unauthorized" })
47
+ return nil , "" , nil
48
+ }
49
+ curRoleStr , ok := curRole .(string )
50
+ if ! ok {
51
+ c .JSON (http .StatusInternalServerError , gin.H {"error" : "failed to get role" })
52
+ return nil , "" , nil
53
+ }
54
+ curUserRole := api .UserRequestRole (curRoleStr )
55
+ return user , curUserRole , nil
56
+ }
57
+
22
58
func (h * SessionHandlers ) GetPubKey (c * gin.Context ) {
23
59
if jwt .PublicKeyBase64 == "" {
24
60
c .JSON (http .StatusInternalServerError , gin.H {"error" : "Public key not available" })
@@ -28,28 +64,51 @@ func (h *SessionHandlers) GetPubKey(c *gin.Context) {
28
64
}
29
65
30
66
func (h * SessionHandlers ) Register (c * gin.Context ) {
31
- user := api.UserRequest {}
32
- if err := c .ShouldBindJSON (& user ); err != nil {
67
+ newUser := api.UserRequest {}
68
+ if err := c .ShouldBindJSON (& newUser ); err != nil {
33
69
c .JSON (http .StatusBadRequest , gin.H {"error" : "Invalid request body" })
34
70
return
35
71
}
36
- if * user .Role == api .UserRequestRoleAdmin || * user .Role == api .UserRequestRoleController {
37
- c .JSON (http .StatusForbidden , gin.H {"error" : "Cannot register as" + * user .Role + ", permission denied" })
72
+
73
+ // Default to creating a normal user if role is not specified
74
+ if newUser .Role == nil {
75
+ defaultRole := api .UserRequestRoleDriver
76
+ newUser .Role = & defaultRole
77
+ }
78
+
79
+ // If registering as an admin or controller, verify permissions
80
+ if * newUser .Role == api .UserRequestRoleAdmin || * newUser .Role == api .UserRequestRoleController {
81
+ // Check if the current user is authenticated with admin privileges
82
+ _ , role , err := auth .AuthenticationFunc (c .GetHeader ("Authorization" ))
83
+ if err != nil {
84
+ c .JSON (http .StatusUnauthorized , gin.H {"error" : "Authentication failed: " + err .Error ()})
85
+ return
86
+ }
87
+
88
+ // Check if the user has admin privileges
89
+ if role != api .UserRequestRoleAdmin {
90
+ c .JSON (http .StatusForbidden , gin.H {"error" : "Admin privileges required to register " + string (* newUser .Role ) + " accounts" })
91
+ return
92
+ }
38
93
}
94
+
95
+ // For regular users, allow unauthenticated registration
96
+
39
97
// Check if the user already exists
40
- _ , err := h .dao .GetUser (c .Request .Context (), user .Username )
98
+ _ , err := h .dao .GetUser (c .Request .Context (), newUser .Username )
41
99
if err != dao .ErrUserNotFound {
42
100
c .JSON (http .StatusConflict , gin.H {"error" : "User already exists" })
43
101
return
44
102
}
103
+
45
104
// Add the user to the database
46
105
var id int64
47
- id , err = h .dao .AddUser (c .Request .Context (), user )
106
+ id , err = h .dao .AddUser (c .Request .Context (), newUser )
48
107
if err != nil {
49
108
c .JSON (http .StatusInternalServerError , gin.H {"error" : "Failed to add user" })
50
109
return
51
110
}
52
- token , err := jwt .GenerateToken (user .Username , * user .Role )
111
+ token , err := jwt .GenerateToken (newUser .Username , * newUser .Role )
53
112
if err != nil {
54
113
c .JSON (http .StatusInternalServerError , gin.H {"error" : err .Error ()})
55
114
return
@@ -61,11 +120,11 @@ func (h *SessionHandlers) Register(c *gin.Context) {
61
120
TokenType : "Bearer" ,
62
121
User : api.UserResponse {
63
122
Id : id ,
64
- Role : api .UserResponseRole (* user .Role ),
65
- Username : user .Username ,
66
- Email : user .Email ,
67
- Name : user .Name ,
68
- Surname : user .Surname ,
123
+ Role : api .UserResponseRole (* newUser .Role ),
124
+ Username : newUser .Username ,
125
+ Email : newUser .Email ,
126
+ Name : newUser .Name ,
127
+ Surname : newUser .Surname ,
69
128
},
70
129
}
71
130
c .JSON (http .StatusCreated , response )
@@ -123,40 +182,14 @@ func (h *SessionHandlers) Login(c *gin.Context) {
123
182
}
124
183
125
184
func (h * SessionHandlers ) GetSession (c * gin.Context ) {
126
- username := c .Request .Context ().Value ("username" )
127
- if username == nil {
128
- c .JSON (http .StatusUnauthorized , gin.H {"error" : "unauthorized" })
129
- return
130
- }
131
- usernameStr , ok := username .(string )
132
- if ! ok {
133
- c .JSON (http .StatusInternalServerError , gin.H {"error" : "failed to get username" })
134
- return
135
- }
136
- user , err := h .dao .GetUser (c .Request .Context (), usernameStr )
137
- if err != nil {
138
- if err == dao .ErrUserNotFound {
139
- c .JSON (http .StatusNotFound , gin.H {"error" : "User not found" })
140
- return
141
- }
142
- c .JSON (http .StatusInternalServerError , gin.H {"error" : "Failed to get user" })
143
- return
144
- }
145
-
146
- role := c .Request .Context ().Value ("role" )
147
- if role == nil {
148
- c .JSON (http .StatusUnauthorized , gin.H {"error" : "unauthorized" })
149
- return
150
- }
151
- roleStr , ok := role .(string )
152
- if ! ok {
153
- c .JSON (http .StatusInternalServerError , gin.H {"error" : "failed to get role" })
185
+ user , userRole , err := getLoggedUser (c , h .dao )
186
+ if err != nil || user == nil {
154
187
return
155
188
}
156
- userRole := api .UserRequestRole (roleStr )
157
189
190
+ // No need to fetch the user again since we already have it
158
191
// return a new token for the authenticated user
159
- token , err := jwt .GenerateToken (usernameStr , userRole )
192
+ token , err := jwt .GenerateToken (user . Username , userRole )
160
193
if err != nil {
161
194
c .JSON (http .StatusInternalServerError , gin.H {"error" : "Failed to generate token" })
162
195
return
@@ -171,7 +204,7 @@ func (h *SessionHandlers) GetSession(c *gin.Context) {
171
204
Email : user .Email ,
172
205
Name : user .Name ,
173
206
Surname : user .Surname ,
174
- Role : api .UserResponseRole (roleStr ),
207
+ Role : api .UserResponseRole (string ( userRole ) ),
175
208
},
176
209
}
177
210
c .JSON (http .StatusOK , sessionResponse )
0 commit comments