90 lines · 3.1 KB · Swift
RawDownload
import Foundation public enum TokenAccountInjection: Sendable {    case cookieHeader    case environment(key: String)} public struct TokenAccountSupport: Sendable {    public let title: String    public let subtitle: String    public let placeholder: String    public let injection: TokenAccountInjection    public let requiresManualCookieSource: Bool    public let cookieName: String?     public init(        title: String,        subtitle: String,        placeholder: String,        injection: TokenAccountInjection,        requiresManualCookieSource: Bool,        cookieName: String?)    {        self.title = title        self.subtitle = subtitle        self.placeholder = placeholder        self.injection = injection        self.requiresManualCookieSource = requiresManualCookieSource        self.cookieName = cookieName    }} public enum TokenAccountSupportCatalog {    public static func support(for provider: UsageProvider) -> TokenAccountSupport? {        supportByProvider[provider]    }     public static func envOverride(for provider: UsageProvider, token: String) -> [String: String]? {        guard let support = self.support(for: provider) else { return nil }        switch support.injection {        case let .environment(key):            return [key: token]        case .cookieHeader:            if provider == .claude,               let normalized = self.normalizedClaudeOAuthToken(token),               self.isClaudeOAuthToken(normalized)            {                return [ClaudeOAuthCredentialsStore.environmentTokenKey: normalized]            }            return nil        }    }     public static func normalizedCookieHeader(for provider: UsageProvider, token: String) -> String {        guard let support = self.support(for: provider) else {            return token.trimmingCharacters(in: .whitespacesAndNewlines)        }        return self.normalizedCookieHeader(token, support: support)    }     public static func isClaudeOAuthToken(_ token: String) -> Bool {        guard let trimmed = self.normalizedClaudeOAuthToken(token) else { return false }        let lower = trimmed.lowercased()        if lower.contains("cookie:") || trimmed.contains("=") {            return false        }        return lower.hasPrefix("sk-ant-oat")    }     private static func normalizedClaudeOAuthToken(_ token: String) -> String? {        let trimmed = token.trimmingCharacters(in: .whitespacesAndNewlines)        guard !trimmed.isEmpty else { return nil }        let lower = trimmed.lowercased()        if lower.hasPrefix("bearer ") {            return trimmed.dropFirst("bearer ".count)                .trimmingCharacters(in: .whitespacesAndNewlines)        }        return trimmed    }     public static func normalizedCookieHeader(_ token: String, support: TokenAccountSupport) -> String {        let trimmed = token.trimmingCharacters(in: .whitespacesAndNewlines)        guard let cookieName = support.cookieName else { return trimmed }        let lower = trimmed.lowercased()        if lower.contains("cookie:") || trimmed.contains("=") {            return trimmed        }        return "\(cookieName)=\(trimmed)"    }}