1
- # This Source Code Form is subject to the terms of the Mozilla Public
2
- # License, v. 2.0. If a copy of the MPL was not distributed with this
3
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
-
5
1
import base64
6
2
import os
7
3
import json
8
4
import unittest
9
5
from nose .tools import eq_ , ok_
6
+ from mock import patch
10
7
11
8
from jose import jws
12
9
from vapid import Vapid , VapidException
26
23
27
24
28
25
def setUp (self ):
29
- open ('/tmp/private' , 'w' ).write (T_PRIVATE )
30
- open ('/tmp/public' , 'w' ).write (T_PUBLIC )
26
+ ff = open ('/tmp/private' , 'w' )
27
+ ff .write (T_PRIVATE )
28
+ ff .close ()
29
+ ff = open ('/tmp/public' , 'w' )
30
+ ff .write (T_PUBLIC )
31
+ ff .close ()
31
32
32
33
33
34
def tearDown (self ):
@@ -37,9 +38,18 @@ def tearDown(self):
37
38
38
39
class VapidTestCase (unittest .TestCase ):
39
40
def test_init (self ):
40
- v = Vapid ("/tmp/private" )
41
- eq_ (v .private_key .to_pem (), T_PRIVATE )
42
- eq_ (v .public_key .to_pem (), T_PUBLIC )
41
+ v1 = Vapid (private_key_file = "/tmp/private" )
42
+ eq_ (v1 .private_key .to_pem (), T_PRIVATE )
43
+ eq_ (v1 .public_key .to_pem (), T_PUBLIC )
44
+ v2 = Vapid (private_key = T_PRIVATE )
45
+ eq_ (v2 .private_key .to_pem (), T_PRIVATE )
46
+ eq_ (v2 .public_key .to_pem (), T_PUBLIC )
47
+
48
+ @patch ("ecdsa.SigningKey.from_pem" , side_effect = Exception )
49
+ def test_init_bad_priv (self , mm ):
50
+ self .assertRaises (Exception ,
51
+ Vapid ,
52
+ private_key_file = "/tmp/private" )
43
53
44
54
def test_private (self ):
45
55
v = Vapid ()
@@ -63,22 +73,46 @@ def test_gen_key(self):
63
73
ok_ (v .public_key )
64
74
ok_ (v .private_key )
65
75
76
+ def test_save_key (self ):
77
+ v = Vapid ()
78
+ v .save_key ("/tmp/p2" )
79
+ os .unlink ("/tmp/p2" )
80
+
81
+ def test_save_public_key (self ):
82
+ v = Vapid ()
83
+ v .generate_keys ()
84
+ v .save_public_key ("/tmp/p2" )
85
+ os .unlink ("/tmp/p2" )
86
+
66
87
def test_validate (self ):
67
88
v = Vapid ("/tmp/private" )
68
- claims = {"aud" : "example.com" , "sub" : "admin@example.com" }
69
- result = jws .sign (claims , v .private_key , algorithm = "ES256" )
70
- msg = v .validate (result )
71
- eq_ (claims , json .loads (msg ))
89
+ msg = "foobar"
90
+ vtoken = v .validate (msg )
91
+ ok_ (v .public_key .verify (base64 .urlsafe_b64decode (vtoken ), msg ))
72
92
73
93
def test_sign (self ):
74
94
v = Vapid ("/tmp/private" )
75
95
claims = {"aud" : "example.com" , "sub" : "admin@example.com" }
76
- result = v .sign (claims )
96
+ result = v .sign (claims , "id=previous" )
77
97
eq_ (result ['Crypto-Key' ],
98
+ 'id=previous,'
78
99
'p256ecdsa=EJwJZq_GN8jJbo1GGpyU70hmP2hbWAUpQFKDBy'
79
100
'KB81yldJ9GTklBM5xqEwuPM7VuQcyiLDhvovthPIXx-gsQRQ==' )
80
101
items = jws .verify (result ['Authorization' ][7 :],
81
102
v .public_key ,
82
103
algorithms = ["ES256" ])
83
104
eq_ (json .loads (items ), claims )
105
+ result = v .sign (claims )
106
+ eq_ (result ['Crypto-Key' ],
107
+ 'p256ecdsa=EJwJZq_GN8jJbo1GGpyU70hmP2hbWAUpQFKDBy'
108
+ 'KB81yldJ9GTklBM5xqEwuPM7VuQcyiLDhvovthPIXx-gsQRQ==' )
109
+
110
+ def test_bad_sign (self ):
111
+ v = Vapid ("/tmp/private" )
112
+ self .assertRaises (VapidException ,
113
+ v .sign ,
114
+ {'sub' : "a@e.c" })
115
+ self .assertRaises (VapidException ,
116
+ v .sign ,
117
+ {'aud' : "https://e.c" })
84
118
0 commit comments