Exemple #1
0
        private bool CanClaimDomain(Number320 key, IPublicKey publicKey)
        {
            var domainProtectedByOthers = _backend.IsDomainProtectedByOthers(key, publicKey);
            var domainOverridableByMe   = ForceOverrideDomain(key.DomainKey, publicKey);

            return(!domainProtectedByOthers || domainOverridableByMe);
        }
Exemple #2
0
 public Enum UpdateMeta(Number320 locationAndDomainKey, IPublicKey publicKey, IPublicKey newPublicKey)
 {
     if (!SecurityDomainCheck(locationAndDomainKey, publicKey, newPublicKey, true))
     {
         return(PutStatus.FailedSecurity);
     }
     return(PutStatus.Ok);
 }
Exemple #3
0
        public DigestInfo Digest(Number320 locationAndDomainKey, SimpleBloomFilter <Number160> keyBloomFilter, SimpleBloomFilter <Number160> contentBloomFilter, int limit, bool ascending, bool isBloomFilterAnd)
        {
            var digestInfo = new DigestInfo();
            var rLock      = Lock(locationAndDomainKey);

            try {
                var from = new Number640(locationAndDomainKey, Number160.Zero, Number160.Zero);
                var to   = new Number640(locationAndDomainKey, Number160.MaxValue, Number160.MaxValue);
                var tmp  = _backend.SubMap(from, to, limit, ascending);

                foreach (var kvp in tmp)
                {
                    if (isBloomFilterAnd)
                    {
                        if (keyBloomFilter == null || keyBloomFilter.Contains(kvp.Key.ContentKey))
                        {
                            if (contentBloomFilter == null || contentBloomFilter.Contains(kvp.Value.Hash))
                            {
                                if (!kvp.Value.HasPrepareFlag)
                                {
                                    digestInfo.Put(kvp.Key, kvp.Value.BasedOnSet);
                                }
                            }
                        }
                    }
                    else
                    {
                        if (keyBloomFilter == null || !keyBloomFilter.Contains(kvp.Key.ContentKey))
                        {
                            if (contentBloomFilter == null || !contentBloomFilter.Contains(kvp.Value.Hash))
                            {
                                if (!kvp.Value.HasPrepareFlag)
                                {
                                    digestInfo.Put(kvp.Key, kvp.Value.BasedOnSet);
                                }
                            }
                        }
                    }
                }
                return(digestInfo);
            }
            finally
            {
                rLock.Unlock();
            }
        }
Exemple #4
0
        private bool SecurityDomainCheck(Number320 key, IPublicKey publicKey, IPublicKey newPublicKey, bool domainProtection)
        {
            var domainProtectedByOthers = _backend.IsDomainProtectedByOthers(key, publicKey);

            Logger.Debug("No domain protection requested {0} for domain {1}.", Utils.Hash(newPublicKey), key);
            // I dont want to claim the domain
            if (!domainProtection)
            {
                // Returns true if the domain is not protceted by others, otherwise
                // false if the domain is protected
                return(!domainProtectedByOthers);
            }
            if (CanClaimDomain(key, publicKey))
            {
                if (CanProtectDomain(key.DomainKey, publicKey))
                {
                    Logger.Debug("Set domain protection.");
                    return(_backend.ProtectDomain(key, newPublicKey));
                }
                return(true);
            }
            return(false);
        }
