Skip to content

Commit 39f76d7

Browse files
authored
Merge pull request #107 from GeekMasher/depgraph-server
Depgraph server
2 parents 03ab5fc + ace882b commit 39f76d7

File tree

5 files changed

+71
-20
lines changed

5 files changed

+71
-20
lines changed

src/ghastoolkit/octokit/clearlydefined.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ def getLicenses(self, dependency: Dependency) -> list[str]:
6262
curlicense = curation.get("licensed", {}).get("declared")
6363
if curlicense:
6464
licenses.add(curlicense)
65-
except:
65+
except KeyboardInterrupt:
66+
raise Exception("Keyboard Interrupt")
67+
except Exception as err:
6668
logger.warning(f"Error getting curation data :: {dependency}")
69+
logger.warning(f"Error :: {err}")
6770

6871
return list(licenses)

src/ghastoolkit/octokit/dependencygraph.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from typing import Any, Dict
44
import urllib.parse
55

6+
from semantic_version import Version
7+
68
from ghastoolkit.octokit.github import GitHub, Repository
79
from ghastoolkit.supplychain.advisories import Advisory
810
from ghastoolkit.supplychain.dependencyalert import DependencyAlert
@@ -53,7 +55,24 @@ def getOrganizationDependencies(self) -> Dict[Repository, Dependencies]:
5355

5456
def getDependencies(self) -> Dependencies:
5557
"""Get Dependencies."""
56-
deps = self.getDependenciesSbom()
58+
if GitHub.isEnterpriseServer():
59+
if not self.enable_clearlydefined:
60+
logger.warning(
61+
"Enterprise Server does not support licensing information"
62+
)
63+
# enterprise: 3.8+ use SBOM API
64+
if GitHub.server_version >= Version("3.9.0"):
65+
logger.info("Using SBOM API to resolve dependencies (GHES 3.9+)")
66+
deps = self.getDependenciesSbom()
67+
# enterprise: 3.7+ use GraphQL API
68+
elif GitHub.server_version >= Version("3.6.0"):
69+
logger.warning("Using GraphQL API to resolve dependencies (GHES 3.6+)")
70+
deps = self.getDependenciesGraphQL()
71+
else:
72+
raise Exception("Enterprise Server version must be >= 3.6.0")
73+
else:
74+
# cloud: download SBOM
75+
deps = self.getDependenciesSbom()
5776

5877
if self.enable_graphql:
5978
logger.debug("Enabled GraphQL Dependencies")
@@ -62,7 +81,7 @@ def getDependencies(self) -> Dependencies:
6281
deps.updateDependencies(graph_deps)
6382

6483
if self.enable_clearlydefined:
65-
logger.debug("Applying ClearlyDefined on dependencies")
84+
logger.info("Using ClearlyDefined API to resolve dependency licenses")
6685
deps.applyClearlyDefined()
6786
return deps
6887

@@ -141,6 +160,10 @@ def getDependenciesGraphQL(self) -> Dependencies:
141160

142161
def getDependenciesInPR(self, base: str, head: str) -> Dependencies:
143162
"""Get all the dependencies from a Pull Request."""
163+
164+
if GitHub.isEnterpriseServer() and GitHub.server_version < Version("3.6.0"):
165+
raise Exception("Enterprise Server version must be >= 3.6")
166+
144167
dependencies = Dependencies()
145168
base = urllib.parse.quote(base, safe="")
146169
head = urllib.parse.quote(head, safe="")

src/ghastoolkit/octokit/github.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
import tempfile
66
import subprocess
77
from dataclasses import dataclass
8-
from typing import Optional, Tuple, Union
8+
from typing import Dict, Optional, Tuple, Union
99
from urllib.parse import urlparse
1010

11+
from semantic_version import Version
12+
1113

1214
logger = logging.getLogger("ghastoolkit.octokit.github")
1315

@@ -252,6 +254,7 @@ class GitHub:
252254
"""GraphQL API URL"""
253255

254256
enterprise: Optional[str] = None
257+
server_version: Optional[Version] = None
255258

