-
Notifications
You must be signed in to change notification settings - Fork 27
/
DefaultsOverride.swift
199 lines (154 loc) · 6.13 KB
/
DefaultsOverride.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
//
// DefaultsOverride.swift
// XCreds
//
// Created by Timothy Perfitt on 5/21/23.
//
import Cocoa
public class DefaultsOverride: UserDefaults {
static let standardOverride = DefaultsOverride()
private override init?(suiteName suitename: String?) {
TCSLogWithMark()
super.init(suiteName: suitename)
self.refreshCachedPrefs()
}
private convenience init() {
TCSLogWithMark()
self.init(suiteName: nil)!
}
var cachedPrefs=Dictionary<String, Any>()
@objc func refreshCachedPrefs() {
TCSLogWithMark()
cachedPrefs=Dictionary()
let prefScriptPath = UserDefaults.standard.string(forKey: PrefKeys.settingsOverrideScriptPath.rawValue)
guard let prefScriptPath = prefScriptPath else {
TCSLogWithMark("no override defined")
return
}
TCSLogErrorWithMark("Pref script defined at \(prefScriptPath)")
if FileManager.default.fileExists(atPath:prefScriptPath)==false{
TCSLogErrorWithMark("Pref script defined but does not exist")
return
}
do {
let attributes = try FileManager.default.attributesOfItem(atPath: prefScriptPath)
if FileManager.default.isExecutableFile(atPath: prefScriptPath) == false {
TCSLogErrorWithMark("override script is not executable")
return
}
guard let ownerID=attributes[.ownerAccountID] as? NSNumber else {
TCSLogErrorWithMark("Could not get owner id")
return
}
guard let permission = attributes[.posixPermissions] as? NSNumber else
{
TCSLogErrorWithMark("Could not get permission")
return
}
if ownerID.uintValue != 92 {
TCSLogErrorWithMark("override script is not owned by _securityagent. not running: \(ownerID.debugDescription)")
return
}
let unixPermissions = permission.int16Value
if unixPermissions & 0x3f != 0 {
TCSLogErrorWithMark("override script cannot be accessible by anyone besides _securityagent. not running: \(unixPermissions)")
return
}
let scriptRes=cliTask(prefScriptPath)
if scriptRes.count==0{
TCSLogErrorWithMark("script did not return anything")
return
}
TCSLogWithMark()
guard let rawData = scriptRes.data(using: .utf8) else {
TCSLogErrorWithMark("could not convert raw data");
return
}
var format: PropertyListSerialization.PropertyListFormat = .xml
TCSLogWithMark()
do {
TCSLogWithMark()
/*
guard let propertyListObject = try PropertyListSerialization.propertyList(from: rawData, options: [], format: &format) else {
TCSLogErrorWithMark("could not turn to plist")
return
}
*/
let propertyListObject = try PropertyListSerialization.propertyList(from: rawData, options: [], format: &format)
if let propertyListObject = propertyListObject as? [String: Any] {
cachedPrefs=propertyListObject
}
else {
TCSLogWithMark("Could not convert to plist")
}
} catch {
TCSLogErrorWithMark("Error converting script to property list: \(scriptRes)")
return
}
TCSLogWithMark()
}
catch {
TCSLogErrorWithMark(error.localizedDescription)
}
}
override public func string(forKey defaultName: String) -> String? {
if let defaultName = cachedPrefs[defaultName] as? String{
return defaultName
}
return UserDefaults.standard.string(forKey: defaultName)
}
override public func object(forKey defaultName: String) -> Any? {
if let defaultName = cachedPrefs[defaultName]{
return defaultName
}
return UserDefaults.standard.object(forKey: defaultName)
}
override public func array(forKey defaultName: String) -> [Any]? {
TCSLogWithMark()
if let defaultName = cachedPrefs[defaultName] as? [Any]{
return defaultName
}
return UserDefaults.standard.array(forKey: defaultName)
}
override public func data(forKey defaultName: String) -> Data? {
TCSLogWithMark()
if let defaultName = cachedPrefs[defaultName] as? Data {
return defaultName
}
return UserDefaults.standard.data(forKey: defaultName)
}
override public func integer(forKey defaultName: String) -> Int {
TCSLogWithMark()
if let defaultName = cachedPrefs[defaultName] as? Int {
return defaultName
}
return UserDefaults.standard.integer(forKey: defaultName)
}
override public func float(forKey defaultName: String) -> Float {
TCSLogWithMark()
if let defaultName = cachedPrefs[defaultName] as? Float {
return defaultName
}
return UserDefaults.standard.float(forKey: defaultName)
}
override public func double(forKey defaultName: String) -> Double {
if let defaultName = cachedPrefs[defaultName] as? Double {
return defaultName
}
return UserDefaults.standard.double(forKey: defaultName)
}
override public func bool(forKey defaultName: String) -> Bool {
if let defaultName = cachedPrefs[defaultName] as? Bool {
TCSLogWithMark("override value \(defaultName)")
return defaultName
}
return UserDefaults.standard.bool(forKey: defaultName)
}
override public func url(forKey defaultName: String) -> URL? {
TCSLogWithMark()
if let defaultName = cachedPrefs[defaultName] as? URL {
return defaultName
}
return UserDefaults.standard.url(forKey: defaultName)
}
}