|
5 | 5 | import click
|
6 | 6 | import zipfile
|
7 | 7 | import redshift_connector
|
| 8 | +import jwt |
| 9 | +from validator_collection import checkers |
8 | 10 |
|
9 | 11 | from tqdm import trange
|
10 | 12 | from sqlparse import split
|
@@ -77,6 +79,34 @@ def run_sql(sql, config):
|
77 | 79 | print(notice.strip())
|
78 | 80 |
|
79 | 81 |
|
| 82 | +def validate_lds_config(lds_config): |
| 83 | + pattern = r'^(lds-function-asia-northeast1|lds-function-australia-southeast1|lds-function-europe-west1|lds-function-us-east1)$' # noqa: E501 |
| 84 | + if not validate_str(lds_config.get('lambda'), pattern): |
| 85 | + exit('incorrect configuration: missing or invalid lds.lambda') |
| 86 | + |
| 87 | + pattern = r'^arn:aws:iam::[0-9]+:role/CartoFunctionsRedshiftRole,arn:aws:iam::000955892807:role/CartoFunctionsRole$' # noqa: E501 |
| 88 | + if not validate_str(lds_config.get('roles'), pattern): |
| 89 | + exit('incorrect configuration: missing or invalid lds.roles') |
| 90 | + |
| 91 | + if not validate_str(lds_config.get('api_base_url')): |
| 92 | + exit('incorrect configuration: missing lds.api_base_url') |
| 93 | + |
| 94 | + if not checkers.is_url(lds_config.get('api_base_url')): |
| 95 | + exit('incorrect configuration: invalid lds.api_base_url') |
| 96 | + |
| 97 | + token = lds_config.get('token') |
| 98 | + if not validate_str(token): |
| 99 | + exit('incorrect configuration: missing lds.token') |
| 100 | + algorithm = jwt.get_unverified_header(token).get('alg') |
| 101 | + if not algorithm: |
| 102 | + exit('incorrect configuration: invalid lds.token') |
| 103 | + jwt_payload = jwt.decode( |
| 104 | + token, algorithms=[algorithm], options={'verify_signature': False} |
| 105 | + ) |
| 106 | + if not jwt_payload.get('a') or not jwt_payload.get('jti'): |
| 107 | + exit('incorrect configuration: invalid lds.token') |
| 108 | + |
| 109 | + |
80 | 110 | def validate_config(config):
|
81 | 111 | connection = config.get('connection')
|
82 | 112 |
|
@@ -107,21 +137,9 @@ def validate_config(config):
|
107 | 137 | if not validate_str(connection.get('password')):
|
108 | 138 | exit('incorrect configuration: missing connection.password')
|
109 | 139 |
|
110 |
| - lds = config.get('lds') |
111 |
| - if cloud == 'redshift' and lds is not None: |
112 |
| - pattern = r'^(lds-function-asia-northeast1|lds-function-australia-southeast1|lds-function-europe-west1|lds-function-us-east1)$' # noqa: E501 |
113 |
| - if not validate_str(lds.get('lambda'), pattern): |
114 |
| - exit('incorrect configuration: missing or invalid lds.lambda') |
115 |
| - |
116 |
| - pattern = r'^arn:aws:iam::[0-9]+:role/CartoFunctionsRedshiftRole,arn:aws:iam::000955892807:role/CartoFunctionsRole$' # noqa: E501 |
117 |
| - if not validate_str(lds.get('roles'), pattern): |
118 |
| - exit('incorrect configuration: missing or invalid lds.roles') |
119 |
| - |
120 |
| - if not validate_str(lds.get('api_base_url')): |
121 |
| - exit('incorrect configuration: missing lds.api_base_url') |
122 |
| - |
123 |
| - if not validate_str(lds.get('token')): |
124 |
| - exit('incorrect configuration: missing lds.token') |
| 140 | + lds_config = config.get('lds') |
| 141 | + if cloud == 'redshift' and lds_config is not None: |
| 142 | + validate_lds_config(lds_config) |
125 | 143 |
|
126 | 144 |
|
127 | 145 | def validate_str(string, pattern=None):
|
|
0 commit comments