forked from agl/pond
/
erasure_linux.go
115 lines (103 loc) · 2.95 KB
/
erasure_linux.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
package main
import (
"fmt"
"time"
"github.com/agl/pond/client/disk"
"github.com/agl/pond/client/tpm"
)
func (c *guiClient) createErasureStorage(pw string, stateFile *disk.StateFile) error {
var tpmInfo string
present := tpm.Present()
if present {
tpmInfo = "Your computer appears to have a TPM chip. Click below to try and use it. You'll need tcsd (the TPM daemon) running."
} else {
tpmInfo = "Your computer does not appear to have a TPM chip. Without one, it's possible that someone in physical possession of your computer and passphrase could extract old messages that should have been deleted. Using a computer with a TPM is strongly preferable until alternatives can be implemented."
}
ui := VBox{
widgetBase: widgetBase{padding: 40, expand: true, fill: true, name: "vbox"},
children: []Widget{
Label{
widgetBase: widgetBase{font: "DejaVu Sans 30"},
text: "Configure TPM",
},
Label{
widgetBase: widgetBase{
padding: 20,
font: "DejaVu Sans 14",
},
text: "It's very difficult to erase information on modern computers so Pond tries to use the TPM chip if possible.\n\n" + tpmInfo,
wrap: 600,
},
HBox{
children: []Widget{
Button{
widgetBase: widgetBase{
name: "tpm",
insensitive: !present,
},
text: "Try to configure TPM",
},
},
},
TextView{
widgetBase: widgetBase{name: "log", expand: true, fill: true},
editable: false,
},
Button{
widgetBase: widgetBase{name: "continue"},
text: "Continue without TPM",
},
},
}
c.gui.Actions() <- SetBoxContents{name: "body", child: ui}
c.gui.Actions() <- SetFocus{name: "tpm"}
c.gui.Actions() <- UIState{uiStateErasureStorage}
c.gui.Signal()
var logText string
tpm := disk.TPM{
Log: func(format string, args ...interface{}) {
c.log.Printf(format, args...)
logText += fmt.Sprintf(format, args...) + "\n"
c.gui.Actions() <- SetTextView{name: "log", text: logText}
c.gui.Signal()
},
Rand: c.rand,
}
NextEvent:
for {
event, ok := <-c.gui.Events()
if !ok {
c.ShutdownAndSuspend()
}
click, ok := event.(Click)
if !ok {
continue
}
switch click.name {
case "continue":
stateFile.Erasure = nil
return stateFile.Create(pw)
case "tpm":
if len(logText) > 0 {
c.gui.Actions() <- SetTextView{name: "log", text: ""}
c.gui.Signal()
logText = ""
time.Sleep(300 * time.Millisecond)
}
stateFile.Erasure = &tpm
c.gui.Actions() <- Sensitive{name: "tpm", sensitive: false}
c.gui.Actions() <- Sensitive{name: "continue", sensitive: false}
c.gui.Signal()
if err := stateFile.Create(pw); err != nil {
tpm.Log("Setup failed with error: %s", err)
tpm.Log("You can click the button to try again")
c.gui.Actions() <- Sensitive{name: "tpm", sensitive: true}
c.gui.Actions() <- Sensitive{name: "continue", sensitive: true}
c.gui.Signal()
continue NextEvent
}
return nil
}
}
panic("unreachable")
}