256259
github_app: bool = False
257260
"""GitHub App setting"""
@@ -288,6 +291,10 @@ def init(
288291
GitHub.instance = instance
289292
GitHub.api_rest, GitHub.api_graphql = GitHub.parseInstance(instance)
290293

294+
if GitHub.isEnterpriseServer():
295+
# Get the server version
296+
GitHub.getMetaInformation()
297+
291298
GitHub.enterprise = enterprise
292299

293300
return
@@ -302,11 +309,29 @@ def parseInstance(instance: str) -> Tuple[str, str]:
302309
api = url.scheme + "://api." + url.netloc
303310
return (api, f"{api}/graphql")
304311
# GitHub Ent Server
305-
api = url.scheme + "://" + url.netloc + "/api/v3"
312+
api = url.scheme + "://" + url.netloc + "/api"
306313

307-
return (api, f"{api}/graphql")
314+
return (f"{api}/v3", f"{api}/graphql")
315+
316+
@staticmethod
317+
def isEnterpriseServer() -> bool:
318+
"""Is the GitHub instance an Enterprise Server."""
319+
return GitHub.instance != "https://github.com"
308320

309321
@staticmethod
310322
def display() -> str:
311323
"""Display the GitHub Settings."""
312324
return f"GitHub('{GitHub.repository.display()}', '{GitHub.instance}')"
325+
326+
@staticmethod
327+
def getMetaInformation() -> Dict:
328+
"""Get the GitHub Meta Information."""
329+
from ghastoolkit.octokit.octokit import RestRequest
330+
331+
response = RestRequest().session.get(f"{GitHub.api_rest}/meta")
332+
333+
if response.headers.get("X-GitHub-Enterprise-Version"):
334+
version = response.headers.get("X-GitHub-Enterprise-Version")
335+
GitHub.server_version = Version(version)
336+
337+
return response.json()

src/ghastoolkit/octokit/octokit.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def wrap(self, *args, **kwargs):
134134
result = rest.get(url, parameters=params, authenticated=authenticated)
135135

136136
if response:
137-
return func(self, responce=result, **kwargs)
137+
return func(self, response=result, **kwargs)
138138

139139
# TODO: runtime type checking
140140

@@ -203,29 +203,29 @@ def get(
203203
while True:
204204
params["page"] = page
205205

206-
responce = self.session.get(url, params=params)
207-
responce_json = responce.json()
206+
response = self.session.get(url, params=params)
207+
response_json = response.json()
208208

209-
if responce.status_code != expected:
209+
if response.status_code != expected:
210210
if display_errors:
211-
logger.error(f"Error code from server :: {responce.status_code}")
212-
logger.error(f"Content :: {responce_json}")
211+
logger.error(f"Error code from server :: {response.status_code}")
212+
logger.error(f"Content :: {response_json}")
213213

214-
known_error = __OCTOKIT_ERRORS__.get(responce.status_code)
214+
known_error = __OCTOKIT_ERRORS__.get(response.status_code)
215215
if known_error:
216216
raise Exception(known_error)
217217
raise Exception("REST Request failed :: non-expected server error")
218218

219-
if isinstance(responce_json, dict) and responce_json.get("errors"):
220-
logger.error(responce_json.get("message"))
219+
if isinstance(response_json, dict) and response_json.get("errors"):
220+
logger.error(response_json.get("message"))
221221
raise Exception("REST Request failed :: error from server")
222222

223-
if isinstance(responce_json, dict):
224-
return responce_json
223+
if isinstance(response_json, dict):
224+
return response_json
225225

226-
result.extend(responce_json)
226+
result.extend(response_json)
227227
# if the page is not full, we must have hit the end
228-
if len(responce_json) < RestRequest.PER_PAGE:
228+
if len(response_json) < RestRequest.PER_PAGE:
229229
break
230230

231231
page += 1

tests/test_github.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def test_server(self):
2828
self.assertEqual(GitHub.instance, "https://github.geekmasher.dev")
2929
self.assertEqual(GitHub.api_rest, "https://github.geekmasher.dev/api/v3")
3030
self.assertEqual(
31-
GitHub.api_graphql, "https://github.geekmasher.dev/api/v3/graphql"
31+
GitHub.api_graphql, "https://github.geekmasher.dev/api/graphql"
3232
)
3333

3434
def test_parseReference(self):

0 commit comments

Comments
 (0)