d126d8e5a0
* placeholder handling of wg registration with upgrade mode token * include upgrade mode credentials as part of credential storage * introduce helper for decoding JWT payload * expose methods for removing emergency credentials from the storage * don't allow duplicate emergency credentials with the same content * added authenticator ClientMessage for upgrade mode check * retrieve credentials with longest expiration first * post rebasing fixes * fixed gateway config * feat: allow specifying minimum node performance for client init * nym-node UM improvements * fixed upgrade mode bandwidth on initial authentication * fix: logs and thresholds * expose attestation information from nym-node http api * additional logs * post rebasing fixes * make @simonwicky happy by removing empty lines in emergency_credential table definition * chore: remove '_' prefix for internal counters within in-mem ecash storage * improved import of 'UpgradeModeState' within the nym-node * use explicit time dependency within credential-storage * re-order imports within the gateway-client * moved 'AvailableBandwidth' definition to the monorepo
60 lines
2.2 KiB
Rust
60 lines
2.2 KiB
Rust
// Copyright 2025 - Nym Technologies SA <contact@nymtech.net>
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
use async_trait::async_trait;
|
|
use nym_credential_storage::storage::Storage;
|
|
use nym_credentials_interface::TicketType;
|
|
use nym_crypto::asymmetric::ed25519;
|
|
use nym_validator_client::nyxd::contract_traits::DkgQueryClient;
|
|
|
|
use crate::{error::BandwidthControllerError, BandwidthController, PreparedCredential};
|
|
|
|
pub const DEFAULT_TICKETS_TO_SPEND: u32 = 1;
|
|
|
|
// TODO: this does not really belong here
|
|
pub const UPGRADE_MODE_JWT_TYPE: &str = "UPGRADE_MODE_JWT";
|
|
|
|
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
|
|
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
|
|
pub trait BandwidthTicketProvider: Send + Sync {
|
|
async fn get_ecash_ticket(
|
|
&self,
|
|
ticket_type: TicketType,
|
|
gateway_id: ed25519::PublicKey,
|
|
tickets_to_spend: u32,
|
|
) -> Result<PreparedCredential, BandwidthControllerError>;
|
|
|
|
async fn get_upgrade_mode_token(&self) -> Result<Option<String>, BandwidthControllerError>;
|
|
}
|
|
|
|
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
|
|
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
|
|
impl<C, St> BandwidthTicketProvider for BandwidthController<C, St>
|
|
where
|
|
C: DkgQueryClient + Sync + Send,
|
|
St: nym_credential_storage::storage::Storage,
|
|
<St as Storage>::StorageError: Send + Sync + 'static,
|
|
{
|
|
async fn get_ecash_ticket(
|
|
&self,
|
|
ticket_type: TicketType,
|
|
gateway_id: ed25519::PublicKey,
|
|
tickets_to_spend: u32,
|
|
) -> Result<PreparedCredential, BandwidthControllerError> {
|
|
self.prepare_ecash_ticket(ticket_type, gateway_id.to_bytes(), tickets_to_spend)
|
|
.await
|
|
}
|
|
|
|
async fn get_upgrade_mode_token(&self) -> Result<Option<String>, BandwidthControllerError> {
|
|
let Some(emergency_credential) =
|
|
self.get_emergency_credential(UPGRADE_MODE_JWT_TYPE).await?
|
|
else {
|
|
return Ok(None);
|
|
};
|
|
// upgrade mode credential is just a simple stringified JWT
|
|
let token = String::from_utf8(emergency_credential.data.content)
|
|
.map_err(|_| BandwidthControllerError::MalformedUpgradeModeToken)?;
|
|
Ok(Some(token))
|
|
}
|
|
}
|