mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 21:33:26 +00:00
Fixes #225 - Use a properly defined user agent
* Set a proper user agent * Add fallback when UA comes out nil * Remove unused Bundle extension * Return nil when asciification fails * Add whitespace handling and further emoji test case * Explicitly check if string is already in ASCII * Rename factory to builder * Use allSatisfy instead of reduce * Use key path syntax
This commit is contained in:
@@ -51,4 +51,22 @@ extension String {
|
||||
}
|
||||
return abs(hash)
|
||||
}
|
||||
|
||||
var isASCII: Bool {
|
||||
allSatisfy(\.isASCII)
|
||||
}
|
||||
|
||||
func asciified() -> String? {
|
||||
guard !isASCII else {
|
||||
return self
|
||||
}
|
||||
guard !canBeConverted(to: .ascii) else {
|
||||
return nil
|
||||
}
|
||||
let mutableString = NSMutableString(string: self)
|
||||
guard CFStringTransform(mutableString, nil, "Any-Latin; Latin-ASCII; [:^ASCII:] Remove" as CFString, false) else {
|
||||
return nil
|
||||
}
|
||||
return mutableString.trimmingCharacters(in: .whitespaces)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
#if !os(OSX)
|
||||
import DeviceKit
|
||||
#endif
|
||||
|
||||
final class UserAgentBuilder {
|
||||
class func makeASCIIUserAgent() -> String? {
|
||||
makeUserAgent()?.asciified()
|
||||
}
|
||||
|
||||
private class func makeUserAgent() -> String? {
|
||||
let clientName = ElementInfoPlist.cfBundleDisplayName
|
||||
let clientVersion = ElementInfoPlist.cfBundleShortVersionString
|
||||
|
||||
#if os(iOS)
|
||||
return String(
|
||||
format: "%@/%@ (%@; iOS %@; Scale/%0.2f)",
|
||||
clientName,
|
||||
clientVersion,
|
||||
Device.current.safeDescription,
|
||||
UIDevice.current.systemVersion,
|
||||
UIScreen.main.scale
|
||||
)
|
||||
#elseif os(tvOS)
|
||||
return String(
|
||||
format: "%@/%@ (%@; tvOS %@; Scale/%0.2f)",
|
||||
clientName,
|
||||
clientVersion,
|
||||
Device.current.safeDescription,
|
||||
UIDevice.current.systemVersion,
|
||||
UIScreen.main.scale
|
||||
)
|
||||
#elseif os(watchOS)
|
||||
return String(
|
||||
format: "%@/%@ (%@; watchOS %@; Scale/%0.2f)",
|
||||
clientName,
|
||||
clientVersion,
|
||||
Device.current.safeDescription,
|
||||
WKInterfaceDevice.current.systemVersion,
|
||||
WKInterfaceDevice.currentDevice.screenScale
|
||||
)
|
||||
#elseif os(OSX)
|
||||
return String(
|
||||
format: "%@/%@ (Mac; Mac OS X %@)",
|
||||
clientName,
|
||||
clientVersion,
|
||||
NSProcessInfo.processInfo.operatingSystemVersionString
|
||||
)
|
||||
#else
|
||||
return nil
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -109,7 +109,8 @@ class UserSessionStore: UserSessionStoreProtocol {
|
||||
let builder = ClientBuilder()
|
||||
.basePath(path: baseDirectory.path)
|
||||
.username(username: credentials.userID)
|
||||
|
||||
.userAgent(userAgent: UserAgentBuilder.makeASCIIUserAgent() ?? "unknown")
|
||||
|
||||
do {
|
||||
let client: Client = try await Task.dispatch(on: .global()) {
|
||||
let client = try builder.build()
|
||||
|
||||
Reference in New Issue
Block a user