From 842611754debec7d1814e44e6a2cf302e84c0d66 Mon Sep 17 00:00:00 2001 From: Dustin Mierau Date: Wed, 22 May 2024 17:35:01 -0700 Subject: Support for drag and drop of old Hotline Bookmark files onto the Servers window. --- Hotline/Application-macOS.swift | 3 +++ Hotline/Info.plist | 35 +++++++++++++++++++++++++++ Hotline/Models/Bookmark.swift | 39 ++++++++++++++++++++++++++++++ Hotline/Utility/FoundationExtensions.swift | 30 +++++++++++++++++++++++ Hotline/macOS/TrackerView.swift | 29 ++++++++++++++++++++++ 5 files changed, 136 insertions(+) diff --git a/Hotline/Application-macOS.swift b/Hotline/Application-macOS.swift index 9aec187..016cb60 100644 --- a/Hotline/Application-macOS.swift +++ b/Hotline/Application-macOS.swift @@ -22,6 +22,9 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_ notification: Notification) { AppLaunchState.shared.launchState = .launched + let blah = NSFileTypeForHFSTypeCode("HTbm".fourCharCode()) + print("FILETYPE: \(blah)", blah!, "'HTbm'") + CKContainer.default().accountStatus { status, error in switch status { case .noAccount: diff --git a/Hotline/Info.plist b/Hotline/Info.plist index 8b58335..ac7a2c9 100644 --- a/Hotline/Info.plist +++ b/Hotline/Info.plist @@ -2,6 +2,19 @@ + CFBundleDocumentTypes + + + CFBundleTypeName + Hotline Bookmark + LSHandlerRank + Alternate + LSItemContentTypes + + 'HTbm' + + + CFBundleURLTypes @@ -25,5 +38,27 @@ + UTImportedTypeDeclarations + + + UTTypeConformsTo + + UTTypeDescription + Hotline Bookmark + UTTypeIconFiles + + UTTypeIdentifier + 'HTbm' + UTTypeTagSpecification + + public.filename-extension + + .htbm + + public.mime-type + + + + diff --git a/Hotline/Models/Bookmark.swift b/Hotline/Models/Bookmark.swift index c713bb0..234a196 100644 --- a/Hotline/Models/Bookmark.swift +++ b/Hotline/Models/Bookmark.swift @@ -96,6 +96,45 @@ final class Bookmark { self.serverDescription = server.description } + init?(fileURL bookmarkFileURL: URL) { + guard let fileAttributes = try? FileManager.default.attributesOfItem(atPath: bookmarkFileURL.path(percentEncoded: false)), + let fileSize = fileAttributes[FileAttributeKey.size] as? UInt64, + fileSize <= 2000, + let fileData = try? Data(contentsOf: bookmarkFileURL) else { + return nil + } + + print("Bookmark: Parsing Hotline bookmark file...") + + var fileDataArray: [UInt8] = [UInt8](fileData) + + guard let headerValue = fileDataArray.consumeUInt32(), + headerValue.fourCharCode() == "HTsc", + let versionNumber = fileDataArray.consumeUInt16(), + versionNumber == 1, + fileDataArray.consume(128), // Skip 128 reserved bytes. + let loginLength = fileDataArray.consumeUInt16(), + let loginData: Data = fileDataArray.consumeBytes(32), + let passwordLength = fileDataArray.consumeUInt16(), + let passwordData: Data = fileDataArray.consumeBytes(32), + let addressLength = fileDataArray.consumeUInt16(), + let addressData: Data = fileDataArray.consumeBytes(256), + let addressString = String(data: addressData[0.. String? { + let (str, len) = self.readLongPString(at: 0) + guard let str = str else { + return nil + } + if len == 0 { + return "" + } + + self.removeFirst(len) + return str + } + mutating func consumeString(_ length: Int) -> String? { guard let val = self.readString(at: 0, length: length) else { return nil @@ -388,6 +401,23 @@ extension Array where Element == UInt8 { mutating func appendData(_ data: [UInt8]) { self.append(contentsOf: data) } + + mutating func hotlineEncrypt() { + for i in (0.. [UInt8] { + var cpy = [UInt8](self) + + + + for i in (0..