|
49 | 49 |
|
50 | 50 | import pip_checker |
51 | 51 |
|
| 52 | +# White list Google owned Python packages |
| 53 | +GITHUB_PREFIX = 'github.com/' |
| 54 | +WHITELIST_GITHUB_REPO = ['GoogleCloudPlatform/', |
| 55 | + 'google/', |
| 56 | + 'googleapis/'] |
| 57 | + |
52 | 58 |
|
53 | 59 | def _parse_python_version_to_interpreter_mapping(s): |
54 | 60 | version_to_interpreter = {} |
@@ -96,6 +102,13 @@ def _check(self, start_response, python_version, packages): |
96 | 102 | [('Content-Type', 'text/plain; charset=utf-8')]) |
97 | 103 | return [b'Request must specify at least one package'] |
98 | 104 |
|
| 105 | + sanitized_packages = self._sanitize_packages(packages) |
| 106 | + |
| 107 | + if sanitized_packages != packages: |
| 108 | + start_response('400 Bad Request', |
| 109 | + [('Content-Type', 'text/plain; charset=utf-8')]) |
| 110 | + return [b'Request contains third party github head packages.'] |
| 111 | + |
99 | 112 | if not python_version: |
100 | 113 | start_response('400 Bad Request', |
101 | 114 | [('Content-Type', 'text/plain; charset=utf-8')]) |
@@ -139,6 +152,21 @@ def _check(self, start_response, python_version, packages): |
139 | 152 | start_response('200 OK', [('Content-Type', 'application/json')]) |
140 | 153 | return [json.dumps(results).encode('utf-8')] |
141 | 154 |
|
| 155 | + def _sanitize_packages(self, packages): |
| 156 | + # If checking github head version, only run checks for whitelisted |
| 157 | + # repos. |
| 158 | + sanitized_packages = [] |
| 159 | + for pkg in packages: |
| 160 | + if GITHUB_PREFIX in pkg: |
| 161 | + for whitelist_repo in WHITELIST_GITHUB_REPO: |
| 162 | + github_whitelist = GITHUB_PREFIX + whitelist_repo |
| 163 | + if github_whitelist in pkg: |
| 164 | + sanitized_packages.append(pkg) |
| 165 | + else: |
| 166 | + sanitized_packages.append(pkg) |
| 167 | + |
| 168 | + return sanitized_packages |
| 169 | + |
142 | 170 | def _wsgi_app(self, environ, start_response): |
143 | 171 | if environ.get('REQUEST_METHOD') == 'GET': |
144 | 172 | parameters = urllib.parse.parse_qs(environ.get('QUERY_STRING', '')) |
@@ -170,8 +198,7 @@ def _wsgi_app(self, environ, start_response): |
170 | 198 | environ.get('REQUEST_METHOD').encode('utf-8') |
171 | 199 | ] |
172 | 200 |
|
173 | | - return self._check(start_response, python_version, |
174 | | - packages) |
| 201 | + return self._check(start_response, python_version, packages) |
175 | 202 |
|
176 | 203 | def serve(self): |
177 | 204 | with wsgiref.simple_server.make_server(self._host, self._port, |
|
0 commit comments