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 }