Beispiel #1
0
        private void SaveConfig(Store s)
        {
            var lookup = s.GetMatching(e => (StoreRecordId)e[0] == StoreRecordId.StoreIdConfig, 1);
            var str2ix = new Dictionary <I2PString, int>();

            foreach (var one in lookup)
            {
                var reader = new BufRefLen(one.Value);
                reader.Read32();
                var key = new I2PString(reader);
                str2ix[key] = one.Key;
            }

            AccessConfig(delegate(Dictionary <I2PString, I2PString> settings)
            {
                foreach (var one in settings)
                {
                    var rec = new BufLen[] {
                        BufUtils.To32BL((int)StoreRecordId.StoreIdConfig),
                        new BufLen(one.Key.ToByteArray()), new BufLen(one.Value.ToByteArray())
                    };

                    if (str2ix.ContainsKey(one.Key))
                    {
                        s.Write(rec, str2ix[one.Key]);
                    }
                    else
                    {
                        s.Write(rec);
                    }
                }
            });
        }
Beispiel #2
0
        public GetDateMessage(BufRefLen reader)
            : base(ProtocolMessageType.GetDate)
        {
            Version = new I2PString(reader);

            // As of release 0.9.11, the authentication [Mapping] may be included, with the keys i2cp.username and i2cp.password.
            if (reader.Length > 0)
            {
                Mapping = new I2PMapping(reader);
            }
        }
Beispiel #3
0
 public GetDateMessage(BufRef reader)
     : base(ProtocolMessageType.GetDate)
 {
     reader.Seek(4);
     if ((ProtocolMessageType)reader.Read8() != MessageType)
     {
         throw new ArgumentException("GetDateMessage( reader ) Wrong message type.");
     }
     Version = new I2PString(reader);
     Mapping = new I2PMapping(reader);
 }
Beispiel #4
0
        public HostLookupMessage(BufRefLen reader)
            : base(ProtocolMessageType.HostLookup)
        {
            SessionId           = reader.ReadFlip16();
            RequestId           = reader.ReadFlip32();
            TimeoutMilliseconds = reader.ReadFlip32();
            RequestType         = (HostLookupTypes)reader.Read8();

            switch (RequestType)
            {
            case HostLookupTypes.Hash:
                Hash = new I2PIdentHash(reader);
                break;

            case HostLookupTypes.HostName:
                HostName = new I2PString(reader);
                break;
            }
        }
Beispiel #5
0
        void Save(bool onlyupdated)
        {
            var deleted = 0;
            var saved   = 0;

            var sw = new Stopwatch();

            sw.Start();

            var inactive = Statistics.GetInactive();

            if (RouterInfos.Count - inactive.Count() <= RouterInfoCountLowWaterMark)
            {
                inactive = inactive.Take(RouterInfos.Count - RouterInfoCountLowWaterMark);
            }
            RemoveRouterInfo(inactive);

            using (var s = GetStore())
            {
                lock ( RouterInfos )
                {
                    foreach (var one in RouterInfos.ToArray())
                    {
                        try
                        {
                            if (one.Value.Value.Deleted)
                            {
                                if (one.Value.Value.StoreIx > 0)
                                {
                                    s.Delete(one.Value.Value.StoreIx);
                                }
                                RouterInfos.Remove(one.Key);
                                ++deleted;
                                continue;
                            }

                            if (!onlyupdated || (onlyupdated && one.Value.Value.Updated))
                            {
                                var rec = new BufLen[] { (BufLen)(int)StoreRecordId.StoreIdRouterInfo, new BufLen(one.Value.Key.ToByteArray()) };
                                if (one.Value.Value.StoreIx > 0)
                                {
                                    s.Write(rec, one.Value.Value.StoreIx);
                                }
                                else
                                {
                                    one.Value.Value.StoreIx = s.Write(rec);
                                }
                                one.Value.Value.Updated = false;
                                ++saved;
                            }
                        }
                        catch (Exception ex)
                        {
                            DebugUtils.LogDebug("NetDb: Save: Store exception: " + ex.ToString());
                            one.Value.Value.StoreIx = -1;
                        }
                    }
                }

                var lookup = s.GetMatching(e => (StoreRecordId)e[0] == StoreRecordId.StoreIdConfig, 1);
                Dictionary <I2PString, int> str2ix = new Dictionary <I2PString, int>();
                foreach (var one in lookup)
                {
                    var reader = new BufRefLen(one.Value);
                    reader.Read32();
                    var key = new I2PString(reader);
                    str2ix[key] = one.Key;
                }

                AccessConfig(delegate(Dictionary <I2PString, I2PString> settings)
                {
                    foreach (var one in settings)
                    {
                        var rec = new BufLen[] { (BufLen)(int)StoreRecordId.StoreIdConfig,
                                                 new BufLen(one.Key.ToByteArray()), new BufLen(one.Value.ToByteArray()) };

                        if (str2ix.ContainsKey(one.Key))
                        {
                            s.Write(rec, str2ix[one.Key]);
                        }
                        else
                        {
                            s.Write(rec);
                        }
                    }
                });
            }

            DebugUtils.Log(string.Format("NetDb.Save( {1} ): {0} entries saved, {2} deleted.",
                                         saved,
                                         onlyupdated ? "updated" : "all",
                                         deleted));

            Statistics.Save();
            UpdateSelectionProbabilities();

            sw.Stop();
            DebugUtils.Log("NetDB: Save: " + sw.Elapsed.ToString());
        }
