ssh-hull 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +44 -0
  3. data/.gitignore +27 -0
  4. data/.rubocop.yml +62 -0
  5. data/.tool-versions +1 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +142 -0
  8. data/LICENSE +19 -0
  9. data/README.md +12 -0
  10. data/Rakefile +7 -0
  11. data/bin/bundle +114 -0
  12. data/bin/rake +29 -0
  13. data/bin/rspec +29 -0
  14. data/bin/rubocop +29 -0
  15. data/bomb +12 -0
  16. data/config/locales/en.yml +71 -0
  17. data/config/locales/fr.yml +71 -0
  18. data/exe/ssh-hull +12 -0
  19. data/exe/ssh-tunnel +1 -0
  20. data/lib/ssh-hull/cli.rb +113 -0
  21. data/lib/ssh-hull/logger.rb +6 -0
  22. data/lib/ssh-hull/ui/application.rb +47 -0
  23. data/lib/ssh-hull/ui/forms/application_form.rb +69 -0
  24. data/lib/ssh-hull/ui/forms/host_form.rb +27 -0
  25. data/lib/ssh-hull/ui/forms/tunnel_form.rb +31 -0
  26. data/lib/ssh-hull/ui/helpers/application_window_helper.rb +233 -0
  27. data/lib/ssh-hull/ui/helpers/common/form_helper.rb +169 -0
  28. data/lib/ssh-hull/ui/helpers/common/minimize_helper.rb +46 -0
  29. data/lib/ssh-hull/ui/helpers/common/modal_helper.rb +43 -0
  30. data/lib/ssh-hull/ui/helpers/common/toolbar_helper.rb +106 -0
  31. data/lib/ssh-hull/ui/helpers/common/translation_helper.rb +18 -0
  32. data/lib/ssh-hull/ui/helpers/common/tree_view_helper.rb +40 -0
  33. data/lib/ssh-hull/ui/helpers/host_window_helper.rb +230 -0
  34. data/lib/ssh-hull/ui/helpers/tunnel_window_helper.rb +96 -0
  35. data/lib/ssh-hull/ui/models/config.rb +82 -0
  36. data/lib/ssh-hull/ui/models/host.rb +90 -0
  37. data/lib/ssh-hull/ui/models/tunnel.rb +118 -0
  38. data/lib/ssh-hull/ui/status_icon.rb +45 -0
  39. data/lib/ssh-hull/ui/windows/about_window.rb +32 -0
  40. data/lib/ssh-hull/ui/windows/application_window.rb +42 -0
  41. data/lib/ssh-hull/ui/windows/hosts/delete_window.rb +56 -0
  42. data/lib/ssh-hull/ui/windows/hosts/edit_window.rb +39 -0
  43. data/lib/ssh-hull/ui/windows/hosts/new_window.rb +45 -0
  44. data/lib/ssh-hull/ui/windows/tunnels/delete_window.rb +57 -0
  45. data/lib/ssh-hull/ui/windows/tunnels/edit_window.rb +39 -0
  46. data/lib/ssh-hull/ui/windows/tunnels/new_window.rb +45 -0
  47. data/lib/ssh-hull/version.rb +17 -0
  48. data/lib/ssh-tunnel.rb +94 -0
  49. data/resources/gresources.xml +13 -0
  50. data/resources/ui/about_window.glade +48 -0
  51. data/resources/ui/application_window.glade +196 -0
  52. data/resources/ui/hosts/delete_window.glade +74 -0
  53. data/resources/ui/hosts/edit_window.glade +331 -0
  54. data/resources/ui/hosts/new_window.glade +328 -0
  55. data/resources/ui/tunnels/delete_window.glade +73 -0
  56. data/resources/ui/tunnels/edit_window.glade +305 -0
  57. data/resources/ui/tunnels/new_window.glade +305 -0
  58. data/snap/snapcraft.yaml +48 -0
  59. data/spec/factories/host.rb +22 -0
  60. data/spec/factories/tunnel.rb +16 -0
  61. data/spec/spec_helper.rb +31 -0
  62. data/spec/ssh_tunnel/ui/forms/host_form_spec.rb +103 -0
  63. data/spec/ssh_tunnel/ui/forms/tunnel_form_spec.rb +132 -0
  64. data/spec/ssh_tunnel/ui/models/host_spec.rb +116 -0
  65. data/spec/ssh_tunnel/ui/models/tunnel_spec.rb +43 -0
  66. data/spec/ssh_tunnel_spec.rb +45 -0
  67. data/ssh-hull.gemspec +38 -0
  68. metadata +320 -0
