99 lines
3.4 KiB
Swift
99 lines
3.4 KiB
Swift
import Foundation
|
|
|
|
public struct KimiCookieOverride: Sendable {
|
|
public let token: String
|
|
|
|
public init(token: String) {
|
|
self.token = token
|
|
}
|
|
}
|
|
|
|
public enum KimiCookieHeader {
|
|
private static let log = CodexBarLog.logger(LogCategories.kimiCookie)
|
|
private static let headerPatterns: [String] = [
|
|
#"(?i)kimi-auth=([A-Za-z0-9._\-+=/]+)"#,
|
|
#"(?i)-H\s*'Cookie:\s*([^']+)'"#,
|
|
#"(?i)-H\s*"Cookie:\s*([^"]+)""#,
|
|
#"(?i)\bcookie:\s*'([^']+)'"#,
|
|
#"(?i)\bcookie:\s*"([^"]+)""#,
|
|
#"(?i)\bcookie:\s*([^\r\n]+)"#,
|
|
]
|
|
|
|
public static func resolveCookieOverride(context: ProviderFetchContext) -> KimiCookieOverride? {
|
|
if let settings = context.settings?.kimi, settings.cookieSource == .manual {
|
|
if let manual = settings.manualCookieHeader, !manual.isEmpty {
|
|
return self.override(from: manual)
|
|
}
|
|
}
|
|
|
|
if let envToken = self.override(from: context.env["KIMI_MANUAL_COOKIE"]) {
|
|
return envToken
|
|
}
|
|
if let envToken = self.override(from: context.env["KIMI_AUTH_TOKEN"]) {
|
|
return envToken
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
public static func override(from raw: String?) -> KimiCookieOverride? {
|
|
guard let raw = raw?.trimmingCharacters(in: .whitespacesAndNewlines), !raw.isEmpty else {
|
|
return nil
|
|
}
|
|
|
|
if let token = self.extractKIMAuthToken(from: raw) {
|
|
return KimiCookieOverride(token: token)
|
|
}
|
|
|
|
if let cookieHeader = self.extractHeader(from: raw),
|
|
let token = self.extractKIMAuthToken(from: cookieHeader)
|
|
{
|
|
return KimiCookieOverride(token: token)
|
|
}
|
|
|
|
if raw.hasPrefix("eyJ"), raw.split(separator: ".").count == 3 {
|
|
return KimiCookieOverride(token: raw)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
private static func extractKIMAuthToken(from raw: String) -> String? {
|
|
let patterns = [
|
|
#"(?i)kimi-auth=([A-Za-z0-9._\-+=/]+)"#,
|
|
#"(?i)kimi-auth:\s*([A-Za-z0-9._\-+=/]+)"#,
|
|
]
|
|
|
|
for pattern in patterns {
|
|
guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else { continue }
|
|
let range = NSRange(raw.startIndex..<raw.endIndex, in: raw)
|
|
guard let match = regex.firstMatch(in: raw, options: [], range: range),
|
|
match.numberOfRanges >= 2,
|
|
let captureRange = Range(match.range(at: 1), in: raw)
|
|
else {
|
|
continue
|
|
}
|
|
let token = String(raw[captureRange]).trimmingCharacters(in: .whitespacesAndNewlines)
|
|
if !token.isEmpty { return token }
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
private static func extractHeader(from raw: String) -> String? {
|
|
for pattern in self.headerPatterns {
|
|
guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else { continue }
|
|
let range = NSRange(raw.startIndex..<raw.endIndex, in: raw)
|
|
guard let match = regex.firstMatch(in: raw, options: [], range: range),
|
|
match.numberOfRanges >= 2,
|
|
let captureRange = Range(match.range(at: 1), in: raw)
|
|
else {
|
|
continue
|
|
}
|
|
let captured = String(raw[captureRange]).trimmingCharacters(in: .whitespacesAndNewlines)
|
|
if !captured.isEmpty { return captured }
|
|
}
|
|
return nil
|
|
}
|
|
}
|