Beispiel #6
0
        void Load()
        {
            using (var s = GetStore())
            {
                var sw2 = new Stopwatch();
                sw2.Start();
                var ix = 0;
                while (s != null && (ix = s.Next(ix)) > 0)
                {
                    var reader     = new BufRefLen(s.Read(ix));
                    var recordtype = (StoreRecordId)reader.Read32();

                    try
                    {
                        switch (recordtype)
                        {
                        case StoreRecordId.StoreIdRouterInfo:
                            var one   = new I2PRouterInfo(reader, false);
                            var known = RouterInfos.ContainsKey(one.Identity.IdentHash);

                            if (!ValidateRI(one) && known)
                            {
                                s.Delete(RouterInfos[one.Identity.IdentHash].Value.StoreIx);
                                RouterInfos.Remove(one.Identity.IdentHash);
                                Statistics.DestinationInformationFaulty(one.Identity.IdentHash);
                                continue;
                            }

                            RouterInfos[one.Identity.IdentHash] = new KeyValuePair <I2PRouterInfo, RouterInfoMeta>(
                                one,
                                new RouterInfoMeta(ix));
                            break;

                        case StoreRecordId.StoreIdConfig:
                            AccessConfig(delegate(Dictionary <I2PString, I2PString> settings)
                            {
                                var key       = new I2PString(reader);
                                settings[key] = new I2PString(reader);
                            });
                            break;

                        default:
                            s.Delete(ix);
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        DebugUtils.LogDebug($"NetDb: Load: Store exception, ix [{ix}] removed. {ex}");
                        s.Delete(ix);
                    }
                }
                sw2.Stop();
                DebugUtils.Log($"Store: {sw2.Elapsed}");
            }

            var files = GetNetDbFiles();

            foreach (var file in files)
            {
                AddRouterInfo(file);
            }

            lock (RouterInfos)
                if (RouterInfos.Count == 0)
                {
                    DebugUtils.LogWarning($"WARNING: NetDB database contains no routers. Add router files to {NetDbPath}.");
                }

            Statistics.Load();
            UpdateSelectionProbabilities();

            Save(true);

            foreach (var file in files)
            {
                File.Delete(file);
            }
        }
Beispiel #7
0
        void Load()
        {
            using (var s = GetStore())
            {
                var sw2 = new Stopwatch();
                sw2.Start();
                var ix = 0;
                while (s != null && (ix = s.Next(ix)) > 0)
                {
                    var reader     = new BufRefLen(s.Read(ix));
                    var recordtype = (StoreRecordId)reader.Read32();

                    try
                    {
                        switch (recordtype)
                        {
                        case StoreRecordId.StoreIdRouterInfo:
                            var one = new I2PRouterInfo(reader, false);

                            if (!ValidateRI(one))
                            {
                                s.Delete(ix);
                                RouterInfos.TryRemove(one.Identity.IdentHash, out _);
                                FloodfillInfos.TryRemove(one.Identity.IdentHash, out _);
                                Statistics.DestinationInformationFaulty(one.Identity.IdentHash);

                                continue;
                            }

                            if (!RouterContext.Inst.UseIpV6)
                            {
                                if (!one.Adresses.Any(a => a.Options.ValueContains("host", ".")))
                                {
                                    Logging.LogDebug($"NetDb: RouterInfo have no IPV4 address: {one.Identity.IdentHash.Id32}");
                                    s.Delete(ix);

                                    continue;
                                }
                            }

                            var re = new RouterEntry(
                                one,
                                new RouterInfoMeta(ix));
                            RouterInfos[one.Identity.IdentHash] = re;
                            if (re.IsFloodfill)
                            {
                                FloodfillInfos[one.Identity.IdentHash] = re;
                            }
                            break;

                        case StoreRecordId.StoreIdConfig:
                            AccessConfig(delegate(Dictionary <I2PString, I2PString> settings)
                            {
                                var key       = new I2PString(reader);
                                settings[key] = new I2PString(reader);
                            });
                            break;

                        default:
                            s.Delete(ix);
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        Logging.LogDebug($"NetDb: Load: Store exception, ix [{ix}] removed. {ex}");
                        s.Delete(ix);
                    }
                }
                sw2.Stop();
                Logging.Log($"Store: {sw2.Elapsed}");
            }

            ImportNetDbFiles();

            if (RouterInfos.Count < 20)
            {
                Logging.LogWarning($"WARNING: NetDB database contains " +
                                   $"{RouterInfos.Count} routers. Add router files to {NetDbPath}.");

                DoBootstrap();
            }

            Statistics.Load();
            IsFirewalledUpdate();

#if DEBUG
            ShowDebugDatabaseInfo();
#endif

            UpdateSelectionProbabilities();

            Save(true);
        }
Beispiel #8
0
 public SetDateMessage(BufRef data)
     : base(ProtocolMessageType.SetDate)
 {
     Date    = new I2PDate(data);
     Version = new I2PString(data);
 }
Beispiel #9
0
 public SetDateMessage(I2PDate date, I2PString ver)
     : base(ProtocolMessageType.SetDate)
 {
     Date    = date;
     Version = ver;
 }
Beispiel #10
0
        void Save(bool onlyupdated)
        {
            var created = 0;
            var updated = 0;
            var deleted = 0;

            var sw = new Stopwatch();

            sw.Start();

            var inactive = Statistics.GetInactive();

            RemoveRouterInfo(inactive);

            using (var s = GetStore())
            {
                lock ( RouterInfos )
                {
                    foreach (var one in RouterInfos.ToArray())
                    {
                        try
                        {
                            if (one.Value.Value.Deleted)
                            {
                                if (one.Value.Value.StoreIx > 0)
                                {
                                    s.Delete(one.Value.Value.StoreIx);
                                }
                                RouterInfos.Remove(one.Key);
                                ++deleted;
                                continue;
                            }

                            if (!onlyupdated || (onlyupdated && one.Value.Value.Updated))
                            {
                                var rec = new BufLen[] { (BufLen)(int)StoreRecordId.StoreIdRouterInfo, new BufLen(one.Value.Key.ToByteArray()) };
                                if (one.Value.Value.StoreIx > 0)
                                {
                                    s.Write(rec, one.Value.Value.StoreIx);
                                    ++updated;
                                }
                                else
                                {
                                    one.Value.Value.StoreIx = s.Write(rec);
                                    ++created;
                                }
                                one.Value.Value.Updated = false;
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.LogDebug("NetDb: Save: Store exception: " + ex.ToString());
                            one.Value.Value.StoreIx = -1;
                        }
                    }
                }

                var lookup = s.GetMatching(e => (StoreRecordId)e[0] == StoreRecordId.StoreIdConfig, 1);
                Dictionary <I2PString, int> str2ix = new Dictionary <I2PString, int>();
                foreach (var one in lookup)
                {
                    var reader = new BufRefLen(one.Value);
                    reader.Read32();
                    var key = new I2PString(reader);
                    str2ix[key] = one.Key;
                }

                AccessConfig(delegate(Dictionary <I2PString, I2PString> settings)
                {
                    foreach (var one in settings)
                    {
                        var rec = new BufLen[] { (BufLen)(int)StoreRecordId.StoreIdConfig,
                                                 new BufLen(one.Key.ToByteArray()), new BufLen(one.Value.ToByteArray()) };

                        if (str2ix.ContainsKey(one.Key))
                        {
                            s.Write(rec, str2ix[one.Key]);
                        }
                        else
                        {
                            s.Write(rec);
                        }
                    }
                });
            }

            Logging.Log($"NetDb.Save( {( onlyupdated ? "updated" : "all" )} ): " +
                        $"{created} created, {updated} updated, {deleted} deleted.");

            Statistics.RemoveOldStatistics();
            UpdateSelectionProbabilities();

            sw.Stop();
            Logging.Log($"NetDB: Save: {sw.Elapsed}");
        }
Beispiel #11
0
 public GetDateMessage(string ver, I2PMapping map)
     : base(ProtocolMessageType.GetDate)
 {
     Version = new I2PString(ver);
     Mapping = map;
 }