- Notifications
You must be signed in to change notification settings - Fork 300
/
Copy pathBrowserExtension.swift
101 lines (83 loc) · 2.99 KB
/
BrowserExtension.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
import CheetahIPC
classBrowserExtensionState:JSONHandler<BrowserExtensionMessage>{
@Publishedvarmode:String?
@Publishedvarfiles=[String: String]()
@Publishedvarlogs=[String: String]()
varnavigationStart=0
varlastUpdate:Date?
publicinit(){
super.init(respondsTo:IPCMessage.browserExtensionMessage)
handler ={
guardlet message = $0 else{
returnnil
}
if message.navigationStart >self.navigationStart {
self.navigationStart = message.navigationStart
self.files.removeAll()
self.logs.removeAll()
}
letnewMode= message.mode
if newMode !=self.mode {
self.mode = newMode
self.files.removeAll()
self.logs.removeAll()
}
for(name, content)in message.files {
self.files[name]= content
}
for(name, content)in message.logs {
self.logs[name]= content
}
ifself.lastUpdate ==nil{
print("BrowserExtensionState: first message was received!")
}
self.lastUpdate =Date.now
returnnil
}
}
varcodeDescription:String{
if files.isEmpty {
return"N/A"
}else{
return files
.map{ name, content in"[\(name)]\n\(content)"}
.joined(separator:"\n\n")
}
}
varlogsDescription:String{
if logs.isEmpty {
return"N/A"
}else{
return logs
.map{ name, content in
letrecentLines= content.split(separator:"\n").suffix(20).joined(separator:"\n")
return"[\(name)]\n\(recentLines)"
}
.joined(separator:"\n\n")
}
}
}
structNativeMessagingManifest:Codable{
enum`Type`:String,Codable{
case stdio
}
letname:String
letdescription:String
letpath:String
lettype:`Type`
letallowedExtensions:[String]
}
func installNativeMessagingManifest()throws->Bool{
letmanifest=NativeMessagingManifest(
name:"cheetah",
description:"Cheetah Extension",
path:Bundle.main.path(forAuxiliaryExecutable:"ExtensionHelper")!,
type:.stdio,
allowedExtensions:["cheetah@phrack.org"])
letpath=FileManager.default.homeDirectoryForCurrentUser.appending(path:"Library/Application Support/Mozilla/NativeMessagingHosts/cheetah.json").absoluteURL.path
print("Installing native messaging manifest at \(path)")
letencoder=JSONEncoder()
encoder.keyEncodingStrategy =.convertToSnakeCase
letcontents=try encoder.encode(manifest)
returnFileManager.default.createFile(atPath: path, contents: contents)
}