Skip to content

Commit 91a90e5

Browse files
committed
add SecondFactorCode
1 parent 09d19e7 commit 91a90e5

File tree

4 files changed

+89
-1
lines changed

4 files changed

+89
-1
lines changed

procuret/security/__init__.py

Whitespace-only changes.
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
"""
2+
Procuret Python
3+
Second Factor Code Module
4+
author: hugh@blinkybeach.com
5+
"""
6+
from pydoc import plain
7+
from procuret.ancillary.session_perspective import Perspective
8+
from typing import Optional
9+
from procuret.http.method import HTTPMethod
10+
from procuret.http.api_request import ApiRequest
11+
12+
13+
class SecondFactorCode:
14+
15+
PATH = '/second-factor-code'
16+
17+
@staticmethod
18+
def create_with_email(
19+
email: str,
20+
plaintext_secret: str,
21+
perspective: Optional[Perspective]
22+
) -> None:
23+
24+
return SecondFactorCode._create(
25+
email=email,
26+
agent_id=None,
27+
plaintext_secret=plaintext_secret,
28+
perspective=perspective
29+
)
30+
31+
@staticmethod
32+
def create_with_agent_id(
33+
agent_id: int,
34+
plaintext_secret: str,
35+
perspective: Optional[Perspective]
36+
) -> None:
37+
38+
return SecondFactorCode._create(
39+
email=None,
40+
agent_id=agent_id,
41+
plaintext_secret=plaintext_secret,
42+
perspective=perspective
43+
)
44+
45+
@staticmethod
46+
def _create(
47+
email: Optional[str],
48+
agent_id: Optional[int],
49+
plaintext_secret: str,
50+
perspective: Optional[Perspective]
51+
) -> None:
52+
53+
data = {
54+
'email': email,
55+
'plaintext_secret': plaintext_secret,
56+
'agent_id': agent_id,
57+
'perspective': (
58+
perspective.value if perspective is not None else None
59+
)
60+
}
61+
62+
ApiRequest.make(
63+
path=SecondFactorCode.PATH,
64+
method=HTTPMethod.POST,
65+
data=data,
66+
session=None,
67+
query_parameters=None
68+
)
69+
70+
return None

procuret/session.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,16 @@ def create_with_email(
7171
email: str,
7272
plaintext_secret: str,
7373
perspective: Perspective,
74+
code: str,
7475
lifecycle: Lifecycle = Lifecycle.LONG_LIVED
7576
) -> Self:
7677

7778
data = {
7879
'email': email,
7980
'secret': plaintext_secret,
8081
'perspective': perspective.value,
81-
'lifecycle': lifecycle.value
82+
'lifecycle': lifecycle.value,
83+
'code': code
8284
}
8385

8486
result = ApiRequest.make(

procuret/tests/variants/with_session.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from procuret.tests.test import Test
77
from procuret.session import Session, Perspective
88
from typing import Optional
9+
from procuret.security.second_factor_code import SecondFactorCode
910

1011

1112
class TestWithSession(Test):
@@ -23,8 +24,23 @@ def _tws_load_session(self) -> Session:
2324
if not isinstance(self.test_perspective, Perspective):
2425
raise NotImplementedError('Implement .test_perspective')
2526

27+
SecondFactorCode.create_with_email(
28+
email=self.email,
29+
plaintext_secret=self.secret,
30+
perspective=self.test_perspective
31+
)
32+
33+
code = input('Second factor code: ')
34+
35+
if not code.isdigit():
36+
raise ValueError('Second factor code must be integer')
37+
38+
if not len(code) == 6:
39+
raise ValueError('Second factor code must be six digits')
40+
2641
self._tws_cached_session = Session.create_with_email(
2742
email=self.email,
43+
code=code,
2844
plaintext_secret=self.secret,
2945
perspective=self.test_perspective
3046
)

0 commit comments

Comments
 (0)