
    F/j(                     h   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZmZmZmZ d dlmZ dZ eddd	
      Zdj+                  e      Zdj/                         j1                  d      ZdZdj/                  d      j1                  d      Zd Zd Z G d dej<                        Zy)    N)serialization)patchMock)Vapid01Vapid02VapidException
_check_sub)decodez
MHcCAQEEIPeN1iAipHbt8+/KZ2NIF8NeN24jqAmnMLFZEMocY8RboAoGCCqGSM49
AwEHoUQDQgAEEJwJZq/GN8jJbo1GGpyU70hmP2hbWAUpQFKDByKB81yldJ9GTklB
M5xqEwuPM7VuQcyiLDhvovthPIXx+gsQRQ==
l   [D8(C
s4^C/S~>_kw l   \sER kZ3Ho)9jjtF+l   Et	/QfAnjg<.P9&(Ot% )dxyz7-----BEGIN PRIVATE KEY-----{}-----END PRIVATE KEY-----
z-
943WICKkdu3z78pnY0gXw143biOoCacwsVkQyhxjxFs
utf8z-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEJwJZq/GN8jJbo1GGpyU70hmP2hb
WAUpQFKDByKB81yldJ9GTklBM5xqEwuPM7VuQcyiLDhvovthPIXx+gsQRQ==
-----END PUBLIC KEY-----
WBBCcCWavxjfIyW6NRhqclO9IZj9oW1gFKUBSgwcigfNcpXSfRk5JQTOcahMLjzO1bkHMoiw4b6L7YTyF8foLEEU=c                 H   t        dd      5 }|j                  t               d d d        t        dd      5 }|j                  t               d d d        t        dd      5 }|j                  t               d d d        y # 1 sw Y   ^xY w# 1 sw Y   @xY w# 1 sw Y   y xY w)N/tmp/privatew/tmp/public/tmp/private.der)openwriteTEST_KEY_PRIVATE_PEMTEST_KEY_PUBLIC_PEMTEST_KEY_PRIVATE_DER)selfffs     W/var/www/html/maxservice/venv/lib/python3.12/site-packages/py_vapid/tests/test_vapid.pysetup_moduler   3   s    	nc	" 'b
%&'	mS	! &R
$%&	 #	& '"
%&' '	' '& &' 's"   B B!B B	BB!c                 X    t        j                  d       t        j                  d       y )Nr   r   )osunlink)r   s    r   teardown_moduler"   <   s    IInIIm    c                       e Zd Zd Zd Zd Z ede      d        Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z ed      d        Zd Zy)VapidTestCasec                 l   |j                   j                         j                  t        j	                  d      k(  sJ |j
                  j                         j                  t        j	                  d      k(  sJ |j
                  j                         j                  t        j	                  d      k(  sJ y )Nr   r   r   )	private_keyprivate_numbersprivate_valuekeyget
public_keypublic_numbersr   r   r   vs     r   
check_keyszVapidTestCase.check_keysB   s}    }},,.<<LLL||**,..#''#,>>>||**,..#''#,>>>r#   c                    t        j                  d      }| j                  |       t        j                  t        j                               }| j                  |       t        j                  t        j                               }| j                  |       t        j                  d      }| j                  |       d}t        j                  |       t        j                  j                  |      sJ t        j                  |       y )Nr   r   z/tmp/not_exist)r   	from_filer0   from_pemr   encodefrom_derr   r    pathisfiler!   )r   v1v2v3v4no_exists         r   	test_initzVapidTestCase.test_initG   s    ~.299;<299;<12#(#ww~~h'''
		(r#   c                 *    |dt        |      dz  d  z   S )Nz====   )len)r   datas     r   repadzVapidTestCase.repadU   s    fSY]^,,,r#   zpy_vapid.Vapid01.from_pem)side_effectc                 P    | j                  t        t        j                  d       y )Nr   )private_key_file)assertRaises	Exceptionr   r2   )r   mms     r   test_init_bad_readz VapidTestCase.test_init_bad_readX   s#    )!+++9 	 	;r#   c                 p    t               }|j                          |j                  sJ |j                  sJ y N)r   generate_keysr,   r'   r.   s     r   test_gen_keyzVapidTestCase.test_gen_key^   s+    I	|||}}}r#   c                 L    t               | j                  t        fd       y )Nc                       j                   S rK   )r'   )r/   s   r   <lambda>z0VapidTestCase.test_private_key.<locals>.<lambda>g   s    !-- r#   )r   rF   r   r.   s    @r   test_private_keyzVapidTestCase.test_private_keyd   s    I./	1r#   c                 P    t               }|j                  J |j                  J y rK   )r   _private_key_public_keyr.   s     r   test_public_keyzVapidTestCase.test_public_keyi   s)    I~~%%%}}$$$r#   c                     t               }|j                          |j                  d       t        j                  d       y Nz/tmp/p2)r   rL   save_keyr    r!   r.   s     r   test_save_keyzVapidTestCase.test_save_keyn   s+    I		

9
		)r#   c                     t               }|j                          |j                  d       t        j                  d       y rW   )r   rL   save_public_keyr    r!   r.   s     r   test_same_public_keyz"VapidTestCase.test_same_public_keyt   s-    I		)$
		)r#   c                 X    t        j                  t              }| j                  |       y rK   )r   from_rawTEST_KEY_PRIVATE_RAWr0   r.   s     r   test_from_rawzVapidTestCase.test_from_rawz   s    12r#   c                     t        j                  t              }t        j                  t        j	                               }| j                  |       | j                  |       y rK   )r   from_stringr   r_   r
   r0   )r   r8   r9   s      r   test_from_stringzVapidTestCase.test_from_string~   sE      !56  !5!<!<!>?r#   c                 
   t        j                  t              }ddd}|j                  |d      }|d   dt        j                  d      z   k(  sJ t        j                  |j                  j                  t        j                  j                  t        j                  j                              j                  d      j                  dd	      j                  d
d      j!                         }t        |d   j#                  d      d   |      }|D ]  }||   ||   k(  rJ  |j                  |      }|d   dt        j                  d      z   k(  sJ t        j$                  |d   j#                  d      d   |d         sJ y )Nhttps://example.commailto:admin@example.com)audsubid=previousz
Crypto-Keyzid=previous;p256ecdsa=r   +-/_Authorization    z
p256ecdsa=r   r*   auth)r   rb   r   signTEST_KEY_PUBLIC_RAWr
   binascii
