0
|
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 } |