From 4f70d01dd6830ec12dc8e378d5091227fa6305f3 Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Fri, 28 Apr 2023 18:02:57 +0400 Subject: [PATCH] Set User-Agent header for OCI HTTP requests (#478) * Set User-Agent header for OCI HTTP requests * IORegistry value is actually a NUL-terminated C string * Use sysctl instead of IOKit --- Package.resolved | 9 ++++++ Package.swift | 2 ++ Sources/tart/DeviceInfo/DeviceInfo.swift | 37 ++++++++++++++++++++++++ Sources/tart/OCI/Registry.swift | 3 ++ 4 files changed, 51 insertions(+) create mode 100644 Sources/tart/DeviceInfo/DeviceInfo.swift diff --git a/Package.resolved b/Package.resolved index 1a40b1f..9e87893 100644 --- a/Package.resolved +++ b/Package.resolved @@ -81,6 +81,15 @@ "version" : "1.0.2" } }, + { + "identity" : "swift-sysctl", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sersoft-gmbh/swift-sysctl.git", + "state" : { + "revision" : "71fd64ee84819bb19fbecfb36d5a4503726b6fb7", + "version" : "1.6.0" + } + }, { "identity" : "swiftdate", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index 4781d71..611766d 100644 --- a/Package.swift +++ b/Package.swift @@ -20,6 +20,7 @@ let package = Package( .package(url: "https://github.com/nicklockwood/SwiftFormat", from: "0.50.6"), .package(url: "https://github.com/getsentry/sentry-cocoa", from: "8.3.3"), .package(url: "https://github.com/cfilipov/TextTable", branch: "master"), + .package(url: "https://github.com/sersoft-gmbh/swift-sysctl.git", from: "1.0.0"), ], targets: [ .executableTarget(name: "tart", dependencies: [ @@ -32,6 +33,7 @@ let package = Package( .product(name: "Atomics", package: "swift-atomics"), .product(name: "Sentry", package: "sentry-cocoa"), .product(name: "TextTable", package: "TextTable"), + .product(name: "Sysctl", package: "swift-sysctl"), ], exclude: [ "OCI/Reference/Makefile", "OCI/Reference/Reference.g4", diff --git a/Sources/tart/DeviceInfo/DeviceInfo.swift b/Sources/tart/DeviceInfo/DeviceInfo.swift new file mode 100644 index 0000000..b0b3e28 --- /dev/null +++ b/Sources/tart/DeviceInfo/DeviceInfo.swift @@ -0,0 +1,37 @@ +import Foundation +import Sysctl + +class DeviceInfo { + private static var osMemoized: String? = nil + private static var modelMemoized: String? = nil + + static var os: String { + if let os = osMemoized { + return os + } + + osMemoized = getOS() + + return osMemoized! + } + + static var model: String { + if let model = modelMemoized { + return model + } + + modelMemoized = getModel() + + return modelMemoized! + } + + private static func getOS() -> String { + let osVersion = ProcessInfo.processInfo.operatingSystemVersion + + return "macOS \(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)" + } + + private static func getModel() -> String { + return SystemControl().hardware.model + } +} diff --git a/Sources/tart/OCI/Registry.swift b/Sources/tart/OCI/Registry.swift index d904660..1f3046a 100644 --- a/Sources/tart/OCI/Registry.swift +++ b/Sources/tart/OCI/Registry.swift @@ -387,6 +387,9 @@ class Registry { request.addValue(value, forHTTPHeaderField: name) } + request.setValue("Tart/\(CI.version) (\(DeviceInfo.os); \(DeviceInfo.model))", + forHTTPHeaderField: "User-Agent") + return try await Fetcher.fetch(request, viaFile: viaFile) } }