b2a_base64r,   public_bytesr   EncodingX962PublicFormatUncompressedPointreplacestripsplitverify)r   r/   claimsresultpkeyitemsks          r   test_sign_01zVapidTestCase.test_sign_01   s    45.35.l#$':'A'A&'IIK 	K K""LL%%&&++**<<

 &.c*773+<UUW 	 vo.44S9!<dC 	)A8vay(((	)l#.55f==? 	? ? ~~|$**3/2(
 	
 
r#   c           	         t        j                  d      }dddd}t        j                  |      }|j	                  |d      }|d   }|d d d	k(  sJ d
|v sJ d|v sJ |dd  j                  d      }t        |      dk(  sJ t        j                  t        j                  | j                  |d   dd  j                  d      d               j                  d            }t        j                  | j                  |d   dd              }t        j                  |      d d dk(  sJ t        |      dk(  sJ ||k(  sJ |D ]  }	||	   ||	   k(  rJ  y )Nr   re   rf   extra valuerg   rh   foori   rn      vapid  t=,k=,   r   .rp   r   s   04A   )r   r2   copydeepcopyrs   r~   r@   jsonloadsbase64urlsafe_b64decoderB   r
   ru   
a2b_base64hexlify)
r   r/   r   claim_checkr   rr   partst_valk_valr   s
             r   test_sign_02zVapidTestCase.test_sign_02   sp   n-.3&( mmF+.o&BQx8###}}}}QRs#5zQ

633JJuQx|))#.q12