Exemple #5
0
        public override void HandleResponse(Message.Message requestMessage, PeerConnection peerConnection, bool sign, IResponder responder)
        {
            if (requestMessage.KeyList.Count < 2)
            {
                throw new ArgumentException("At least location and domain keys are needed.");
            }
            if (!(requestMessage.Type == Message.Message.MessageType.Request1 ||
                  requestMessage.Type == Message.Message.MessageType.Request2 ||
                  requestMessage.Type == Message.Message.MessageType.Request3 ||
                  requestMessage.Type == Message.Message.MessageType.Request4) &&
                (requestMessage.Command == Rpc.Commands.Neighbor.GetNr()))
            {
                throw new ArgumentException("Message content is wrong for this handler.");
            }

            Number160 locationKey = requestMessage.Key(0);
            Number160 domainKey   = requestMessage.Key(1);

            var neighbors = GetNeighbors(locationKey, NeighborSize);

            if (neighbors == null)
            {
                // return empty neighbor set
                var response = CreateResponseMessage(requestMessage, Message.Message.MessageType.NotFound);
                response.SetNeighborSet(new NeighborSet(-1, new Collection <PeerAddress>()));
                responder.Response(response);
                return;
            }

            // create response message and set neighbors
            var responseMessage = CreateResponseMessage(requestMessage, Message.Message.MessageType.Ok);

            Logger.Debug("Found the following neighbors: {0}.", Convenient.ToString(neighbors));
            var neighborSet = new NeighborSet(NeighborLimit, neighbors);

            responseMessage.SetNeighborSet(neighborSet);

            Number160 contentKey         = requestMessage.Key(2);
            var       keyBloomFilter     = requestMessage.BloomFilter(0);
            var       contentBloomFilter = requestMessage.BloomFilter(1);
            var       keyCollection      = requestMessage.KeyCollection(0);

            // it is important to set an integer if a value is present
            bool isDigest = requestMessage.Type != Message.Message.MessageType.Request1;

            if (isDigest)
            {
                if (requestMessage.Type == Message.Message.MessageType.Request2)
                {
                    DigestInfo digestInfo;
                    if (PeerBean.DigestStorage == null)
                    {
                        // no storage to search
                        digestInfo = new DigestInfo();
                    }
                    else if (contentKey != null && locationKey != null && domainKey != null)
                    {
                        var locationAndDomainKey = new Number320(locationKey, domainKey);
                        var from = new Number640(locationAndDomainKey, contentKey, Number160.Zero);
                        var to   = new Number640(locationAndDomainKey, contentKey, Number160.MaxValue);
                        digestInfo = PeerBean.DigestStorage.Digest(from, to, -1, true);
                    }
                    else if ((keyBloomFilter != null || contentBloomFilter != null) && locationKey != null && domainKey != null)
                    {
                        var locationAndDomainKey = new Number320(locationKey, domainKey);
                        digestInfo = PeerBean.DigestStorage.Digest(locationAndDomainKey, keyBloomFilter,
                                                                   contentBloomFilter, -1, true, true);
                    }
                    else if (keyCollection != null && keyCollection.Keys.Count == 2)
                    {
                        var enumerator = keyCollection.Keys.GetEnumerator();
                        var from       = enumerator.MoveNext() ? enumerator.Current : null; // TODO works correctly?
                        var to         = enumerator.MoveNext() ? enumerator.Current : null;

                        digestInfo = PeerBean.DigestStorage.Digest(from, to, -1, true);
                    }
                    else if (locationKey != null && domainKey != null)
                    {
                        var locationAndDomainKey = new Number320(locationKey, domainKey);
                        var from = new Number640(locationAndDomainKey, Number160.Zero, Number160.Zero);
                        var to   = new Number640(locationAndDomainKey, Number160.MaxValue, Number160.MaxValue);
                        digestInfo = PeerBean.DigestStorage.Digest(from, to, -1, true);
                    }
                    else
                    {
                        Logger.Warn("Did not search for anything.");
                        digestInfo = new DigestInfo();
                    }
                    responseMessage.SetIntValue(digestInfo.Size);
                    responseMessage.SetKey(digestInfo.KeyDigest);
                    responseMessage.SetKey(digestInfo.ContentDigest);
                }
                else if (requestMessage.Type == Message.Message.MessageType.Request3)
                {
                    DigestInfo digestInfo;
                    if (PeerBean.DigestTracker == null)
                    {
                        // no tracker to search
                        digestInfo = new DigestInfo();
                    }
                    else
                    {
                        digestInfo = PeerBean.DigestTracker.Digest(locationKey, domainKey, contentKey);
                        if (digestInfo.Size == 0)
                        {
                            Logger.Debug("No entry found on peer {0}.", requestMessage.Recipient);
                        }
                    }
                    responseMessage.SetIntValue(digestInfo.Size);
                }
                else if (requestMessage.Type == Message.Message.MessageType.Request4)
                {
                    lock (PeerBean.PeerStatusListeners)
                    {
                        foreach (var listener in PeerBean.PeerStatusListeners)
                        {
                            listener.PeerFailed(requestMessage.Sender,
                                                new PeerException(PeerException.AbortCauseEnum.Shutdown, "shutdown"));
                        }
                    }
                }
            }

            responder.Response(responseMessage);
        }
Exemple #6
0
 private RangeLock <Number640> .Range Lock(Number320 number320)
 {
     return(RangeLock.Lock(
                new Number640(number320, Number160.Zero, Number160.Zero),
                new Number640(number320, Number160.MaxValue, Number160.MaxValue)));
 }
