source: trunk/CrypPlugins/KeySearcher/P2P/Tree/Leaf.cs @ 2442

Last change on this file since 2442 was 2442, checked in by nolte, 11 years ago

Protecting the Tree from Node/Leaf Attacks. Healing-Kit Update

(Will be further modified Wednesday)

File size: 4.3 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Numerics;
4using Cryptool.P2P;
5using KeySearcher.Helper;
6using KeySearcher.P2P.Exceptions;
7using KeySearcher.P2P.Storage;
8using KeySearcher.Properties;
9
10namespace KeySearcher.P2P.Tree
11{
12    class Leaf : NodeBase
13    {
14        internal DateTime LastReservationDate;
15        private bool isLeafReserved;
16        private const int RESERVATIONTIMEOUT = 30;
17        private long clientIdentifier = -1;
18
19        public Leaf(StorageHelper storageHelper, KeyQualityHelper keyQualityHelper, Node parentNode, BigInteger id, string distributedJobIdentifier)
20            : base(storageHelper, keyQualityHelper, parentNode, id, id, distributedJobIdentifier)
21        {
22        }
23
24        public void HandleResults(LinkedList<KeySearcher.ValueKey> result)
25        {
26            EnhanceUserInformation(result);
27            UpdateActivity();           
28            UpdateDht();
29        }
30
31        private void EnhanceUserInformation(LinkedList<KeySearcher.ValueKey> result)
32        {
33            var enhancedResults = new LinkedList<KeySearcher.ValueKey>();
34            DateTime chunkstart = DateTime.UtcNow;
35            DateTime defaultstart = DateTime.MinValue;
36            string username = P2PSettings.Default.PeerName;
37            long maschineid = Cryptool.PluginBase.Miscellaneous.UniqueIdentifier.GetID();
38            string maschinename = Cryptool.PluginBase.Miscellaneous.UniqueIdentifier.GetHostName();
39
40            foreach (var valueKey in result)
41            {
42                KeySearcher.ValueKey vk = valueKey;
43
44                if ((username != null) && (!username.Equals("")))
45                {
46                    vk.user = username;
47                    vk.time = chunkstart;
48                    vk.maschid = maschineid;
49                    vk.maschname = maschinename;
50                }
51                else
52                {
53                    vk.user = "Unknown";
54                    vk.time = defaultstart;
55                    vk.maschid = 666;
56                    vk.maschname = "Devil";
57                }
58                enhancedResults.AddLast(vk);
59            }
60            Result = enhancedResults;
61        }
62
63        public BigInteger PatternId()
64        {
65            return From;
66        }
67
68        public override Leaf CalculatableLeaf(bool useReservedNodes)
69        {
70            if (IsCalculated())
71            {
72                throw new AlreadyCalculatedException();
73            }
74
75            return this;
76        }
77
78        public override bool IsCalculated()
79        {
80            return Result.Count > 0;
81        }
82
83        public override void Reset()
84        {
85            ParentNode.Reset();
86            Result.Clear();
87            Activity.Clear();
88            StorageHelper.UpdateInDht(this);
89        }
90
91        public override void UpdateCache()
92        {
93            var dateSomeMinutesBefore = DateTime.UtcNow.Subtract(new TimeSpan(0, RESERVATIONTIMEOUT, 0));
94            isLeafReserved = dateSomeMinutesBefore < LastReservationDate;
95        }
96
97        public bool ReserveLeaf()
98        {
99            LastReservationDate = DateTime.UtcNow;
100            clientIdentifier = Cryptool.PluginBase.Miscellaneous.UniqueIdentifier.GetID();
101            return StorageHelper.UpdateInDht(this).IsSuccessful();
102        }
103
104        public void GiveLeafFree()
105        {
106            StorageHelper.UpdateFromDht((this));         
107            //Only give leaf free, if the reservation is still ours:
108            if (clientIdentifier == Cryptool.PluginBase.Miscellaneous.UniqueIdentifier.GetID())
109            {
110                LastReservationDate = new DateTime(0);
111                clientIdentifier = -1;
112                isLeafReserved = false;
113                StorageHelper.UpdateInDht(this);
114            }
115        }
116
117        public override bool IsReserved()
118        {
119            return isLeafReserved;
120        }
121
122        public override string ToString()
123        {
124            return base.ToString() + Resources.__last_reservation_date_ + LastReservationDate;
125        }
126
127        public long getClientIdentifier()
128        {
129            return clientIdentifier;
130        }
131
132        public void setClientIdentifier(long id)
133        {
134            clientIdentifier = id;
135        }
136    }
137}
Note: See TracBrowser for help on using the repository browser.