@@ -295,22 +295,6 @@ long jwt_hash_str_find_long(zval *arr, char *key)
295
295
return 0 ;
296
296
}
297
297
298
- /* hash find zend_array */
299
- zend_array * jwt_hash_str_find_ht (zval * arr , char * key )
300
- {
301
- zval * zv = zend_hash_str_find (Z_ARRVAL_P (arr ), key , strlen (key ));
302
-
303
- if (zv != NULL ) {
304
- if (Z_TYPE_P (zv ) == IS_ARRAY ) {
305
- return Z_ARRVAL_P (zv );
306
- } else {
307
- php_error_docref (NULL , E_WARNING , "%s type must be array" , key );
308
- }
309
- }
310
-
311
- return NULL ;
312
- }
313
-
314
298
/* verify string claims */
315
299
int jwt_verify_claims_str (zval * arr , char * key , char * str )
316
300
{
@@ -362,57 +346,64 @@ int jwt_verify_body(char *body, zval *return_value)
362
346
php_json_decode_ex (return_value , ZSTR_VAL (vs ), ZSTR_LEN (vs ), PHP_JSON_OBJECT_AS_ARRAY , 512 );
363
347
zend_string_free (vs );
364
348
349
+ #define FORMAT_CEX_TIME (t , cex ) do { \
350
+ struct tm *timeinfo; \
351
+ char buf[128]; \
352
+ timeinfo = localtime(&t); \
353
+ strftime(buf, sizeof(buf), "Cannot handle token prior to %Y-%m-%d %H:%M:%S", timeinfo); \
354
+ ce = cex; \
355
+ err_msg = buf; \
356
+ } while(0);
357
+
358
+ #define FORMAT_CEX_MSG (msg , cex ) do { \
359
+ ce = cex; \
360
+ err_msg = msg; \
361
+ } while(0);
362
+
365
363
/* Expiration */
366
- if (JWT_G (expiration ) && (curr_time - JWT_G (leeway )) >= JWT_G (expiration )) {
367
- ce = jwt_expired_signature_cex ;
368
- err_msg = "Expired token" ;
369
- }
364
+ if (JWT_G (expiration ) && (curr_time - JWT_G (leeway )) >= JWT_G (expiration ))
365
+ FORMAT_CEX_MSG ("Expired token" , jwt_expired_signature_cex );
370
366
371
367
/* not before */
372
- if (JWT_G (not_before ) && JWT_G (not_before ) > (curr_time + JWT_G (leeway ))) {
373
- struct tm * timeinfo ;
374
- char buf [128 ];
375
-
376
- timeinfo = localtime (& JWT_G (not_before ));
377
- strftime (buf , sizeof (buf ), "Cannot handle token prior to %Y-%m-%d %H:%M:%S" , timeinfo );
378
- ce = jwt_before_valid_cex ;
379
- err_msg = buf ;
380
- }
368
+ if (JWT_G (not_before ) && JWT_G (not_before ) > (curr_time + JWT_G (leeway )))
369
+ FORMAT_CEX_TIME (JWT_G (not_before ), jwt_before_valid_cex );
381
370
382
371
/* iss */
383
- if (jwt_verify_claims_str (return_value , "iss" , JWT_G (iss ))) {
384
- ce = jwt_invalid_issuer_cex ;
385
- err_msg = "Invalid Issuer" ;
386
- }
372
+ if (jwt_verify_claims_str (return_value , "iss" , JWT_G (iss )))
373
+ FORMAT_CEX_MSG ("Invalid Issuer" , jwt_invalid_issuer_cex );
387
374
388
375
/* iat */
389
376
if (JWT_G (iat ) && JWT_G (iat ) > (curr_time + JWT_G (leeway ))) {
390
- struct tm * timeinfo ;
391
- char buf [128 ];
392
-
393
- timeinfo = localtime (& JWT_G (iat ));
394
- strftime (buf , sizeof (buf ), "Cannot handle token prior to %Y-%m-%d %H:%M:%S" , timeinfo );
395
- ce = jwt_invalid_iat_cex ;
396
- err_msg = buf ;
377
+ FORMAT_CEX_TIME (JWT_G (iat ), jwt_invalid_iat_cex );
397
378
}
398
379
399
380
/* jti */
400
- if (jwt_verify_claims_str (return_value , "jti" , JWT_G (jti ))) {
401
- ce = jwt_invalid_jti_cex ;
402
- err_msg = "Invalid Jti" ;
403
- }
381
+ if (jwt_verify_claims_str (return_value , "jti" , JWT_G (jti )))
382
+ FORMAT_CEX_MSG ("Invalid Jti" , jwt_invalid_jti_cex );
404
383
405
384
/* aud */
406
- if (jwt_array_equals (JWT_G (aud ), jwt_hash_str_find_ht (return_value , "aud" ))) {
407
- ce = jwt_invalid_aud_cex ;
408
- err_msg = "Invalid Aud" ;
385
+ size_t flag = 0 ;
386
+ zval * zv_aud = zend_hash_str_find (Z_ARRVAL_P (return_value ), "aud" , strlen ("aud" ));
387
+
388
+ if (zv_aud && JWT_G (aud )) {
389
+ switch (Z_TYPE_P (zv_aud )) {
390
+ case IS_ARRAY :
391
+ if (jwt_array_equals (Z_ARRVAL_P (JWT_G (aud )), Z_ARRVAL_P (zv_aud ))) flag = 1 ;
392
+ break ;
393
+ case IS_STRING :
394
+ if (strcmp (Z_STRVAL_P (JWT_G (aud )), Z_STRVAL_P (zv_aud ))) flag = 1 ;
395
+ break ;
396
+ default :
397
+ php_error_docref (NULL , E_WARNING , "Aud type must be string or array" );
398
+ break ;
399
+ }
400
+
401
+ if (flag ) FORMAT_CEX_MSG ("Invalid Aud" , jwt_invalid_aud_cex );
409
402
}
410
403
411
404
/* sub */
412
- if (jwt_verify_claims_str (return_value , "sub" , JWT_G (sub ))) {
413
- ce = jwt_invalid_sub_cex ;
414
- err_msg = "Invalid Sub" ;
415
- }
405
+ if (jwt_verify_claims_str (return_value , "sub" , JWT_G (sub )))
406
+ FORMAT_CEX_MSG ("Invalid Sub" , jwt_invalid_sub_cex );
416
407
417
408
if (err_msg ) {
418
409
zend_throw_exception (ce , err_msg , 0 );
@@ -440,7 +431,7 @@ int jwt_parse_options(zval *options)
440
431
JWT_G (leeway ) = jwt_hash_str_find_long (options , "leeway" );
441
432
JWT_G (iss ) = jwt_hash_str_find_str (options , "iss" );
442
433
JWT_G (jti ) = jwt_hash_str_find_str (options , "jti" );
443
- JWT_G (aud ) = jwt_hash_str_find_ht ( options , "aud" );
434
+ JWT_G (aud ) = zend_hash_str_find ( Z_ARRVAL_P ( options ) , "aud" , strlen ( "aud" ) );
444
435
JWT_G (sub ) = jwt_hash_str_find_str (options , "sub" );
445
436
}
446
437
break ;
0 commit comments