@@ -0,0 +1,331 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Generated with glade 3.38.2 -->
3
+ <interface>
4
+ <requires lib="gtk+" version="3.18"/>
5
+ <template class="SSHTunnelUIWindowsHostsEditWindow" parent="GtkWindow">
6
+ <property name="visible">True</property>
7
+ <property name="can-focus">False</property>
8
+ <property name="type">popup</property>
9
+ <property name="modal">True</property>
10
+ <property name="window-position">center</property>
11
+ <property name="default-width">800</property>
12
+ <property name="default-height">600</property>
13
+ <property name="type-hint">dialog</property>
14
+ <property name="skip-taskbar-hint">True</property>
15
+ <property name="gravity">center</property>
16
+ <child>
17
+ <object class="GtkBox">
18
+ <property name="visible">True</property>
19
+ <property name="can-focus">False</property>
20
+ <property name="orientation">vertical</property>
21
+ <child>
22
+ <!-- n-columns=3 n-rows=5 -->
23
+ <object class="GtkGrid">
24
+ <property name="visible">True</property>
25
+ <property name="can-focus">False</property>
26
+ <property name="margin-top">10</property>
27
+ <property name="margin-bottom">10</property>
28
+ <child>
29
+ <object class="GtkLabel" id="label_name">
30
+ <property name="visible">True</property>
31
+ <property name="can-focus">False</property>
32
+ <property name="halign">start</property>
33
+ <property name="margin-start">10</property>
34
+ <property name="margin-end">10</property>
35
+ <property name="margin-top">3</property>
36
+ <property name="margin-bottom">5</property>
37
+ <property name="label" translatable="yes">Name</property>
38
+ </object>
39
+ <packing>
40
+ <property name="left-attach">0</property>
41
+ <property name="top-attach">0</property>
42
+ </packing>
43
+ </child>
44
+ <child>
45
+ <object class="GtkEntry" id="input_name">
46
+ <property name="visible">True</property>
47
+ <property name="can-focus">True</property>
48
+ <property name="margin-end">10</property>
49
+ <property name="margin-top">3</property>
50
+ <property name="margin-bottom">5</property>
51
+ <property name="hexpand">True</property>
52
+ </object>
53
+ <packing>
54
+ <property name="left-attach">1</property>
55
+ <property name="top-attach">0</property>
56
+ </packing>
57
+ </child>
58
+ <child>
59
+ <object class="GtkLabel" id="label_user">
60
+ <property name="visible">True</property>
61
+ <property name="can-focus">False</property>
62
+ <property name="halign">start</property>
63
+ <property name="margin-start">10</property>
64
+ <property name="margin-end">10</property>
65
+ <property name="margin-top">5</property>
66
+ <property name="margin-bottom">5</property>
67
+ <property name="label" translatable="yes">User</property>
68
+ </object>
69
+ <packing>
70
+ <property name="left-attach">0</property>
71
+ <property name="top-attach">1</property>
72
+ </packing>
73
+ </child>
74
+ <child>
75
+ <object class="GtkEntry" id="input_user">
76
+ <property name="visible">True</property>
77
+ <property name="can-focus">True</property>
78
+ <property name="margin-end">10</property>
79
+ <property name="margin-top">5</property>
80
+ <property name="margin-bottom">5</property>
81
+ <property name="hexpand">True</property>
82
+ </object>
83
+ <packing>
84
+ <property name="left-attach">1</property>
85
+ <property name="top-attach">1</property>
86
+ </packing>
87
+ </child>
88
+ <child>
89
+ <object class="GtkLabel" id="label_host">
90
+ <property name="visible">True</property>
91
+ <property name="can-focus">False</property>
92
+ <property name="halign">start</property>
93
+ <property name="margin-start">10</property>
94
+ <property name="margin-end">10</property>
95
+ <property name="margin-top">5</property>
96
+ <property name="margin-bottom">5</property>
97
+ <property name="label" translatable="yes">Host</property>
98
+ </object>
99
+ <packing>
100
+ <property name="left-attach">0</property>
101
+ <property name="top-attach">2</property>
102
+ </packing>
103
+ </child>
104
+ <child>
105
+ <object class="GtkEntry" id="input_host">
106
+ <property name="visible">True</property>
107
+ <property name="can-focus">True</property>
108
+ <property name="margin-end">10</property>
109
+ <property name="margin-top">5</property>
110
+ <property name="margin-bottom">5</property>
111
+ <property name="hexpand">True</property>
112
+ </object>
113
+ <packing>
114
+ <property name="left-attach">1</property>
115
+ <property name="top-attach">2</property>
116
+ </packing>
117
+ </child>
118
+ <child>
119
+ <object class="GtkLabel" id="label_port">
120
+ <property name="visible">True</property>
121
+ <property name="can-focus">False</property>
122
+ <property name="halign">start</property>
123
+ <property name="margin-start">10</property>
124
+ <property name="margin-end">10</property>
125
+ <property name="margin-top">5</property>
126
+ <property name="margin-bottom">5</property>
127
+ <property name="label" translatable="yes">Port</property>
128
+ </object>
129
+ <packing>
130
+ <property name="left-attach">0</property>
131
+ <property name="top-attach">3</property>
132
+ </packing>
133
+ </child>
134
+ <child>
135
+ <object class="GtkEntry" id="input_port">
136
+ <property name="visible">True</property>
137
+ <property name="can-focus">True</property>
138
+ <property name="margin-end">10</property>
139
+ <property name="margin-top">5</property>
140
+ <property name="margin-bottom">5</property>
141
+ <property name="hexpand">True</property>
142
+ </object>
143
+ <packing>
144
+ <property name="left-attach">1</property>
145
+ <property name="top-attach">3</property>
146
+ </packing>
147
+ </child>
148
+ <child>
149
+ <object class="GtkLabel" id="label_identity_file">
150
+ <property name="visible">True</property>
151
+ <property name="can-focus">False</property>
152
+ <property name="halign">start</property>
153
+ <property name="margin-start">10</property>
154
+ <property name="margin-end">10</property>
155
+ <property name="margin-top">5</property>
156
+ <property name="label" translatable="yes">Identity File</property>
157
+ </object>
158
+ <packing>
159
+ <property name="left-attach">0</property>
160
+ <property name="top-attach">4</property>
161
+ </packing>
162
+ </child>
163
+ <child>
164
+ <object class="GtkFileChooserButton" id="input_identity_file">
165
+ <property name="visible">True</property>
166
+ <property name="can-focus">False</property>
167
+ <property name="margin-end">10</property>
168
+ <property name="margin-top">5</property>
169
+ <property name="create-folders">False</property>
170
+ <property name="show-hidden">True</property>
171
+ <property name="title" translatable="yes"/>
172
+ </object>
173
+ <packing>
174
+ <property name="left-attach">1</property>
175
+ <property name="top-attach">4</property>
176
+ </packing>
177
+ </child>
178
+ <child>
179
+ <object class="GtkButton" id="button_reset_identity_file">
180
+ <property name="label" translatable="yes">button</property>
181
+ <property name="visible">True</property>
182
+ <property name="can-focus">True</property>
183
+ <property name="receives-default">True</property>
184
+ <property name="margin-end">10</property>
185
+ <property name="margin-top">5</property>
186
+ </object>
187
+ <packing>
188
+ <property name="left-attach">2</property>
189
+ <property name="top-attach">4</property>
190
+ </packing>
191
+ </child>
192
+ <child>
193
+ <placeholder/>
194
+ </child>
195
+ <child>
196
+ <placeholder/>
197
+ </child>
198
+ <child>
199
+ <placeholder/>
200
+ </child>
201
+ <child>
202
+ <placeholder/>
203
+ </child>
204
+ </object>
205
+ <packing>
206
+ <property name="expand">False</property>
207
+ <property name="fill">True</property>
208
+ <property name="position">0</property>
209
+ </packing>
210
+ </child>
211
+ <child>
212
+ <object class="GtkBox">
213
+ <property name="visible">True</property>
214
+ <property name="can-focus">False</property>
215
+ <property name="hexpand">True</property>
216
+ <property name="vexpand">True</property>
217
+ <child>
218
+ <object class="GtkScrolledWindow" id="tunnels_scrolled_window">
219
+ <property name="visible">True</property>
220
+ <property name="can-focus">True</property>
221
+ <property name="margin-left">9</property>
222
+ <property name="margin-bottom">10</property>
223
+ <property name="hexpand">True</property>
224
+ <property name="vexpand">True</property>
225
+ <property name="shadow-type">in</property>
226
+ <child>
227
+ <placeholder/>
228
+ </child>
229
+ </object>
230
+ <packing>
231
+ <property name="expand">False</property>
232
+ <property name="fill">True</property>
233
+ <property name="position">0</property>
234
+ </packing>
235
+ </child>
236
+ <child>
237
+ <object class="GtkToolbar">
238
+ <property name="visible">True</property>
239
+ <property name="can-focus">False</property>
240
+ <property name="orientation">vertical</property>
241
+ <child>
242
+ <object class="GtkToolButton" id="button_add">
243
+ <property name="visible">True</property>
244
+ <property name="can-focus">False</property>
245
+ <property name="tooltip-text" translatable="yes">Add Tunnel</property>
246
+ <property name="stock-id">gtk-add</property>
247
+ </object>
248
+ <packing>
249
+ <property name="expand">False</property>
250
+ <property name="homogeneous">True</property>
251
+ </packing>
252
+ </child>
253
+ <child>
254
+ <object class="GtkToolButton" id="button_edit">
255
+ <property name="visible">True</property>
256
+ <property name="can-focus">False</property>
257
+ <property name="tooltip-text" translatable="yes">Edit Tunnel</property>
258
+ <property name="stock-id">gtk-edit</property>
259
+ </object>
260
+ <packing>
261
+ <property name="expand">False</property>
262
+ <property name="homogeneous">True</property>
263
+ </packing>
264
+ </child>
265
+ <child>
266
+ <object class="GtkToolButton" id="button_remove">
267
+ <property name="visible">True</property>
268
+ <property name="can-focus">False</property>
269
+ <property name="tooltip-text" translatable="yes">Remove Tunnel</property>
270
+ <property name="stock-id">gtk-remove</property>
271
+ </object>
272
+ <packing>
273
+ <property name="expand">False</property>
274
+ <property name="homogeneous">True</property>
275
+ </packing>
276
+ </child>
277
+ </object>
278
+ <packing>
279
+ <property name="expand">False</property>
280
+ <property name="fill">True</property>
281
+ <property name="position">1</property>
282
+ </packing>
283
+ </child>
284
+ </object>
285
+ <packing>
286
+ <property name="expand">False</property>
287
+ <property name="fill">True</property>
288
+ <property name="position">1</property>
289
+ </packing>
290
+ </child>
291
+ <child>
292
+ <object class="GtkActionBar">
293
+ <property name="visible">True</property>
294
+ <property name="can-focus">False</property>
295
+ <child>
296
+ <object class="GtkButton" id="button_cancel">
297
+ <property name="label">gtk-cancel</property>
298
+ <property name="visible">True</property>
299
+ <property name="can-focus">True</property>
300
+ <property name="receives-default">True</property>
301
+ <property name="use-stock">True</property>
302
+ </object>
303
+ <packing>
304
+ <property name="pack-type">end</property>
305
+ <property name="position">0</property>
306
+ </packing>
307
+ </child>
308
+ <child>
309
+ <object class="GtkButton" id="button_submit">
310
+ <property name="label">gtk-apply</property>
311
+ <property name="visible">True</property>
312
+ <property name="can-focus">True</property>
313
+ <property name="receives-default">True</property>
314
+ <property name="use-stock">True</property>
315
+ </object>
316
+ <packing>
317
+ <property name="pack-type">end</property>
318
+ <property name="position">0</property>
319
+ </packing>
320
+ </child>
321
+ </object>
322
+ <packing>
323
+ <property name="expand">False</property>
324
+ <property name="fill">True</property>
325
+ <property name="position">2</property>
326
+ </packing>
327
+ </child>
328
+ </object>
329
+ </child>
330
+ </template>
331
+ </interface>
@@ -0,0 +1,328 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Generated with glade 3.38.2 -->
3
+ <interface>
4
+ <requires lib="gtk+" version="3.18"/>
5
+ <template class="SSHTunnelUIWindowsHostsNewWindow" parent="GtkWindow">
6
+ <property name="visible">True</property>
7
+ <property name="can-focus">False</property>
8
+ <property name="type">popup</property>
9
+ <property name="modal">True</property>
10
+ <property name="window-position">center</property>
11
+ <property name="default-width">800</property>
12
+ <property name="default-height">600</property>
13
+ <property name="type-hint">dialog</property>
14
+ <property name="skip-taskbar-hint">True</property>
15
+ <property name="gravity">center</property>
16
+ <child>
17
+ <object class="GtkBox">
18
+ <property name="visible">True</property>
19
+ <property name="can-focus">False</property>
20
+ <property name="orientation">vertical</property>
21
+ <child>
22
+ <!-- n-columns=3 n-rows=5 -->
23
+ <object class="GtkGrid">
24
+ <property name="visible">True</property>
25
+ <property name="can-focus">False</property>
26
+ <property name="margin-top">10</property>
27
+ <property name="margin-bottom">10</property>
28
+ <child>
29
+ <object class="GtkLabel" id="label_name">
30
+ <property name="visible">True</property>
31
+ <property name="can-focus">False</property>
32
+ <property name="halign">start</property>
33
+ <property name="margin-start">10</property>
34
+ <property name="margin-end">10</property>
35
+ <property name="margin-top">3</property>
36
+ <property name="margin-bottom">5</property>
37
+ <property name="label" translatable="yes">Name</property>
38
+ </object>
39
+ <packing>
40
+ <property name="left-attach">0</property>
41
+ <property name="top-attach">0</property>
42
+ </packing>
43
+ </child>
44
+ <child>
45
+ <object class="GtkEntry" id="input_name">
46
+ <property name="visible">True</property>
47
+ <property name="can-focus">True</property>
48
+ <property name="margin-end">10</property>
49
+ <property name="margin-top">3</property>
50
+ <property name="margin-bottom">5</property>
51
+ <property name="hexpand">True</property>
52
+ </object>
53
+ <packing>
54
+ <property name="left-attach">1</property>
55
+ <property name="top-attach">0</property>
56
+ </packing>
57
+ </child>
58
+ <child>
59
+ <object class="GtkLabel" id="label_user">
60
+ <property name="visible">True</property>
61
+ <property name="can-focus">False</property>
62
+ <property name="halign">start</property>
63
+ <property name="margin-start">10</property>
64
+ <property name="margin-end">10</property>
65
+ <property name="margin-top">5</property>
66
+ <property name="margin-bottom">5</property>
67
+ <property name="label" translatable="yes">User</property>
68
+ </object>
69
+ <packing>
70
+ <property name="left-attach">0</property>
71
+ <property name="top-attach">1</property>
72
+ </packing>
73
+ </child>
74
+ <child>
75
+ <object class="GtkEntry" id="input_user">
76
+ <property name="visible">True</property>
77
+ <property name="can-focus">True</property>
78
+ <property name="margin-end">10</property>
79
+ <property name="margin-top">5</property>
80
+ <property name="margin-bottom">5</property>
81
+ </object>
82
+ <packing>
83
+ <property name="left-attach">1</property>
84
+ <property name="top-attach">1</property>
85
+ </packing>
86
+ </child>
87
+ <child>
88
+ <object class="GtkLabel" id="label_host">
89
+ <property name="visible">True</property>
90
+ <property name="can-focus">False</property>
91
+ <property name="halign">start</property>
92
+ <property name="margin-start">10</property>
93
+ <property name="margin-end">10</property>
94
+ <property name="margin-top">5</property>
95
+ <property name="margin-bottom">5</property>
96
+ <property name="label" translatable="yes">Host</property>
97
+ </object>
98
+ <packing>
99
+ <property name="left-attach">0</property>
100
+ <property name="top-attach">2</property>
101
+ </packing>
102
+ </child>
103
+ <child>
104
+ <object class="GtkEntry" id="input_host">
105
+ <property name="visible">True</property>
106
+ <property name="can-focus">True</property>
107
+ <property name="margin-end">10</property>
108
+ <property name="margin-top">5</property>
109
+ <property name="margin-bottom">5</property>
110
+ </object>
111
+ <packing>
112
+ <property name="left-attach">1</property>
113
+ <property name="top-attach">2</property>
114
+ </packing>
115
+ </child>
116
+ <child>
117
+ <object class="GtkLabel" id="label_port">
118
+ <property name="visible">True</property>
119
+ <property name="can-focus">False</property>
120
+ <property name="halign">start</property>
121
+ <property name="margin-start">10</property>
122
+ <property name="margin-end">10</property>
123
+ <property name="margin-top">5</property>
124
+ <property name="margin-bottom">5</property>
125
+ <property name="label" translatable="yes">Port</property>
126
+ </object>
127
+ <packing>
128
+ <property name="left-attach">0</property>
129
+ <property name="top-attach">3</property>
130
+ </packing>
131
+ </child>
132
+ <child>
133
+ <object class="GtkEntry" id="input_port">
134
+ <property name="visible">True</property>
135
+ <property name="can-focus">True</property>
136
+ <property name="margin-end">10</property>
137
+ <property name="margin-top">5</property>
138
+ <property name="margin-bottom">5</property>
139
+ </object>
140
+ <packing>
141
+ <property name="left-attach">1</property>
142
+ <property name="top-attach">3</property>
143
+ </packing>
144
+ </child>
145
+ <child>
146
+ <object class="GtkFileChooserButton" id="input_identity_file">
147
+ <property name="visible">True</property>
148
+ <property name="can-focus">False</property>
149
+ <property name="margin-end">10</property>
150
+ <property name="margin-top">5</property>
151
+ <property name="create-folders">False</property>
152
+ <property name="show-hidden">True</property>
153
+ <property name="title" translatable="yes"/>
154
+ </object>
155
+ <packing>
156
+ <property name="left-attach">1</property>
157
+ <property name="top-attach">4</property>
158
+ </packing>
159
+ </child>
160
+ <child>
161
+ <object class="GtkLabel" id="label_identity_file">
162
+ <property name="visible">True</property>
163
+ <property name="can-focus">False</property>
164
+ <property name="halign">start</property>
165
+ <property name="margin-start">10</property>
166
+ <property name="margin-end">10</property>
167
+ <property name="margin-top">5</property>
168
+ <property name="label" translatable="yes">Identity File</property>
169
+ </object>
170
+ <packing>
171
+ <property name="left-attach">0</property>
172
+ <property name="top-attach">4</property>
173
+ </packing>
174
+ </child>
175
+ <child>
176
+ <object class="GtkButton" id="button_reset_identity_file">
177
+ <property name="label" translatable="yes">button</property>
178
+ <property name="visible">True</property>
179
+ <property name="can-focus">True</property>
180
+ <property name="receives-default">True</property>
181
+ <property name="margin-end">10</property>
182
+ <property name="margin-top">5</property>
183
+ </object>
184
+ <packing>
185
+ <property name="left-attach">2</property>
186
+ <property name="top-attach">4</property>
187
+ </packing>
188
+ </child>
189
+ <child>
190
+ <placeholder/>
191
+ </child>
192
+ <child>
193
+ <placeholder/>
194
+ </child>
195
+ <child>
196
+ <placeholder/>
197
+ </child>
198
+ <child>
199
+ <placeholder/>
200
+ </child>
201
+ </object>
202
+ <packing>
203
+ <property name="expand">False</property>
204
+ <property name="fill">True</property>
205
+ <property name="position">0</property>
206
+ </packing>
207
+ </child>
208
+ <child>
209
+ <object class="GtkBox">
210
+ <property name="visible">True</property>
211
+ <property name="can-focus">False</property>
212
+ <property name="hexpand">True</property>
213
+ <property name="vexpand">True</property>
214
+ <child>
215
+ <object class="GtkScrolledWindow" id="tunnels_scrolled_window">
216
+ <property name="visible">True</property>
217
+ <property name="can-focus">True</property>
218
+ <property name="margin-left">9</property>
219
+ <property name="margin-bottom">10</property>
220
+ <property name="hexpand">True</property>
221
+ <property name="vexpand">True</property>
222
+ <property name="shadow-type">in</property>
223
+ <child>
224
+ <placeholder/>
225
+ </child>
226
+ </object>
227
+ <packing>
228
+ <property name="expand">False</property>
229
+ <property name="fill">True</property>
230
+ <property name="position">0</property>
231
+ </packing>
232
+ </child>
233
+ <child>
234
+ <object class="GtkToolbar">
235
+ <property name="visible">True</property>
236
+ <property name="can-focus">False</property>
237
+ <property name="orientation">vertical</property>
238
+ <child>
239
+ <object class="GtkToolButton" id="button_add">
240
+ <property name="visible">True</property>
241
+ <property name="can-focus">False</property>
242
+ <property name="tooltip-text" translatable="yes">Add Tunnel</property>
243
+ <property name="stock-id">gtk-add</property>
244
+ </object>
245
+ <packing>
246
+ <property name="expand">False</property>
247
+ <property name="homogeneous">True</property>
248
+ </packing>
249
+ </child>
250
+ <child>
251
+ <object class="GtkToolButton" id="button_edit">
252
+ <property name="visible">True</property>
253
+ <property name="can-focus">False</property>
254
+ <property name="tooltip-text" translatable="yes">Edit Tunnel</property>
255
+ <property name="stock-id">gtk-edit</property>
256
+ </object>
257
+ <packing>
258
+ <property name="expand">False</property>
259
+ <property name="homogeneous">True</property>
260
+ </packing>
261
+ </child>
262
+ <child>
263
+ <object class="GtkToolButton" id="button_remove">
264
+ <property name="visible">True</property>
265
+ <property name="can-focus">False</property>
266
+ <property name="tooltip-text" translatable="yes">Remove Tunnel</property>
267
+ <property name="stock-id">gtk-remove</property>
268
+ </object>
269
+ <packing>
270
+ <property name="expand">False</property>
271
+ <property name="homogeneous">True</property>
272
+ </packing>
273
+ </child>
274
+ </object>
275
+ <packing>
276
+ <property name="expand">False</property>
277
+ <property name="fill">True</property>
278
+ <property name="position">1</property>
279
+ </packing>
280
+ </child>
281
+ </object>
282
+ <packing>
283
+ <property name="expand">False</property>
284
+ <property name="fill">True</property>
285
+ <property name="position">1</property>
286
+ </packing>
287
+ </child>
288
+ <child>
289
+ <object class="GtkActionBar">
290
+ <property name="visible">True</property>
291
+ <property name="can-focus">False</property>
292
+ <child>
293
+ <object class="GtkButton" id="button_cancel">
294
+ <property name="label">gtk-cancel</property>
295
+ <property name="visible">True</property>
296
+ <property name="can-focus">True</property>
297
+ <property name="receives-default">True</property>
298
+ <property name="use-stock">True</property>
299
+ </object>
300
+ <packing>
301
+ <property name="pack-type">end</property>
302
+ <property name="position">0</property>
303
+ </packing>
304
+ </child>
305
+ <child>
306
+ <object class="GtkButton" id="button_submit">
307
+ <property name="label">gtk-apply</property>
308
+ <property name="visible">True</property>
309
+ <property name="can-focus">True</property>
310
+ <property name="receives-default">True</property>
311
+ <property name="use-stock">True</property>
312
+ </object>
313
+ <packing>
314
+ <property name="pack-type">end</property>
315
+ <property name="position">0</property>
316
+ </packing>
317
+ </child>
318
+ </object>
319
+ <packing>
320
+ <property name="expand">False</property>
321
+ <property name="fill">True</property>
322
+ <property name="position">2</property>
323
+ </packing>
324
+ </child>
325
+ </object>
326
+ </child>
327
+ </template>
328
+ </interface>