summaryrefslogtreecommitdiff
path: root/crates/common/src/auth/oauth/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/common/src/auth/oauth/mod.rs')
-rw-r--r--crates/common/src/auth/oauth/mod.rs89
1 files changed, 31 insertions, 58 deletions
diff --git a/crates/common/src/auth/oauth/mod.rs b/crates/common/src/auth/oauth/mod.rs
index b58474e1..20078868 100644
--- a/crates/common/src/auth/oauth/mod.rs
+++ b/crates/common/src/auth/oauth/mod.rs
@@ -5,6 +5,7 @@
*/
pub mod crypto;
+pub mod introspect;
pub mod token;
pub const DEVICE_CODE_LEN: usize = 40;
@@ -14,68 +15,40 @@ pub const CLIENT_ID_MAX_LEN: usize = 20;
pub const USER_CODE_ALPHABET: &[u8] = b"ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // No 0, O, I, 1
-pub fn extract_oauth_bearer(bytes: &[u8]) -> Option<&str> {
- let mut start_pos = 0;
- let eof = bytes.len().saturating_sub(1);
-
- for (pos, ch) in bytes.iter().enumerate() {
- let is_separator = *ch == 1;
- if is_separator || pos == eof {
- if bytes
- .get(start_pos..start_pos + 12)
- .map_or(false, |s| s.eq_ignore_ascii_case(b"auth=Bearer "))
- {
- return bytes
- .get(start_pos + 12..if is_separator { pos } else { bytes.len() })
- .and_then(|s| std::str::from_utf8(s).ok());
- }
+#[derive(Debug, Clone, Copy, Eq, PartialEq)]
+pub enum GrantType {
+ AccessToken,
+ RefreshToken,
+ LiveTracing,
+ LiveMetrics,
+}
- start_pos = pos + 1;
+impl GrantType {
+ pub fn as_str(&self) -> &'static str {
+ match self {
+ GrantType::AccessToken => "access_token",
+ GrantType::RefreshToken => "refresh_token",
+ GrantType::LiveTracing => "live_tracing",
+ GrantType::LiveMetrics => "live_metrics",
}
}
- None
-}
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn test_extract_oauth_bearer() {
- let input = b"auth=Bearer validtoken";
- let result = extract_oauth_bearer(input);
- assert_eq!(result, Some("validtoken"));
-
- let input = b"auth=Invalid validtoken";
- let result = extract_oauth_bearer(input);
- assert_eq!(result, None);
-
- let input = b"auth=Bearer";
- let result = extract_oauth_bearer(input);
- assert_eq!(result, None);
-
- let input = b"";
- let result = extract_oauth_bearer(input);
- assert_eq!(result, None);
-
- let input = b"auth=Bearer token1\x01auth=Bearer token2";
- let result = extract_oauth_bearer(input);
- assert_eq!(result, Some("token1"));
-
- let input = b"auth=Bearer VALIDTOKEN";
- let result = extract_oauth_bearer(input);
- assert_eq!(result, Some("VALIDTOKEN"));
-
- let input = b"auth=Bearer token with spaces";
- let result = extract_oauth_bearer(input);
- assert_eq!(result, Some("token with spaces"));
-
- let input = b"auth=Bearer token_with_special_chars!@#";
- let result = extract_oauth_bearer(input);
- assert_eq!(result, Some("token_with_special_chars!@#"));
+ pub fn id(&self) -> u8 {
+ match self {
+ GrantType::AccessToken => 0,
+ GrantType::RefreshToken => 1,
+ GrantType::LiveTracing => 2,
+ GrantType::LiveMetrics => 3,
+ }
+ }
- let input = "n,a=user@example.com,\x01host=server.example.com\x01port=143\x01auth=Bearer vF9dft4qmTc2Nvb3RlckBhbHRhdmlzdGEuY29tCg==\x01\x01";
- let result = extract_oauth_bearer(input.as_bytes());
- assert_eq!(result, Some("vF9dft4qmTc2Nvb3RlckBhbHRhdmlzdGEuY29tCg=="));
+ pub fn from_id(id: u8) -> Option<Self> {
+ match id {
+ 0 => Some(GrantType::AccessToken),
+ 1 => Some(GrantType::RefreshToken),
+ 2 => Some(GrantType::LiveTracing),
+ 3 => Some(GrantType::LiveMetrics),
+ _ => None,
+ }
}
}