1
0
mirror of https://github.com/openSUSE/osc.git synced 2025-01-12 08:56:13 +01:00
github.com_openSUSE_osc/osc/obs_api/keyinfo.py

111 lines
3.8 KiB
Python

import textwrap
from ..util.models import * # pylint: disable=wildcard-import,unused-wildcard-import
from .keyinfo_pubkey import KeyinfoPubkey
from .keyinfo_sslcert import KeyinfoSslcert
class Keyinfo(XmlModel):
XML_TAG = "keyinfo"
project: str = Field(
xml_attribute=True,
description=textwrap.dedent(
"""
The name of the project.
"""
),
)
pubkey_list: Optional[List[KeyinfoPubkey]] = Field(
xml_name="pubkey",
)
sslcert_list: Optional[List[KeyinfoSslcert]] = Field(
xml_name="sslcert",
)
@classmethod
def from_api(cls, apiurl: str, project: str) -> "Keyinfo":
url_path = ["source", project, "_keyinfo"]
url_query = {}
response = cls.xml_request("GET", apiurl, url_path, url_query)
return cls.from_file(response, apiurl=apiurl)
@classmethod
def get_pubkey_deprecated(cls, apiurl: str, project: str, *, traverse: bool = True) -> Optional[Tuple[str, str]]:
"""
Old API for retrieving pubkey of the given ``project``. Use ``Keyinfo.from_api()`` instead if possible.
:param traverse: If set to ``True`` and the key is not found, traverse project hierarchy for the first available key.
:return: (project, pubkey) or None
"""
from urllib.error import HTTPError
from ..connection import http_request
from ..core import makeurl
from ..output import print_msg
while True:
url_path = ["source", project, "_pubkey"]
url_query = {}
url = makeurl(apiurl, url_path, url_query)
try:
response = http_request("GET", url)
pubkey = response.read().decode("utf-8")
return project, pubkey
except HTTPError as e:
if e.code != 404:
raise
if not traverse:
return None
parts = project.rsplit(":", 1)
if parts[0] != project:
print_msg(f"No pubkey found in project '{project}'. Trying the parent project '{parts[0]}'...", print_to="debug")
project = parts[0]
continue
# we're at the top level, no key found
return None
@classmethod
def get_sslcert_deprecated(cls, apiurl: str, project: str, *, traverse: bool = True) -> Optional[Tuple[str, str]]:
"""
Old API for retrieving sslcert of the given ``project``. Use ``Keyinfo.from_api()`` instead if possible.
:param traverse: If set to ``True`` and the cert is not found, traverse project hierarchy for the first available cert.
:return: (project, sslcert) or None
"""
from urllib.error import HTTPError
from ..connection import http_request
from ..core import makeurl
from ..output import print_msg
while True:
url_path = ["source", project, "_project", "_sslcert"]
url_query = {
"meta": 1,
}
url = makeurl(apiurl, url_path, url_query)
try:
response = http_request("GET", url)
sslcert = response.read().decode("utf-8")
return project, sslcert
except HTTPError as e:
if e.code != 404:
raise
if not traverse:
return None
parts = project.rsplit(":", 1)
if parts[0] != project:
print_msg(f"No sslcert found in project '{project}'. Trying the parent project '{parts[0]}'...", print_to="debug")
project = parts[0]
continue
# we're at the top level, no cert found
return None