1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
// Clock port re-export — External Developer consumers can use
// `pas_external::clock::ArcClock` / `pas_external::clock::FrozenClock`
// without a separate `ppoppo-clock` dep in their Cargo.toml.
// Perimeter Bearer-auth Layer kit — Phase A Slice 4 lifted the kit to
// `ppoppo_sdk_core::bearer::*`. pas-external 0.11.0 re-exports the
// kit at `pas_external::bearer::*` (audit decision D — 1-level
// role-named module, no `oidc::axum::*` nesting) for 3rd-party
// consumers (RCW/CTW). 1st-party services (chat-auth) import direct
// from sdk-core (audit decision B). The framework-dep visibility
// (axum / tower) is signalled by the `axum` feature gate, not by a
// nested `pas_external::oidc::axum::*` namespace.
// `epoch` re-exports the engine `EpochRevocation` port + ships the
// canonical adapter set (Phase 11.Z, RFC_2026-05-09 §3.5). Gated on
// `well-known-fetch` because the engine port itself needs `token` and
// the original `UserinfoFetcher` (deleted in 0.10.0) required the HTTP
// client (`oauth`) — both implied by the `well-known-fetch` flag.
// `SharedCacheCache` (0.10.0, RFC_2026-05-08 §4.1) requires the
// additional `shared-cache` feature for the `ppoppo-infra` adapter dep.
// `oauth` is two-tiered: the `TokenResponse` wire DTO compiles at the
// `oauth` tier (consumed by `pas_port` / `session_liveness`), while the
// `OAuthConfig` + `AuthClient` HTTP adapter is gated inside the module on
// `well-known-fetch` — the tier of its sole constructor,
// `oidc::RelyingParty::new`. As of 0.8.0 the module is `pub(crate)`:
// consumers reach the OIDC RP composition root (`oidc::RelyingParty<S>`)
// and never the raw OAuth surface. See `oidc::RefreshOutcome` for the
// boundary type at `RelyingParty::refresh`.
pub
// Native-app OAuth composition root (RFC 8252) — the non-OIDC sibling of
// `oidc::RelyingParty<S>`. Separate rather than a relaxation: the RP is
// welded to OIDC in three places (an `openid` scope marker, an
// unconditional `nonce`, a verified id_token) and a native resource client
// breaks all three. See the module docs.
// Renewing `TokenSource` (G3 / RTR) — `RefreshTokenSource` + `TokenStore`.
// For native / CLI clients (CNC) that hold a durable refresh token and feed a
// `ppoppo_sdk_core::TokenCache`; depends on the `PasAuthPort` port (`oauth`)
// and sdk-core's `token-cache` (the `TokenSource` trait it implements).
// `pkce` primitives (`generate_state`, `generate_code_verifier`,
// `generate_code_challenge`) are SDK plumbing — `oidc::RelyingParty::start`
// is the sole consumer, so the module is gated on `well-known-fetch`
// (the RP's tier) rather than the lower `oauth` tier, which would orphan
// it under the default feature set. `pub(crate)` since 0.8.0.
pub
// Granted-vs-requested scope validation (RFC 6749 §5.1). Ungated and
// dependency-free — it reads only a `&str` echo and a `ConsentScopes`
// marker, and every leg that receives a token response uses the same
// function, so the RFC's absence-and-containment semantics are decided in
// exactly one place.
// `session_liveness` is intentionally ungated at module level — the
// 0.10.0 `SessionLiveness` port has no AES / OAuth deps and ships
// regardless of feature configuration so the verifier slot
// (`PasJwtVerifier::with_session_liveness`) can reference it under
// just `feature = "well-known-fetch"`. Internal sub-modules
// (`cipher`, `liveness`) remain gated on `feature = "session-liveness"`
// for the AES wrapper + PAS refresh-token check.
// Test-support helpers. `FakePasServer` is the SDK-owned wiremock-wrapped
// fake PAS Authorization Server, replacing the 0.7.x
// `RelyingParty::for_test_with_parts` escape hatch. Consumer integration
// tests construct a real `RelyingParty::new(...)` against
// `FakePasServer.issuer_url()` so production and test go through the same
// public interface.
// Re-exports for convenient access
pub use ;
pub use MemoryAuditSink;
pub use ;
// 0.10.0 — ungated L2 verifier-slot port (RFC_2026-05-08 §4.2 lock).
pub use ;
pub use ;
// γ port-and-adapter — Phase 6.1 (D-04 = γ, locked 2026-05-05).
// Phase A (RFC `RFC_2026-05-08_app-credential-collapse.md`, audit
// decisions E + G) lifted the cohesive verifier group to
// `ppoppo_sdk_core::verifier::*`. pas-external re-exports at top level
// (no `token::` namespace — audit decision E) so consumer code
// reaches `pas_external::{BearerVerifier, JwtVerifier, ...}`. Renames:
// `PasJwtVerifier` → `JwtVerifier`; `Expectations` → `VerifyConfig`;
// `AuthSession` → `VerifiedClaims`. The `crypto-side` `VerifyError`
// re-exports as `TokenVerifyError` (BREAKING) to make space for the
// Layer-side `VerifyError` from `pas_external::bearer::*` (Slice 4
// migration). Phase A 0.11.0 ships clean — no transitional alias.
pub use ;
pub use ;
pub use MemoryBearerVerifier;
// OIDC RP surface — composition root + post-verify shapes + ports.
// `RelyingParty<S>` is the consumer-facing entry point; `RefreshOutcome`
// is the typed boundary return for `RelyingParty::refresh` (replaces
// the 0.7.x `oauth::TokenResponse` re-export).
pub use ;
pub use MemoryIdTokenVerifier;
pub use ;
// The SDK-family scope contract. Re-exported (facade rule: every type in a
// public signature is reachable from this crate's root) because
// `NativeAuthFlow<S: ConsentScopes>` and the sources it yields put both
// names on the public surface. A 3rd party must never have to name the
// engine crate — `pcs-session` re-exports the same two, so an integration
// spells `pcs_session::scopes::Notify` and nothing else.
pub use ConsentScopes;
pub use ScopedTokenSource;
pub use ;
// Native-app OAuth surface (RFC 8252).
pub use ;
// `AuthClient` — nameable, deliberately NOT constructible.
//
// It appears as a generic argument in what `NativeAuthFlow::{complete,
// token_source}` return (`RefreshTokenSource<AuthClient, T, S>`), and a native
// app holds that source in its application state — which means writing the
// type down. Without this re-export the signature names a `pub(crate)`
// internal and the surface is unusable from outside, while the crate still
// compiles cleanly: `private_interfaces` does not fire on a private type in
// generic-argument position. `tests/native_auth_flow_boundary.rs` names the
// type from outside precisely because no lint will.
//
// Constructing one still requires `OAuthConfig`, which stays unexported — so
// 0.8.0's decision (consumers reach OAuth through a composition root, never
// the raw client) is intact. Nameable is not the same as constructible, and
// only the first is needed here.
pub use AuthClient;
// Renewing TokenSource (G3 / RTR).
pub use ;
// `Url` is consumer-facing via `Config::new(client_id, redirect_uri: Url, ...)`
// and `Discovery::for_test`. Re-exported so consumers reach the same `url`
// crate version the SDK uses without separately tracking it in their
// Cargo.toml.
pub use Url;