Mercurial > hg > marc.net
comparison ARClient/frmEditResource.cs @ 0:90ea68d4f92f
First release
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Sat, 08 Nov 2014 22:43:51 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:90ea68d4f92f |
---|---|
1 using System; | |
2 using System.Collections; | |
3 using System.Net; | |
4 using System.Text; | |
5 using System.Windows.Forms; | |
6 | |
7 namespace ARClient { | |
8 partial class frmEditResource : Form { | |
9 public Form1 MainForm { get; set; } | |
10 public Byte[] Label = null; | |
11 public IDictionary Value = new Hashtable(); | |
12 public UInt32 UpdateSerial = 0; | |
13 | |
14 public frmEditResource() { | |
15 InitializeComponent(); | |
16 radTypeDomain.Checked = true; | |
17 } | |
18 | |
19 private void frmEditResource_Load(object sender, EventArgs e) { | |
20 tabControl1_SelectedIndexChanged(null, null); | |
21 } | |
22 public void ImportData() { | |
23 tabControl1.SelectedIndex = 1; | |
24 } | |
25 | |
26 private void radType_CheckedChanged(object sender, EventArgs e) { | |
27 if (radTypeDomain.Checked) { | |
28 lblLabelHint.Text = "Enter the domain name including the top level component. For an Anonet domain, your domain name must end in '.ano'."; | |
29 if (Label != null && Label.Length > 1 && Label[0] == 4) txtLabelValue.Text = Encoding.UTF8.GetString(Label, 1, Label.Length - 1); | |
30 else txtLabelValue_TextChanged(sender, e); | |
31 } else if (radTypeIPv4.Checked) { | |
32 lblLabelHint.Text = "Enter the IPv4 network in CIDR notation, e.g. '1.2.3.0/24'."; | |
33 if (Label != null && Label.Length == 6 && Label[0] == 1) txtLabelValue.Text = Label[1].ToString() + "." + Label[2].ToString() + "." + Label[3].ToString() + "." + Label[4].ToString() + "/" + Label[5].ToString(); | |
34 else txtLabelValue_TextChanged(sender, e); | |
35 } else if (radTypeIPv6.Checked) { | |
36 lblLabelHint.Text = "Enter the IPv6 network in CIDR notation, e.g. 'fd63:1e39:6f73:001b::/64'."; | |
37 if (Label != null && Label.Length == 18 && Label[0] == 2) { | |
38 Byte[] address = new Byte[16]; | |
39 Buffer.BlockCopy(Label, 2, address, 0, 16); | |
40 txtLabelValue.Text = (new IPAddress(address)).ToString() + "/" + Label[17].ToString(); | |
41 } else txtLabelValue_TextChanged(sender, e); | |
42 } else if (radTypeASNumber.Checked) { | |
43 lblLabelHint.Text = "Enter the AS number."; | |
44 if (Label != null && Label.Length == 5 && Label[0] == 3) txtLabelValue.Text = Functions.DecodeInt32BigEndian(Label, 1).ToString(); | |
45 else txtLabelValue_TextChanged(sender, e); | |
46 } else if (radTypeOtherHex.Checked) { | |
47 lblLabelHint.Text = "Expert usage! Enter the raw label value in hexadecimal notation."; | |
48 if (Label != null) txtLabelValue.Text = Functions.bin2hex(Label); | |
49 else txtLabelValue_TextChanged(sender, e); | |
50 } else { | |
51 lblLabelHint.Text = "Select a resource type."; | |
52 } | |
53 } | |
54 | |
55 private Boolean TryParseLabel() { | |
56 Label = null; | |
57 if (radTypeDomain.Checked) { | |
58 if (txtLabelValue.Text.Length < 1) return false; | |
59 Byte[] bytes = Encoding.UTF8.GetBytes(txtLabelValue.Text.ToLowerInvariant()); | |
60 Label = new Byte[bytes.Length + 1]; | |
61 Label[0] = 4; | |
62 bytes.CopyTo(Label, 1); | |
63 return true; | |
64 } else if (radTypeIPv4.Checked) { | |
65 String[] parts1 = txtLabelValue.Text.Split('/'); | |
66 if (parts1.Length != 2) return false; | |
67 String[] parts2 = parts1[0].Split('.'); | |
68 if (parts2.Length != 4) return false; | |
69 Byte[] bytes = new Byte[6]; | |
70 bytes[0] = 1; | |
71 for (int i = 0; i < 4; i++) if (!Byte.TryParse(parts2[i], out bytes[i + 1])) return false; | |
72 if (!Byte.TryParse(parts1[1], out bytes[5])) return false; | |
73 if (bytes[5] > 32) return false; | |
74 Label = bytes; | |
75 return true; | |
76 } else if (radTypeIPv6.Checked) { | |
77 String[] parts1 = txtLabelValue.Text.Split('/'); | |
78 if (parts1.Length != 2) return false; | |
79 IPAddress addr; | |
80 if (!IPAddress.TryParse(parts1[0], out addr)) return false; | |
81 if (addr.AddressFamily != System.Net.Sockets.AddressFamily.InterNetworkV6) return false; | |
82 Byte len; | |
83 if (!Byte.TryParse(parts1[1], out len)) return false; | |
84 if (len > 128) return false; | |
85 Label = new Byte[18]; | |
86 Label[0] = 2; | |
87 addr.GetAddressBytes().CopyTo(Label, 1); | |
88 Label[17] = len; | |
89 return true; | |
90 } else if (radTypeASNumber.Checked) { | |
91 UInt32 asn; | |
92 if (!UInt32.TryParse(txtLabelValue.Text, out asn)) return false; | |
93 Label = new Byte[5]; | |
94 Label[0] = 3; | |
95 Functions.EncodeInt32BigEndian(asn).CopyTo(Label, 1); | |
96 return true; | |
97 } else if (radTypeOtherHex.Checked) { | |
98 Label = Functions.hex2bin(txtLabelValue.Text); | |
99 return Label != null; | |
100 } else { | |
101 return false; | |
102 } | |
103 } | |
104 | |
105 private void txtLabelValue_TextChanged(object sender, EventArgs e) { | |
106 Boolean valid = TryParseLabel(); | |
107 lblLabelValid.Visible = !valid; | |
108 btnLabelNext.Visible = valid; | |
109 } | |
110 | |
111 private void btnLabelNext_Click(object sender, EventArgs e) { | |
112 tabControl1.SelectedIndex++; | |
113 } | |
114 | |
115 private void UpdateValueTree() { | |
116 lvwData.SuspendLayout(); | |
117 lvwData.Nodes.Clear(); | |
118 | |
119 if (Value is IDictionary) { | |
120 foreach (DictionaryEntry child in (IDictionary)Value) lvwData.Nodes.Add(AddResourceValueInTree(child.Key.ToString() + ": ", child.Value)); | |
121 } else if (Value is ICollection) { | |
122 foreach (Object child in (ICollection)Value) lvwData.Nodes.Add(AddResourceValueInTree(String.Empty, child)); | |
123 } else if (Value == null) { | |
124 lvwData.Nodes.Add("Null").Tag = null; | |
125 } else { | |
126 lvwData.Nodes.Add(Value.ToString()).Tag = Value; | |
127 } | |
128 | |
129 lvwData.ResumeLayout(); | |
130 } | |
131 private TreeNode AddResourceValueInTree(String prefix, Object value) { | |
132 TreeNode node = new TreeNode(); | |
133 if (value is IDictionary) { | |
134 node.Text = prefix + "Dictionary"; | |
135 foreach (DictionaryEntry child in (IDictionary)value) node.Nodes.Add(AddResourceValueInTree(child.Key.ToString() + ": ", child.Value)); | |
136 } else if (value is ICollection) { | |
137 node.Text = prefix + "Collection"; | |
138 foreach (Object child in (ICollection)value) node.Nodes.Add(AddResourceValueInTree(String.Empty, child)); | |
139 } else if (value == null) { | |
140 node.Text = prefix + "Null"; | |
141 } else { | |
142 node.Text = prefix + value.ToString(); | |
143 } | |
144 node.Tag = value; | |
145 node.Expand(); | |
146 return node; | |
147 } | |
148 | |
149 private void btnDataSetOwner_Click(object sender, EventArgs e) { | |
150 frmTextInput form = new frmTextInput(); | |
151 form.Text = "MARC - Resource data"; | |
152 form.Description = "Enter the owner name:"; | |
153 if (!(Value is IDictionary)) Value = new Hashtable(); | |
154 if (Value.Contains("owner")) form.Value = Value["owner"].ToString(); | |
155 if (form.ShowDialog(this) != DialogResult.OK) return; | |
156 Value["owner"] = form.Value; | |
157 UpdateValueTree(); | |
158 } | |
159 private void btnDataSetDescription_Click(object sender, EventArgs e) { | |
160 frmTextInput form = new frmTextInput(); | |
161 form.Text = "MARC - Resource data"; | |
162 form.Description = "Enter the resource description:"; | |
163 if (!(Value is IDictionary)) Value = new Hashtable(); | |
164 if (Value.Contains("descr")) form.Value = Value["descr"].ToString(); | |
165 if (form.ShowDialog(this) != DialogResult.OK) return; | |
166 Value["descr"] = form.Value; | |
167 UpdateValueTree(); | |
168 } | |
169 private void btnDataAddDNS_Click(object sender, EventArgs e) { | |
170 frmTextInput form = new frmTextInput(); | |
171 form.Text = "MARC - Resource data"; | |
172 form.Description = "Enter the nameserver name in the current zone, or add a dot ad the end to use a nameserver in another zone:"; | |
173 form.Value = "ns1"; | |
174 if (form.ShowDialog(this) != DialogResult.OK) return; | |
175 String nsname = form.Value; | |
176 String nsip4 = null, nsip6 = null; | |
177 if (!nsname.EndsWith(".")) { | |
178 form.Description = "Enter the nameserver IPv4 address, if any:"; | |
179 form.Value = ""; | |
180 if (form.ShowDialog(this) == DialogResult.OK) nsip4 = form.Value; | |
181 form.Description = "Enter the nameserver IPv6 address, if any:"; | |
182 form.Value = ""; | |
183 if (form.ShowDialog(this) == DialogResult.OK) nsip6 = form.Value; | |
184 } | |
185 if (!(Value is IDictionary)) Value = new Hashtable(); | |
186 if (Value["ns"] == null || !(Value["ns"] is IDictionary)) Value["ns"] = new Hashtable(); | |
187 IDictionary dns = (IDictionary)Value["ns"]; | |
188 IList ns = new ArrayList(); | |
189 dns[nsname] = ns; | |
190 if (nsip4 != null && nsip4.Length > 0) ns.Add(nsip4); | |
191 if (nsip6 != null && nsip6.Length > 0) ns.Add(nsip6); | |
192 UpdateValueTree(); | |
193 } | |
194 | |
195 private void btnDataEditString_Click(object sender, EventArgs e) { | |
196 if (lvwData.SelectedNode == null || lvwData.SelectedNode.Tag == null) return; | |
197 frmTextInput form = new frmTextInput(); | |
198 form.Text = "MARC - Resource data"; | |
199 form.Description = "Enter the new value:"; | |
200 form.Value = lvwData.SelectedNode.Tag.ToString(); | |
201 if (form.ShowDialog(this) != DialogResult.OK) return; | |
202 Object parent = lvwData.SelectedNode.Parent == null ? Value : lvwData.SelectedNode.Parent.Tag; | |
203 if (parent == null) return; | |
204 if (parent is IDictionary) { | |
205 foreach (DictionaryEntry entry in ((IDictionary)parent)) { | |
206 if (lvwData.SelectedNode.Tag == entry.Value) { | |
207 ((IDictionary)parent)[entry.Key] = form.Value; | |
208 break; | |
209 } | |
210 } | |
211 } else if (parent is IList) { | |
212 for (int i = 0; i < ((IList)parent).Count; i++) { | |
213 if (((IList)parent)[i] == lvwData.SelectedNode.Tag) ((IList)parent)[i] = form.Value; | |
214 } | |
215 } | |
216 UpdateValueTree(); | |
217 } | |
218 | |
219 private void btnDataAddSring_Click(object sender, EventArgs e) { | |
220 Object parent = lvwData.SelectedNode == null ? Value : lvwData.SelectedNode.Tag; | |
221 if (!(parent is IDictionary || parent is IList)) return; | |
222 frmTextInput form = new frmTextInput(); | |
223 form.Text = "MARC - Resource data"; | |
224 String dkey = null; | |
225 if (parent is IDictionary) { | |
226 form.Description = "Enter the dictionary key:"; | |
227 if (form.ShowDialog(this) != DialogResult.OK) return; | |
228 dkey = form.Value; | |
229 } | |
230 form.Value = String.Empty; | |
231 form.Description = "Enter the value:"; | |
232 if (form.ShowDialog(this) != DialogResult.OK) return; | |
233 if (parent is IDictionary) { | |
234 ((IDictionary)parent)[dkey]= form.Value; | |
235 } else if (parent is IList) { | |
236 ((IList)parent).Add(form.Value); | |
237 } | |
238 UpdateValueTree(); | |
239 } | |
240 | |
241 private void btnDataAddCollection_Click(object sender, EventArgs e) { | |
242 Object parent = lvwData.SelectedNode == null ? Value : lvwData.SelectedNode.Tag; | |
243 if (parent is IDictionary) { | |
244 frmTextInput form = new frmTextInput(); | |
245 form.Text = "MARC - Resource data"; | |
246 form.Description = "Enter the dictionary key:"; | |
247 if (form.ShowDialog(this) != DialogResult.OK) return; | |
248 ((IDictionary)parent)[form.Value] = new ArrayList(); | |
249 } else if (parent is IList) { | |
250 ((IList)parent).Add(new ArrayList()); | |
251 } | |
252 UpdateValueTree(); | |
253 } | |
254 | |
255 private void btnDataAddDictionary_Click(object sender, EventArgs e) { | |
256 Object parent = lvwData.SelectedNode == null ? Value : lvwData.SelectedNode.Tag; | |
257 if (parent is IDictionary) { | |
258 frmTextInput form = new frmTextInput(); | |
259 form.Text = "MARC - Resource data"; | |
260 form.Description = "Enter the dictionary key:"; | |
261 if (form.ShowDialog(this) != DialogResult.OK) return; | |
262 ((IDictionary)parent)[form.Value] = new Hashtable(); | |
263 } else if (parent is IList) { | |
264 ((IList)parent).Add(new Hashtable()); | |
265 } | |
266 UpdateValueTree(); | |
267 } | |
268 | |
269 private void btnDataDelete_Click(object sender, EventArgs e) { | |
270 if (lvwData.SelectedNode == null || lvwData.SelectedNode.Tag == null) return; | |
271 Object parent = lvwData.SelectedNode.Parent == null ? Value : lvwData.SelectedNode.Parent.Tag; | |
272 if (parent == null) return; | |
273 if (parent is IDictionary) { | |
274 foreach (DictionaryEntry entry in ((IDictionary)parent)) { | |
275 if (lvwData.SelectedNode.Tag == entry.Value) { | |
276 ((IDictionary)parent).Remove(entry.Key); | |
277 break; | |
278 } | |
279 } | |
280 } else if (parent is IList) { | |
281 ((IList)parent).Remove(lvwData.SelectedNode.Tag); | |
282 } | |
283 UpdateValueTree(); | |
284 } | |
285 | |
286 private void btnDataDeleteAll_Click(object sender, EventArgs e) { | |
287 Value = null; | |
288 UpdateValueTree(); | |
289 } | |
290 | |
291 private void UpdateResourceStatus() { | |
292 MARCUpdate resource; | |
293 grpUpdateConflict.Visible = false; | |
294 grpUpdateExport.Visible = true; | |
295 txtUpdateLabel.Text = Functions.GetNameForLabel(Label); | |
296 UpdateSerial = checked((UInt32)MARCUpdate.DateTimeToUnix(DateTime.Now)); | |
297 if (MainForm.Resources.TryGetValue(new MARCLabel(Label), out resource)) { | |
298 txtUpdateCurrentOwner.Text = Functions.bin2hex(resource.Key.Bytes); | |
299 txtUpdateCurrentTransfer.Text = resource.Transfer == null ? "None" : Functions.bin2hex(resource.Transfer.Value.Bytes); | |
300 txtUpdateCurrentSerial.Text = resource.Serial.ToString() + " (" + resource.UpdateTimestamp.ToShortDateString() + ")"; | |
301 txtUpdateCurrentExpiration.Text = resource.Expiration == null ? "None" : resource.Expiration.Value.ToString() + " (" + resource.ExpirationTimestamp.ToShortDateString() + ")"; | |
302 if (!resource.CanUpdate(MainForm.PublicKey)) { | |
303 txtUpdateCurrentStatus.Text = "Not available"; | |
304 grpUpdateConflict.Visible = true; | |
305 grpUpdateExport.Visible = false; | |
306 return; | |
307 } | |
308 txtUpdateCurrentStatus.Text = "Registered"; | |
309 if (UpdateSerial <= resource.Serial) UpdateSerial = resource.Serial + 1; | |
310 txtUpdateCurrentSize.Text = resource.UpdateMessage.Length.ToString(); | |
311 } else { | |
312 txtUpdateCurrentOwner.Text = "None"; | |
313 txtUpdateCurrentTransfer.Text = "None"; | |
314 txtUpdateCurrentSerial.Text = String.Empty; | |
315 txtUpdateCurrentStatus.Text = "Free"; | |
316 txtUpdateCurrentSize.Text = "N/A"; | |
317 } | |
318 txtUpdateOwner.Text = MainForm.PublicKey.ToString(); | |
319 dtpUpdateExpiration.Value = DateTime.Now.AddYears(1); | |
320 dtpUpdateExpiration.Checked = false; | |
321 chkUpdateTransferEnabled.Checked = false; | |
322 } | |
323 | |
324 private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) { | |
325 if (tabControl1.SelectedIndex == 0) { | |
326 if (Label != null && Label.Length > 0) { | |
327 switch (Label[0]) { | |
328 case 1: radTypeIPv4.Checked = true; break; | |
329 case 2: radTypeIPv6.Checked = true; break; | |
330 case 3: radTypeASNumber.Checked = true; break; | |
331 case 4: radTypeDomain.Checked = true; break; | |
332 default: radTypeOtherHex.Checked = true; break; | |
333 } | |
334 } | |
335 radType_CheckedChanged(sender, e); | |
336 txtLabelValue_TextChanged(sender, e); | |
337 } else if (Label == null || Label.Length == 0) { | |
338 MessageBox.Show("The selected label is not valid. Please correct the label and try again.", "MARC - Invalid label", MessageBoxButtons.OK, MessageBoxIcon.Error); | |
339 tabControl1.SelectedIndex = 0; | |
340 } else if (tabControl1.SelectedIndex == 1) { | |
341 UpdateValueTree(); | |
342 } else if (tabControl1.SelectedIndex == 2) { | |
343 UpdateResourceStatus(); | |
344 } | |
345 } | |
346 | |
347 private void btnUpdateDelete_Click(object sender, EventArgs e) { | |
348 MARCLabel l = new MARCLabel(Label); | |
349 MainForm.ResourceHasChanged(null, MainForm.Resources[l]); | |
350 MainForm.Resources.Remove(l); | |
351 UpdateResourceStatus(); | |
352 } | |
353 | |
354 private void btnUpdateNow_Click(object sender, EventArgs e) { | |
355 UInt32? Expiration = null; | |
356 Byte[] Transfer = null; | |
357 if (dtpUpdateExpiration.Checked) { | |
358 DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); | |
359 Expiration = checked((UInt32)(dtpUpdateExpiration.Value.ToUniversalTime() - epoch).TotalSeconds); | |
360 } | |
361 if (chkUpdateTransferEnabled.Checked) { | |
362 Transfer = Functions.hex2bin(txtUpdateTransfer.Text); | |
363 } | |
364 MARCUpdate update = MARCUpdate.Create(MainForm.SecretKey, UpdateSerial, Label, Value, Expiration, Transfer); | |
365 txtUpdateCurrentSize.Text = update.UpdateMessage.Length.ToString() + " bytes"; | |
366 MainForm.ReplaceOrAddResource(update); | |
367 MainForm.DatabaseSaved = false; | |
368 UpdateResourceStatus(); | |
369 } | |
370 } | |
371 } |