Exemple #7
0
        public Enum UpdateMeta(Number320 locationAndDomainKey, IPublicKey publicKey, IPublicKey newPublicKey)
        {
		    if (!SecurityDomainCheck(locationAndDomainKey, publicKey, newPublicKey, true))
            {
			    return PutStatus.FailedSecurity;
		    }
		    return PutStatus.Ok;
	    }
Exemple #8
0
 private RangeLock<Number640>.Range Lock(Number320 number320)
 {
     return RangeLock.Lock(
         new Number640(number320, Number160.Zero, Number160.Zero), 
         new Number640(number320, Number160.MaxValue, Number160.MaxValue));
 }
Exemple #9
0
        private bool CanClaimDomain(Number320 key, IPublicKey publicKey)
        {
		    var domainProtectedByOthers = _backend.IsDomainProtectedByOthers(key, publicKey);
		    var domainOverridableByMe = ForceOverrideDomain(key.DomainKey, publicKey);
		    return !domainProtectedByOthers || domainOverridableByMe;
	    }
Exemple #10
0
        private bool SecurityDomainCheck(Number320 key, IPublicKey publicKey, IPublicKey newPublicKey, bool domainProtection) 
        {
		    var domainProtectedByOthers = _backend.IsDomainProtectedByOthers(key, publicKey);
			Logger.Debug("No domain protection requested {0} for domain {1}.", Utils.Hash(newPublicKey), key);
		    // I dont want to claim the domain
		    if (!domainProtection)
            {
                // Returns true if the domain is not protceted by others, otherwise
			    // false if the domain is protected
			    return !domainProtectedByOthers;
		    }
            if (CanClaimDomain(key, publicKey))
            {
                if (CanProtectDomain(key.DomainKey, publicKey))
                {
                    Logger.Debug("Set domain protection.");
                    return _backend.ProtectDomain(key, newPublicKey);
                }
                return true;
            }
            return false;
	    }
Exemple #11
0
        public DigestInfo Digest(Number320 locationAndDomainKey, SimpleBloomFilter<Number160> keyBloomFilter, SimpleBloomFilter<Number160> contentBloomFilter, int limit, bool ascending, bool isBloomFilterAnd)
        {
            var digestInfo = new DigestInfo();
		    var rLock = Lock(locationAndDomainKey);
		    try {
			    var from = new Number640(locationAndDomainKey, Number160.Zero, Number160.Zero);
			    var to = new Number640(locationAndDomainKey, Number160.MaxValue, Number160.MaxValue);
			    var tmp = _backend.SubMap(from, to, limit, ascending);

			    foreach (var kvp in tmp)
                {
				    if (isBloomFilterAnd)
                    {
					    if (keyBloomFilter == null || keyBloomFilter.Contains(kvp.Key.ContentKey))
                        {
						    if (contentBloomFilter == null || contentBloomFilter.Contains(kvp.Value.Hash))
                            {
							    if (!kvp.Value.HasPrepareFlag)
                                {
								    digestInfo.Put(kvp.Key, kvp.Value.BasedOnSet);
							    }
						    }
					    }
				    }
                    else
                    {
					    if (keyBloomFilter == null || !keyBloomFilter.Contains(kvp.Key.ContentKey))
                        {
						    if (contentBloomFilter == null || !contentBloomFilter.Contains(kvp.Value.Hash))
                            {
							    if (!kvp.Value.HasPrepareFlag)
                                {
								    digestInfo.Put(kvp.Key, kvp.Value.BasedOnSet);
							    }
						    }
					    }
				    }
			    }
			    return digestInfo;
		    } 
            finally
            {
			    rLock.Unlock();
		    }
        }
