|
5 | 5 | Metadata,
|
6 | 6 | Reference,
|
7 | 7 | ReviewGuidance,
|
8 |
| - SimpleCodemod, |
9 | 8 | )
|
| 9 | +from core_codemods.api.core_codemod import CoreCodemod |
| 10 | +from codemodder.codemods.libcst_transformer import ( |
| 11 | + LibcstTransformerPipeline, |
| 12 | + LibcstResultTransformer, |
| 13 | +) |
| 14 | +from codemodder.codemods.semgrep import SemgrepRuleDetector |
10 | 15 |
|
11 | 16 |
|
12 |
| -class JwtDecodeVerify(SimpleCodemod): |
13 |
| - metadata = Metadata( |
14 |
| - name="jwt-decode-verify", |
15 |
| - summary="Verify JWT Decode", |
16 |
| - review_guidance=ReviewGuidance.MERGE_WITHOUT_REVIEW, |
17 |
| - references=[ |
18 |
| - Reference(url="https://pyjwt.readthedocs.io/en/stable/api.html"), |
19 |
| - Reference( |
20 |
| - url="https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/06-Session_Management_Testing/10-Testing_JSON_Web_Tokens" |
21 |
| - ), |
22 |
| - ], |
23 |
| - ) |
| 17 | +class JwtDecodeVerifyTransformer(LibcstResultTransformer): |
24 | 18 | change_description = "Enable all verifications in `jwt.decode` call."
|
25 |
| - detector_pattern = r""" |
26 |
| - rules: |
27 |
| - - pattern-either: |
28 |
| - - patterns: |
29 |
| - - pattern: jwt.decode(..., verify=False, ...) |
30 |
| - - pattern-inside: | |
31 |
| - import jwt |
32 |
| - ... |
33 |
| - - patterns: |
34 |
| - - pattern: | |
35 |
| - jwt.decode(..., options={..., "$KEY": False, ...}, ...) |
36 |
| - - metavariable-regex: |
37 |
| - metavariable: $KEY |
38 |
| - regex: verify_ |
39 |
| - - pattern-inside: | |
40 |
| - import jwt |
41 |
| - ... |
42 |
| - """ |
43 | 19 |
|
44 | 20 | def _replace_opts_dict(self, opts_dict):
|
45 | 21 | new_dict_elements = []
|
@@ -100,3 +76,39 @@ def is_verify_keyword(element: cst.DictElement) -> bool:
|
100 | 76 | matchers.matches(element.key, matchers.SimpleString())
|
101 | 77 | and "verify" in element.key.value
|
102 | 78 | )
|
| 79 | + |
| 80 | + |
| 81 | +JwtDecodeVerify = CoreCodemod( |
| 82 | + metadata=Metadata( |
| 83 | + name="jwt-decode-verify", |
| 84 | + summary="Verify JWT Decode", |
| 85 | + review_guidance=ReviewGuidance.MERGE_WITHOUT_REVIEW, |
| 86 | + references=[ |
| 87 | + Reference(url="https://pyjwt.readthedocs.io/en/stable/api.html"), |
| 88 | + Reference( |
| 89 | + url="https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/06-Session_Management_Testing/10-Testing_JSON_Web_Tokens" |
| 90 | + ), |
| 91 | + ], |
| 92 | + ), |
| 93 | + transformer=LibcstTransformerPipeline(JwtDecodeVerifyTransformer), |
| 94 | + detector=SemgrepRuleDetector( |
| 95 | + r""" |
| 96 | + rules: |
| 97 | + - pattern-either: |
| 98 | + - patterns: |
| 99 | + - pattern: jwt.decode(..., verify=False, ...) |
| 100 | + - pattern-inside: | |
| 101 | + import jwt |
| 102 | + ... |
| 103 | + - patterns: |
| 104 | + - pattern: | |
| 105 | + jwt.decode(..., options={..., "$KEY": False, ...}, ...) |
| 106 | + - metavariable-regex: |
| 107 | + metavariable: $KEY |
| 108 | + regex: verify_ |
| 109 | + - pattern-inside: | |
| 110 | + import jwt |
| 111 | + ... |
| 112 | + """ |
| 113 | + ), |
| 114 | +) |
0 commit comments