use pki_types::CertificateDer;
use serde::Serialize;
use std::cmp::Ordering;
use crate::errors;
#[derive(Serialize, Debug)]
pub enum Auth {
Anonymous,
Basic(String, String),
Bearer(String),
}
impl From<&Auth> for oci_client::secrets::RegistryAuth {
fn from(auth: &Auth) -> Self {
match auth {
Auth::Anonymous => oci_client::secrets::RegistryAuth::Anonymous,
Auth::Basic(username, pass) => {
oci_client::secrets::RegistryAuth::Basic(username.clone(), pass.clone())
}
Auth::Bearer(token) => oci_client::secrets::RegistryAuth::Bearer(token.clone()),
}
}
}
impl From<&oci_client::secrets::RegistryAuth> for Auth {
fn from(auth: &oci_client::secrets::RegistryAuth) -> Self {
match auth {
oci_client::secrets::RegistryAuth::Anonymous => Auth::Anonymous,
oci_client::secrets::RegistryAuth::Basic(username, pass) => {
Auth::Basic(username.clone(), pass.clone())
}
oci_client::secrets::RegistryAuth::Bearer(token) => Auth::Bearer(token.clone()),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub enum ClientProtocol {
#[allow(missing_docs)]
Http,
#[allow(missing_docs)]
#[default]
Https,
#[allow(missing_docs)]
HttpsExcept(Vec<String>),
}
impl From<ClientProtocol> for oci_client::client::ClientProtocol {
fn from(cp: ClientProtocol) -> Self {
match cp {
ClientProtocol::Http => oci_client::client::ClientProtocol::Http,
ClientProtocol::Https => oci_client::client::ClientProtocol::Https,
ClientProtocol::HttpsExcept(exceptions) => {
oci_client::client::ClientProtocol::HttpsExcept(exceptions)
}
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CertificateEncoding {
#[allow(missing_docs)]
Der,
#[allow(missing_docs)]
Pem,
}
impl From<CertificateEncoding> for oci_client::client::CertificateEncoding {
fn from(ce: CertificateEncoding) -> Self {
match ce {
CertificateEncoding::Der => oci_client::client::CertificateEncoding::Der,
CertificateEncoding::Pem => oci_client::client::CertificateEncoding::Pem,
}
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Certificate {
pub encoding: CertificateEncoding,
pub data: Vec<u8>,
}
impl Ord for Certificate {
fn cmp(&self, other: &Self) -> Ordering {
self.data.cmp(&other.data)
}
}
impl PartialOrd for Certificate {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl From<&Certificate> for oci_client::client::Certificate {
fn from(cert: &Certificate) -> Self {
oci_client::client::Certificate {
encoding: cert.encoding.clone().into(),
data: cert.data.clone(),
}
}
}
impl<'a> TryFrom<Certificate> for CertificateDer<'a> {
type Error = errors::SigstoreError;
fn try_from(value: Certificate) -> errors::Result<CertificateDer<'a>> {
#[inline]
fn to_der(pem: &[u8]) -> errors::Result<Vec<u8>> {
Ok(pem::parse(pem)?.into_contents())
}
match &value.encoding {
CertificateEncoding::Der => Ok(CertificateDer::from(value.data)),
CertificateEncoding::Pem => Ok(CertificateDer::from(to_der(&value.data)?)),
}
}
}
#[derive(Debug, Clone)]
pub struct ClientConfig {
pub protocol: ClientProtocol,
#[cfg_attr(docsrs, doc(cfg(feature = "native-tls")))]
#[cfg(feature = "native-tls")]
pub accept_invalid_hostnames: bool,
pub accept_invalid_certificates: bool,
pub extra_root_certificates: Vec<Certificate>,
pub https_proxy: Option<String>,
pub http_proxy: Option<String>,
pub no_proxy: Option<String>,
}
impl Default for ClientConfig {
fn default() -> Self {
ClientConfig {
protocol: ClientProtocol::Https,
#[cfg(feature = "native-tls")]
accept_invalid_hostnames: false,
accept_invalid_certificates: false,
extra_root_certificates: Vec::new(),
https_proxy: None,
http_proxy: None,
no_proxy: None,
}
}
}
impl From<ClientConfig> for oci_client::client::ClientConfig {
fn from(config: ClientConfig) -> Self {
oci_client::client::ClientConfig {
protocol: config.protocol.into(),
accept_invalid_certificates: config.accept_invalid_certificates,
#[cfg(feature = "native-tls")]
accept_invalid_hostnames: config.accept_invalid_hostnames,
extra_root_certificates: config
.extra_root_certificates
.iter()
.map(|c| c.into())
.collect(),
https_proxy: config.https_proxy,
http_proxy: config.http_proxy,
no_proxy: config.no_proxy,
..Default::default()
}
}
}
#[derive(Debug, Clone)]
pub struct PushResponse {
pub config_url: String,
pub manifest_url: String,
}
impl From<PushResponse> for oci_client::client::PushResponse {
fn from(pr: PushResponse) -> Self {
oci_client::client::PushResponse {
config_url: pr.config_url,
manifest_url: pr.manifest_url,
}
}
}
impl From<oci_client::client::PushResponse> for PushResponse {
fn from(pr: oci_client::client::PushResponse) -> Self {
PushResponse {
config_url: pr.config_url,
manifest_url: pr.manifest_url,
}
}
}