diff --git a/.tx/config b/.tx/config index 09904d97cf..c819fc6744 100644 --- a/.tx/config +++ b/.tx/config @@ -1,620 +1,698 @@ +;; warning - conversions for all Java bundles: +;; id->in, he->iw, iy, yi->ji + [main] -host = https://www.transifex.com +host = https://www.transifex.com +lang_map = ru_RU: ru, sv_SE: sv, tr_TR: tr, uk_UA: uk, zh_CN: zh, et_EE: et, id: in, he: iw + +[o:otf:p:I2P:r:i2ptunnel] +file_filter = apps/i2ptunnel/locale/messages_.po +source_file = apps/i2ptunnel/locale/messages_en.po +source_lang = en +trans.ar = apps/i2ptunnel/locale/messages_ar.po +trans.cs = apps/i2ptunnel/locale/messages_cs.po +trans.da = apps/i2ptunnel/locale/messages_da.po +trans.de = apps/i2ptunnel/locale/messages_de.po +trans.es = apps/i2ptunnel/locale/messages_es.po +trans.es_AR = apps/i2ptunnel/locale/messages_es_AR.po +trans.fa = apps/i2ptunnel/locale/messages_fa.po +trans.fi = apps/i2ptunnel/locale/messages_fi.po +trans.fr = apps/i2ptunnel/locale/messages_fr.po +trans.hu = apps/i2ptunnel/locale/messages_hu.po +;; Java converts id to in +trans.id = apps/i2ptunnel/locale/messages_in.po +trans.it = apps/i2ptunnel/locale/messages_it.po +trans.ja = apps/i2ptunnel/locale/messages_ja.po +trans.ko = apps/i2ptunnel/locale/messages_ko.po +trans.nb = apps/i2ptunnel/locale/messages_nb.po +trans.nl = apps/i2ptunnel/locale/messages_nl.po +trans.nn = apps/i2ptunnel/locale/messages_nn.po +trans.pl = apps/i2ptunnel/locale/messages_pl.po +trans.pt = apps/i2ptunnel/locale/messages_pt.po +trans.pt_BR = apps/i2ptunnel/locale/messages_pt_BR.po +trans.ro = apps/i2ptunnel/locale/messages_ro.po +trans.ru_RU = apps/i2ptunnel/locale/messages_ru.po +trans.sk = apps/i2ptunnel/locale/messages_sk.po +trans.sq = apps/i2ptunnel/locale/messages_sq.po +trans.sv_SE = apps/i2ptunnel/locale/messages_sv.po +trans.tr_TR = apps/i2ptunnel/locale/messages_tr.po +trans.uk_UA = apps/i2ptunnel/locale/messages_uk.po +trans.vi = apps/i2ptunnel/locale/messages_vi.po +trans.zh_CN = apps/i2ptunnel/locale/messages_zh.po +trans.zh_TW = apps/i2ptunnel/locale/messages_zh_TW.po + +[o:otf:p:I2P:r:proxy] +file_filter = apps/i2ptunnel/locale-proxy/messages_.po +source_file = apps/i2ptunnel/locale-proxy/messages_en.po +source_lang = en +trans.ar = apps/i2ptunnel/locale-proxy/messages_ar.po +trans.cs = apps/i2ptunnel/locale-proxy/messages_cs.po +trans.de = apps/i2ptunnel/locale-proxy/messages_de.po +trans.el = apps/i2ptunnel/locale-proxy/messages_el.po +trans.es = apps/i2ptunnel/locale-proxy/messages_es.po +trans.es_AR = apps/i2ptunnel/locale-proxy/messages_es_AR.po +trans.fa = apps/i2ptunnel/locale-proxy/messages_fa.po +trans.fi = apps/i2ptunnel/locale-proxy/messages_fi.po +trans.fr = apps/i2ptunnel/locale-proxy/messages_fr.po +trans.hu = apps/i2ptunnel/locale-proxy/messages_hu.po +;; Java converts id to in +trans.id = apps/i2ptunnel/locale-proxy/messages_in.po +trans.it = apps/i2ptunnel/locale-proxy/messages_it.po +trans.ja = apps/i2ptunnel/locale-proxy/messages_ja.po +trans.ko = apps/i2ptunnel/locale-proxy/messages_ko.po +trans.nb = apps/i2ptunnel/locale-proxy/messages_nb.po +trans.nl = apps/i2ptunnel/locale-proxy/messages_nl.po +trans.nn = apps/i2ptunnel/locale-proxy/messages_nn.po +trans.pl = apps/i2ptunnel/locale-proxy/messages_pl.po +trans.pt = apps/i2ptunnel/locale-proxy/messages_pt.po +trans.pt_BR = apps/i2ptunnel/locale-proxy/messages_pt_BR.po +trans.ro = apps/i2ptunnel/locale-proxy/messages_ro.po +trans.ru_RU = apps/i2ptunnel/locale-proxy/messages_ru.po +trans.sk = apps/i2ptunnel/locale-proxy/messages_sk.po +trans.sv_SE = apps/i2ptunnel/locale-proxy/messages_sv.po +trans.tr_TR = apps/i2ptunnel/locale-proxy/messages_tr.po +trans.uk_UA = apps/i2ptunnel/locale-proxy/messages_uk.po +trans.vi = apps/i2ptunnel/locale-proxy/messages_vi.po +trans.zh_CN = apps/i2ptunnel/locale-proxy/messages_zh.po +trans.zh_TW = apps/i2ptunnel/locale-proxy/messages_zh_TW.po [o:otf:p:I2P:r:core] +file_filter = core/locale/messages_.po +type = PO source_file = core/locale/messages_en.po source_lang = en -type = PO -trans.ku = core/locale/messages_ku.po -trans.nl = core/locale/messages_nl.po -trans.pt_BR = core/locale/messages_pt_BR.po -trans.uk_UA = core/locale/messages_uk.po -trans.az = core/locale/messages_az.po -trans.el = core/locale/messages_el.po -trans.id = core/locale/messages_in.po +trans.ar = core/locale/messages_ar.po +trans.az = core/locale/messages_az.po +trans.cs = core/locale/messages_cs.po +trans.da = core/locale/messages_da.po +trans.de = core/locale/messages_de.po +trans.el = core/locale/messages_el.po +trans.es = core/locale/messages_es.po trans.et_EE = core/locale/messages_et.po -trans.hu = core/locale/messages_hu.po -trans.ro = core/locale/messages_ro.po -trans.sl = core/locale/messages_sl.po -trans.da = core/locale/messages_da.po -trans.tr_TR = core/locale/messages_tr.po -trans.ar = core/locale/messages_ar.po -trans.cs = core/locale/messages_cs.po -trans.pl = core/locale/messages_pl.po +trans.fa = core/locale/messages_fa.po +trans.fi = core/locale/messages_fi.po +trans.fr = core/locale/messages_fr.po +trans.hu = core/locale/messages_hu.po +;; Java converts id to in +trans.id = core/locale/messages_in.po +trans.it = core/locale/messages_it.po +trans.ja = core/locale/messages_ja.po +trans.ko = core/locale/messages_ko.po +trans.ku = core/locale/messages_ku.po +trans.nb = core/locale/messages_nb.po +trans.nl = core/locale/messages_nl.po +trans.pl = core/locale/messages_pl.po +trans.pt = core/locale/messages_pt.po +trans.pt_BR = core/locale/messages_pt_BR.po +trans.ro = core/locale/messages_ro.po trans.ru_RU = core/locale/messages_ru.po -trans.it = core/locale/messages_it.po -trans.ko = core/locale/messages_ko.po +trans.sl = core/locale/messages_sl.po trans.sv_SE = core/locale/messages_sv.po -trans.tk = core/locale/messages_tk.po -trans.vi = core/locale/messages_vi.po +trans.tk = core/locale/messages_tk.po +trans.tr_TR = core/locale/messages_tr.po +trans.uk_UA = core/locale/messages_uk.po +trans.vi = core/locale/messages_vi.po trans.zh_CN = core/locale/messages_zh.po trans.zh_TW = core/locale/messages_zh_TW.po -trans.de = core/locale/messages_de.po -trans.es = core/locale/messages_es.po -trans.fr = core/locale/messages_fr.po -trans.ja = core/locale/messages_ja.po -trans.nb = core/locale/messages_nb.po -trans.pt = core/locale/messages_pt.po -trans.fa = core/locale/messages_fa.po -trans.fi = core/locale/messages_fi.po + +[o:otf:p:I2P:r:router] +file_filter = router/locale/messages_.po +type = PO +source_file = router/locale/messages_en.po +source_lang = en +trans.ar = router/locale/messages_ar.po +trans.az = router/locale/messages_az.po +trans.cs = router/locale/messages_cs.po +trans.da = router/locale/messages_da.po +trans.de = router/locale/messages_de.po +trans.el = router/locale/messages_el.po +trans.es = router/locale/messages_es.po +trans.es_AR = router/locale/messages_es_AR.po +trans.et_EE = router/locale/messages_et.po +trans.fa = router/locale/messages_fa.po +trans.fi = router/locale/messages_fi.po +trans.fr = router/locale/messages_fr.po +trans.hu = router/locale/messages_hu.po +;; Java converts id to in +trans.id = router/locale/messages_in.po +trans.it = router/locale/messages_it.po +trans.ja = router/locale/messages_ja.po +trans.ko = router/locale/messages_ko.po +trans.ku = router/locale/messages_ku.po +trans.nb = router/locale/messages_nb.po +trans.nl = router/locale/messages_nl.po +trans.pl = router/locale/messages_pl.po +trans.pt = router/locale/messages_pt.po +trans.pt_BR = router/locale/messages_pt_BR.po +trans.ro = router/locale/messages_ro.po +trans.ru_RU = router/locale/messages_ru.po +trans.sl = router/locale/messages_sl.po +trans.sv_SE = router/locale/messages_sv.po +trans.tk = router/locale/messages_tk.po +trans.tr_TR = router/locale/messages_tr.po +trans.uk_UA = router/locale/messages_uk.po +trans.vi = router/locale/messages_vi.po +trans.zh_CN = router/locale/messages_zh.po +trans.zh_TW = router/locale/messages_zh_TW.po + +[o:otf:p:I2P:r:routerconsole] +file_filter = apps/routerconsole/locale/messages_.po +source_file = apps/routerconsole/locale/messages_en.po +source_lang = en +trans.ar = apps/routerconsole/locale/messages_ar.po +trans.az = apps/routerconsole/locale/messages_az.po +trans.cs = apps/routerconsole/locale/messages_cs.po +trans.da = apps/routerconsole/locale/messages_da.po +trans.de = apps/routerconsole/locale/messages_de.po +trans.el = apps/routerconsole/locale/messages_el.po +trans.es = apps/routerconsole/locale/messages_es.po +trans.es_AR = apps/routerconsole/locale/messages_es_AR.po +trans.et_EE = apps/routerconsole/locale/messages_et.po +trans.fa = apps/routerconsole/locale/messages_fa.po +trans.fi = apps/routerconsole/locale/messages_fi.po +trans.fr = apps/routerconsole/locale/messages_fr.po +trans.hu = apps/routerconsole/locale/messages_hu.po +;; Java converts id to in +trans.id = apps/routerconsole/locale/messages_in.po +trans.it = apps/routerconsole/locale/messages_it.po +trans.ja = apps/routerconsole/locale/messages_ja.po +trans.ko = apps/routerconsole/locale/messages_ko.po +trans.nb = apps/routerconsole/locale/messages_nb.po +trans.nl = apps/routerconsole/locale/messages_nl.po +trans.pl = apps/routerconsole/locale/messages_pl.po +trans.pt = apps/routerconsole/locale/messages_pt.po +trans.pt_BR = apps/routerconsole/locale/messages_pt_BR.po +trans.ro = apps/routerconsole/locale/messages_ro.po +trans.ru_RU = apps/routerconsole/locale/messages_ru.po +trans.sv_SE = apps/routerconsole/locale/messages_sv.po +trans.tr_TR = apps/routerconsole/locale/messages_tr.po +trans.uk_UA = apps/routerconsole/locale/messages_uk.po +trans.vi = apps/routerconsole/locale/messages_vi.po +trans.zh_CN = apps/routerconsole/locale/messages_zh.po +trans.zh_TW = apps/routerconsole/locale/messages_zh_TW.po + +[o:otf:p:I2P:r:welcome] +file_filter = apps/routerconsole/locale-news/messages_.po +source_file = apps/routerconsole/locale-news/messages_en.po +source_lang = en +trans.ar = apps/routerconsole/locale-news/messages_ar.po +trans.az = apps/routerconsole/locale-news/messages_az.po +trans.cs = apps/routerconsole/locale-news/messages_cs.po +trans.de = apps/routerconsole/locale-news/messages_de.po +trans.el = apps/routerconsole/locale-news/messages_el.po +trans.es = apps/routerconsole/locale-news/messages_es.po +trans.es_AR = apps/routerconsole/locale-news/messages_es_AR.po +trans.fa = apps/routerconsole/locale-news/messages_fa.po +trans.fi = apps/routerconsole/locale-news/messages_fi.po +trans.fr = apps/routerconsole/locale-news/messages_fr.po +trans.gl = apps/routerconsole/locale-news/messages_gl.po +;; Java converts he to iw +trans.he = apps/routerconsole/locale-news/messages_iw.po +trans.hu = apps/routerconsole/locale-news/messages_hu.po +;; Java converts id to in +trans.id = apps/routerconsole/locale-news/messages_in.po +trans.it = apps/routerconsole/locale-news/messages_it.po +trans.ja = apps/routerconsole/locale-news/messages_ja.po +trans.ko = apps/routerconsole/locale-news/messages_ko.po +trans.ku = apps/routerconsole/locale-news/messages_ku.po +trans.mg = apps/routerconsole/locale-news/messages_mg.po +trans.nb = apps/routerconsole/locale-news/messages_nb.po +trans.nl = apps/routerconsole/locale-news/messages_nl.po +trans.pl = apps/routerconsole/locale-news/messages_pl.po +trans.pt = apps/routerconsole/locale-news/messages_pt.po +trans.pt_BR = apps/routerconsole/locale-news/messages_pt_BR.po +trans.ro = apps/routerconsole/locale-news/messages_ro.po +trans.ru_RU = apps/routerconsole/locale-news/messages_ru.po +trans.sk = apps/routerconsole/locale-news/messages_sk.po +trans.sl = apps/routerconsole/locale-news/messages_sl.po +trans.sq = apps/routerconsole/locale-news/messages_sq.po +trans.sr = apps/routerconsole/locale-news/messages_sr.po +trans.sv_SE = apps/routerconsole/locale-news/messages_sv.po +trans.tk = apps/routerconsole/locale-news/messages_tk.po +trans.tr_TR = apps/routerconsole/locale-news/messages_tr.po +trans.uk_UA = apps/routerconsole/locale-news/messages_uk.po +trans.zh_CN = apps/routerconsole/locale-news/messages_zh.po +trans.zh_TW = apps/routerconsole/locale-news/messages_zh_TW.po [o:otf:p:I2P:r:countries] +file_filter = apps/routerconsole/locale-countries/messages_.po +type = PO source_file = apps/routerconsole/locale-countries/messages_en.po source_lang = en -type = PO -trans.et_EE = apps/routerconsole/locale-countries/messages_et.po -trans.hi = apps/routerconsole/locale-countries/messages_hi.po -trans.sr = apps/routerconsole/locale-countries/messages_sr.po -trans.tr_TR = apps/routerconsole/locale-countries/messages_tr.po -trans.ar = apps/routerconsole/locale-countries/messages_ar.po -trans.az = apps/routerconsole/locale-countries/messages_az.po +trans.ar = apps/routerconsole/locale-countries/messages_ar.po +trans.az = apps/routerconsole/locale-countries/messages_az.po +trans.bg = apps/routerconsole/locale-countries/messages_bg.po +trans.ca = apps/routerconsole/locale-countries/messages_ca.po +trans.cs = apps/routerconsole/locale-countries/messages_cs.po +trans.da = apps/routerconsole/locale-countries/messages_da.po +trans.de = apps/routerconsole/locale-countries/messages_de.po +trans.el = apps/routerconsole/locale-countries/messages_el.po +trans.es = apps/routerconsole/locale-countries/messages_es.po trans.es_AR = apps/routerconsole/locale-countries/messages_es_AR.po -trans.hu = apps/routerconsole/locale-countries/messages_hu.po -trans.it = apps/routerconsole/locale-countries/messages_it.po -trans.ku = apps/routerconsole/locale-countries/messages_ku.po -trans.sk = apps/routerconsole/locale-countries/messages_sk.po -trans.bg = apps/routerconsole/locale-countries/messages_bg.po -trans.nb = apps/routerconsole/locale-countries/messages_nb.po -trans.ca = apps/routerconsole/locale-countries/messages_ca.po -trans.hr = apps/routerconsole/locale-countries/messages_hr.po -trans.pl = apps/routerconsole/locale-countries/messages_pl.po -trans.ru_RU = apps/routerconsole/locale-countries/messages_ru.po -trans.sq = apps/routerconsole/locale-countries/messages_sq.po -trans.tk = apps/routerconsole/locale-countries/messages_tk.po -trans.zh_TW = apps/routerconsole/locale-countries/messages_zh_TW.po -trans.de = apps/routerconsole/locale-countries/messages_de.po -trans.id = apps/routerconsole/locale-countries/messages_in.po -trans.ja = apps/routerconsole/locale-countries/messages_ja.po -trans.ko = apps/routerconsole/locale-countries/messages_ko.po +trans.et_EE = apps/routerconsole/locale-countries/messages_et.po +trans.fa = apps/routerconsole/locale-countries/messages_fa.po +trans.fi = apps/routerconsole/locale-countries/messages_fi.po +trans.fr = apps/routerconsole/locale-countries/messages_fr.po +trans.gl = apps/routerconsole/locale-countries/messages_gl.po +trans.hi = apps/routerconsole/locale-countries/messages_hi.po +trans.hr = apps/routerconsole/locale-countries/messages_hr.po +trans.hu = apps/routerconsole/locale-countries/messages_hu.po +;; Java converts he to iw +trans.he = apps/routerconsole/locale-countries/messages_iw.po +;; Java converts id to in +trans.id = apps/routerconsole/locale-countries/messages_in.po +trans.it = apps/routerconsole/locale-countries/messages_it.po +trans.ja = apps/routerconsole/locale-countries/messages_ja.po +trans.ko = apps/routerconsole/locale-countries/messages_ko.po +trans.ku = apps/routerconsole/locale-countries/messages_ku.po +trans.mg = apps/routerconsole/locale-countries/messages_mg.po +trans.nb = apps/routerconsole/locale-countries/messages_nb.po +trans.nl = apps/routerconsole/locale-countries/messages_nl.po +trans.pl = apps/routerconsole/locale-countries/messages_pl.po +trans.pt = apps/routerconsole/locale-countries/messages_pt.po trans.pt_BR = apps/routerconsole/locale-countries/messages_pt_BR.po -trans.vi = apps/routerconsole/locale-countries/messages_vi.po -trans.sl = apps/routerconsole/locale-countries/messages_sl.po -trans.da = apps/routerconsole/locale-countries/messages_da.po -trans.el = apps/routerconsole/locale-countries/messages_el.po -trans.es = apps/routerconsole/locale-countries/messages_es.po -trans.fi = apps/routerconsole/locale-countries/messages_fi.po -trans.fr = apps/routerconsole/locale-countries/messages_fr.po -trans.mg = apps/routerconsole/locale-countries/messages_mg.po -trans.pt = apps/routerconsole/locale-countries/messages_pt.po +trans.ro = apps/routerconsole/locale-countries/messages_ro.po +trans.ru_RU = apps/routerconsole/locale-countries/messages_ru.po +trans.sk = apps/routerconsole/locale-countries/messages_sk.po +trans.sl = apps/routerconsole/locale-countries/messages_sl.po +trans.sq = apps/routerconsole/locale-countries/messages_sq.po +trans.sr = apps/routerconsole/locale-countries/messages_sr.po trans.sv_SE = apps/routerconsole/locale-countries/messages_sv.po -trans.zh_CN = apps/routerconsole/locale-countries/messages_zh.po -trans.cs = apps/routerconsole/locale-countries/messages_cs.po -trans.he = apps/routerconsole/locale-countries/messages_iw.po +trans.tk = apps/routerconsole/locale-countries/messages_tk.po +trans.tr_TR = apps/routerconsole/locale-countries/messages_tr.po trans.uk_UA = apps/routerconsole/locale-countries/messages_uk.po -trans.fa = apps/routerconsole/locale-countries/messages_fa.po -trans.gl = apps/routerconsole/locale-countries/messages_gl.po -trans.nl = apps/routerconsole/locale-countries/messages_nl.po -trans.ro = apps/routerconsole/locale-countries/messages_ro.po +trans.vi = apps/routerconsole/locale-countries/messages_vi.po +trans.zh_CN = apps/routerconsole/locale-countries/messages_zh.po +trans.zh_TW = apps/routerconsole/locale-countries/messages_zh_TW.po -[o:otf:p:I2P:r:debconf] -source_file = debian/po/templates.pot +[o:otf:p:I2P:r:i2psnark] +file_filter = apps/i2psnark/locale/messages_.po +source_file = apps/i2psnark/locale/messages_en.po source_lang = en -trans.tk = debian/po/tk.po -trans.ar = debian/po/ar.po -trans.az = debian/po/az.po -trans.fi = debian/po/fi.po -trans.sk = debian/po/sk.po -trans.cs = debian/po/cs.po -trans.es_AR = debian/po/es_AR.po -trans.fr = debian/po/fr.po -trans.hu = debian/po/hu.po -trans.pt = debian/po/pt.po -trans.uk_UA = debian/po/uk.po -trans.zh_TW = debian/po/zh_TW.po -trans.gl = debian/po/gl.po -trans.es = debian/po/es.po -trans.id = debian/po/id.po -trans.pt_BR = debian/po/pt_BR.po -trans.ro = debian/po/ro.po -trans.sq = debian/po/sq.po -trans.de = debian/po/de.po -trans.el = debian/po/el.po -trans.it = debian/po/it.po -trans.ja = debian/po/ja.po -trans.nb = debian/po/nb.po -trans.nl = debian/po/nl.po -trans.ru_RU = debian/po/ru.po -trans.ko = debian/po/ko.po -trans.sv_SE = debian/po/sv.po -trans.tr_TR = debian/po/tr.po -trans.zh_CN = debian/po/zh.po -trans.pl = debian/po/pl.po -trans.sl = debian/po/sl.po +trans.ar = apps/i2psnark/locale/messages_ar.po +trans.cs = apps/i2psnark/locale/messages_cs.po +trans.da = apps/i2psnark/locale/messages_da.po +trans.de = apps/i2psnark/locale/messages_de.po +trans.el = apps/i2psnark/locale/messages_el.po +trans.es = apps/i2psnark/locale/messages_es.po +trans.es_AR = apps/i2psnark/locale/messages_es_AR.po +trans.fa = apps/i2psnark/locale/messages_fa.po +trans.fi = apps/i2psnark/locale/messages_fi.po +trans.fr = apps/i2psnark/locale/messages_fr.po +trans.hu = apps/i2psnark/locale/messages_hu.po +;; Java converts id to in +trans.id = apps/i2psnark/locale/messages_in.po +trans.it = apps/i2psnark/locale/messages_it.po +trans.ja = apps/i2psnark/locale/messages_ja.po +trans.ko = apps/i2psnark/locale/messages_ko.po +trans.nb = apps/i2psnark/locale/messages_nb.po +trans.nl = apps/i2psnark/locale/messages_nl.po +trans.pl = apps/i2psnark/locale/messages_pl.po +trans.pt = apps/i2psnark/locale/messages_pt.po +trans.pt_BR = apps/i2psnark/locale/messages_pt_BR.po +trans.ro = apps/i2psnark/locale/messages_ro.po +trans.ru_RU = apps/i2psnark/locale/messages_ru.po +trans.sk = apps/i2psnark/locale/messages_sk.po +trans.sv_SE = apps/i2psnark/locale/messages_sv.po +trans.sq = apps/i2psnark/locale/messages_sq.po +trans.tr_TR = apps/i2psnark/locale/messages_tr.po +trans.uk_UA = apps/i2psnark/locale/messages_uk.po +trans.vi = apps/i2psnark/locale/messages_vi.po +trans.zh_CN = apps/i2psnark/locale/messages_zh.po +trans.zh_TW = apps/i2psnark/locale/messages_zh_TW.po + +[o:otf:p:I2P:r:susidns] +file_filter = apps/susidns/locale/messages_.po +source_file = apps/susidns/locale/messages_en.po +source_lang = en +trans.ar = apps/susidns/locale/messages_ar.po +trans.cs = apps/susidns/locale/messages_cs.po +trans.da = apps/susidns/locale/messages_da.po +trans.de = apps/susidns/locale/messages_de.po +trans.el = apps/susidns/locale/messages_el.po +trans.es = apps/susidns/locale/messages_es.po +trans.es_AR = apps/susidns/locale/messages_es_AR.po +trans.fa = apps/susidns/locale/messages_fa.po +trans.fi = apps/susidns/locale/messages_fi.po +trans.fr = apps/susidns/locale/messages_fr.po +trans.gl = apps/susidns/locale/messages_gl.po +trans.hu = apps/susidns/locale/messages_hu.po +;; Java converts id to in +trans.id = apps/susidns/locale/messages_in.po +trans.it = apps/susidns/locale/messages_it.po +trans.ja = apps/susidns/locale/messages_ja.po +trans.ko = apps/susidns/locale/messages_ko.po +trans.nl = apps/susidns/locale/messages_nl.po +trans.pl = apps/susidns/locale/messages_pl.po +trans.pt = apps/susidns/locale/messages_pt.po +trans.pt_BR = apps/susidns/locale/messages_pt_BR.po +trans.ro = apps/susidns/locale/messages_ro.po +trans.ru_RU = apps/susidns/locale/messages_ru.po +trans.sv_SE = apps/susidns/locale/messages_sv.po +trans.tr_TR = apps/susidns/locale/messages_tr.po +trans.uk_UA = apps/susidns/locale/messages_uk.po +trans.vi = apps/susidns/locale/messages_vi.po +trans.zh_CN = apps/susidns/locale/messages_zh.po +trans.zh_TW = apps/susidns/locale/messages_zh_TW.po [o:otf:p:I2P:r:desktopgui] +file_filter = apps/desktopgui/locale/messages_.po source_file = apps/desktopgui/locale/messages_en.po source_lang = en -trans.ca = apps/desktopgui/locale/messages_ca.po -trans.fa = apps/desktopgui/locale/messages_fa.po -trans.fi = apps/desktopgui/locale/messages_fi.po -trans.ku = apps/desktopgui/locale/messages_ku.po -trans.nb = apps/desktopgui/locale/messages_nb.po -trans.sr = apps/desktopgui/locale/messages_sr.po -trans.zh_CN = apps/desktopgui/locale/messages_zh.po -trans.hu = apps/desktopgui/locale/messages_hu.po -trans.pt = apps/desktopgui/locale/messages_pt.po -trans.tr_TR = apps/desktopgui/locale/messages_tr.po -trans.ar = apps/desktopgui/locale/messages_ar.po -trans.cs = apps/desktopgui/locale/messages_cs.po -trans.ro = apps/desktopgui/locale/messages_ro.po -trans.zh_TW = apps/desktopgui/locale/messages_zh_TW.po +trans.ar = apps/desktopgui/locale/messages_ar.po +trans.az = apps/desktopgui/locale/messages_az.po +trans.bg = apps/desktopgui/locale/messages_bg.po +trans.ca = apps/desktopgui/locale/messages_ca.po +trans.cs = apps/desktopgui/locale/messages_cs.po +trans.da = apps/desktopgui/locale/messages_da.po +trans.de = apps/desktopgui/locale/messages_de.po +trans.el = apps/desktopgui/locale/messages_el.po +trans.es = apps/desktopgui/locale/messages_es.po +trans.es_AR = apps/desktopgui/locale/messages_es_AR.po +trans.fa = apps/desktopgui/locale/messages_fa.po +trans.fi = apps/desktopgui/locale/messages_fi.po +trans.fr = apps/desktopgui/locale/messages_fr.po +trans.gl = apps/desktopgui/locale/messages_gl.po +trans.hu = apps/desktopgui/locale/messages_hu.po +;; Java converts id to in +trans.id = apps/desktopgui/locale/messages_in.po +trans.it = apps/desktopgui/locale/messages_it.po +trans.ja = apps/desktopgui/locale/messages_ja.po +trans.ko = apps/desktopgui/locale/messages_ko.po +trans.ku = apps/desktopgui/locale/messages_ku.po +trans.mg = apps/desktopgui/locale/messages_mg.po +trans.nb = apps/desktopgui/locale/messages_nb.po +trans.nl = apps/desktopgui/locale/messages_nl.po +trans.pl = apps/desktopgui/locale/messages_pl.po +trans.pt = apps/desktopgui/locale/messages_pt.po trans.pt_BR = apps/desktopgui/locale/messages_pt_BR.po -trans.az = apps/desktopgui/locale/messages_az.po -trans.bg = apps/desktopgui/locale/messages_bg.po -trans.de = apps/desktopgui/locale/messages_de.po -trans.el = apps/desktopgui/locale/messages_el.po -trans.es = apps/desktopgui/locale/messages_es.po -trans.id = apps/desktopgui/locale/messages_in.po -trans.ko = apps/desktopgui/locale/messages_ko.po -trans.sv_SE = apps/desktopgui/locale/messages_sv.po -trans.mg = apps/desktopgui/locale/messages_mg.po -trans.nl = apps/desktopgui/locale/messages_nl.po +trans.ro = apps/desktopgui/locale/messages_ro.po trans.ru_RU = apps/desktopgui/locale/messages_ru.po -trans.sk = apps/desktopgui/locale/messages_sk.po -trans.sq = apps/desktopgui/locale/messages_sq.po -trans.es_AR = apps/desktopgui/locale/messages_es_AR.po -trans.ja = apps/desktopgui/locale/messages_ja.po -trans.sl = apps/desktopgui/locale/messages_sl.po +trans.sk = apps/desktopgui/locale/messages_sk.po +trans.sl = apps/desktopgui/locale/messages_sl.po +trans.sr = apps/desktopgui/locale/messages_sr.po +trans.sv_SE = apps/desktopgui/locale/messages_sv.po +trans.sq = apps/desktopgui/locale/messages_sq.po +trans.tk = apps/desktopgui/locale/messages_tk.po +trans.tr_TR = apps/desktopgui/locale/messages_tr.po trans.uk_UA = apps/desktopgui/locale/messages_uk.po -trans.fr = apps/desktopgui/locale/messages_fr.po -trans.gl = apps/desktopgui/locale/messages_gl.po -trans.tk = apps/desktopgui/locale/messages_tk.po -trans.da = apps/desktopgui/locale/messages_da.po -trans.it = apps/desktopgui/locale/messages_it.po -trans.pl = apps/desktopgui/locale/messages_pl.po -trans.vi = apps/desktopgui/locale/messages_vi.po +trans.vi = apps/desktopgui/locale/messages_vi.po +trans.zh_CN = apps/desktopgui/locale/messages_zh.po +trans.zh_TW = apps/desktopgui/locale/messages_zh_TW.po -[o:otf:p:I2P:r:eepsite] -source_file = installer/resources/eepsite/docroot/help/index.html +[o:otf:p:I2P:r:susimail] +file_filter = apps/susimail/locale/messages_.po +source_file = apps/susimail/locale/messages_en.po source_lang = en -type = HTML -trans.fa = installer/resources/eepsite/docroot/help/index_fa.html -trans.ru_RU = installer/resources/eepsite/docroot/help/index_ru.html -trans.sv_SE = installer/resources/eepsite/docroot/help/index_sv.html -trans.tr_TR = installer/resources/eepsite/docroot/help/index_tr.html -trans.az = installer/resources/eepsite/docroot/help/index_az.html -trans.el = installer/resources/eepsite/docroot/help/index_el.html -trans.pl = installer/resources/eepsite/docroot/help/index_pl.html -trans.zh_CN = installer/resources/eepsite/docroot/help/index_zh.html -trans.de = installer/resources/eepsite/docroot/help/index_de.html -trans.fr = installer/resources/eepsite/docroot/help/index_fr.html -trans.hu = installer/resources/eepsite/docroot/help/index_hu.html -trans.it = installer/resources/eepsite/docroot/help/index_it.html -trans.pt = installer/resources/eepsite/docroot/help/index_pt.html -trans.id = installer/resources/eepsite/docroot/help/index_in.html -trans.ro = installer/resources/eepsite/docroot/help/index_ro.html -trans.uk_UA = installer/resources/eepsite/docroot/help/index_uk.html +trans.ar = apps/susimail/locale/messages_ar.po +trans.az = apps/susimail/locale/messages_az.po +trans.bg = apps/susimail/locale/messages_bg.po +trans.ca = apps/susimail/locale/messages_ca.po +trans.cs = apps/susimail/locale/messages_cs.po +trans.da = apps/susimail/locale/messages_da.po +trans.de = apps/susimail/locale/messages_de.po +trans.el = apps/susimail/locale/messages_el.po +trans.es = apps/susimail/locale/messages_es.po +trans.es_AR = apps/susimail/locale/messages_es_AR.po +trans.fa = apps/susimail/locale/messages_fa.po +trans.fi = apps/susimail/locale/messages_fi.po +trans.fr = apps/susimail/locale/messages_fr.po +trans.gl = apps/susimail/locale/messages_gl.po +trans.hr = apps/susimail/locale/messages_hr.po +trans.hu = apps/susimail/locale/messages_hu.po +;; Java converts he to iw +trans.he = apps/susimail/locale/messages_iw.po +;; Java converts id to in +trans.id = apps/susimail/locale/messages_in.po +trans.it = apps/susimail/locale/messages_it.po +trans.ja = apps/susimail/locale/messages_ja.po +trans.ko = apps/susimail/locale/messages_ko.po +trans.mg = apps/susimail/locale/messages_mg.po +trans.nb = apps/susimail/locale/messages_nb.po +trans.nl = apps/susimail/locale/messages_nl.po +trans.pl = apps/susimail/locale/messages_pl.po +trans.pt = apps/susimail/locale/messages_pt.po +trans.pt_BR = apps/susimail/locale/messages_pt_BR.po +trans.ro = apps/susimail/locale/messages_ro.po +trans.ru_RU = apps/susimail/locale/messages_ru.po +trans.sk = apps/susimail/locale/messages_sk.po +trans.sq = apps/susimail/locale/messages_sq.po +trans.sr = apps/susimail/locale/messages_sr.po +trans.sv_SE = apps/susimail/locale/messages_sv.po +trans.tr_TR = apps/susimail/locale/messages_tr.po +trans.uk_UA = apps/susimail/locale/messages_uk.po +trans.vi = apps/susimail/locale/messages_vi.po +trans.zh_CN = apps/susimail/locale/messages_zh.po +trans.zh_TW = apps/susimail/locale/messages_zh_TW.po -[o:otf:p:I2P:r:getopt] -source_file = core/java/src/gnu/getopt/MessagesBundle.properties +[o:otf:p:I2P:r:debconf] +file_filter = debian/po/.po +source_file = debian/po/templates.pot source_lang = en -type = PROPERTIES -trans.ro = core/java/src/gnu/getopt/MessagesBundle_ro.properties -trans.ru_RU = core/java/src/gnu/getopt/MessagesBundle_ru.properties -trans.az = core/java/src/gnu/getopt/MessagesBundle_az.properties -trans.de = core/java/src/gnu/getopt/MessagesBundle_de.properties -trans.hu = core/java/src/gnu/getopt/MessagesBundle_hu.properties -trans.id = core/java/src/gnu/getopt/MessagesBundle_in.properties -trans.gl = core/java/src/gnu/getopt/MessagesBundle_gl.properties -trans.pl = core/java/src/gnu/getopt/MessagesBundle_pl.properties -trans.uk_UA = core/java/src/gnu/getopt/MessagesBundle_uk.properties -trans.zh_CN = core/java/src/gnu/getopt/MessagesBundle_zh.properties -trans.ko = core/java/src/gnu/getopt/MessagesBundle_ko.properties -trans.sk = core/java/src/gnu/getopt/MessagesBundle_sk.properties -trans.sr = core/java/src/gnu/getopt/MessagesBundle_sr.properties -trans.sv_SE = core/java/src/gnu/getopt/MessagesBundle_sv.properties -trans.tr_TR = core/java/src/gnu/getopt/MessagesBundle_tr.properties -trans.cs = core/java/src/gnu/getopt/MessagesBundle_cs.properties -trans.ja = core/java/src/gnu/getopt/MessagesBundle_ja.properties -trans.pt = core/java/src/gnu/getopt/MessagesBundle_pt.properties -trans.pt_BR = core/java/src/gnu/getopt/MessagesBundle_pt_BR.properties -trans.ar = core/java/src/gnu/getopt/MessagesBundle_ar.properties -trans.es = core/java/src/gnu/getopt/MessagesBundle_es.properties -trans.sq = core/java/src/gnu/getopt/MessagesBundle_sq.properties -trans.it = core/java/src/gnu/getopt/MessagesBundle_it.properties -trans.nl = core/java/src/gnu/getopt/MessagesBundle_nl.properties -trans.fr = core/java/src/gnu/getopt/MessagesBundle_fr.properties -trans.nb = core/java/src/gnu/getopt/MessagesBundle_nb.properties -trans.zh_TW = core/java/src/gnu/getopt/MessagesBundle_zh_TW.properties -trans.es_AR = core/java/src/gnu/getopt/MessagesBundle_es_AR.properties -trans.fi = core/java/src/gnu/getopt/MessagesBundle_fi.properties -trans.ku = core/java/src/gnu/getopt/MessagesBundle_ku.properties -trans.sl = core/java/src/gnu/getopt/MessagesBundle_sl.properties +trans.ar = debian/po/ar.po +trans.az = debian/po/az.po +trans.cs = debian/po/cs.po +trans.de = debian/po/de.po +trans.el = debian/po/el.po +trans.es = debian/po/es.po +trans.es_AR = debian/po/es_AR.po +trans.fi = debian/po/fi.po +trans.fr = debian/po/fr.po +trans.gl = debian/po/gl.po +trans.id = debian/po/id.po +trans.it = debian/po/it.po +trans.hu = debian/po/hu.po +trans.ja = debian/po/ja.po +trans.ko = debian/po/ko.po +trans.nb = debian/po/nb.po +trans.nl = debian/po/nl.po +trans.pl = debian/po/pl.po +trans.pt = debian/po/pt.po +trans.pt_BR = debian/po/pt_BR.po +trans.ro = debian/po/ro.po +trans.ru_RU = debian/po/ru.po +trans.sk = debian/po/sk.po +trans.sl = debian/po/sl.po +trans.sq = debian/po/sq.po +trans.sv_SE = debian/po/sv.po +trans.tk = debian/po/tk.po +trans.tr_TR = debian/po/tr.po +trans.uk_UA = debian/po/uk.po +trans.zh_CN = debian/po/zh.po +trans.zh_TW = debian/po/zh_TW.po [o:otf:p:I2P:r:i2prouter-script] +file_filter = installer/resources/locale/po/messages_.po source_file = installer/resources/locale/po/messages_en.po source_lang = en +trans.ar = installer/resources/locale/po/messages_ar.po +trans.az = installer/resources/locale/po/messages_az.po +trans.ca = installer/resources/locale/po/messages_ca.po +trans.de = installer/resources/locale/po/messages_de.po +trans.es = installer/resources/locale/po/messages_es.po trans.es_AR = installer/resources/locale/po/messages_es_AR.po -trans.fi = installer/resources/locale/po/messages_fi.po +trans.fi = installer/resources/locale/po/messages_fi.po +trans.fr = installer/resources/locale/po/messages_fr.po +trans.id = installer/resources/locale/po/messages_id.po +trans.it = installer/resources/locale/po/messages_it.po +trans.ja = installer/resources/locale/po/messages_ja.po +trans.ko = installer/resources/locale/po/messages_ko.po +trans.nb = installer/resources/locale/po/messages_nb.po +trans.nl = installer/resources/locale/po/messages_nl.po +trans.pl = installer/resources/locale/po/messages_pl.po +trans.pt = installer/resources/locale/po/messages_pt.po trans.pt_BR = installer/resources/locale/po/messages_pt_BR.po +trans.ro = installer/resources/locale/po/messages_ro.po +trans.ru_RU = installer/resources/locale/po/messages_ru.po +trans.sk = installer/resources/locale/po/messages_sk.po +trans.sv_SE = installer/resources/locale/po/messages_sv.po +trans.tr_TR = installer/resources/locale/po/messages_tr.po trans.uk_UA = installer/resources/locale/po/messages_uk.po trans.zh_CN = installer/resources/locale/po/messages_zh.po -trans.ar = installer/resources/locale/po/messages_ar.po -trans.es = installer/resources/locale/po/messages_es.po -trans.id = installer/resources/locale/po/messages_id.po -trans.it = installer/resources/locale/po/messages_it.po -trans.ja = installer/resources/locale/po/messages_ja.po -trans.nb = installer/resources/locale/po/messages_nb.po -trans.pt = installer/resources/locale/po/messages_pt.po trans.zh_TW = installer/resources/locale/po/messages_zh_TW.po -trans.az = installer/resources/locale/po/messages_az.po -trans.ca = installer/resources/locale/po/messages_ca.po -trans.pl = installer/resources/locale/po/messages_pl.po -trans.ro = installer/resources/locale/po/messages_ro.po -trans.ru_RU = installer/resources/locale/po/messages_ru.po -trans.tr_TR = installer/resources/locale/po/messages_tr.po -trans.ko = installer/resources/locale/po/messages_ko.po -trans.nl = installer/resources/locale/po/messages_nl.po -trans.sk = installer/resources/locale/po/messages_sk.po -trans.sv_SE = installer/resources/locale/po/messages_sv.po -trans.de = installer/resources/locale/po/messages_de.po -trans.fr = installer/resources/locale/po/messages_fr.po -[o:otf:p:I2P:r:i2psnark] -source_file = apps/i2psnark/locale/messages_en.po +[o:otf:p:I2P:r:getopt] +;; +;; Java properties files (when not read with our DataHelper methods) must be ISO-8859-1 encoded. +;; See https://docs.oracle.com/javase/6/docs/api/java/util/Properties.html +;; Several getopt translations from Transifex are ISO-8859-1 encoded. +;; So that all our source files are consistently UTF-8 encoded, +;; you may optionally convert them to ASCII with Unicode escapes after downloading. +;; Convert files with: +;; native2ascii -encoding iso-8859-1 foo.properties foo.properties.new +;; Then review that it looks right: +;; native2ascii -reverse -encoding UTF-8 foo.properties.new +;; Then copy it over: +;; mv foo.properties.new foo.properties +;; The following files from Transifex are known to be ISO-8859-1 encoded, +;; and should be escaped using native2ascii after downloading: +;; gl, pt, pt_BR, sq, sv, tr +;; +file_filter = core/java/src/gnu/getopt/MessagesBundle_.properties +source_file = core/java/src/gnu/getopt/MessagesBundle.properties source_lang = en -trans.hu = apps/i2psnark/locale/messages_hu.po -trans.ro = apps/i2psnark/locale/messages_ro.po -trans.sq = apps/i2psnark/locale/messages_sq.po -trans.pl = apps/i2psnark/locale/messages_pl.po -trans.ru_RU = apps/i2psnark/locale/messages_ru.po -trans.zh_CN = apps/i2psnark/locale/messages_zh.po -trans.ar = apps/i2psnark/locale/messages_ar.po -trans.sk = apps/i2psnark/locale/messages_sk.po -trans.da = apps/i2psnark/locale/messages_da.po -trans.fa = apps/i2psnark/locale/messages_fa.po -trans.nb = apps/i2psnark/locale/messages_nb.po -trans.pt = apps/i2psnark/locale/messages_pt.po -trans.pt_BR = apps/i2psnark/locale/messages_pt_BR.po -trans.tr_TR = apps/i2psnark/locale/messages_tr.po -trans.cs = apps/i2psnark/locale/messages_cs.po -trans.id = apps/i2psnark/locale/messages_in.po -trans.it = apps/i2psnark/locale/messages_it.po -trans.ja = apps/i2psnark/locale/messages_ja.po -trans.vi = apps/i2psnark/locale/messages_vi.po -trans.de = apps/i2psnark/locale/messages_de.po -trans.fi = apps/i2psnark/locale/messages_fi.po -trans.ko = apps/i2psnark/locale/messages_ko.po -trans.nl = apps/i2psnark/locale/messages_nl.po -trans.fr = apps/i2psnark/locale/messages_fr.po -trans.sv_SE = apps/i2psnark/locale/messages_sv.po -trans.zh_TW = apps/i2psnark/locale/messages_zh_TW.po -trans.el = apps/i2psnark/locale/messages_el.po -trans.es = apps/i2psnark/locale/messages_es.po -trans.es_AR = apps/i2psnark/locale/messages_es_AR.po -trans.uk_UA = apps/i2psnark/locale/messages_uk.po +type = PROPERTIES +trans.ar = core/java/src/gnu/getopt/MessagesBundle_ar.properties +trans.az = core/java/src/gnu/getopt/MessagesBundle_az.properties +trans.cs = core/java/src/gnu/getopt/MessagesBundle_cs.properties +trans.de = core/java/src/gnu/getopt/MessagesBundle_de.properties +trans.es = core/java/src/gnu/getopt/MessagesBundle_es.properties +trans.es_AR = core/java/src/gnu/getopt/MessagesBundle_es_AR.properties +trans.fi = core/java/src/gnu/getopt/MessagesBundle_fi.properties +trans.fr = core/java/src/gnu/getopt/MessagesBundle_fr.properties +trans.gl = core/java/src/gnu/getopt/MessagesBundle_gl.properties +trans.hu = core/java/src/gnu/getopt/MessagesBundle_hu.properties +;; Java converts id to in +trans.id = core/java/src/gnu/getopt/MessagesBundle_in.properties +trans.it = core/java/src/gnu/getopt/MessagesBundle_it.properties +trans.ja = core/java/src/gnu/getopt/MessagesBundle_ja.properties +trans.ko = core/java/src/gnu/getopt/MessagesBundle_ko.properties +trans.ku = core/java/src/gnu/getopt/MessagesBundle_ku.properties +trans.nb = core/java/src/gnu/getopt/MessagesBundle_nb.properties +trans.nl = core/java/src/gnu/getopt/MessagesBundle_nl.properties +trans.pl = core/java/src/gnu/getopt/MessagesBundle_pl.properties +trans.pt = core/java/src/gnu/getopt/MessagesBundle_pt.properties +trans.pt_BR = core/java/src/gnu/getopt/MessagesBundle_pt_BR.properties +trans.ro = core/java/src/gnu/getopt/MessagesBundle_ro.properties +trans.ru_RU = core/java/src/gnu/getopt/MessagesBundle_ru.properties +trans.sk = core/java/src/gnu/getopt/MessagesBundle_sk.properties +trans.sl = core/java/src/gnu/getopt/MessagesBundle_sl.properties +trans.sq = core/java/src/gnu/getopt/MessagesBundle_sq.properties +trans.sr = core/java/src/gnu/getopt/MessagesBundle_sr.properties +trans.sv_SE = core/java/src/gnu/getopt/MessagesBundle_sv.properties +trans.tr_TR = core/java/src/gnu/getopt/MessagesBundle_tr.properties +trans.uk_UA = core/java/src/gnu/getopt/MessagesBundle_uk.properties +trans.zh_CN = core/java/src/gnu/getopt/MessagesBundle_zh.properties +trans.zh_TW = core/java/src/gnu/getopt/MessagesBundle_zh_TW.properties -[o:otf:p:I2P:r:i2ptunnel] -source_file = apps/i2ptunnel/locale/messages_en.po +[o:otf:p:I2P:r:streaming] +file_filter = apps/ministreaming/locale/messages_.po +source_file = apps/ministreaming/locale/messages_en.po source_lang = en -trans.hu = apps/i2ptunnel/locale/messages_hu.po -trans.ko = apps/i2ptunnel/locale/messages_ko.po -trans.sk = apps/i2ptunnel/locale/messages_sk.po -trans.sq = apps/i2ptunnel/locale/messages_sq.po -trans.vi = apps/i2ptunnel/locale/messages_vi.po -trans.zh_CN = apps/i2ptunnel/locale/messages_zh.po -trans.ar = apps/i2ptunnel/locale/messages_ar.po -trans.fi = apps/i2ptunnel/locale/messages_fi.po -trans.fr = apps/i2ptunnel/locale/messages_fr.po -trans.pl = apps/i2ptunnel/locale/messages_pl.po -trans.ru_RU = apps/i2ptunnel/locale/messages_ru.po -trans.zh_TW = apps/i2ptunnel/locale/messages_zh_TW.po -trans.fa = apps/i2ptunnel/locale/messages_fa.po -trans.pt_BR = apps/i2ptunnel/locale/messages_pt_BR.po -trans.ro = apps/i2ptunnel/locale/messages_ro.po -trans.uk_UA = apps/i2ptunnel/locale/messages_uk.po -trans.da = apps/i2ptunnel/locale/messages_da.po -trans.it = apps/i2ptunnel/locale/messages_it.po -trans.nn = apps/i2ptunnel/locale/messages_nn.po -trans.es_AR = apps/i2ptunnel/locale/messages_es_AR.po -trans.pt = apps/i2ptunnel/locale/messages_pt.po -trans.tr_TR = apps/i2ptunnel/locale/messages_tr.po -trans.es = apps/i2ptunnel/locale/messages_es.po -trans.id = apps/i2ptunnel/locale/messages_in.po -trans.sv_SE = apps/i2ptunnel/locale/messages_sv.po -trans.de = apps/i2ptunnel/locale/messages_de.po -trans.nb = apps/i2ptunnel/locale/messages_nb.po -trans.cs = apps/i2ptunnel/locale/messages_cs.po -trans.ja = apps/i2ptunnel/locale/messages_ja.po -trans.nl = apps/i2ptunnel/locale/messages_nl.po +trans.ar = apps/ministreaming/locale/messages_ar.po +trans.az = apps/ministreaming/locale/messages_az.po +trans.ca = apps/ministreaming/locale/messages_ca.po +trans.cs = apps/ministreaming/locale/messages_cs.po +trans.de = apps/ministreaming/locale/messages_de.po +trans.es = apps/ministreaming/locale/messages_es.po +trans.es_AR = apps/ministreaming/locale/messages_es_AR.po +trans.fa = apps/ministreaming/locale/messages_fa.po +trans.fi = apps/ministreaming/locale/messages_fi.po +trans.fr = apps/ministreaming/locale/messages_fr.po +trans.gl = apps/ministreaming/locale/messages_gl.po +trans.hu = apps/ministreaming/locale/messages_hu.po +;; Java converts id to in +trans.id = apps/ministreaming/locale/messages_in.po +trans.it = apps/ministreaming/locale/messages_it.po +trans.ko = apps/ministreaming/locale/messages_ko.po +trans.nb = apps/ministreaming/locale/messages_nb.po +trans.nl = apps/ministreaming/locale/messages_nl.po +trans.pl = apps/ministreaming/locale/messages_pl.po +trans.pt = apps/ministreaming/locale/messages_pt.po +trans.pt_BR = apps/ministreaming/locale/messages_pt_BR.po +trans.ro = apps/ministreaming/locale/messages_ro.po +trans.ru_RU = apps/ministreaming/locale/messages_ru.po +trans.sl = apps/ministreaming/locale/messages_sl.po +trans.sv_SE = apps/ministreaming/locale/messages_sv.po +trans.tk = apps/ministreaming/locale/messages_tk.po +trans.tr_TR = apps/ministreaming/locale/messages_tr.po +trans.uk_UA = apps/ministreaming/locale/messages_uk.po +trans.zh_CN = apps/ministreaming/locale/messages_zh.po +trans.zh_TW = apps/ministreaming/locale/messages_zh_TW.po [o:otf:p:I2P:r:manpages] +;; +;; after adding languages here, add to debian/*.manpages also +;; You must run installer/resources/poupdate-man.sh first. +;; +file_filter = installer/resources/locale-man/man_.po +type = PO source_file = installer/resources/locale-man/man.pot source_lang = en -type = PO -trans.es = installer/resources/locale-man/man_es.po -trans.pl = installer/resources/locale-man/man_pl.po -trans.pt = installer/resources/locale-man/man_pt.po -trans.tr_TR = installer/resources/locale-man/man_tr.po -trans.az = installer/resources/locale-man/man_az.po -trans.de = installer/resources/locale-man/man_de.po -trans.ja = installer/resources/locale-man/man_ja.po +trans.ar = installer/resources/locale-man/man_ar.po +trans.az = installer/resources/locale-man/man_az.po +trans.de = installer/resources/locale-man/man_de.po +trans.es = installer/resources/locale-man/man_es.po +trans.es_AR = installer/resources/locale-man/man_es_AR.po +trans.fi = installer/resources/locale-man/man_fi.po +trans.fr = installer/resources/locale-man/man_fr.po +trans.hu = installer/resources/locale-man/man_hu.po +trans.id = installer/resources/locale-man/man_id.po +trans.it = installer/resources/locale-man/man_it.po +trans.ja = installer/resources/locale-man/man_ja.po +trans.ko = installer/resources/locale-man/man_ko.po +trans.nl = installer/resources/locale-man/man_nl.po +trans.pl = installer/resources/locale-man/man_pl.po +trans.pt = installer/resources/locale-man/man_pt.po trans.pt_BR = installer/resources/locale-man/man_pt_BR.po -trans.ro = installer/resources/locale-man/man_ro.po -trans.fr = installer/resources/locale-man/man_fr.po -trans.id = installer/resources/locale-man/man_id.po -trans.fi = installer/resources/locale-man/man_fi.po +trans.ro = installer/resources/locale-man/man_ro.po trans.ru_RU = installer/resources/locale-man/man_ru.po -trans.zh_TW = installer/resources/locale-man/man_zh_TW.po -trans.ar = installer/resources/locale-man/man_ar.po -trans.es_AR = installer/resources/locale-man/man_es_AR.po -trans.ko = installer/resources/locale-man/man_ko.po -trans.nl = installer/resources/locale-man/man_nl.po trans.sv_SE = installer/resources/locale-man/man_sv.po +trans.tr_TR = installer/resources/locale-man/man_tr.po trans.zh_CN = installer/resources/locale-man/man_zh.po -trans.hu = installer/resources/locale-man/man_hu.po -trans.it = installer/resources/locale-man/man_it.po +trans.zh_TW = installer/resources/locale-man/man_zh_TW.po -[o:otf:p:I2P:r:proxy] -source_file = apps/i2ptunnel/locale-proxy/messages_en.po +[o:otf:p:I2P:r:eepsite] +;; +;; For any new translations, add links in installer/resources/eepsite/docroot/help/index.html +;; and copy new flags in build.xml copyflags-unlesspkg target, +;; and add to debian/i2p-router.links and debian-alt/*/i2p-router.links +;; +file_filter = installer/resources/eepsite/docroot/help/index_.po +type = HTML +source_file = installer/resources/eepsite/docroot/help/index.html source_lang = en -trans.cs = apps/i2ptunnel/locale-proxy/messages_cs.po -trans.nl = apps/i2ptunnel/locale-proxy/messages_nl.po -trans.pl = apps/i2ptunnel/locale-proxy/messages_pl.po -trans.sv_SE = apps/i2ptunnel/locale-proxy/messages_sv.po -trans.fa = apps/i2ptunnel/locale-proxy/messages_fa.po -trans.fi = apps/i2ptunnel/locale-proxy/messages_fi.po -trans.ko = apps/i2ptunnel/locale-proxy/messages_ko.po -trans.sk = apps/i2ptunnel/locale-proxy/messages_sk.po -trans.zh_CN = apps/i2ptunnel/locale-proxy/messages_zh.po -trans.fr = apps/i2ptunnel/locale-proxy/messages_fr.po -trans.id = apps/i2ptunnel/locale-proxy/messages_in.po -trans.it = apps/i2ptunnel/locale-proxy/messages_it.po -trans.el = apps/i2ptunnel/locale-proxy/messages_el.po -trans.ja = apps/i2ptunnel/locale-proxy/messages_ja.po -trans.uk_UA = apps/i2ptunnel/locale-proxy/messages_uk.po -trans.es_AR = apps/i2ptunnel/locale-proxy/messages_es_AR.po -trans.hu = apps/i2ptunnel/locale-proxy/messages_hu.po -trans.nb = apps/i2ptunnel/locale-proxy/messages_nb.po -trans.es = apps/i2ptunnel/locale-proxy/messages_es.po -trans.ru_RU = apps/i2ptunnel/locale-proxy/messages_ru.po -trans.tr_TR = apps/i2ptunnel/locale-proxy/messages_tr.po -trans.de = apps/i2ptunnel/locale-proxy/messages_de.po -trans.pt_BR = apps/i2ptunnel/locale-proxy/messages_pt_BR.po -trans.ro = apps/i2ptunnel/locale-proxy/messages_ro.po -trans.ar = apps/i2ptunnel/locale-proxy/messages_ar.po -trans.nn = apps/i2ptunnel/locale-proxy/messages_nn.po -trans.pt = apps/i2ptunnel/locale-proxy/messages_pt.po -trans.vi = apps/i2ptunnel/locale-proxy/messages_vi.po -trans.zh_TW = apps/i2ptunnel/locale-proxy/messages_zh_TW.po +;; File contains local changes to fix RTL issues. +;; Merge locally or make changes on TX side before re-enabling +;;trans.ar = installer/resources/eepsite/docroot/help/index_ar.html +trans.az = installer/resources/eepsite/docroot/help/index_az.html +trans.de = installer/resources/eepsite/docroot/help/index_de.html +trans.el = installer/resources/eepsite/docroot/help/index_el.html +;; not yet translated on TX, use old page +;;trans.es = installer/resources/eepsite/docroot/help/index_es.html +trans.fa = installer/resources/eepsite/docroot/help/index_fa.html +trans.fr = installer/resources/eepsite/docroot/help/index_fr.html +trans.hu = installer/resources/eepsite/docroot/help/index_hu.html +;; Java converts id to in +trans.id = installer/resources/eepsite/docroot/help/index_in.html +trans.it = installer/resources/eepsite/docroot/help/index_it.html +;; not yet translated on TX, use old page +;;trans.nl = installer/resources/eepsite/docroot/help/index_nl.html +trans.pl = installer/resources/eepsite/docroot/help/index_pl.html +trans.pt = installer/resources/eepsite/docroot/help/index_pt.html +trans.ro = installer/resources/eepsite/docroot/help/index_ro.html +trans.ru_RU = installer/resources/eepsite/docroot/help/index_ru.html +trans.sv_SE = installer/resources/eepsite/docroot/help/index_sv.html +trans.tr_TR = installer/resources/eepsite/docroot/help/index_tr.html +trans.uk_UA = installer/resources/eepsite/docroot/help/index_uk.html +trans.zh_CN = installer/resources/eepsite/docroot/help/index_zh.html [o:otf:p:I2P:r:readme] +;; +;; Text on /console +;; +;; NOTE: No support for country suffixes right now. +;; See ResourceHelper.java +;; +file_filter = apps/routerconsole/resources/docs/readme_.html +type = HTML source_file = apps/routerconsole/resources/docs/readme.html source_lang = en -type = HTML -trans.ar = apps/routerconsole/resources/docs/readme_ar.html -trans.it = apps/routerconsole/resources/docs/readme_it.html -trans.pl = apps/routerconsole/resources/docs/readme_pl.html -trans.ro = apps/routerconsole/resources/docs/readme_ro.html +trans.ar = apps/routerconsole/resources/docs/readme_ar.html +trans.de = apps/routerconsole/resources/docs/readme_de.html +trans.fr = apps/routerconsole/resources/docs/readme_fr.html +trans.hu = apps/routerconsole/resources/docs/readme_hu.html +;; Java converts id to in +trans.id = apps/routerconsole/resources/docs/readme_in.html +trans.it = apps/routerconsole/resources/docs/readme_it.html +trans.ja = apps/routerconsole/resources/docs/readme_ja.html +trans.pl = apps/routerconsole/resources/docs/readme_pl.html +trans.pt = apps/routerconsole/resources/docs/readme_pt.html +trans.ro = apps/routerconsole/resources/docs/readme_ro.html +trans.ru_RU = apps/routerconsole/resources/docs/readme_ru.html +trans.sl = apps/routerconsole/resources/docs/readme_sl.html trans.tr_TR = apps/routerconsole/resources/docs/readme_tr.html trans.uk_UA = apps/routerconsole/resources/docs/readme_uk.html -trans.ja = apps/routerconsole/resources/docs/readme_ja.html -trans.sl = apps/routerconsole/resources/docs/readme_sl.html -trans.hu = apps/routerconsole/resources/docs/readme_hu.html -trans.id = apps/routerconsole/resources/docs/readme_in.html -trans.pt = apps/routerconsole/resources/docs/readme_pt.html trans.zh_CN = apps/routerconsole/resources/docs/readme_zh.html trans.zh_TW = apps/routerconsole/resources/docs/readme_zh_TW.html -trans.de = apps/routerconsole/resources/docs/readme_de.html -trans.fr = apps/routerconsole/resources/docs/readme_fr.html -trans.ru_RU = apps/routerconsole/resources/docs/readme_ru.html - -[o:otf:p:I2P:r:router] -source_file = router/locale/messages_en.po -source_lang = en -type = PO -trans.ar = router/locale/messages_ar.po -trans.az = router/locale/messages_az.po -trans.de = router/locale/messages_de.po -trans.hu = router/locale/messages_hu.po -trans.id = router/locale/messages_in.po -trans.es = router/locale/messages_es.po -trans.vi = router/locale/messages_vi.po -trans.et_EE = router/locale/messages_et.po -trans.fr = router/locale/messages_fr.po -trans.sl = router/locale/messages_sl.po -trans.zh_TW = router/locale/messages_zh_TW.po -trans.da = router/locale/messages_da.po -trans.fi = router/locale/messages_fi.po -trans.ko = router/locale/messages_ko.po -trans.ru_RU = router/locale/messages_ru.po -trans.el = router/locale/messages_el.po -trans.fa = router/locale/messages_fa.po -trans.ro = router/locale/messages_ro.po -trans.uk_UA = router/locale/messages_uk.po -trans.es_AR = router/locale/messages_es_AR.po -trans.it = router/locale/messages_it.po -trans.nl = router/locale/messages_nl.po -trans.pl = router/locale/messages_pl.po -trans.sv_SE = router/locale/messages_sv.po -trans.tk = router/locale/messages_tk.po -trans.tr_TR = router/locale/messages_tr.po -trans.cs = router/locale/messages_cs.po -trans.ja = router/locale/messages_ja.po -trans.ku = router/locale/messages_ku.po -trans.nb = router/locale/messages_nb.po -trans.pt = router/locale/messages_pt.po -trans.pt_BR = router/locale/messages_pt_BR.po -trans.zh_CN = router/locale/messages_zh.po - -[o:otf:p:I2P:r:routerconsole] -source_file = apps/routerconsole/locale/messages_en.po -source_lang = en -trans.vi = apps/routerconsole/locale/messages_vi.po -trans.et_EE = apps/routerconsole/locale/messages_et.po -trans.fi = apps/routerconsole/locale/messages_fi.po -trans.ko = apps/routerconsole/locale/messages_ko.po -trans.nb = apps/routerconsole/locale/messages_nb.po -trans.pl = apps/routerconsole/locale/messages_pl.po -trans.pt = apps/routerconsole/locale/messages_pt.po -trans.uk_UA = apps/routerconsole/locale/messages_uk.po -trans.cs = apps/routerconsole/locale/messages_cs.po -trans.hu = apps/routerconsole/locale/messages_hu.po -trans.el = apps/routerconsole/locale/messages_el.po -trans.es_AR = apps/routerconsole/locale/messages_es_AR.po -trans.fr = apps/routerconsole/locale/messages_fr.po -trans.ja = apps/routerconsole/locale/messages_ja.po -trans.nl = apps/routerconsole/locale/messages_nl.po -trans.tr_TR = apps/routerconsole/locale/messages_tr.po -trans.de = apps/routerconsole/locale/messages_de.po -trans.es = apps/routerconsole/locale/messages_es.po -trans.sv_SE = apps/routerconsole/locale/messages_sv.po -trans.zh_CN = apps/routerconsole/locale/messages_zh.po -trans.zh_TW = apps/routerconsole/locale/messages_zh_TW.po -trans.da = apps/routerconsole/locale/messages_da.po -trans.fa = apps/routerconsole/locale/messages_fa.po -trans.ru_RU = apps/routerconsole/locale/messages_ru.po -trans.ar = apps/routerconsole/locale/messages_ar.po -trans.az = apps/routerconsole/locale/messages_az.po -trans.pt_BR = apps/routerconsole/locale/messages_pt_BR.po -trans.ro = apps/routerconsole/locale/messages_ro.po -trans.id = apps/routerconsole/locale/messages_in.po -trans.it = apps/routerconsole/locale/messages_it.po - -[o:otf:p:I2P:r:streaming] -source_file = apps/ministreaming/locale/messages_en.po -source_lang = en -trans.zh_TW = apps/ministreaming/locale/messages_zh_TW.po -trans.fa = apps/ministreaming/locale/messages_fa.po -trans.fr = apps/ministreaming/locale/messages_fr.po -trans.nb = apps/ministreaming/locale/messages_nb.po -trans.tr_TR = apps/ministreaming/locale/messages_tr.po -trans.zh_CN = apps/ministreaming/locale/messages_zh.po -trans.ru_RU = apps/ministreaming/locale/messages_ru.po -trans.ar = apps/ministreaming/locale/messages_ar.po -trans.ko = apps/ministreaming/locale/messages_ko.po -trans.pl = apps/ministreaming/locale/messages_pl.po -trans.pt = apps/ministreaming/locale/messages_pt.po -trans.ca = apps/ministreaming/locale/messages_ca.po -trans.cs = apps/ministreaming/locale/messages_cs.po -trans.hu = apps/ministreaming/locale/messages_hu.po -trans.pt_BR = apps/ministreaming/locale/messages_pt_BR.po -trans.az = apps/ministreaming/locale/messages_az.po -trans.es_AR = apps/ministreaming/locale/messages_es_AR.po -trans.gl = apps/ministreaming/locale/messages_gl.po -trans.it = apps/ministreaming/locale/messages_it.po -trans.tk = apps/ministreaming/locale/messages_tk.po -trans.de = apps/ministreaming/locale/messages_de.po -trans.nl = apps/ministreaming/locale/messages_nl.po -trans.ro = apps/ministreaming/locale/messages_ro.po -trans.sl = apps/ministreaming/locale/messages_sl.po -trans.sv_SE = apps/ministreaming/locale/messages_sv.po -trans.uk_UA = apps/ministreaming/locale/messages_uk.po -trans.es = apps/ministreaming/locale/messages_es.po -trans.fi = apps/ministreaming/locale/messages_fi.po -trans.id = apps/ministreaming/locale/messages_in.po - -[o:otf:p:I2P:r:susidns] -source_file = apps/susidns/locale/messages_en.po -source_lang = en -trans.zh_TW = apps/susidns/locale/messages_zh_TW.po -trans.hu = apps/susidns/locale/messages_hu.po -trans.id = apps/susidns/locale/messages_in.po -trans.uk_UA = apps/susidns/locale/messages_uk.po -trans.es_AR = apps/susidns/locale/messages_es_AR.po -trans.fi = apps/susidns/locale/messages_fi.po -trans.it = apps/susidns/locale/messages_it.po -trans.pt_BR = apps/susidns/locale/messages_pt_BR.po -trans.ru_RU = apps/susidns/locale/messages_ru.po -trans.zh_CN = apps/susidns/locale/messages_zh.po -trans.fr = apps/susidns/locale/messages_fr.po -trans.gl = apps/susidns/locale/messages_gl.po -trans.es = apps/susidns/locale/messages_es.po -trans.de = apps/susidns/locale/messages_de.po -trans.fa = apps/susidns/locale/messages_fa.po -trans.pl = apps/susidns/locale/messages_pl.po -trans.pt = apps/susidns/locale/messages_pt.po -trans.ko = apps/susidns/locale/messages_ko.po -trans.tr_TR = apps/susidns/locale/messages_tr.po -trans.cs = apps/susidns/locale/messages_cs.po -trans.ja = apps/susidns/locale/messages_ja.po -trans.el = apps/susidns/locale/messages_el.po -trans.nl = apps/susidns/locale/messages_nl.po -trans.ro = apps/susidns/locale/messages_ro.po -trans.sv_SE = apps/susidns/locale/messages_sv.po -trans.vi = apps/susidns/locale/messages_vi.po -trans.ar = apps/susidns/locale/messages_ar.po -trans.da = apps/susidns/locale/messages_da.po - -[o:otf:p:I2P:r:susimail] -source_file = apps/susimail/locale/messages_en.po -source_lang = en -trans.ro = apps/susimail/locale/messages_ro.po -trans.sr = apps/susimail/locale/messages_sr.po -trans.bg = apps/susimail/locale/messages_bg.po -trans.es_AR = apps/susimail/locale/messages_es_AR.po -trans.id = apps/susimail/locale/messages_in.po -trans.mg = apps/susimail/locale/messages_mg.po -trans.ca = apps/susimail/locale/messages_ca.po -trans.sk = apps/susimail/locale/messages_sk.po -trans.he = apps/susimail/locale/messages_iw.po -trans.ja = apps/susimail/locale/messages_ja.po -trans.sv_SE = apps/susimail/locale/messages_sv.po -trans.vi = apps/susimail/locale/messages_vi.po -trans.pt = apps/susimail/locale/messages_pt.po -trans.pt_BR = apps/susimail/locale/messages_pt_BR.po -trans.cs = apps/susimail/locale/messages_cs.po -trans.fi = apps/susimail/locale/messages_fi.po -trans.gl = apps/susimail/locale/messages_gl.po -trans.hr = apps/susimail/locale/messages_hr.po -trans.nb = apps/susimail/locale/messages_nb.po -trans.ru_RU = apps/susimail/locale/messages_ru.po -trans.sq = apps/susimail/locale/messages_sq.po -trans.az = apps/susimail/locale/messages_az.po -trans.el = apps/susimail/locale/messages_el.po -trans.it = apps/susimail/locale/messages_it.po -trans.ko = apps/susimail/locale/messages_ko.po -trans.fr = apps/susimail/locale/messages_fr.po -trans.zh_CN = apps/susimail/locale/messages_zh.po -trans.zh_TW = apps/susimail/locale/messages_zh_TW.po -trans.uk_UA = apps/susimail/locale/messages_uk.po -trans.da = apps/susimail/locale/messages_da.po -trans.es = apps/susimail/locale/messages_es.po -trans.nl = apps/susimail/locale/messages_nl.po -trans.pl = apps/susimail/locale/messages_pl.po -trans.tr_TR = apps/susimail/locale/messages_tr.po -trans.ar = apps/susimail/locale/messages_ar.po -trans.de = apps/susimail/locale/messages_de.po -trans.fa = apps/susimail/locale/messages_fa.po -trans.hu = apps/susimail/locale/messages_hu.po - -[o:otf:p:I2P:r:welcome] -source_file = apps/routerconsole/locale-news/messages_en.po -source_lang = en -trans.he = apps/routerconsole/locale-news/messages_iw.po -trans.hu = apps/routerconsole/locale-news/messages_hu.po -trans.sr = apps/routerconsole/locale-news/messages_sr.po -trans.de = apps/routerconsole/locale-news/messages_de.po -trans.fi = apps/routerconsole/locale-news/messages_fi.po -trans.gl = apps/routerconsole/locale-news/messages_gl.po -trans.pt = apps/routerconsole/locale-news/messages_pt.po -trans.tk = apps/routerconsole/locale-news/messages_tk.po -trans.sv_SE = apps/routerconsole/locale-news/messages_sv.po -trans.ar = apps/routerconsole/locale-news/messages_ar.po -trans.ko = apps/routerconsole/locale-news/messages_ko.po -trans.mg = apps/routerconsole/locale-news/messages_mg.po -trans.nl = apps/routerconsole/locale-news/messages_nl.po -trans.pt_BR = apps/routerconsole/locale-news/messages_pt_BR.po -trans.es_AR = apps/routerconsole/locale-news/messages_es_AR.po -trans.fa = apps/routerconsole/locale-news/messages_fa.po -trans.id = apps/routerconsole/locale-news/messages_in.po -trans.nb = apps/routerconsole/locale-news/messages_nb.po -trans.pl = apps/routerconsole/locale-news/messages_pl.po -trans.ro = apps/routerconsole/locale-news/messages_ro.po -trans.tr_TR = apps/routerconsole/locale-news/messages_tr.po -trans.uk_UA = apps/routerconsole/locale-news/messages_uk.po -trans.az = apps/routerconsole/locale-news/messages_az.po -trans.fr = apps/routerconsole/locale-news/messages_fr.po -trans.it = apps/routerconsole/locale-news/messages_it.po -trans.zh_TW = apps/routerconsole/locale-news/messages_zh_TW.po -trans.cs = apps/routerconsole/locale-news/messages_cs.po -trans.el = apps/routerconsole/locale-news/messages_el.po -trans.sq = apps/routerconsole/locale-news/messages_sq.po -trans.ku = apps/routerconsole/locale-news/messages_ku.po -trans.ru_RU = apps/routerconsole/locale-news/messages_ru.po -trans.sk = apps/routerconsole/locale-news/messages_sk.po -trans.zh_CN = apps/routerconsole/locale-news/messages_zh.po -trans.es = apps/routerconsole/locale-news/messages_es.po -trans.ja = apps/routerconsole/locale-news/messages_ja.po -trans.sl = apps/routerconsole/locale-news/messages_sl.po diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java index c510e19e2d..6fa1ce9ce2 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java @@ -106,7 +106,7 @@ private void saveChanges() { private void saveFF() { boolean saved = _context.router().saveConfig(ConfigAdvancedHelper.PROP_FLOODFILL_PARTICIPANT, _ff); if (_ff.equals("false") || _ff.equals("true")) { - FloodfillNetworkDatabaseFacade fndf = _context.netDb(); + FloodfillNetworkDatabaseFacade fndf = (FloodfillNetworkDatabaseFacade) _context.netDb(); boolean isFF = _ff.equals("true"); // this will rebuild the RI, log in the event log, etc. fndf.setFloodfillEnabled(isFF); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java index d21a53fbc9..1a268a49b9 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java @@ -302,7 +302,7 @@ public void renderStatusHTML(Writer out, int mode) throws IOException { buf.append("") .append("Caps").append(":").append(_t("capabilities in the netDb, not used to determine profiles")) .append(""); - buf.append(""); + buf.append("
"); buf.append("") .append("") .append("" + diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryHelper.java index bb6144ab56..bea9800c58 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryHelper.java @@ -985,13 +985,14 @@ public String getFirewallAndReseedStatus() { .append(""); } + // checker will be null for DummyNetworkDatabaseFacade ReseedChecker checker = _context.netDb().reseedChecker(); - String status = checker.getStatus(); + String status = checker != null ? checker.getStatus() : ""; if (status.length() > 0) { // Show status message even if not running, timer in ReseedChecker should remove after 20 minutes buf.append("
").append(status).append("
"); } - if (!checker.inProgress()) { + if (checker != null && !checker.inProgress()) { // If a new reseed isn't running, and the last reseed had errors, show error message String reseedErrorMessage = checker.getError(); if (reseedErrorMessage.length() > 0) { diff --git a/apps/routerconsole/jsp/css.jsi b/apps/routerconsole/jsp/css.jsi index e3ab1970b7..556fc55496 100644 --- a/apps/routerconsole/jsp/css.jsi +++ b/apps/routerconsole/jsp/css.jsi @@ -64,12 +64,13 @@ %> <% - if (intl.getLang().equals("zh")) { + String curlang = intl.getLang(); + if (curlang.equals("zh")) { // make the fonts bigger for chinese %> <% - } else if (intl.getLang().equals("ar")) { - // Use RTL theme for Arabic + } else if (curlang.equals("ar") || curlang.equals("fa")) { + // Use RTL theme for Arabic and Persian %> <% } diff --git a/apps/routerconsole/jsp/themes/console/dark/console.css b/apps/routerconsole/jsp/themes/console/dark/console.css index 200f1d0ef5..4a0beb8e50 100644 --- a/apps/routerconsole/jsp/themes/console/dark/console.css +++ b/apps/routerconsole/jsp/themes/console/dark/console.css @@ -5158,7 +5158,7 @@ table#thresholds td { } #profile_defs td:first-child { - width: 5% !important; + width: 8% !important; white-space: nowrap; text-align: right; } @@ -5166,6 +5166,11 @@ table#thresholds td { #profile_defs td:last-child { white-space: normal; line-height: 120%; + text-align: left; +} + +#profile_defs td:nth-child(2)::first-letter { + text-transform: uppercase; } #thresholds th, @@ -5186,10 +5191,7 @@ table#thresholds td { #capabilities_key table td { padding: 3px 5px !important; -} - -#capabilities_key table td:nth-child(even) { - width: 16px; + text-align: left; } #capabilities_key b { diff --git a/apps/routerconsole/jsp/themes/console/dark/console_ar.css b/apps/routerconsole/jsp/themes/console/dark/console_ar.css index 1ccbbdc462..59adfe7189 100644 --- a/apps/routerconsole/jsp/themes/console/dark/console_ar.css +++ b/apps/routerconsole/jsp/themes/console/dark/console_ar.css @@ -82,6 +82,10 @@ input.search, input.search:focus { background-position: right 4px center !important; } +.routersummaryouter { + margin: 0 2px 10px 5px; +} + .routersummary img[src$="i2plogo.png"] { margin-top: -2px !important; margin-left: 0 !important; diff --git a/apps/routerconsole/jsp/themes/console/light/console.css b/apps/routerconsole/jsp/themes/console/light/console.css index d19ea15d8f..9109108ba1 100644 --- a/apps/routerconsole/jsp/themes/console/light/console.css +++ b/apps/routerconsole/jsp/themes/console/light/console.css @@ -6516,7 +6516,7 @@ ul#banlist { } #profile_defs td:first-child { - width: 5% !important; + width: 8% !important; white-space: nowrap; text-align: right; } @@ -6524,6 +6524,7 @@ ul#banlist { #profile_defs td:last-child { white-space: normal; line-height: 120%; + text-align: left; } #profile_defs td:nth-child(2)::first-letter { @@ -6548,14 +6549,7 @@ ul#banlist { #capabilities_key table td { padding: 3px 5px !important; -} - -#capabilities_key table td:nth-child(even) { - width: 16px; -} - -#capabilities_key td:nth-child(2)::first-letter { - text-transform: none; + text-align: left; } #capabilities_key b { diff --git a/apps/routerconsole/jsp/themes/console/light/console_ar.css b/apps/routerconsole/jsp/themes/console/light/console_ar.css index 05aa63db6d..575ea5d9c3 100644 --- a/apps/routerconsole/jsp/themes/console/light/console_ar.css +++ b/apps/routerconsole/jsp/themes/console/light/console_ar.css @@ -47,7 +47,7 @@ h2, h3 { } .routersummaryouter { - margin-right: -1px; + margin-right: 8px; } .routersummary { diff --git a/core/java/src/net/i2p/client/naming/LookupDest.java b/core/java/src/net/i2p/client/naming/LookupDest.java index 9c3274a017..d6b3111636 100644 --- a/core/java/src/net/i2p/client/naming/LookupDest.java +++ b/core/java/src/net/i2p/client/naming/LookupDest.java @@ -96,23 +96,6 @@ static Destination lookupHostname(I2PAppContext ctx, String hostname) throws I2P return rv; } - private static boolean deleteHostname(I2PAppContext ctx, String hostname) { - try { - Destination dest = lookupHostname(I2PAppContext.getGlobalContext(), hostname); - if (dest == null) - System.err.println("Destination not found!"); - else { - NamingService ns = I2PAppContext.getGlobalContext().namingService(); - if (ns != null) - return ns.remove(hostname, dest); - System.err.print("ns is null"); - } - } catch (I2PSessionException ise) { - ise.printStackTrace(); - } - return false; - } - /** * @since 0.9.40 split out from above */ @@ -147,22 +130,14 @@ public static void main(String args[]) { System.err.println("Usage: LookupDest hostname|b32"); System.exit(1); } - if (args[0].length() == 1) { - try { - Destination dest = lookupHostname(I2PAppContext.getGlobalContext(), args[0]); - if (dest == null) - System.err.println("Destination not found!"); - else - System.out.println(dest.toBase64()); - } catch (I2PSessionException ise) { - ise.printStackTrace(); - } - } - if (args[0].length() == 2) { - if (args[0] == "-d") { - deleteHostname(I2PAppContext.getGlobalContext(), args[1]); - } + try { + Destination dest = lookupHostname(I2PAppContext.getGlobalContext(), args[0]); + if (dest == null) + System.err.println("Destination not found!"); + else + System.out.println(dest.toBase64()); + } catch (I2PSessionException ise) { + ise.printStackTrace(); } - } } diff --git a/core/java/src/net/i2p/data/DatabaseEntry.java b/core/java/src/net/i2p/data/DatabaseEntry.java index 8af4fdcb08..8a6b84e275 100644 --- a/core/java/src/net/i2p/data/DatabaseEntry.java +++ b/core/java/src/net/i2p/data/DatabaseEntry.java @@ -62,8 +62,27 @@ public abstract class DatabaseEntry extends DataStructureImpl { // synch: this private Hash _currentRoutingKey; private long _routingKeyGenMod; - protected boolean _receivedAsPublished; - protected boolean _receivedAsReply; + private boolean _receivedAsPublished; + private boolean _receivedAsReply; + + /** + * Hash of the client receiving the routerinfo, or null if it was sent directly. + */ + private Hash _receivedBy; + + /** + * The Hash of the local client that received this LS, + * null if the router or unknown. + * + * @since 0.9.47 + */ + public Hash getReceivedBy() { + return _receivedBy; + } + + public void setReceivedBy(Hash receivedBy) { + this._receivedBy = receivedBy; + } /** * A common interface to the timestamp of the two subclasses. @@ -134,16 +153,6 @@ public static boolean isLeaseSet(int type) { type == KEY_TYPE_META_LS2; } - /** - * Convenience method, is the type any variant of router info? - * - * @return true for any type of RouterInfo, false for LeaseSet, false for others - * @since x.x.x - */ - public boolean isRouterInfo() { - return (getType() == KEY_TYPE_ROUTERINFO); - } - /** * Returns the raw payload data, excluding the signature, to be signed by sign(). * diff --git a/core/java/src/net/i2p/data/LeaseSet.java b/core/java/src/net/i2p/data/LeaseSet.java index 96159b4437..d16101705a 100644 --- a/core/java/src/net/i2p/data/LeaseSet.java +++ b/core/java/src/net/i2p/data/LeaseSet.java @@ -68,7 +68,6 @@ public class LeaseSet extends DatabaseEntry { protected SigningPublicKey _signingKey; // Keep leases in the order received, or else signature verification will fail! protected final List _leases; - private Hash _receivedBy; // Store these since isCurrent() and getEarliestLeaseDate() are called frequently private long _firstExpiration; protected long _lastExpiration; @@ -185,22 +184,14 @@ public void setSigningKey(SigningPublicKey key) { _signingKey = key; } - /** - * The Hash of the local client that received this LS, - * null if the router or unknown. - * - * @since 0.9.47 - */ - public Hash getReceivedBy() { return _receivedBy; } - /** * Also sets receivedAsReply to true * @param localClient may be null * @since 0.9.47 */ public void setReceivedBy(Hash localClient) { - _receivedAsReply = true; - _receivedBy = localClient; + super.setReceivedBy(localClient); + super.setReceivedAsReply(); } /** @@ -331,7 +322,7 @@ protected byte[] getBytes() { } byte rv[] = out.toByteArray(); // if we are floodfill and this was published to us - if (_receivedAsPublished) + if (getReceivedAsPublished()) _byteified = rv; return rv; } diff --git a/core/java/src/net/i2p/data/LeaseSet2.java b/core/java/src/net/i2p/data/LeaseSet2.java index 9888b30f6f..561803442e 100644 --- a/core/java/src/net/i2p/data/LeaseSet2.java +++ b/core/java/src/net/i2p/data/LeaseSet2.java @@ -396,7 +396,7 @@ protected byte[] getBytes() { } byte rv[] = out.toByteArray(); // if we are floodfill and this was published to us - if (_receivedAsPublished) + if (getReceivedAsPublished()) _byteified = rv; return rv; } diff --git a/core/java/src/net/i2p/util/SystemVersion.java b/core/java/src/net/i2p/util/SystemVersion.java index 9a77657717..73ecbc09a0 100644 --- a/core/java/src/net/i2p/util/SystemVersion.java +++ b/core/java/src/net/i2p/util/SystemVersion.java @@ -445,7 +445,7 @@ public static void main(String[] args) { System.out.println("Java 9 : " + isJava9()); System.out.println("Java 10 : " + isJava10()); System.out.println("Java 11 : " + isJava11()); - for (int i = 12; i <= 17; i++) { + for (int i = 12; i <= 22; i++) { System.out.println("Java " + i + " : " + isJava(i)); } System.out.println("Android : " + isAndroid()); diff --git a/history.txt b/history.txt index f16e81b264..81efdc274d 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,18 @@ +2023-11-02 zzz + * NetDB: Enforce no RIs in subdbs (Gitlab #465) + - Throw IAE if attempting to store/publish RI to subdb + - Log warnings if attempting to lookup RI in subdb + - Revert changes to createPeerSelector() + - Revert peer selector changes in SearchJob and StoreJob + - Use common PeerSelector and KBucketSet for all dbs + - Revert/fix FloodfillVerifyStoreJob to looukp RIs in the main DB + - Don't start ExpireRoutersJob in subdbs + - Revert change in InboundMessageDistributor that was looking up RI in subdb + - Remove KNDF.isMainDb(), replace with !isClientDb() + +2023-10-29 zzz + * Console: Netdb tab fixes and cleanup (Gitlab #465) + 2023-10-28 zzz * i2ptunnel: - Remove nonstandard Proxy-Connection headers (Gitlab #452) diff --git a/installer/resources/checklist.md b/installer/resources/checklist.md index f79f21eba1..777ee7b84c 100644 --- a/installer/resources/checklist.md +++ b/installer/resources/checklist.md @@ -12,7 +12,7 @@ - Review changes in English po files, fix up any necessary tagged strings in Java source - Revert English po files with no actual changes (i.e. with line number changes only) - Check in remaining English po files (and any files with changed strings) -- Push to Transifex: `tx push -s` +- Push to Transifex: `tx push --use-git-timestamps -s` - Make announcement on Transifex with checkin deadline - GeoIP: db-ip.com update is usually first of the month, time accordingly @@ -47,7 +47,7 @@ - See README for setup - `./create_new_entry.sh` - Entry href should be the in-net link to the release blog post - - `tx push -s` + - `tx push --use-git-timestamps -s` - `git commit` 2. Write the draft blog post and push to Transifex: @@ -55,7 +55,7 @@ - Checkout i2p.www branch - Write draft release announcement - see i2p2www/blog/README for instructions - Top content should be the same as the news entry - - `tx push -s -r I2P.website_blog` + - `tx push --use-git-timestamps -s -r I2P.website_blog` - `git commit` 3. Make announcement on Transifex asking for news translation @@ -73,7 +73,7 @@ - Look for newly translated languages and resources on Transifex - Add any new ones to .tx/config (use your own judgement on which to include based on minimum translated percentage) - - `tx pull` + - `tx pull --use-git-timestamps` - `ant testscripts` to verify that all updated translations are valid - For any invalid that break the test, fix up the po file manually, or fix on tx and pull again, or (if new) comment out in .tx/config (add a comment why) @@ -266,7 +266,7 @@ 8. Notify downstream Debian maintainer 9. Pull announcement translations: - - `tx pull -r I2P.website_blog` + - `tx pull --use-git-timestamps -r I2P.website_blog` Do NOT forget this step! - `./update-existing-po.sh` - `git commit i2p2www/translations/ -m "Updated translations"` diff --git a/router/java/src/net/i2p/data/router/RouterInfo.java b/router/java/src/net/i2p/data/router/RouterInfo.java index 0ed5e2da0c..ba556a7271 100644 --- a/router/java/src/net/i2p/data/router/RouterInfo.java +++ b/router/java/src/net/i2p/data/router/RouterInfo.java @@ -86,19 +86,6 @@ public class RouterInfo extends DatabaseEntry { public static final String PROP_CAPABILITIES = "caps"; public static final char CAPABILITY_HIDDEN = 'H'; private static final int MAX_ADDRESSES = 16; - - /** - * Hash of the client receiving the routerinfo, or null if it was sent directly. - */ - private Hash _receivedBy; - - public Hash getReceivedBy() { - return _receivedBy; - } - - public void setReceivedBy(Hash _receivedBy) { - this._receivedBy = _receivedBy; - } /** Public string of chars which serve as bandwidth capacity markers * NOTE: individual chars defined in Router.java diff --git a/router/java/src/net/i2p/router/MultiRouter.java b/router/java/src/net/i2p/router/MultiRouter.java index 814163b481..18a802dc69 100644 --- a/router/java/src/net/i2p/router/MultiRouter.java +++ b/router/java/src/net/i2p/router/MultiRouter.java @@ -140,7 +140,7 @@ private static void internalReseed() { HashSet riSet = new HashSet(); for(Router r : _routers) { - riSet.addAll(r.getContext().netDbSegmentor().getRouters()); + riSet.addAll(r.getContext().netDb().getRouters()); } for(Router r : _routers) { for(RouterInfo ri : riSet){ diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java index 2fb44cb247..972862a3cc 100644 --- a/router/java/src/net/i2p/router/RouterContext.java +++ b/router/java/src/net/i2p/router/RouterContext.java @@ -244,10 +244,9 @@ public synchronized void initAll() { //_messageStateMonitor = new MessageStateMonitor(this); _routingKeyGenerator = new RouterKeyGenerator(this); if (!getBooleanProperty("i2p.dummyNetDb")) - //_netDb = new FloodfillNetworkDatabaseFacade(this); // new KademliaNetworkDatabaseFacade(this); - _netDb = new FloodfillNetworkDatabaseSegmentor(this); // new KademliaNetworkDatabaseFacade(this); + _netDb = new FloodfillNetworkDatabaseSegmentor(this); else - _netDb = new DummyNetworkDatabaseFacade(this); + _netDb = new DummyNetworkDatabaseSegmentor(this); _keyManager = new KeyManager(this); if (!getBooleanProperty("i2p.vmCommSystem")) _commSystem = new CommSystemFacadeImpl(this); @@ -371,10 +370,23 @@ public Hash routerHash() { /** * Our db cache + * @since 0.9.60 */ public SegmentedNetworkDatabaseFacade netDbSegmentor() { return _netDb; } - public FloodfillNetworkDatabaseFacade netDb() { return _netDb.mainNetDB(); } - public FloodfillNetworkDatabaseFacade clientNetDb(Hash id) { return _netDb.clientNetDB(id); } + + public NetworkDatabaseFacade netDb() { return _netDb.mainNetDB(); } + + /** + * Get the client netDb for the given id. + * Will return the main netDb if + * the dbid is null or the client db is not found. + * + * @since 0.9.60 + * @param id may be null + * @return non-null + */ + public NetworkDatabaseFacade clientNetDb(Hash id) { return _netDb.clientNetDB(id); } + /** * The actual driver of the router, where all jobs are enqueued and processed. */ diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 5acef532af..daf51b5ca2 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -20,7 +20,7 @@ public class RouterVersion { public final static String VERSION = CoreVersion.VERSION; /** for example: "beta", "alpha", "rc" */ public final static String QUALIFIER = ""; - public final static long BUILD = 9; + public final static long BUILD = 10; /** for example "-test" */ public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + QUALIFIER + EXTRA; diff --git a/router/java/src/net/i2p/router/client/LookupDestJob.java b/router/java/src/net/i2p/router/client/LookupDestJob.java index 09516f299d..2bb8c1de8c 100644 --- a/router/java/src/net/i2p/router/client/LookupDestJob.java +++ b/router/java/src/net/i2p/router/client/LookupDestJob.java @@ -196,12 +196,6 @@ else if (fail1) } } - private String toBase32(){ - if (_fromLocalDest != null) - return _fromLocalDest.toBase32(); - return null; - } - private class DoneJob extends JobImpl { public DoneJob(RouterContext enclosingContext) { super(enclosingContext); diff --git a/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseFacade.java index 52b65b89a8..9fbea9b812 100644 --- a/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseFacade.java @@ -11,7 +11,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -21,29 +20,18 @@ import net.i2p.data.LeaseSet; import net.i2p.data.router.RouterInfo; import net.i2p.router.Job; +import net.i2p.router.NetworkDatabaseFacade; import net.i2p.router.RouterContext; -import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; -import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseSegmentor; -import net.i2p.router.networkdb.kademlia.KademliaNetworkDatabaseFacade; -import net.i2p.router.networkdb.kademlia.SegmentedNetworkDatabaseFacade; -public class DummyNetworkDatabaseFacade extends SegmentedNetworkDatabaseFacade { +public class DummyNetworkDatabaseFacade extends NetworkDatabaseFacade { private final Map _routers; private final RouterContext _context; - private final FloodfillNetworkDatabaseFacade _fndb; public DummyNetworkDatabaseFacade(RouterContext ctx) { - super(ctx); - _fndb = new FloodfillNetworkDatabaseFacade(ctx, FloodfillNetworkDatabaseSegmentor.MAIN_DBID); - _fndb.startup(); _routers = Collections.synchronizedMap(new HashMap()); _context = ctx; } - public FloodfillNetworkDatabaseFacade getSubNetDB(Hash dbid){ - return null; - } - public void restart() {} public void shutdown() {} public void startup() { @@ -89,24 +77,4 @@ public void fail(Hash dbEntry) { public Set getAllRouters() { return new HashSet(_routers.keySet()); } public Set findNearestRouters(Hash key, int maxNumRouters, Set peersToIgnore) { return getAllRouters(); } - - @Override - public LeaseSet lookupLeaseSetHashIsClient(Hash key) { - throw new UnsupportedOperationException("Unimplemented method 'lookupLeaseSetHashIsClient'"); - } - - @Override - public FloodfillNetworkDatabaseFacade mainNetDB() { - return _fndb; - } - - @Override - public FloodfillNetworkDatabaseFacade clientNetDB(Hash id) { - return _fndb; - } - - @Override - public Set getSubNetDBs(){ - throw new UnsupportedOperationException("Unimplemented method 'getSubNetDBs'"); - } } diff --git a/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseSegmentor.java b/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseSegmentor.java new file mode 100644 index 0000000000..6d00af6059 --- /dev/null +++ b/router/java/src/net/i2p/router/dummy/DummyNetworkDatabaseSegmentor.java @@ -0,0 +1,33 @@ +package net.i2p.router.dummy; + +import net.i2p.data.Hash; +import net.i2p.router.RouterContext; +import net.i2p.router.NetworkDatabaseFacade; +import net.i2p.router.networkdb.kademlia.SegmentedNetworkDatabaseFacade; + +/** + * @since 0.9.60 + */ +public class DummyNetworkDatabaseSegmentor extends SegmentedNetworkDatabaseFacade { + private final NetworkDatabaseFacade _fndb; + + public DummyNetworkDatabaseSegmentor(RouterContext ctx) { + _fndb = new DummyNetworkDatabaseFacade(ctx); + } + + public void shutdown() { + _fndb.shutdown(); + } + + public void startup() { + _fndb.startup(); + } + + public NetworkDatabaseFacade mainNetDB() { + return _fndb; + } + + public NetworkDatabaseFacade clientNetDB(Hash id) { + return _fndb; + } +} diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java index 646f7985d4..1f220a3550 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java @@ -95,7 +95,7 @@ public FloodfillNetworkDatabaseFacade(RouterContext context, Hash dbid) { // for ISJ _context.statManager().createRateStat("netDb.RILookupDirect", "Was an iterative RI lookup sent directly?", "NetworkDatabase", rate); // No need to start the FloodfillMonitorJob for client subDb. - if (!isMainDb()) + if (isClientDb()) _ffMonitor = null; else _ffMonitor = new FloodfillMonitorJob(_context, this); @@ -107,7 +107,7 @@ public synchronized void startup() { super.startup(); if (_ffMonitor != null) _context.jobQueue().addJob(_ffMonitor); - if (!isMainDb()) { + if (isClientDb()) { isFF = false; } else { isFF = _context.getBooleanProperty(FloodfillMonitorJob.PROP_FLOODFILL_PARTICIPANT); @@ -116,7 +116,7 @@ public synchronized void startup() { } long down = _context.router().getEstimatedDowntime(); - if (!_context.commSystem().isDummy() && isMainDb() && + if (!_context.commSystem().isDummy() && !isClientDb() && (down == 0 || (!isFF && down > 30*60*1000) || (isFF && down > 24*60*60*1000))) { // refresh old routers Job rrj = new RefreshRoutersJob(_context, this); @@ -128,7 +128,7 @@ public synchronized void startup() { @Override protected void createHandlers() { // Only initialize the handlers for the flooodfill netDb. - if (isMainDb()) { + if (!isClientDb()) { if (_log.shouldInfo()) _log.info("[dbid: " + super._dbid + "] Initializing the message handlers"); _context.inNetMessagePool().registerHandlerJobBuilder(DatabaseLookupMessage.MESSAGE_TYPE, new FloodfillDatabaseLookupMessageHandler(_context, this)); @@ -215,38 +215,14 @@ void sendStore(Hash key, DatabaseEntry ds, Job onSuccess, Job onFailure, long se // of the flooding - instead, send them to a random floodfill peer so *they* can flood 'em out. // perhaps statistically adjust this so we are the source every 1/N times... or something. if (floodfillEnabled() && (ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)) { - //if (!chanceOfFloodingOurOwn(-1)) { - flood(ds); - if (onSuccess != null) - _context.jobQueue().addJob(onSuccess); - //} else { - // _context.jobQueue().addJob(new FloodfillStoreJob(_context, this, key, ds, onSuccess, onFailure, sendTimeout, toIgnore)); - //} Less sure I should do this this time around. TODO: figure out how this should adjust + flood(ds); + if (onSuccess != null) + _context.jobQueue().addJob(onSuccess); } else { _context.jobQueue().addJob(new FloodfillStoreJob(_context, this, key, ds, onSuccess, onFailure, sendTimeout, toIgnore)); } } - /* TODO: figure out how this should work - private boolean chanceOfFloodingOurOwn(int percent) { - if (percent < 0) { - // make percent equal to 1-peer.failedLookupRate by retrieving it from the stats - RateStat percentRate = _context.statManager().getRate("netDb.failedLookupRate"); - if (percentRate != null) - percent = (1-(int)percentRate.getLifetimeAverageValue())*100; - else { - _log.warn("chanceOfFloodingOurOwn() could not find netDb.failedLookupRate"); - return false; - } - } - // if the router has been up for at least an hour - if (_context.router().getUptime() > 60*60*1000) { - // then 30% of the time return true - return Math.random() < (percent / 100.0f); - } - return false; - }*/ - /** * Increments and tests. * @since 0.7.11 @@ -290,11 +266,6 @@ public boolean floodConditional(DatabaseEntry ds) { return true; } - public int minFloodfillPeers() { - int mfp = _context.getProperty(MINIMUM_SUBDB_PEERS, 0); - return mfp; - } - /** * Send to a subset of all floodfill peers. * We do this to implement Kademlia within the floodfills, i.e. @@ -440,13 +411,6 @@ public void runJob() { } } - @Override - protected PeerSelector createPeerSelector() { - if (_peerSelector != null) - return _peerSelector; - return new FloodfillPeerSelector(_context); - } - /** * Public, called from console. This wakes up the floodfill monitor, * which will rebuild the RI and log in the event log, @@ -526,14 +490,11 @@ SearchJob search(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs, * @return null always * @since 0.9.10 */ - // ToDo: With repect to segmented netDb clients, this framework needs - // refinement. A client with a segmented netDb can not use exploratory - // tunnels. The return messages will not have sufficient information - // to be directed back to the clientmaking the query. SearchJob search(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs, boolean isLease, Hash fromLocalDest) { //if (true) return super.search(key, onFindJob, onFailedLookupJob, timeoutMs, isLease); if (key == null) throw new IllegalArgumentException("searchin for nothin, eh?"); + if (fromLocalDest == null && isClientDb()) throw new IllegalArgumentException("client subDbs cannot use exploratory tunnels"); boolean isNew = false; FloodSearchJob searchJob; synchronized (_activeFloodQueries) { diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseSegmentor.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseSegmentor.java index 3d5c347868..611c38abc0 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseSegmentor.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseSegmentor.java @@ -1,15 +1,7 @@ package net.i2p.router.networkdb.kademlia; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import net.i2p.data.BlindData; import net.i2p.data.Hash; -import net.i2p.data.LeaseSet; -import net.i2p.data.SigningPublicKey; -import net.i2p.data.router.RouterInfo; +import net.i2p.router.NetworkDatabaseFacade; import net.i2p.router.RouterContext; import net.i2p.util.Log; @@ -48,24 +40,22 @@ * @since 0.9.60 */ public class FloodfillNetworkDatabaseSegmentor extends SegmentedNetworkDatabaseFacade { - protected final Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; //private static final String PROP_NETDB_ISOLATION = "router.netdb.isolation"; public static final Hash MAIN_DBID = null; private final FloodfillNetworkDatabaseFacade _mainDbid; /** * Construct a new FloodfillNetworkDatabaseSegmentor with the given - * RouterContext, containing a default, main netDb and a multihome netDb + * RouterContext, containing a default, main netDb * and which is prepared to add client netDbs. * * @since 0.9.60 */ public FloodfillNetworkDatabaseSegmentor(RouterContext context) { - super(context); _log = context.logManager().getLog(getClass()); - if (_context == null) - _context = context; + _context = context; _mainDbid = new FloodfillNetworkDatabaseFacade(_context, MAIN_DBID); } @@ -81,14 +71,13 @@ public boolean useSubDbs() { * @param id the ID of the FloodfillNetworkDatabaseFacade object to retrieve * @return the FloodfillNetworkDatabaseFacade object corresponding to the ID or null if it does not exist. */ - @Override - protected FloodfillNetworkDatabaseFacade getSubNetDB(Hash id) { + private NetworkDatabaseFacade getSubNetDB(Hash id) { return _context.clientManager().getClientFloodfillNetworkDatabaseFacade(id); } + /** - * If we are floodfill, turn it off and tell everybody for the _mainDbid and the - * _multihomeDbid + * If we are floodfill, turn it off and tell everybody for the _mainDbid * * @since 0.9.60 * @@ -100,7 +89,7 @@ public synchronized void shutdown() { } /** - * Start up the floodfill for the _mainDbid and the _multihomeDbid + * Start up the _mainDbid * * @since 0.9.60 * @@ -111,130 +100,6 @@ public synchronized void startup() { _mainDbid.startup(); } - /** - * list of the RouterInfo objects for all known peers; - * - * @since 0.9.60 - * @return non-null - */ - public List getKnownRouterData() { - List rv = new ArrayList(); - for (FloodfillNetworkDatabaseFacade subdb : getSubNetDBs()) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("getKnownRouterData Called from FNDS,"+subdb._dbid+", will be combined with all other subDbs"); - rv.addAll(subdb.getKnownRouterData()); - } - return rv; - } - - /** - * list of the Hashes of currently known floodfill peers; - * Returned list will not include our own hash. - * List is not sorted and not shuffled. - * - * @since 0.9.60 - * @return non-null - */ - public List getFloodfillPeers() { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("getFloodfillPeers collecting all floodfill peers across all subDbs"); - List peers = new ArrayList(); - for (FloodfillNetworkDatabaseFacade subdb : getSubNetDBs()) { - peers.addAll(subdb.getFloodfillPeers()); - } - return peers; - } - - /** - * Lookup using the client's tunnels when the client LS key is know - * but the client dbid is not. - * - * @param key The LS key for client. - * @return may be null - * @since 0.9.60 - */ - @Override - public LeaseSet lookupLeaseSetHashIsClient(Hash key) { - return lookupLeaseSetLocally(key, null); - } - - /** - * Lookup using the client's tunnels when the client LS key is known. - * if a DBID is not provided, the clients will all be checked, and the - * first value will be used. - * - * @return may be null - * @since 0.9.60 - */ - //@Override - protected LeaseSet lookupLeaseSetLocally(Hash key, Hash dbid) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("lookupLeaseSetLocally on all subDbs: " + key.toBase32()); - if (dbid == null) { - LeaseSet rv = null; - for (FloodfillNetworkDatabaseFacade subdb : getClientSubNetDBs()) { - rv = subdb.lookupLeaseSetLocally(key); - if (rv != null) { - return rv; - } - } - } - return this.getSubNetDB(dbid).lookupLeaseSetLocally(key); - } - - /** - * Check if all of the known subDbs are initialized - * - * @since 0.9.60 - * @return true if the mainNetdb and all known client netDbs are initialized - */ - public boolean isInitialized() { - if (_mainDbid == null) - return false; - boolean rv = _mainDbid.isInitialized(); - if (!rv) - return rv; - for (FloodfillNetworkDatabaseFacade subdb : getClientSubNetDBs()) { - rv = subdb.isInitialized(); - if (!rv) { - break; - } - } - return rv; - } - - /** - * list of the RouterInfo objects for all known peers known to clients(in subDbs) only - * - * @since 0.9.60 - * @return non-null - */ - public Set getRoutersKnownToClients() { - Set rv = new HashSet<>(); - for (FloodfillNetworkDatabaseFacade subdb : getClientSubNetDBs()) { - Set rv2 = subdb.getRouters(); - if (rv2 != null) - rv.addAll(rv2); - } - return rv; - } - - /** - * list of the LeaseSet objects for all known peers known to clients(in subDbs) only - * - * @since 0.9.60 - * @return non-null - */ - public Set getLeasesKnownToClients() { - Set rv = new HashSet<>(); - for (FloodfillNetworkDatabaseFacade fndf : getClientSubNetDBs()) { - Set rv2 = fndf.getLeases(); - if (rv2 != null) - rv.addAll(rv2); - } - return rv; - } - /** * get the main netDb, which is the one we will use if we are a floodfill * @@ -242,101 +107,27 @@ public Set getLeasesKnownToClients() { * @return may be null */ @Override - public FloodfillNetworkDatabaseFacade mainNetDB() { + public NetworkDatabaseFacade mainNetDB() { return _mainDbid; } /** * get the client netDb for the given id - * Will return the "exploratory(default client)" netDb if + * Will return the "main" netDb if * the dbid is null. * * @since 0.9.60 * @return may be null if the client netDb does not exist */ @Override - public FloodfillNetworkDatabaseFacade clientNetDB(Hash id) { + public NetworkDatabaseFacade clientNetDB(Hash id) { if (_log.shouldDebug()) _log.debug("looked up clientNetDB: " + id); if (id != null){ - FloodfillNetworkDatabaseFacade fndf = getSubNetDB(id); + NetworkDatabaseFacade fndf = getSubNetDB(id); if (fndf != null) return fndf; } return mainNetDB(); } - - /** - * look up the dbid of the client or clients with the given signing - * public key - * - * @since 0.9.60 - * @return non-null - */ - @Override - public List lookupClientBySigningPublicKey(SigningPublicKey spk) { - List rv = new ArrayList<>(); - for (Hash subdb : _context.clientManager().getPrimaryHashes()) { - FloodfillNetworkDatabaseFacade fndf = _context.clientManager().getClientFloodfillNetworkDatabaseFacade(subdb); - if (fndf == null) - continue; - // if (subdb.startsWith("clients_")) - // TODO: see if we can access only one subDb at a time when we need - // to look up a client by SPK. We mostly need this for managing blinded - // and encrypted keys in the Keyring Config UI page. See also - // ConfigKeyringHelper - BlindData bd = fndf.getBlindData(spk); - if (bd != null) { - rv.add(subdb); - } - } - return rv; - } - - /** - * get all the subDbs and return them in a Set. This includes the main netDb - * and the possible-multihomes netDb - * - * @since 0.9.60 - * @return non-null - */ - @Override - public Set getSubNetDBs() { - if (!_mainDbid.isInitialized()) - return Collections.emptySet(); - Set rv = new HashSet<>(); - rv.add(_mainDbid); - rv.addAll(_context.clientManager().getClientFloodfillNetworkDatabaseFacades()); - return rv; - } - - /** - * get all the subDbs and return them in a Set. This only includes subDbs associated - * with specific clients, unless subDbs are disabled in which case it only contains the - * main netDB - * - * @since 0.9.60 - * @return non-null - */ - private Set getClientSubNetDBs() { - if (!_mainDbid.isInitialized()) - return Collections.emptySet(); - Set rv = new HashSet<>(); - rv.addAll(_context.clientManager().getClientFloodfillNetworkDatabaseFacades()); - return rv; - } - - /** - * list of the BlindData objects for all known clients - * - * @since 0.9.60 - * @return non-null - */ - @Override - public List getLocalClientsBlindData() { - List rv = new ArrayList<>(); - for (FloodfillNetworkDatabaseFacade subdb : getClientSubNetDBs()) { - } - return rv; - } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java index 44df85d419..5570d87786 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java @@ -148,11 +148,11 @@ public void runJob() { } // garlic encrypt to hide contents from the OBEP - RouterInfo peer = _facade.lookupRouterInfoLocally(_target); + RouterInfo peer = ctx.netDb().lookupRouterInfoLocally(_target); if (peer == null) { if (_log.shouldLog(Log.WARN)) _log.warn("(JobId: " + getJobId() - + "; dbid: " + _facade._dbid + + "; db: " + _facade + ") Fail looking up RI locally for target " + _target); _facade.verifyFinished(_key); return; @@ -245,7 +245,7 @@ public void runJob() { } if (_log.shouldLog(Log.INFO)) - _log.info("[JobId: " + getJobId() + "; dbid: " + _facade._dbid + _log.info("[JobId: " + getJobId() + "; db: " + _facade + "]: Starting verify (stored " + _key + " to " + _sentTo + "), asking " + _target); _sendTime = ctx.clock().now(); _expiration = _sendTime + VERIFY_TIMEOUT; @@ -277,7 +277,7 @@ private Hash pickTarget() { if (peers.isEmpty()) break; Hash peer = peers.get(0); - RouterInfo ri = _facade.lookupRouterInfoLocally(peer); + RouterInfo ri = getContext().netDb().lookupRouterInfoLocally(peer); //if (ri != null && StoreJob.supportsCert(ri, keyCert)) { if (ri != null && StoreJob.shouldStoreTo(ri) && //(!_isLS2 || (StoreJob.shouldStoreLS2To(ri) && @@ -334,18 +334,7 @@ public boolean isMatch(I2NPMessage message) { return _key.equals(dsm.getKey()); } else if (type == DatabaseSearchReplyMessage.MESSAGE_TYPE) { DatabaseSearchReplyMessage dsrm = (DatabaseSearchReplyMessage)message; - boolean rv = _key.equals(dsrm.getSearchKey()); - if (rv) { - if (_log.shouldInfo()) - _log.info("[JobId: " + getJobId() + "; dbid: " + _facade._dbid - + "DSRM key match successful."); - } else { - if (_log.shouldWarn()) - _log.warn("[JobId: " + getJobId() + "; dbid: " + _facade._dbid - + "]: DSRM key mismatch for key " + _key - + " with DSRM: " + message); - } - return rv; + return _key.equals(dsrm.getSearchKey()); } return false; } @@ -413,21 +402,16 @@ public void runJob() { // assume 0 old, all new, 0 invalid, 0 dup pm.dbLookupReply(_target, 0, dsrm.getNumReplies(), 0, 0, delay); - // ToDo: Clarify the following log message. - // This message is phrased in a manner that draws attention, and indicates - // the possibility of a problem that may need follow-up. But examination - // of the code did not provide insight as to what is being verified, - // and what is failing. This message will be displayed unconditionally - // every time a DSRM is handled here. + // The peer we asked did not have the key, so _sentTo failed to flood it if (_log.shouldLog(Log.WARN)) - _log.warn(getJobId() + ": DSRM verify failed (dbid: " - + _facade._dbid + ") for " + _key); + _log.warn(getJobId() + ": DSRM verify failed (db: " + + _facade + ") for " + _key); // only for RI... LS too dangerous? if (_isRouterInfo) { if (_facade.isClientDb()) if (_log.shouldLog(Log.WARN)) - _log.warn("[Jobid: " + getJobId() + "; dbid: " + _facade._dbid - + "Warning! Client is starting a SingleLookupJob (DIRECT?) for RouterInfo"); + _log.warn("[Jobid: " + getJobId() + "; db: " + _facade + + "] Warning! Client is starting a SingleLookupJob (DIRECT?) for RouterInfo"); ctx.jobQueue().addJob(new SingleLookupJob(ctx, dsrm)); } } @@ -458,12 +442,7 @@ public void runJob() { * So at least we'll try THREE ffs round-robin if things continue to fail... */ private void resend() { - // It's safe to check the default netDb first, but if the lookup is for - // a client, nearly all RI is expected to be found in the FF netDb. DatabaseEntry ds = _facade.lookupLocally(_key); - if ((ds == null) && _facade.isClientDb() && _isRouterInfo) - // It's safe to check the floodfill netDb for RI - ds = getContext().netDb().lookupLocally(_key); if (ds != null) { // By the time we get here, a minute or more after the store started, // we may have already started a new store diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java index d9e6cdc872..df5d1e0227 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -81,7 +81,6 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad protected final int _networkID; private final BlindCache _blindCache; protected final Hash _dbid; - private Hash _localKey; private final Job _elj, _erj; /** @@ -178,22 +177,24 @@ public KademliaNetworkDatabaseFacade(RouterContext context, Hash dbid) { _dbid = dbid; _log = _context.logManager().getLog(getClass()); _networkID = context.router().getNetworkID(); - _peerSelector = createPeerSelector(); _publishingLeaseSets = new HashMap(8); _activeRequests = new HashMap(8); - if (!isMainDb()) { + if (isClientDb()) { _reseedChecker = null; _blindCache = null; _exploreKeys = null; + _erj = null; + _peerSelector = ((KademliaNetworkDatabaseFacade) context.netDb()).getPeerSelector(); } else { _reseedChecker = new ReseedChecker(context); _blindCache = new BlindCache(context); _exploreKeys = new ConcurrentHashSet(64); + // We don't have a comm system here to check for ctx.commSystem().isDummy() + // we'll check before starting in startup() + _erj = new ExpireRoutersJob(_context, this); + _peerSelector = createPeerSelector(); } _elj = new ExpireLeasesJob(_context, this); - // We don't have a comm system here to check for ctx.commSystem().isDummy() - // we'll check before starting in startup() - _erj = new ExpireRoutersJob(_context, this); if (_log.shouldLog(Log.DEBUG)) _log.debug("Created KademliaNetworkDatabaseFacade for id: " + dbid); context.statManager().createRateStat("netDb.lookupDeferred", "how many lookups are deferred?", "NetworkDatabase", new long[] { 60*60*1000 }); @@ -219,13 +220,24 @@ public boolean isInitialized() { return _initialized && _ds != null && _ds.isInitialized(); } - protected abstract PeerSelector createPeerSelector(); + /** + * Only for main DB + */ + protected PeerSelector createPeerSelector() { + if (isClientDb()) + throw new IllegalStateException(); + return new FloodfillPeerSelector(_context); + } + + /** + * @return the main DB's peer selector. Client DBs do not have their own. + */ public PeerSelector getPeerSelector() { return _peerSelector; } /** @since 0.9 */ @Override public ReseedChecker reseedChecker() { - if (!isMainDb()) + if (isClientDb()) return null; return _reseedChecker; } @@ -236,14 +248,18 @@ public ReseedChecker reseedChecker() { * This checks if we're the main DB already and returns our blind * cache if we are. If not, it looks up the main Db and gets it. * - * @return + * @return non-null + * @since 0.9.60 */ protected BlindCache blindCache() { - if (isMainDb()) + if (!isClientDb()) return _blindCache; - return _context.netDb().blindCache(); + return ((FloodfillNetworkDatabaseFacade) _context.netDb()).blindCache(); } + /** + * @return the main DB's KBucketSet. Client DBs do not have their own. + */ KBucketSet getKBuckets() { return _kb; } DataStore getDataStore() { return _ds; } @@ -256,20 +272,20 @@ void setLastExploreNewDate(long when) { /** @return unmodifiable set */ public Set getExploreKeys() { - if (!_initialized || !isMainDb()) + if (!_initialized || isClientDb()) return Collections.emptySet(); return Collections.unmodifiableSet(_exploreKeys); } public void removeFromExploreKeys(Collection toRemove) { - if (!_initialized || !isMainDb()) + if (!_initialized || isClientDb()) return; _exploreKeys.removeAll(toRemove); _context.statManager().addRateData("netDb.exploreKeySet", _exploreKeys.size()); } public void queueForExploration(Collection keys) { - if (!_initialized || !isMainDb()) + if (!_initialized || isClientDb()) return; for (Iterator iter = keys.iterator(); iter.hasNext() && _exploreKeys.size() < MAX_EXPLORE_QUEUE; ) { _exploreKeys.add(iter.next()); @@ -281,16 +297,19 @@ public void queueForExploration(Collection keys) { * Cannot be restarted. */ public synchronized void shutdown() { + if (_log.shouldWarn()) + _log.warn("DB shutdown " + this); _initialized = false; - if (!_context.commSystem().isDummy() && isMainDb() && + if (!_context.commSystem().isDummy() && !isClientDb() && _context.router().getUptime() > ROUTER_INFO_EXPIRATION_FLOODFILL + 10*60*1000 + 60*1000) { // expire inline before saving RIs in _ds.stop() Job erj = new ExpireRoutersJob(_context, this); erj.runJob(); } _context.jobQueue().removeJob(_elj); - _context.jobQueue().removeJob(_erj); - if (_kb != null) + if (_erj != null) + _context.jobQueue().removeJob(_erj); + if (_kb != null && !isClientDb()) _kb.clear(); if (_ds != null) _ds.stop(); @@ -298,7 +317,7 @@ public synchronized void shutdown() { _exploreKeys.clear(); if (_negativeCache != null) _negativeCache.stop(); - if (isMainDb()) + if (!isClientDb()) blindCache().shutdown(); } @@ -341,29 +360,18 @@ public boolean isClientDb() { return true; } - /** - * Check if the database is the main netDb. This is the one we're normally using - * if you're acting as a floodfill. - * - * @return true if _dbid == FNDS.MAIN_DBID - * @since 0.9.60 - */ - protected boolean isMainDb() { - // This is a null check in disguise, don't use equals() here. - // FNDS.MAIN_DBID is always null. - if (_dbid == FloodfillNetworkDatabaseSegmentor.MAIN_DBID) - return true; - return false; - } - public synchronized void startup() { - _log.info("Starting up the kademlia network database"); + if (_log.shouldInfo()) + _log.info("Starting up the " + this); RouterInfo ri = _context.router().getRouterInfo(); String dbDir = _context.getProperty(PROP_DB_DIR, DEFAULT_DB_DIR); - _kb = new KBucketSet(_context, ri.getIdentity().getHash(), + if (isClientDb()) + _kb = ((FloodfillNetworkDatabaseFacade) _context.netDb()).getKBuckets(); + else + _kb = new KBucketSet(_context, ri.getIdentity().getHash(), BUCKET_SIZE, KAD_B, new RejectTrimmer()); try { - if (isMainDb()) { + if (!isClientDb()) { _ds = new PersistentDataStore(_context, dbDir, this); } else { _ds = new TransientDataStore(_context); @@ -373,7 +381,7 @@ public synchronized void startup() { } _dbDir = dbDir; _negativeCache = new NegativeLookupCache(_context); - if (isMainDb()) + if (!isClientDb()) blindCache().startup(); createHandlers(); @@ -388,7 +396,7 @@ public synchronized void startup() { //// expire some routers // Don't run until after RefreshRoutersJob has run, and after validate() will return invalid for old routers. - if (!_context.commSystem().isDummy()) { + if (!isClientDb() && !_context.commSystem().isDummy()) { boolean isFF = _context.getBooleanProperty(FloodfillMonitorJob.PROP_FLOODFILL_PARTICIPANT); long down = _context.router().getEstimatedDowntime(); long delay = (down == 0 || (!isFF && down > 30*60*1000) || (isFF && down > 24*60*60*1000)) ? @@ -399,7 +407,7 @@ public synchronized void startup() { } if (!QUIET) { - if (isMainDb()) { + if (!isClientDb()) { // fill the search queue with random keys in buckets that are too small // Disabled since KBucketImpl.generateRandomKey() is b0rked, // and anyway, we want to search for a completely random key, @@ -421,7 +429,7 @@ public synchronized void startup() { _log.warn("Operating in quiet mode - not exploring or pushing data proactively, simply reactively"); _log.warn("This should NOT be used in production"); } - if (isMainDb()) { + if (!isClientDb()) { // periodically update and resign the router's 'published date', which basically // serves as a version Job plrij = new PublishLocalRouterInfoJob(_context); @@ -452,6 +460,10 @@ protected void createHandlers() {} * @param peersToIgnore can be null */ public Set findNearestRouters(Hash key, int maxNumRouters, Set peersToIgnore) { + if (isClientDb()) { + _log.warn("Subdb", new Exception("I did it")); + return Collections.emptySet(); + } if (!_initialized) return Collections.emptySet(); return new HashSet(_peerSelector.selectNearest(key, maxNumRouters, peersToIgnore, _kb)); } @@ -476,8 +488,16 @@ private Set getRouters(Collection hashes) { } *****/ - /** get the hashes for all known routers */ + /** + * Get the hashes for all known routers + * + * @return empty set if this is a client DB + */ public Set getAllRouters() { + if (isClientDb()) { + _log.warn("Subdb", new Exception("I did it")); + return Collections.emptySet(); + } if (!_initialized) return Collections.emptySet(); Set> entries = _ds.getMapEntries(); Set rv = new HashSet(entries.size()); @@ -494,6 +514,8 @@ public Set getAllRouters() { * both the kbuckets AND the data store, which was fine when the kbuckets held everything. * But now that is probably not what you want. * Just return the count in the data store. + * + * @return 0 if this is a client DB */ @Override public int getKnownRouters() { @@ -503,6 +525,10 @@ public int getKnownRouters() { _kb.getAll(count); return count.size(); ****/ + if (isClientDb()) { + _log.warn("Subdb", new Exception("I did it")); + return 0; + } if (_ds == null) return 0; int rv = 0; for (DatabaseEntry ds : _ds.getEntries()) { @@ -816,12 +842,16 @@ public void lookupRouterInfo(Hash key, Job onFindJob, Job onFailedLookupJob, lon * However, this may still fire off a lookup if the RI is present but expired (and will return null). * This may result in deadlocks. * For true local only, use lookupLocallyWithoutValidation() + * + * @return null always for client dbs */ public RouterInfo lookupRouterInfoLocally(Hash key) { if (!_initialized) return null; // Client netDb shouldn't have RI, search for RI in the floodfill netDb. - if (isClientDb()) - return _context.netDb().lookupRouterInfoLocally(key); + if (isClientDb()) { + _log.warn("Subdb", new Exception("I did it")); + return null; + } DatabaseEntry ds = _ds.get(key); if (ds != null) { if (ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { @@ -905,8 +935,11 @@ void stopPublishing(Hash target) { * Stores to local db only. * Overridden in FNDF to actually send to the floodfills. * @throws IllegalArgumentException if the local router info is invalid + * or if this is a client DB */ public void publish(RouterInfo localRouterInfo) throws IllegalArgumentException { + if (isClientDb()) + throw new IllegalArgumentException("RI publish to client DB"); if (!_initialized) return; if (_context.router().gracefulShutdownInProgress()) return; @@ -934,13 +967,6 @@ public long getLastRouterInfoPublishTime() { return _lastRIPublishTime; } - public boolean matchClientKey(Hash key) { - if ((_localKey != null) && (_localKey.equals(key))) - return true; - else - return false; - } - /** * Persist the local router's info (as updated) into netDb/my.info, since * ./router.info isn't always updated. This also allows external applications @@ -1342,6 +1368,8 @@ public RouterInfo store(Hash key, RouterInfo routerInfo) throws IllegalArgumentE */ RouterInfo store(Hash key, RouterInfo routerInfo, boolean persist) throws IllegalArgumentException { if (!_initialized) return null; + if (isClientDb()) + throw new IllegalArgumentException("RI store to client DB"); RouterInfo rv; try { @@ -1443,7 +1471,8 @@ public void fail(Hash dbEntry) { DatabaseEntry o = _ds.get(dbEntry); if (o == null) { // if we dont know the key, lets make sure it isn't a now-dead peer - _kb.remove(dbEntry); + if (_kb != null) + _kb.remove(dbEntry); _context.peerManager().removeCapabilities(dbEntry); return; } @@ -1459,7 +1488,7 @@ public void fail(Hash dbEntry) { // are any updates if (_log.shouldLog(Log.INFO)) _log.info("Dropping a lease: " + dbEntry); - if (isMainDb()) { + if (!isClientDb()) { _ds.remove(dbEntry, false); } else { // if this happens it's because we're a TransientDataStore instead, @@ -1479,6 +1508,10 @@ protected void lookupBeforeDropping(Hash peer, RouterInfo info) { * Do NOT use for leasesets. */ void dropAfterLookupFailed(Hash peer) { + if (isClientDb()) { + _log.warn("Subdb", new Exception("I did it")); + return; + } _context.peerManager().removeCapabilities(peer); _negativeCache.cache(peer); _kb.remove(peer); @@ -1566,9 +1599,17 @@ public Set getLeases() { return leases; } - /** public for NetDbRenderer in routerconsole */ + /** + * Public for NetDbRenderer in routerconsole + * + * @return empty set if this is a client DB + */ @Override public Set getRouters() { + if (isClientDb()) { + _log.warn("Subdb", new Exception("I did it")); + return Collections.emptySet(); + } if (!_initialized) return null; Set routers = new HashSet(); for (DatabaseEntry o : getDataStore().getEntries()) { @@ -1662,6 +1703,8 @@ public boolean isNegativeCachedForever(Hash key) { */ @Override public void renderStatusHTML(Writer out) throws IOException { + if (_kb == null) + return; out.write(_kb.toString().replace("\n", "
\n")); } @@ -1670,7 +1713,7 @@ public void renderStatusHTML(Writer out) throws IOException { */ @Override public String toString() { - if (isMainDb()) + if (!isClientDb()) return "Main NetDB"; return "Client NetDB " + _dbid.toBase64(); } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/RefreshRoutersJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/RefreshRoutersJob.java index 1ec97ca5de..8d9da703d4 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/RefreshRoutersJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/RefreshRoutersJob.java @@ -41,7 +41,7 @@ class RefreshRoutersJob extends JobImpl { * Don't go faster as this overloads the expl. OBEP / IBGW */ private final static long RERUN_DELAY_MS = 2500; - public final static long EXPIRE = 2*60*60*1000; + private final static long EXPIRE = 2*60*60*1000; private final static long NEW_LOOP_DELAY = 37*60*1000; private static final int ENOUGH_FFS = 3 * StartExplorersJob.LOW_FFS; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java index 2c5a56acfa..686c88aad0 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java @@ -390,10 +390,7 @@ private List getClosestRouters(Hash key, int numClosest, Set already Hash rkey = getContext().routingKeyGenerator().getRoutingKey(key); if (_log.shouldLog(Log.DEBUG)) _log.debug(getJobId() + ": Current routing key for " + key + ": " + rkey); - if (_facade.isClientDb()) - return getContext().netDb().getPeerSelector().selectNearestExplicit(rkey, numClosest, alreadyChecked, _facade.getKBuckets()); - else - return _peerSelector.selectNearestExplicit(rkey, numClosest, alreadyChecked, _facade.getKBuckets()); + return _peerSelector.selectNearestExplicit(rkey, numClosest, alreadyChecked, _facade.getKBuckets()); } /** diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java index 3296cb63bc..b099e9f891 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java @@ -85,13 +85,12 @@ public void runJob() { DatabaseStoreMessage msg = (DatabaseStoreMessage)message; DatabaseEntry entry = msg.getEntry(); try { - if (entry.isRouterInfo()) { - RouterInfo ri = (RouterInfo) entry; - _facade.store(ri.getHash(), ri); - } if (entry.isLeaseSet()) { LeaseSet ls = (LeaseSet) entry; _facade.store(ls.getHash(), ls); + } else { + RouterInfo ri = (RouterInfo) entry; + _facade.store(ri.getHash(), ri); } } catch (UnsupportedCryptoException iae) { // don't blame the peer diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SegmentedNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/SegmentedNetworkDatabaseFacade.java index b7a4b9735a..4ba48034ea 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SegmentedNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SegmentedNetworkDatabaseFacade.java @@ -1,24 +1,7 @@ package net.i2p.router.networkdb.kademlia; -import java.io.IOException; -import java.io.Writer; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.HashSet; - -import net.i2p.data.BlindData; -import net.i2p.data.DatabaseEntry; -import net.i2p.data.Destination; import net.i2p.data.Hash; -import net.i2p.data.LeaseSet; -import net.i2p.data.SigningPublicKey; -import net.i2p.data.router.RouterInfo; -import net.i2p.router.Job; import net.i2p.router.NetworkDatabaseFacade; -import net.i2p.router.RouterContext; -import net.i2p.router.networkdb.reseed.ReseedChecker; -import net.i2p.util.Log; /** * SegmentedNetworkDatabaseFacade @@ -57,24 +40,15 @@ * @since 0.9.60 */ public abstract class SegmentedNetworkDatabaseFacade { - public SegmentedNetworkDatabaseFacade(RouterContext context) { - // super(context, null); - } - /** - * Get a sub-netDb using a Hash identifier - * - * @return client subDb for hash, or null if it does not exist - * @since 0.9.60 - */ - protected abstract FloodfillNetworkDatabaseFacade getSubNetDB(Hash dbid); /** * Get the main netDb, the one which is used if we're a floodfill * * @return may be null if main netDb is not initialized * @since 0.9.60 */ - public abstract FloodfillNetworkDatabaseFacade mainNetDB(); + public abstract NetworkDatabaseFacade mainNetDB(); + /** * Get a client netDb for a given client Hash identifier. Will never * return the mainNetDB. @@ -82,118 +56,19 @@ public SegmentedNetworkDatabaseFacade(RouterContext context) { * @return may be null if the client netDb does not exist * @since 0.9.60 */ - public abstract FloodfillNetworkDatabaseFacade clientNetDB(Hash dbid); + public abstract NetworkDatabaseFacade clientNetDB(Hash dbid); + /** * Shut down the network databases * * @since 0.9.60 */ public abstract void shutdown(); + /** * Start up the network databases * * @since 0.9.60 */ public abstract void startup(); - /** - * Lookup the leaseSet for a given key in only client dbs. - * - * @return may be null - * @since 0.9.60 - */ - public abstract LeaseSet lookupLeaseSetHashIsClient(Hash key); - /** - * Get a set of all sub-netDbs. - * - * @return all the sub netDbs including the main - * @since 0.9.60 - */ - public abstract Set getSubNetDBs(); - /** - * Make sure the SNDF is initialized. This is overridden in - * FloodfillNetworkDatabaseSegmentor so that it will be false until - * *all* required subDbs are initialized. - * - * @return true if the netDbs are initialized - * @since 0.9.60 - */ - public boolean isInitialized() { - return mainNetDB().isInitialized(); - } - - /** - * list all of the RouterInfo objects known to all of the subDbs including - * the main subDb. - * - * @return all of the RouterInfo objects known to all of the netDbs. non-null - * @since 0.9.60 - */ - public Set getRouters() { - Set rv = new HashSet<>(); - for (FloodfillNetworkDatabaseFacade subdb : getSubNetDBs()) { - rv.addAll(subdb.getRouters()); - } - return rv; - } - - /** - * list of the RouterInfo objects for all known peers in all client - * subDbs which is mostly pointless because they should normally reject - * them anyway. - * - * @return non-null all the routerInfos in all of the client netDbs *only* - * @since 0.9.60 - */ - public Set getRoutersKnownToClients() { - Set ris = new HashSet<>(); - Set fndfs = getSubNetDBs(); - for (FloodfillNetworkDatabaseFacade fndf : fndfs) { - ris.addAll(fndf.getRouters()); - } - return ris; - } - - /** - * Get a set of all leases known to all clients. These will be - * leaseSets for destinations that the clients communicate with - * and the leaseSet of the client itself. - * - * @return non-null. all the leaseSets known to all of the client netDbs - * @since 0.9.60 - */ - public Set getLeasesKnownToClients() { - Set lss = new HashSet<>(); - Set fndfs = getSubNetDBs(); - for (FloodfillNetworkDatabaseFacade fndf : fndfs) { - lss.addAll(fndf.getLeases()); - } - return lss; - } - /** - * Check if the mainNetDB needs to reseed - * - * @return non-null. - * @since 0.9.60 - * */ - public ReseedChecker reseedChecker() { - return mainNetDB().reseedChecker(); - }; - /** - * For console ConfigKeyringHelper - * - * @return non-null - * @since 0.9.60 - */ - public List lookupClientBySigningPublicKey(SigningPublicKey spk) { - return Collections.emptyList(); - } - /** - * For console ConfigKeyringHelper - * - * @return non-null - * @since 0.9.60 - */ - public List getLocalClientsBlindData() { - return Collections.emptyList(); - } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java index 3e537fc4c9..651170bf86 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java @@ -89,7 +89,7 @@ public StoreJob(RouterContext context, KademliaNetworkDatabaseFacade facade, Has _onFailure = onFailure; _timeoutMs = timeoutMs; _expiration = context.clock().now() + timeoutMs; - _peerSelector = facade.createPeerSelector(); + _peerSelector = facade.getPeerSelector(); if (data.isLeaseSet()) { _connectChecker = null; _connectMask = 0; @@ -207,7 +207,7 @@ private synchronized void continueSending() { for (Hash peer : closestHashes) { DatabaseEntry ds; if (_facade.isClientDb()) - ds = getContext().netDb().getDataStore().get(peer); + ds = ((FloodfillNetworkDatabaseFacade) getContext().netDb()).getDataStore().get(peer); else ds = _facade.getDataStore().get(peer); if ( (ds == null) || !(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) ) { @@ -318,18 +318,10 @@ private List getMostReliableRouters(Hash key, int numClosest, Set al *****/ private List getClosestFloodfillRouters(Hash key, int numClosest, Set alreadyChecked) { - List rv; Hash rkey = getContext().routingKeyGenerator().getRoutingKey(key); KBucketSet ks = _facade.getKBuckets(); if (ks == null) return new ArrayList(); - if (_log.shouldLog(Log.DEBUG)) - _log.debug(getJobId() + "(dbid: " + _facade._dbid + "): Selecting Floodfill Participants"); - if (_facade.isClientDb()) { - FloodfillPeerSelector ffNetDbPS = (FloodfillPeerSelector)getContext().netDb().getPeerSelector(); - rv = ffNetDbPS.selectFloodfillParticipants(rkey, numClosest, alreadyChecked, ks); - } else { - rv = ((FloodfillPeerSelector)_peerSelector).selectFloodfillParticipants(rkey, numClosest, alreadyChecked, ks); - } + List rv = ((FloodfillPeerSelector)_peerSelector).selectFloodfillParticipants(rkey, numClosest, alreadyChecked, ks); return rv; } diff --git a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java index 88fee3fa93..2cac9e4a1c 100644 --- a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java +++ b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java @@ -147,10 +147,6 @@ public static double calc(PeerProfile profile) { capacity -= PENALTY_CAP_E; } } - /* TODO: G caps can be excluded in TunnelPeerSelector by adding it to DEFAULT_EXCLUDE_CAPS */ - // decide what other handling if any is needed here. - //else if (caps.indexOf(Router.CAPABILITY_NO_TUNNELS) >= 0) - // capacity -= PENALTY_G_CAP; } else { capacity -= PENALTY_NO_RI; } diff --git a/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java b/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java index 42a7010d19..a11afdbb0f 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java @@ -691,7 +691,7 @@ public void gotRI(RouterInfo ri, boolean isHandshake, boolean flood) throws Data try { RouterInfo old = _context.netDb().store(h, ri); if (flood && !ri.equals(old)) { - FloodfillNetworkDatabaseFacade fndf = _context.netDb(); + FloodfillNetworkDatabaseFacade fndf = (FloodfillNetworkDatabaseFacade) _context.netDb(); if (fndf.floodConditional(ri)) { if (_log.shouldDebug()) _log.debug("Flooded the RI: " + h); diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java index 2cc789fd04..936f0edd0d 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java @@ -1670,7 +1670,7 @@ public void gotRI(RouterInfo ri, boolean isHandshake, boolean flood) throws Data return; RouterInfo old = _context.netDb().store(h, ri); if (flood && !ri.equals(old)) { - FloodfillNetworkDatabaseFacade fndf = _context.netDb(); + FloodfillNetworkDatabaseFacade fndf = (FloodfillNetworkDatabaseFacade) _context.netDb(); if ((old == null || ri.getPublished() > old.getPublished()) && fndf.floodConditional(ri)) { if (_log.shouldDebug()) diff --git a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java index 077a5a367d..65e3b8fb05 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java @@ -376,7 +376,7 @@ public void gotRI(RouterInfo ri, boolean isHandshake, boolean flood) throws Data try { RouterInfo old = _context.netDb().store(h, ri); if (flood && !ri.equals(old)) { - FloodfillNetworkDatabaseFacade fndf = _context.netDb(); + FloodfillNetworkDatabaseFacade fndf = (FloodfillNetworkDatabaseFacade) _context.netDb(); if (fndf.floodConditional(ri)) { if (_log.shouldDebug()) _log.debug("Flooded the RI: " + h); diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState2.java b/router/java/src/net/i2p/router/transport/udp/PeerState2.java index ed7acb5442..608c147f3f 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState2.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState2.java @@ -634,7 +634,7 @@ public void gotRI(RouterInfo ri, boolean isHandshake, boolean flood) throws Data return; RouterInfo old = _context.netDb().store(h, ri); if (flood && !ri.equals(old)) { - FloodfillNetworkDatabaseFacade fndf = _context.netDb(); + FloodfillNetworkDatabaseFacade fndf = (FloodfillNetworkDatabaseFacade) _context.netDb(); if ((old == null || ri.getPublished() > old.getPublished()) && fndf.floodConditional(ri)) { if (_log.shouldDebug()) diff --git a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java index d17773c55b..d9223b0600 100644 --- a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java +++ b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java @@ -138,11 +138,7 @@ public void distribute(I2NPMessage msg, Hash target, TunnelId tunnel) { return; if (!ri.isValid()) return; - RouterInfo oldri = null; - if (_client != null) - oldri = _context.clientNetDb(_client).lookupRouterInfoLocally(key); - else - oldri = _context.netDb().lookupRouterInfoLocally(key); + RouterInfo oldri = _context.netDb().lookupRouterInfoLocally(key); // only update if RI is newer and non-ff if (oldri != null && oldri.getPublished() < ri.getPublished() && !FloodfillNetworkDatabaseFacade.isFloodfill(ri)) { @@ -242,13 +238,6 @@ public void distribute(I2NPMessage msg, Hash target, TunnelId tunnel) { // Handling of client tunnel messages need explicit handling // in the context of the client subDb. if (_client != null) { - //Hash dbid = _context.netDbSegmentor().getDbidByHash(_client); - /*if (dbid == null) { - // This error shouldn't occur. All clients should have their own netDb. - if (_log.shouldLog(Log.ERROR)) - _log.error("Error, client (" + _clientNickname + ") dbid not found while processing messages in the IBMD."); - return; - }*/ // For now, the only client message we know how to handle here is a DSM. // There aren't normally DSM messages here, but it should be safe to store // them in the client netDb. @@ -271,7 +260,7 @@ public void distribute(I2NPMessage msg, Hash target, TunnelId tunnel) { if (dsm.getEntry().isLeaseSet()) { if (_log.shouldLog(Log.INFO)) _log.info("[client: " + _clientNickname + "] Saving LS DSM from client tunnel."); - FloodfillDatabaseStoreMessageHandler _FDSMH = new FloodfillDatabaseStoreMessageHandler(_context, _context.clientNetDb(_client)); + FloodfillDatabaseStoreMessageHandler _FDSMH = new FloodfillDatabaseStoreMessageHandler(_context, (FloodfillNetworkDatabaseFacade) _context.clientNetDb(_client)); Job j = _FDSMH.createJob(msg, null, null); j.runJob(); if (sz > 0) { @@ -403,7 +392,7 @@ public void handleClove(DeliveryInstructions instructions, I2NPMessage data) { // ToDo: This should actually have a try and catch. if (_log.shouldLog(Log.INFO)) _log.info("Store the LS in the correct dbid subDb: " + _client.toBase32()); - FloodfillDatabaseStoreMessageHandler _FDSMH = new FloodfillDatabaseStoreMessageHandler(_context, _context.clientNetDb(_client)); + FloodfillDatabaseStoreMessageHandler _FDSMH = new FloodfillDatabaseStoreMessageHandler(_context, (FloodfillNetworkDatabaseFacade) _context.clientNetDb(_client)); Job j = _FDSMH.createJob(data, null, null); j.runJob(); if (sz > 0) { diff --git a/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java b/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java index 2436c569f8..99feff9db6 100644 --- a/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java +++ b/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java @@ -77,7 +77,7 @@ public void receiveComplete(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) { int msgtype = msg.getType(); if (msgtype == DatabaseStoreMessage.MESSAGE_TYPE) { DatabaseStoreMessage dsm = (DatabaseStoreMessage)msg; - if (dsm.getEntry().isRouterInfo()) { + if (!dsm.getEntry().isLeaseSet()) { _ridsm++; _context.statManager().addRateData("tunnel.outboundTunnelEndpointFwdRIDSM", 1); if (_log.shouldLog(Log.WARN))
 D").append(_t("Congested")).append("E").append(_t("Severely congested")).append("