@@ -73,7 +73,7 @@ void handle_login(nng_aio *aio)
73
73
char * token = NULL ;
74
74
char * result = NULL ;
75
75
76
- int ret = neu_jwt_new (& token );
76
+ int ret = neu_jwt_new (& token , req -> name );
77
77
if (ret != 0 ) {
78
78
NEU_JSON_RESPONSE_ERROR (NEU_ERR_NEED_TOKEN , {
79
79
neu_http_response (aio , error_code .error , result_error );
@@ -99,6 +99,233 @@ void handle_login(nng_aio *aio)
99
99
})
100
100
}
101
101
102
+ void handle_get_user (nng_aio * aio )
103
+ {
104
+ char current_user [NEU_USER_NAME_MAX_LEN + 1 ] = { 0 };
105
+ NEU_VALIDATE_JWT_WITH_USER (aio , current_user );
106
+
107
+ UT_icd icd = { sizeof (neu_json_user_resp_t ), NULL , NULL , NULL };
108
+ UT_array * user_list = NULL ;
109
+ utarray_new (user_list , & icd );
110
+
111
+ UT_array * user_infos = neu_user_list ();
112
+ utarray_foreach (user_infos , neu_persist_user_info_t * , p_info )
113
+ {
114
+ neu_json_user_resp_t resp = { 0 };
115
+ strcpy (resp .name , p_info -> name );
116
+ utarray_push_back (user_list , & resp );
117
+ }
118
+ utarray_free (user_infos );
119
+
120
+ char * result = NULL ;
121
+ neu_json_encode_by_fn (user_list , neu_json_encode_user_list_resp , & result );
122
+ neu_http_ok (aio , result );
123
+ free (result );
124
+ utarray_free (user_list );
125
+ }
126
+
127
+ void handle_add_user (nng_aio * aio )
128
+ {
129
+ char current_user [NEU_USER_NAME_MAX_LEN + 1 ] = { 0 };
130
+ NEU_VALIDATE_JWT_WITH_USER (aio , current_user );
131
+ NEU_PROCESS_HTTP_REQUEST (
132
+ aio , neu_json_add_user_req_t , neu_json_decode_add_user_req , {
133
+ // user name length check
134
+ int name_len = strlen (req -> name );
135
+ if (name_len < NEU_USER_NAME_MIN_LEN ||
136
+ name_len > NEU_USER_NAME_MAX_LEN ) {
137
+ nlog_error ("user name too short or too long" );
138
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_INVALID_USER_LEN , {
139
+ neu_http_response (aio , error_code .error , result_error );
140
+ });
141
+ return ;
142
+ }
143
+
144
+ // user password length check
145
+ int pass_len = strlen (req -> pass );
146
+ if (pass_len < NEU_USER_PASSWORD_MIN_LEN ||
147
+ pass_len > NEU_USER_PASSWORD_MAX_LEN ) {
148
+ nlog_error ("user `%s` password too short or too long" ,
149
+ req -> name );
150
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_INVALID_PASSWORD_LEN , {
151
+ neu_http_response (aio , error_code .error , result_error );
152
+ });
153
+ return ;
154
+ }
155
+
156
+ // only admin can add user
157
+ if (0 != strcmp (req -> name , "admin" )) {
158
+ nlog_error ("only admin can add user" );
159
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_USER_NO_PERMISSION , {
160
+ neu_http_response (aio , error_code .error , result_error );
161
+ });
162
+ return ;
163
+ }
164
+
165
+ // user already exists
166
+ neu_user_t * user = neu_load_user (req -> name );
167
+ if (NULL != user ) {
168
+ nlog_error ("user `%s` already exists" , req -> name );
169
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_USER_ALREADY_EXISTS , {
170
+ neu_http_response (aio , error_code .error , result_error );
171
+ });
172
+
173
+ neu_user_free (user );
174
+ return ;
175
+ }
176
+
177
+ // add user
178
+ if (0 != neu_user_add (req -> name , req -> pass )) {
179
+ nlog_error ("add user `%s` fail" , req -> name );
180
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_EINTERNAL , {
181
+ neu_http_response (aio , error_code .error , result_error );
182
+ });
183
+ return ;
184
+ }
185
+
186
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_SUCCESS , {
187
+ neu_http_response (aio , error_code .error , result_error );
188
+ });
189
+ })
190
+ }
191
+
192
+ void handle_update_user (nng_aio * aio )
193
+ {
194
+ char current_user [NEU_USER_NAME_MAX_LEN + 1 ] = { 0 };
195
+ NEU_VALIDATE_JWT_WITH_USER (aio , current_user );
196
+ NEU_PROCESS_HTTP_REQUEST (
197
+ aio , neu_json_password_req_t , neu_json_decode_update_user_req , {
198
+ // user name length check
199
+ int name_len = strlen (req -> name );
200
+ if (name_len < NEU_USER_NAME_MIN_LEN ||
201
+ name_len > NEU_USER_NAME_MAX_LEN ) {
202
+ nlog_error ("user name too short or too long" );
203
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_INVALID_USER_LEN , {
204
+ neu_http_response (aio , error_code .error , result_error );
205
+ });
206
+ return ;
207
+ }
208
+
209
+ // new password length check
210
+ int new_pass_len = strlen (req -> new_pass );
211
+ if (new_pass_len < NEU_USER_PASSWORD_MIN_LEN ||
212
+ new_pass_len > NEU_USER_PASSWORD_MAX_LEN ) {
213
+ nlog_error ("user `%s` new password too short or too long" ,
214
+ req -> name );
215
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_INVALID_PASSWORD_LEN , {
216
+ neu_http_response (aio , error_code .error , result_error );
217
+ });
218
+ return ;
219
+ }
220
+
221
+ // only admin & current user can update user
222
+ if (0 != strcmp (req -> name , "admin" ) &&
223
+ 0 != strcmp (req -> name , current_user )) {
224
+ nlog_error ("only admin & current user can update user" );
225
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_USER_NO_PERMISSION , {
226
+ neu_http_response (aio , error_code .error , result_error );
227
+ });
228
+ return ;
229
+ }
230
+
231
+ // user not exists
232
+ neu_user_t * user = neu_load_user (req -> name );
233
+ if (NULL == user ) {
234
+ nlog_error ("user `%s` not exists" , req -> name );
235
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_USER_NOT_EXISTS , {
236
+ neu_http_response (aio , error_code .error , result_error );
237
+ });
238
+ return ;
239
+ }
240
+
241
+ // update user password
242
+ int rv = neu_user_update_password (user , req -> new_pass );
243
+ if (0 != rv ) {
244
+ nlog_error ("update user `%s` fail" , req -> name );
245
+ NEU_JSON_RESPONSE_ERROR (rv , {
246
+ neu_http_response (aio , error_code .error , result_error );
247
+ });
248
+
249
+ neu_user_free (user );
250
+ return ;
251
+ }
252
+
253
+ // save user
254
+ rv = neu_save_user (user );
255
+ if (0 != rv ) {
256
+ nlog_error ("update user `%s` fail" , req -> name );
257
+ NEU_JSON_RESPONSE_ERROR (rv , {
258
+ neu_http_response (aio , error_code .error , result_error );
259
+ });
260
+
261
+ neu_user_free (user );
262
+ return ;
263
+ }
264
+
265
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_SUCCESS , {
266
+ neu_http_response (aio , error_code .error , result_error );
267
+ });
268
+
269
+ neu_user_free (user );
270
+ })
271
+ }
272
+
273
+ void handle_delete_user (nng_aio * aio )
274
+ {
275
+ char current_user [NEU_USER_NAME_MAX_LEN + 1 ] = { 0 };
276
+ NEU_VALIDATE_JWT_WITH_USER (aio , current_user );
277
+ NEU_PROCESS_HTTP_REQUEST (
278
+ aio , neu_json_delete_user_req_t , neu_json_decode_delete_user_req , {
279
+ // user name length check
280
+ int name_len = strlen (req -> name );
281
+ if (name_len < NEU_USER_NAME_MIN_LEN ||
282
+ name_len > NEU_USER_NAME_MAX_LEN ) {
283
+ nlog_error ("user name too short or too long" );
284
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_INVALID_USER_LEN , {
285
+ neu_http_response (aio , error_code .error , result_error );
286
+ });
287
+ return ;
288
+ }
289
+
290
+ // only admin can delete user
291
+ if (0 != strcmp (req -> name , "admin" )) {
292
+ nlog_error ("only admin can add user" );
293
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_USER_NO_PERMISSION , {
294
+ neu_http_response (aio , error_code .error , result_error );
295
+ });
296
+ return ;
297
+ }
298
+
299
+ // user not exists
300
+ neu_user_t * user = neu_load_user (req -> name );
301
+ if (NULL == user ) {
302
+ nlog_error ("user `%s` not exists" , req -> name );
303
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_USER_NOT_EXISTS , {
304
+ neu_http_response (aio , error_code .error , result_error );
305
+ });
306
+
307
+ return ;
308
+ }
309
+
310
+ // delete user
311
+ if (0 != neu_user_delete (req -> name )) {
312
+ nlog_error ("delete user `%s` fail" , req -> name );
313
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_EINTERNAL , {
314
+ neu_http_response (aio , error_code .error , result_error );
315
+ });
316
+
317
+ neu_user_free (user );
318
+ return ;
319
+ }
320
+
321
+ NEU_JSON_RESPONSE_ERROR (NEU_ERR_SUCCESS , {
322
+ neu_http_response (aio , error_code .error , result_error );
323
+ });
324
+
325
+ neu_user_free (user );
326
+ })
327
+ }
328
+
102
329
void handle_password (nng_aio * aio )
103
330
{
104
331
NEU_PROCESS_HTTP_REQUEST_VALIDATE_JWT (
0 commit comments