Exemple #12
0
        public override void HandleResponse(Message.Message requestMessage, PeerConnection peerConnection, bool sign, IResponder responder)
        {
            if (requestMessage.KeyList.Count < 2)
            {
                throw new ArgumentException("At least location and domain keys are needed.");
            }
            if (!(requestMessage.Type == Message.Message.MessageType.Request1
                || requestMessage.Type == Message.Message.MessageType.Request2
                || requestMessage.Type == Message.Message.MessageType.Request3
                || requestMessage.Type == Message.Message.MessageType.Request4)
                && (requestMessage.Command == Rpc.Commands.Neighbor.GetNr()))
            {
                throw new ArgumentException("Message content is wrong for this handler.");
            }

            Number160 locationKey = requestMessage.Key(0);
            Number160 domainKey = requestMessage.Key(1);

            var neighbors = GetNeighbors(locationKey, NeighborSize);
            if (neighbors == null)
            {
                // return empty neighbor set
                var response = CreateResponseMessage(requestMessage, Message.Message.MessageType.NotFound);
                response.SetNeighborSet(new NeighborSet(-1, new Collection<PeerAddress>()));
                responder.Response(response);
                return;
            }

            // create response message and set neighbors
            var responseMessage = CreateResponseMessage(requestMessage, Message.Message.MessageType.Ok);

            Logger.Debug("Found the following neighbors: {0}.", Convenient.ToString(neighbors));
            var neighborSet = new NeighborSet(NeighborLimit, neighbors);
            responseMessage.SetNeighborSet(neighborSet);

            Number160 contentKey = requestMessage.Key(2);
            var keyBloomFilter = requestMessage.BloomFilter(0);
            var contentBloomFilter = requestMessage.BloomFilter(1);
            var keyCollection = requestMessage.KeyCollection(0);

            // it is important to set an integer if a value is present
            bool isDigest = requestMessage.Type != Message.Message.MessageType.Request1;
            if (isDigest)
            {
                if (requestMessage.Type == Message.Message.MessageType.Request2)
                {
                    DigestInfo digestInfo;
                    if (PeerBean.DigestStorage == null)
                    {
                        // no storage to search
                        digestInfo = new DigestInfo();
                    }
                    else if (contentKey != null && locationKey != null && domainKey != null)
                    {
                        var locationAndDomainKey = new Number320(locationKey, domainKey);
                        var from = new Number640(locationAndDomainKey, contentKey, Number160.Zero);
                        var to = new Number640(locationAndDomainKey, contentKey, Number160.MaxValue);
                        digestInfo = PeerBean.DigestStorage.Digest(from, to, -1, true);
                    }
                    else if ((keyBloomFilter != null || contentBloomFilter != null) && locationKey != null && domainKey != null)
                    {
                        var locationAndDomainKey = new Number320(locationKey, domainKey);
                        digestInfo = PeerBean.DigestStorage.Digest(locationAndDomainKey, keyBloomFilter,
                                contentBloomFilter, -1, true, true);
                    }
                    else if (keyCollection != null && keyCollection.Keys.Count == 2)
                    {
                        var enumerator = keyCollection.Keys.GetEnumerator();
                        var from = enumerator.MoveNext() ? enumerator.Current : null; // TODO works correctly?
                        var to = enumerator.MoveNext() ? enumerator.Current : null;

                        digestInfo = PeerBean.DigestStorage.Digest(from, to, -1, true);
                    }
                    else if (locationKey != null && domainKey != null)
                    {
                        var locationAndDomainKey = new Number320(locationKey, domainKey);
                        var from = new Number640(locationAndDomainKey, Number160.Zero, Number160.Zero);
                        var to = new Number640(locationAndDomainKey, Number160.MaxValue, Number160.MaxValue);
                        digestInfo = PeerBean.DigestStorage.Digest(from, to, -1, true);
                    }
                    else
                    {
                        Logger.Warn("Did not search for anything.");
                        digestInfo = new DigestInfo();
                    }
                    responseMessage.SetIntValue(digestInfo.Size);
                    responseMessage.SetKey(digestInfo.KeyDigest);
                    responseMessage.SetKey(digestInfo.ContentDigest);
                }
                else if (requestMessage.Type == Message.Message.MessageType.Request3)
                {
                    DigestInfo digestInfo;
                    if (PeerBean.DigestTracker == null)
                    {
                        // no tracker to search
                        digestInfo = new DigestInfo();
                    }
                    else
                    {
                        digestInfo = PeerBean.DigestTracker.Digest(locationKey, domainKey, contentKey);
                        if (digestInfo.Size == 0)
                        {
                            Logger.Debug("No entry found on peer {0}.", requestMessage.Recipient);
                        }
                    }
                    responseMessage.SetIntValue(digestInfo.Size);
                }
                else if (requestMessage.Type == Message.Message.MessageType.Request4)
                {
                    lock (PeerBean.PeerStatusListeners)
                    {
                        foreach (var listener in PeerBean.PeerStatusListeners)
                        {
                            listener.PeerFailed(requestMessage.Sender,
                                new PeerException(PeerException.AbortCauseEnum.Shutdown, "shutdown"));
                        }
                    }
                }
            }

            responder.Response(responseMessage);
        }