&. ##DJJuQx|$<=&r*e3335zR$$$ 	)A8vay(((	)r#   c                     t        j                  d      }dddd}|j                  |d      }|d   }|d d d	k(  sJ d
|v sJ d|v sJ y )Nr   http://localhost:8000rf   r   r   ri   rn   r   r   r   r   )r   r2   rs   )r   r/   r   r   rr   s        r   test_sign_02_localhostz$VapidTestCase.test_sign_02_localhost   sj    n-03&( .o&BQx8###}}}}r#   c                     d}d}t        j                  |dj                  |            sJ t        j                  dj                  ||            sJ y )NWBDd3_hVL9fZi9Ybo2UUzA284WG5FZR30_95YeZJsiApwXKpNcF1rRPF3foIiBHXRdJI2Qhumhf6_LFTeZaNndIoa  eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL3VwZGF0ZXMucHVzaC5zZXJ2aWNlcy5tb3ppbGxhLmNvbSIsImV4cCI6MTQ5NDY3MTQ3MCwic3ViIjoibWFpbHRvOnNpbXBsZS1wdXNoLWRlbW9AZ2F1bnRmYWNlLmNvLnVrIn0.LqPi86T-HJ71TXHAYFptZEHD7Wlfjcc4u5jYZ17WpqOlqDcW-5Wtx3x1OgYX19alhJ9oLumlS2VzEvNioZolQAz
webpush {}rq   zvapid t={},k={})rr   )r   r   formatr   r   r*   rr   s      r   test_integrationzVapidTestCase.test_integration   sR    .J
 ~~#L,?,?,EFFF~~#4#;#;D##FGGGr#   c                 >    d}d}t        j                  ||      rJ y )Nr   a  WebPush eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL3VwZGF0ZXMucHVzaC5zZXJ2aWNlcy5tb3ppbGxhLmNvbSIsImV4cCI6MTQ5NDY3MTQ3MCwic3ViIjoibWFpbHRvOnNpbXBsZS1wdXNoLWRlbW9AZ2F1bnRmYWNlLmNvLnVrIn0.LqPi86T-HJ71TXHAYFptZEHD7Wlfjcc4u5jYZ17WpqOlqDcW-5Wtx3x1OgYX19alhJ9oLumlS2VzEvNioZ_BADrq   )r   r   r   s      r   test_bad_integrationz"VapidTestCase.test_bad_integration   s*    .J
 >>c5555r#   c                 H   t        j                  d      }| j                  t        |j                  i        | j                  t        |j                  ddd       | j                  t        |j                  ddd       | j                  t        |j                  ddd       y )Nr   r   zp.example.comrh   rg   zmailto:foo@bar.comzhttps://p.example.com:8080/)r   r2   rF   r   rs   r.   s     r   test_bad_signzVapidTestCase.test_bad_sign   s    n-.&&	 	.&&"'"13	4 	.&&"6"13	4 	.&&"6"?A	Br#   c                 x    t        j                  d      }d|j                  d<   |j                  ddd      sJ y )Nr   Tz	no-strictr   r   r   )r   r2   confrs   r.   s     r   test_ignore_subzVapidTestCase.test_ignore_sub   s8    n-"{vve,CDEEEr#   zGcryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePublicNumbersc                     ddl m} t               }||j                  _        t               }||j
                  _        ||j                  _        | j                  |t        dd       | j                  |t        dd       y )Nr   )InvalidSignaturezfoo.bar.blataaaaz	foo.bar.a)
cryptography.exceptionsr   r   r   rC   r,   return_valuefrom_encoded_pointrF   r
   )r   rH   r   vepks        r   test_invalid_sigzVapidTestCase.test_invalid_sig   sq     	=V 0		V%'"-/** ( 	" 	* % 	"r#   c                 l    g d}g d}|D ]  }t        |      du rJ  |D ]  }t        |      du rJ  y )N)zmailto:me@localhostzmailto:me@1.2.3.4zmailto:me@1234::zmailto:me@1234::5678zmailto:admin@example.orgz1mailto:admin-test-case@example-test-case.test.orgzhttps://localhostz#https://exmample-test-case.test.orgzhttps://8001::zhttps://8001:1000:0001zhttps://1.2.3.4)zmailto:@foobar.comzmailto:example.orgzmailto:0123:zmailto:::1234zhttps://somehostzhttps://xyz:123TF)r	   )r   validinvalidvals       r   test_subzVapidTestCase.test_sub   sT    

  	+Cc?d***	+ 	,Cc?e+++	,r#   N)__name__
__module____qualname__r0   r=   rB   r   rG   rI   rM   rQ   rU   rY   r\   r`   rc   r   r   r   r   r   r   r   r   r    r#   r   r%   r%   A   s    ?
- &I>; ?;
1
%

4).	
H	6B$F
  , -"-" ,r#   r%   ) ru   r   r   r    r   unittestcryptography.hazmat.primitivesr   mockr   r   py_vapidr   r   r   r	   py_vapid.jwtr
   r   dictr*   r   r   r}   r4   r_   r   rt   r   r"   TestCaser%   r   r#   r   <module>r      s       	   8  A A   TRS"#)6*>#? 	EGFF6N 
 2eCj '
Y,H%% Y,r#   