@@ -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 .GetUserByUsername (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,57 @@ 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 .GetUserByUsername (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
+ emailstr := string (newUser .Email )
104
+ _ , err = h .dao .GetUserByEmail (c .Request .Context (), emailstr )
105
+ if err != dao .ErrUserNotFound {
106
+ c .JSON (http .StatusConflict , gin.H {"error" : "Email already in use" })
107
+ return
108
+ }
109
+
45
110
// Add the user to the database
46
111
var id int64
47
- id , err = h .dao .AddUser (c .Request .Context (), user )
112
+ id , err = h .dao .AddUser (c .Request .Context (), newUser )
48
113
if err != nil {
49
114
c .JSON (http .StatusInternalServerError , gin.H {"error" : "Failed to add user" })
50
115
return
51
116
}
52
- token , err := jwt .GenerateToken (user .Username , * user .Role )
117
+ token , err := jwt .GenerateToken (newUser .Username , * newUser .Role )
53
118
if err != nil {
54
119
c .JSON (http .StatusInternalServerError , gin.H {"error" : err .Error ()})
55
120
return
@@ -61,11 +126,11 @@ func (h *SessionHandlers) Register(c *gin.Context) {
61
126
TokenType : "Bearer" ,
62
127
User : api.UserResponse {
63
128
Id : id ,
64
- Role : api .UserResponseRole (* user .Role ),
65
- Username : user .Username ,
66
- Email : user .Email ,
67
- Name : user .Name ,
68
- Surname : user .Surname ,
129
+ Role : api .UserResponseRole (* newUser .Role ),
130
+ Username : newUser .Username ,
131
+ Email : newUser .Email ,
132
+ Name : newUser .Name ,
133
+ Surname : newUser .Surname ,
69
134
},
70
135
}
71
136
c .JSON (http .StatusCreated , response )
@@ -78,7 +143,7 @@ func (h *SessionHandlers) Login(c *gin.Context) {
78
143
return
79
144
}
80
145
// Check if the user exists
81
- user , err := h .dao .GetUser (c .Request .Context (), session .Username )
146
+ user , err := h .dao .GetUserByUsername (c .Request .Context (), session .Username )
82
147
if err == dao .ErrUserNotFound {
83
148
c .JSON (http .StatusNotFound , gin.H {"error" : "User not found" })
84
149
return
@@ -123,40 +188,14 @@ func (h *SessionHandlers) Login(c *gin.Context) {
123
188
}
124
189
125
190
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" })
191
+ user , userRole , err := getLoggedUser (c , h .dao )
192
+ if err != nil || user == nil {
154
193
return
155
194
}
156
- userRole := api .UserRequestRole (roleStr )
157
195
196
+ // No need to fetch the user again since we already have it
158
197
// return a new token for the authenticated user
159
- token , err := jwt .GenerateToken (usernameStr , userRole )
198
+ token , err := jwt .GenerateToken (user . Username , userRole )
160
199
if err != nil {
161
200
c .JSON (http .StatusInternalServerError , gin.H {"error" : "Failed to generate token" })
162
201
return
@@ -171,7 +210,7 @@ func (h *SessionHandlers) GetSession(c *gin.Context) {
171
210
Email : user .Email ,
172
211
Name : user .Name ,
173
212
Surname : user .Surname ,
174
- Role : api .UserResponseRole (roleStr ),
213
+ Role : api .UserResponseRole (string ( userRole ) ),
175
214
},
176
215
}
177
216
c .JSON (http .StatusOK , sessionResponse )
0 commit comments