/
tccutil.go
149 lines (128 loc) · 2.78 KB
/
tccutil.go
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
package tccutil
import (
"bytes"
"database/sql"
"fmt"
"log"
"os/exec"
"strings"
version "github.com/hashicorp/go-version"
// Required to access to the TCC.db sqlite3 database
_ "github.com/mattn/go-sqlite3"
)
var ttc = "/Library/Application Support/com.apple.TCC/TCC.db"
// Client ...
type Client struct {
Name string
}
func getOSXVersion() string {
cmd := exec.Command("sw_vers", "-productVersion")
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
return strings.TrimSpace(out.String())
}
func initDB(filepath string) *sql.DB {
db, err := sql.Open("sqlite3", filepath)
if err != nil {
panic(err)
}
if db == nil {
panic("db nil")
}
return db
}
// ListClients ...
func ListClients() []Client {
db := initDB(ttc)
defer db.Close()
query := `
SELECT client from access
`
rows, err := db.Query(query)
if err != nil {
panic(err)
}
defer rows.Close()
var result []Client
for rows.Next() {
item := Client{}
err2 := rows.Scan(&item.Name)
if err2 != nil {
panic(err2)
}
result = append(result, item)
}
return result
}
// GetClient ...
func GetClient() {
}
func getQueryToInsertClient(client string) string {
localOSXVersion, err := version.NewVersion(getOSXVersion())
if err != nil {
log.Fatal(err)
}
osxVersion, err := version.NewVersion("10.11")
if err != nil {
log.Fatal(err)
}
var clientType int
if string(client[0]) == "/" {
clientType = 1
} else {
clientType = 0
}
var query string
if localOSXVersion.Equal(osxVersion) || localOSXVersion.GreaterThan(osxVersion) {
query = fmt.Sprintf("INSERT or REPLACE INTO access VALUES('kTCCServiceAccessibility','%s',%d,1,1,NULL,NULL)", client, clientType)
} else {
query = fmt.Sprintf("INSERT or REPLACE INTO access VALUES('kTCCServiceAccessibility','%s',%d,1,1,NULL)", client, clientType)
}
return query
}
// InsertClient ...
func InsertClient(client string) {
db := initDB(ttc)
defer db.Close()
query := getQueryToInsertClient(client)
_, err := db.Exec(query)
if err != nil {
log.Fatal(err)
}
}
// RemoveClient ...
func RemoveClient(client string) {
db := initDB(ttc)
defer db.Close()
query := fmt.Sprintf("DELETE from access where client IS '%s'", client)
_, err := db.Exec(query)
if err != nil {
log.Fatal(err)
}
}
// EnableClient ...
func EnableClient(client string) {
db := initDB(ttc)
defer db.Close()
query := fmt.Sprintf("UPDATE access SET allowed='1' WHERE client='%s'", client)
_, err := db.Exec(query)
if err != nil {
log.Fatal(err)
}
}
// DisableClient ...
func DisableClient(client string) {
db := initDB(ttc)
defer db.Close()
query := fmt.Sprintf("UPDATE access SET allowed='0' WHERE client='%s'", client)
_, err := db.Exec(query)
if err != nil {
log.Fatal(err)
}
}