MCPcopy Create free account
hub / github.com/NVIDIA/OpenShell / handle_issue_sandbox_token

Function handle_issue_sandbox_token

crates/openshell-server/src/grpc/auth_rpc.rs:25–76  ·  view source on GitHub ↗
(
    state: &Arc<ServerState>,
    request: Request<IssueSandboxTokenRequest>,
)

Source from the content-addressed store, hash-verified

23
24#[allow(clippy::result_large_err, clippy::unused_async)]
25pub async fn handle_issue_sandbox_token(
26 state: &Arc<ServerState>,
27 request: Request<IssueSandboxTokenRequest>,
28) -> Result<Response<IssueSandboxTokenResponse>, Status> {
29 let principal = request
30 .extensions()
31 .get::<Principal>()
32 .cloned()
33 .ok_or_else(|| Status::unauthenticated("missing principal"))?;
34
35 let Principal::Sandbox(sandbox) = principal else {
36 return Err(Status::permission_denied(
37 "IssueSandboxToken requires a sandbox principal",
38 ));
39 };
40
41 // Only the bootstrap K8s ServiceAccount path can mint a fresh gateway JWT
42 // via this RPC. Sandboxes already holding a gateway JWT use
43 // `RefreshSandboxToken` instead.
44 if !matches!(
45 sandbox.source,
46 SandboxIdentitySource::K8sServiceAccount { .. }
47 ) {
48 debug!(
49 sandbox_id = %sandbox.sandbox_id,
50 "IssueSandboxToken rejected: non-bootstrap principal source"
51 );
52 return Err(Status::permission_denied(
53 "this principal cannot mint a sandbox token; use RefreshSandboxToken",
54 ));
55 }
56
57 let issuer = state.sandbox_jwt_issuer.as_ref().ok_or_else(|| {
58 warn!(
59 sandbox_id = %sandbox.sandbox_id,
60 "IssueSandboxToken called but sandbox JWT issuer is not configured"
61 );
62 Status::unavailable("sandbox JWT minting is not configured on this gateway")
63 })?;
64
65 ensure_sandbox_exists(state, &sandbox.sandbox_id).await?;
66
67 let minted = issuer.mint(&sandbox.sandbox_id)?;
68 info!(
69 sandbox_id = %sandbox.sandbox_id,
70 "issued gateway sandbox JWT"
71 );
72 Ok(Response::new(IssueSandboxTokenResponse {
73 token: minted.token,
74 expires_at_ms: minted.expires_at_ms,
75 }))
76}
77
78#[allow(clippy::result_large_err, clippy::unused_async)]
79pub async fn handle_refresh_sandbox_token(

Calls 2

ensure_sandbox_existsFunction · 0.85
mintMethod · 0.80

Tested by

no test coverage detected