diff --git a/Cargo.lock b/Cargo.lock index 0680d62..df51821 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -512,6 +512,7 @@ dependencies = [ "include_dir", "jwt-simple", "lazy-regex", + "lazy_static", "log", "mime_guess", "qrcode-generator", diff --git a/Cargo.toml b/Cargo.toml index b723d5e..1488e24 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,4 +36,5 @@ webauthn-rs = { version = "0.4.7", features = ["danger-allow-state-serialisation url = "2.3.1" aes-gcm = { version = "0.10.1", features = ["aes"] } bincode = "1.3.3" -chrono = "0.4.22" \ No newline at end of file +chrono = "0.4.22" +lazy_static = "1.4.0" \ No newline at end of file diff --git a/assets/img/countries/ac.png b/assets/img/countries/ac.png new file mode 100644 index 0000000..d3508b4 Binary files /dev/null and b/assets/img/countries/ac.png differ diff --git a/assets/img/countries/ad.png b/assets/img/countries/ad.png new file mode 100644 index 0000000..206df81 Binary files /dev/null and b/assets/img/countries/ad.png differ diff --git a/assets/img/countries/ae.png b/assets/img/countries/ae.png new file mode 100644 index 0000000..6833162 Binary files /dev/null and b/assets/img/countries/ae.png differ diff --git a/assets/img/countries/af.png b/assets/img/countries/af.png new file mode 100644 index 0000000..bb14bc6 Binary files /dev/null and b/assets/img/countries/af.png differ diff --git a/assets/img/countries/ag.png b/assets/img/countries/ag.png new file mode 100644 index 0000000..4f0d39f Binary files /dev/null and b/assets/img/countries/ag.png differ diff --git a/assets/img/countries/ai.png b/assets/img/countries/ai.png new file mode 100644 index 0000000..cba2aee Binary files /dev/null and b/assets/img/countries/ai.png differ diff --git a/assets/img/countries/al.png b/assets/img/countries/al.png new file mode 100644 index 0000000..5e49b1b Binary files /dev/null and b/assets/img/countries/al.png differ diff --git a/assets/img/countries/am.png b/assets/img/countries/am.png new file mode 100644 index 0000000..b1b0e0b Binary files /dev/null and b/assets/img/countries/am.png differ diff --git a/assets/img/countries/ao.png b/assets/img/countries/ao.png new file mode 100644 index 0000000..85de752 Binary files /dev/null and b/assets/img/countries/ao.png differ diff --git a/assets/img/countries/aq.png b/assets/img/countries/aq.png new file mode 100644 index 0000000..d5127e1 Binary files /dev/null and b/assets/img/countries/aq.png differ diff --git a/assets/img/countries/ar.png b/assets/img/countries/ar.png new file mode 100644 index 0000000..383a7d3 Binary files /dev/null and b/assets/img/countries/ar.png differ diff --git a/assets/img/countries/as.png b/assets/img/countries/as.png new file mode 100644 index 0000000..05136ff Binary files /dev/null and b/assets/img/countries/as.png differ diff --git a/assets/img/countries/at.png b/assets/img/countries/at.png new file mode 100644 index 0000000..2857e10 Binary files /dev/null and b/assets/img/countries/at.png differ diff --git a/assets/img/countries/au.png b/assets/img/countries/au.png new file mode 100644 index 0000000..6f6957b Binary files /dev/null and b/assets/img/countries/au.png differ diff --git a/assets/img/countries/aw.png b/assets/img/countries/aw.png new file mode 100644 index 0000000..c5dde1a Binary files /dev/null and b/assets/img/countries/aw.png differ diff --git a/assets/img/countries/ax.png b/assets/img/countries/ax.png new file mode 100644 index 0000000..485020f Binary files /dev/null and b/assets/img/countries/ax.png differ diff --git a/assets/img/countries/az.png b/assets/img/countries/az.png new file mode 100644 index 0000000..1d48556 Binary files /dev/null and b/assets/img/countries/az.png differ diff --git a/assets/img/countries/ba.png b/assets/img/countries/ba.png new file mode 100644 index 0000000..105b67b Binary files /dev/null and b/assets/img/countries/ba.png differ diff --git a/assets/img/countries/bb.png b/assets/img/countries/bb.png new file mode 100644 index 0000000..20b0e61 Binary files /dev/null and b/assets/img/countries/bb.png differ diff --git a/assets/img/countries/bd.png b/assets/img/countries/bd.png new file mode 100644 index 0000000..8cc8a25 Binary files /dev/null and b/assets/img/countries/bd.png differ diff --git a/assets/img/countries/be.png b/assets/img/countries/be.png new file mode 100644 index 0000000..9a598e4 Binary files /dev/null and b/assets/img/countries/be.png differ diff --git a/assets/img/countries/bf.png b/assets/img/countries/bf.png new file mode 100644 index 0000000..d9999ae Binary files /dev/null and b/assets/img/countries/bf.png differ diff --git a/assets/img/countries/bg.png b/assets/img/countries/bg.png new file mode 100644 index 0000000..0126066 Binary files /dev/null and b/assets/img/countries/bg.png differ diff --git a/assets/img/countries/bh.png b/assets/img/countries/bh.png new file mode 100644 index 0000000..ea6f53c Binary files /dev/null and b/assets/img/countries/bh.png differ diff --git a/assets/img/countries/bi.png b/assets/img/countries/bi.png new file mode 100644 index 0000000..5892748 Binary files /dev/null and b/assets/img/countries/bi.png differ diff --git a/assets/img/countries/bj.png b/assets/img/countries/bj.png new file mode 100644 index 0000000..6533cdd Binary files /dev/null and b/assets/img/countries/bj.png differ diff --git a/assets/img/countries/bl.png b/assets/img/countries/bl.png new file mode 100644 index 0000000..08ce439 Binary files /dev/null and b/assets/img/countries/bl.png differ diff --git a/assets/img/countries/bm.png b/assets/img/countries/bm.png new file mode 100644 index 0000000..8287abf Binary files /dev/null and b/assets/img/countries/bm.png differ diff --git a/assets/img/countries/bn.png b/assets/img/countries/bn.png new file mode 100644 index 0000000..0529ca4 Binary files /dev/null and b/assets/img/countries/bn.png differ diff --git a/assets/img/countries/bo.png b/assets/img/countries/bo.png new file mode 100644 index 0000000..dc88687 Binary files /dev/null and b/assets/img/countries/bo.png differ diff --git a/assets/img/countries/bq.png b/assets/img/countries/bq.png new file mode 100644 index 0000000..3097029 Binary files /dev/null and b/assets/img/countries/bq.png differ diff --git a/assets/img/countries/br.png b/assets/img/countries/br.png new file mode 100644 index 0000000..1c78001 Binary files /dev/null and b/assets/img/countries/br.png differ diff --git a/assets/img/countries/bs.png b/assets/img/countries/bs.png new file mode 100644 index 0000000..cdce24d Binary files /dev/null and b/assets/img/countries/bs.png differ diff --git a/assets/img/countries/bt.png b/assets/img/countries/bt.png new file mode 100644 index 0000000..0c0ae17 Binary files /dev/null and b/assets/img/countries/bt.png differ diff --git a/assets/img/countries/bv.png b/assets/img/countries/bv.png new file mode 100644 index 0000000..4af066a Binary files /dev/null and b/assets/img/countries/bv.png differ diff --git a/assets/img/countries/bw.png b/assets/img/countries/bw.png new file mode 100644 index 0000000..9f05ff3 Binary files /dev/null and b/assets/img/countries/bw.png differ diff --git a/assets/img/countries/by.png b/assets/img/countries/by.png new file mode 100644 index 0000000..d209417 Binary files /dev/null and b/assets/img/countries/by.png differ diff --git a/assets/img/countries/bz.png b/assets/img/countries/bz.png new file mode 100644 index 0000000..6ad69ea Binary files /dev/null and b/assets/img/countries/bz.png differ diff --git a/assets/img/countries/ca.png b/assets/img/countries/ca.png new file mode 100644 index 0000000..16a83b7 Binary files /dev/null and b/assets/img/countries/ca.png differ diff --git a/assets/img/countries/cc.png b/assets/img/countries/cc.png new file mode 100644 index 0000000..55e45c7 Binary files /dev/null and b/assets/img/countries/cc.png differ diff --git a/assets/img/countries/cd.png b/assets/img/countries/cd.png new file mode 100644 index 0000000..7cd90ec Binary files /dev/null and b/assets/img/countries/cd.png differ diff --git a/assets/img/countries/cefta.png b/assets/img/countries/cefta.png new file mode 100644 index 0000000..2fd6b76 Binary files /dev/null and b/assets/img/countries/cefta.png differ diff --git a/assets/img/countries/cf.png b/assets/img/countries/cf.png new file mode 100644 index 0000000..d412896 Binary files /dev/null and b/assets/img/countries/cf.png differ diff --git a/assets/img/countries/cg.png b/assets/img/countries/cg.png new file mode 100644 index 0000000..0cb2979 Binary files /dev/null and b/assets/img/countries/cg.png differ diff --git a/assets/img/countries/ch.png b/assets/img/countries/ch.png new file mode 100644 index 0000000..300d65f Binary files /dev/null and b/assets/img/countries/ch.png differ diff --git a/assets/img/countries/ci.png b/assets/img/countries/ci.png new file mode 100644 index 0000000..30e8428 Binary files /dev/null and b/assets/img/countries/ci.png differ diff --git a/assets/img/countries/ck.png b/assets/img/countries/ck.png new file mode 100644 index 0000000..9c6e39e Binary files /dev/null and b/assets/img/countries/ck.png differ diff --git a/assets/img/countries/cl.png b/assets/img/countries/cl.png new file mode 100644 index 0000000..99dad32 Binary files /dev/null and b/assets/img/countries/cl.png differ diff --git a/assets/img/countries/cm.png b/assets/img/countries/cm.png new file mode 100644 index 0000000..f193243 Binary files /dev/null and b/assets/img/countries/cm.png differ diff --git a/assets/img/countries/cn.png b/assets/img/countries/cn.png new file mode 100644 index 0000000..b77d2d2 Binary files /dev/null and b/assets/img/countries/cn.png differ diff --git a/assets/img/countries/co.png b/assets/img/countries/co.png new file mode 100644 index 0000000..7962fe0 Binary files /dev/null and b/assets/img/countries/co.png differ diff --git a/assets/img/countries/cp.png b/assets/img/countries/cp.png new file mode 100644 index 0000000..dbdd329 Binary files /dev/null and b/assets/img/countries/cp.png differ diff --git a/assets/img/countries/cr.png b/assets/img/countries/cr.png new file mode 100644 index 0000000..9c5dfc4 Binary files /dev/null and b/assets/img/countries/cr.png differ diff --git a/assets/img/countries/cu.png b/assets/img/countries/cu.png new file mode 100644 index 0000000..77db169 Binary files /dev/null and b/assets/img/countries/cu.png differ diff --git a/assets/img/countries/cv.png b/assets/img/countries/cv.png new file mode 100644 index 0000000..08d8674 Binary files /dev/null and b/assets/img/countries/cv.png differ diff --git a/assets/img/countries/cw.png b/assets/img/countries/cw.png new file mode 100644 index 0000000..39f967d Binary files /dev/null and b/assets/img/countries/cw.png differ diff --git a/assets/img/countries/cx.png b/assets/img/countries/cx.png new file mode 100644 index 0000000..ddc4243 Binary files /dev/null and b/assets/img/countries/cx.png differ diff --git a/assets/img/countries/cy.png b/assets/img/countries/cy.png new file mode 100644 index 0000000..84cbb45 Binary files /dev/null and b/assets/img/countries/cy.png differ diff --git a/assets/img/countries/cz.png b/assets/img/countries/cz.png new file mode 100644 index 0000000..18aee74 Binary files /dev/null and b/assets/img/countries/cz.png differ diff --git a/assets/img/countries/de.png b/assets/img/countries/de.png new file mode 100644 index 0000000..cb64fdd Binary files /dev/null and b/assets/img/countries/de.png differ diff --git a/assets/img/countries/dg.png b/assets/img/countries/dg.png new file mode 100644 index 0000000..8cdfe20 Binary files /dev/null and b/assets/img/countries/dg.png differ diff --git a/assets/img/countries/dj.png b/assets/img/countries/dj.png new file mode 100644 index 0000000..17e4f3a Binary files /dev/null and b/assets/img/countries/dj.png differ diff --git a/assets/img/countries/dk.png b/assets/img/countries/dk.png new file mode 100644 index 0000000..29baf9c Binary files /dev/null and b/assets/img/countries/dk.png differ diff --git a/assets/img/countries/dm.png b/assets/img/countries/dm.png new file mode 100644 index 0000000..aa490c3 Binary files /dev/null and b/assets/img/countries/dm.png differ diff --git a/assets/img/countries/do.png b/assets/img/countries/do.png new file mode 100644 index 0000000..3f0ed4f Binary files /dev/null and b/assets/img/countries/do.png differ diff --git a/assets/img/countries/dz.png b/assets/img/countries/dz.png new file mode 100644 index 0000000..01e70e2 Binary files /dev/null and b/assets/img/countries/dz.png differ diff --git a/assets/img/countries/ea.png b/assets/img/countries/ea.png new file mode 100644 index 0000000..0d66ccf Binary files /dev/null and b/assets/img/countries/ea.png differ diff --git a/assets/img/countries/ec.png b/assets/img/countries/ec.png new file mode 100644 index 0000000..a4a2e47 Binary files /dev/null and b/assets/img/countries/ec.png differ diff --git a/assets/img/countries/ee.png b/assets/img/countries/ee.png new file mode 100644 index 0000000..3f6c179 Binary files /dev/null and b/assets/img/countries/ee.png differ diff --git a/assets/img/countries/eg.png b/assets/img/countries/eg.png new file mode 100644 index 0000000..5079c49 Binary files /dev/null and b/assets/img/countries/eg.png differ diff --git a/assets/img/countries/eh.png b/assets/img/countries/eh.png new file mode 100644 index 0000000..9724b9a Binary files /dev/null and b/assets/img/countries/eh.png differ diff --git a/assets/img/countries/er.png b/assets/img/countries/er.png new file mode 100644 index 0000000..7473f68 Binary files /dev/null and b/assets/img/countries/er.png differ diff --git a/assets/img/countries/es-ct.png b/assets/img/countries/es-ct.png new file mode 100644 index 0000000..df55eff Binary files /dev/null and b/assets/img/countries/es-ct.png differ diff --git a/assets/img/countries/es-ga.png b/assets/img/countries/es-ga.png new file mode 100644 index 0000000..b31af94 Binary files /dev/null and b/assets/img/countries/es-ga.png differ diff --git a/assets/img/countries/es.png b/assets/img/countries/es.png new file mode 100644 index 0000000..0d66ccf Binary files /dev/null and b/assets/img/countries/es.png differ diff --git a/assets/img/countries/et.png b/assets/img/countries/et.png new file mode 100644 index 0000000..4840387 Binary files /dev/null and b/assets/img/countries/et.png differ diff --git a/assets/img/countries/eu.png b/assets/img/countries/eu.png new file mode 100644 index 0000000..78679e4 Binary files /dev/null and b/assets/img/countries/eu.png differ diff --git a/assets/img/countries/fi.png b/assets/img/countries/fi.png new file mode 100644 index 0000000..8c09c9c Binary files /dev/null and b/assets/img/countries/fi.png differ diff --git a/assets/img/countries/fj.png b/assets/img/countries/fj.png new file mode 100644 index 0000000..9b433e0 Binary files /dev/null and b/assets/img/countries/fj.png differ diff --git a/assets/img/countries/fk.png b/assets/img/countries/fk.png new file mode 100644 index 0000000..4868ba6 Binary files /dev/null and b/assets/img/countries/fk.png differ diff --git a/assets/img/countries/fm.png b/assets/img/countries/fm.png new file mode 100644 index 0000000..0d1262b Binary files /dev/null and b/assets/img/countries/fm.png differ diff --git a/assets/img/countries/fo.png b/assets/img/countries/fo.png new file mode 100644 index 0000000..3f16d8c Binary files /dev/null and b/assets/img/countries/fo.png differ diff --git a/assets/img/countries/fr.png b/assets/img/countries/fr.png new file mode 100644 index 0000000..dbdd329 Binary files /dev/null and b/assets/img/countries/fr.png differ diff --git a/assets/img/countries/ga.png b/assets/img/countries/ga.png new file mode 100644 index 0000000..769ec01 Binary files /dev/null and b/assets/img/countries/ga.png differ diff --git a/assets/img/countries/gb-eng.png b/assets/img/countries/gb-eng.png new file mode 100644 index 0000000..e54ceff Binary files /dev/null and b/assets/img/countries/gb-eng.png differ diff --git a/assets/img/countries/gb-nir.png b/assets/img/countries/gb-nir.png new file mode 100644 index 0000000..d1431b7 Binary files /dev/null and b/assets/img/countries/gb-nir.png differ diff --git a/assets/img/countries/gb-sct.png b/assets/img/countries/gb-sct.png new file mode 100644 index 0000000..694f99e Binary files /dev/null and b/assets/img/countries/gb-sct.png differ diff --git a/assets/img/countries/gb-wls.png b/assets/img/countries/gb-wls.png new file mode 100644 index 0000000..aedfe06 Binary files /dev/null and b/assets/img/countries/gb-wls.png differ diff --git a/assets/img/countries/gb.png b/assets/img/countries/gb.png new file mode 100644 index 0000000..b724a01 Binary files /dev/null and b/assets/img/countries/gb.png differ diff --git a/assets/img/countries/gd.png b/assets/img/countries/gd.png new file mode 100644 index 0000000..46e910e Binary files /dev/null and b/assets/img/countries/gd.png differ diff --git a/assets/img/countries/ge.png b/assets/img/countries/ge.png new file mode 100644 index 0000000..287a0b9 Binary files /dev/null and b/assets/img/countries/ge.png differ diff --git a/assets/img/countries/gf.png b/assets/img/countries/gf.png new file mode 100644 index 0000000..dbdd329 Binary files /dev/null and b/assets/img/countries/gf.png differ diff --git a/assets/img/countries/gg.png b/assets/img/countries/gg.png new file mode 100644 index 0000000..b6a9d08 Binary files /dev/null and b/assets/img/countries/gg.png differ diff --git a/assets/img/countries/gh.png b/assets/img/countries/gh.png new file mode 100644 index 0000000..4e4980a Binary files /dev/null and b/assets/img/countries/gh.png differ diff --git a/assets/img/countries/gi.png b/assets/img/countries/gi.png new file mode 100644 index 0000000..88c6565 Binary files /dev/null and b/assets/img/countries/gi.png differ diff --git a/assets/img/countries/gl.png b/assets/img/countries/gl.png new file mode 100644 index 0000000..f979999 Binary files /dev/null and b/assets/img/countries/gl.png differ diff --git a/assets/img/countries/gm.png b/assets/img/countries/gm.png new file mode 100644 index 0000000..7052054 Binary files /dev/null and b/assets/img/countries/gm.png differ diff --git a/assets/img/countries/gn.png b/assets/img/countries/gn.png new file mode 100644 index 0000000..ce56822 Binary files /dev/null and b/assets/img/countries/gn.png differ diff --git a/assets/img/countries/gp.png b/assets/img/countries/gp.png new file mode 100644 index 0000000..dbdd329 Binary files /dev/null and b/assets/img/countries/gp.png differ diff --git a/assets/img/countries/gq.png b/assets/img/countries/gq.png new file mode 100644 index 0000000..96e4a9c Binary files /dev/null and b/assets/img/countries/gq.png differ diff --git a/assets/img/countries/gr.png b/assets/img/countries/gr.png new file mode 100644 index 0000000..f9831d2 Binary files /dev/null and b/assets/img/countries/gr.png differ diff --git a/assets/img/countries/gs.png b/assets/img/countries/gs.png new file mode 100644 index 0000000..07eedef Binary files /dev/null and b/assets/img/countries/gs.png differ diff --git a/assets/img/countries/gt.png b/assets/img/countries/gt.png new file mode 100644 index 0000000..ae85233 Binary files /dev/null and b/assets/img/countries/gt.png differ diff --git a/assets/img/countries/gu.png b/assets/img/countries/gu.png new file mode 100644 index 0000000..dd400b0 Binary files /dev/null and b/assets/img/countries/gu.png differ diff --git a/assets/img/countries/gw.png b/assets/img/countries/gw.png new file mode 100644 index 0000000..f30c0bd Binary files /dev/null and b/assets/img/countries/gw.png differ diff --git a/assets/img/countries/gy.png b/assets/img/countries/gy.png new file mode 100644 index 0000000..778a447 Binary files /dev/null and b/assets/img/countries/gy.png differ diff --git a/assets/img/countries/hk.png b/assets/img/countries/hk.png new file mode 100644 index 0000000..b7e1d05 Binary files /dev/null and b/assets/img/countries/hk.png differ diff --git a/assets/img/countries/hm.png b/assets/img/countries/hm.png new file mode 100644 index 0000000..6f6957b Binary files /dev/null and b/assets/img/countries/hm.png differ diff --git a/assets/img/countries/hn.png b/assets/img/countries/hn.png new file mode 100644 index 0000000..35394fa Binary files /dev/null and b/assets/img/countries/hn.png differ diff --git a/assets/img/countries/hr.png b/assets/img/countries/hr.png new file mode 100644 index 0000000..4999378 Binary files /dev/null and b/assets/img/countries/hr.png differ diff --git a/assets/img/countries/ht.png b/assets/img/countries/ht.png new file mode 100644 index 0000000..e92f656 Binary files /dev/null and b/assets/img/countries/ht.png differ diff --git a/assets/img/countries/hu.png b/assets/img/countries/hu.png new file mode 100644 index 0000000..7135ac6 Binary files /dev/null and b/assets/img/countries/hu.png differ diff --git a/assets/img/countries/ic.png b/assets/img/countries/ic.png new file mode 100644 index 0000000..7e7019a Binary files /dev/null and b/assets/img/countries/ic.png differ diff --git a/assets/img/countries/id.png b/assets/img/countries/id.png new file mode 100644 index 0000000..358b7a8 Binary files /dev/null and b/assets/img/countries/id.png differ diff --git a/assets/img/countries/ie.png b/assets/img/countries/ie.png new file mode 100644 index 0000000..7a29c26 Binary files /dev/null and b/assets/img/countries/ie.png differ diff --git a/assets/img/countries/il.png b/assets/img/countries/il.png new file mode 100644 index 0000000..2625c1b Binary files /dev/null and b/assets/img/countries/il.png differ diff --git a/assets/img/countries/im.png b/assets/img/countries/im.png new file mode 100644 index 0000000..b0ed5db Binary files /dev/null and b/assets/img/countries/im.png differ diff --git a/assets/img/countries/in.png b/assets/img/countries/in.png new file mode 100644 index 0000000..36a542c Binary files /dev/null and b/assets/img/countries/in.png differ diff --git a/assets/img/countries/io.png b/assets/img/countries/io.png new file mode 100644 index 0000000..8cdfe20 Binary files /dev/null and b/assets/img/countries/io.png differ diff --git a/assets/img/countries/iq.png b/assets/img/countries/iq.png new file mode 100644 index 0000000..a01cf16 Binary files /dev/null and b/assets/img/countries/iq.png differ diff --git a/assets/img/countries/ir.png b/assets/img/countries/ir.png new file mode 100644 index 0000000..63fc958 Binary files /dev/null and b/assets/img/countries/ir.png differ diff --git a/assets/img/countries/is.png b/assets/img/countries/is.png new file mode 100644 index 0000000..c323852 Binary files /dev/null and b/assets/img/countries/is.png differ diff --git a/assets/img/countries/it.png b/assets/img/countries/it.png new file mode 100644 index 0000000..d7be0ed Binary files /dev/null and b/assets/img/countries/it.png differ diff --git a/assets/img/countries/je.png b/assets/img/countries/je.png new file mode 100644 index 0000000..6b5809f Binary files /dev/null and b/assets/img/countries/je.png differ diff --git a/assets/img/countries/jm.png b/assets/img/countries/jm.png new file mode 100644 index 0000000..4950140 Binary files /dev/null and b/assets/img/countries/jm.png differ diff --git a/assets/img/countries/jo.png b/assets/img/countries/jo.png new file mode 100644 index 0000000..d384f83 Binary files /dev/null and b/assets/img/countries/jo.png differ diff --git a/assets/img/countries/jp.png b/assets/img/countries/jp.png new file mode 100644 index 0000000..edf76a5 Binary files /dev/null and b/assets/img/countries/jp.png differ diff --git a/assets/img/countries/ke.png b/assets/img/countries/ke.png new file mode 100644 index 0000000..38cf5b9 Binary files /dev/null and b/assets/img/countries/ke.png differ diff --git a/assets/img/countries/kg.png b/assets/img/countries/kg.png new file mode 100644 index 0000000..3de8dfb Binary files /dev/null and b/assets/img/countries/kg.png differ diff --git a/assets/img/countries/kh.png b/assets/img/countries/kh.png new file mode 100644 index 0000000..343d01a Binary files /dev/null and b/assets/img/countries/kh.png differ diff --git a/assets/img/countries/ki.png b/assets/img/countries/ki.png new file mode 100644 index 0000000..ebfdd86 Binary files /dev/null and b/assets/img/countries/ki.png differ diff --git a/assets/img/countries/km.png b/assets/img/countries/km.png new file mode 100644 index 0000000..f8d3672 Binary files /dev/null and b/assets/img/countries/km.png differ diff --git a/assets/img/countries/kn.png b/assets/img/countries/kn.png new file mode 100644 index 0000000..bd0b5fd Binary files /dev/null and b/assets/img/countries/kn.png differ diff --git a/assets/img/countries/kp.png b/assets/img/countries/kp.png new file mode 100644 index 0000000..60e9e22 Binary files /dev/null and b/assets/img/countries/kp.png differ diff --git a/assets/img/countries/kr.png b/assets/img/countries/kr.png new file mode 100644 index 0000000..42cd872 Binary files /dev/null and b/assets/img/countries/kr.png differ diff --git a/assets/img/countries/kw.png b/assets/img/countries/kw.png new file mode 100644 index 0000000..7117660 Binary files /dev/null and b/assets/img/countries/kw.png differ diff --git a/assets/img/countries/ky.png b/assets/img/countries/ky.png new file mode 100644 index 0000000..26d4740 Binary files /dev/null and b/assets/img/countries/ky.png differ diff --git a/assets/img/countries/kz.png b/assets/img/countries/kz.png new file mode 100644 index 0000000..f1aed1f Binary files /dev/null and b/assets/img/countries/kz.png differ diff --git a/assets/img/countries/la.png b/assets/img/countries/la.png new file mode 100644 index 0000000..caa5adc Binary files /dev/null and b/assets/img/countries/la.png differ diff --git a/assets/img/countries/lb.png b/assets/img/countries/lb.png new file mode 100644 index 0000000..87bc8ea Binary files /dev/null and b/assets/img/countries/lb.png differ diff --git a/assets/img/countries/lc.png b/assets/img/countries/lc.png new file mode 100644 index 0000000..36c1114 Binary files /dev/null and b/assets/img/countries/lc.png differ diff --git a/assets/img/countries/li.png b/assets/img/countries/li.png new file mode 100644 index 0000000..4168113 Binary files /dev/null and b/assets/img/countries/li.png differ diff --git a/assets/img/countries/lk.png b/assets/img/countries/lk.png new file mode 100644 index 0000000..124d2c7 Binary files /dev/null and b/assets/img/countries/lk.png differ diff --git a/assets/img/countries/lr.png b/assets/img/countries/lr.png new file mode 100644 index 0000000..ec9052f Binary files /dev/null and b/assets/img/countries/lr.png differ diff --git a/assets/img/countries/ls.png b/assets/img/countries/ls.png new file mode 100644 index 0000000..bd1fa2c Binary files /dev/null and b/assets/img/countries/ls.png differ diff --git a/assets/img/countries/lt.png b/assets/img/countries/lt.png new file mode 100644 index 0000000..84bb63c Binary files /dev/null and b/assets/img/countries/lt.png differ diff --git a/assets/img/countries/lu.png b/assets/img/countries/lu.png new file mode 100644 index 0000000..e2b0911 Binary files /dev/null and b/assets/img/countries/lu.png differ diff --git a/assets/img/countries/lv.png b/assets/img/countries/lv.png new file mode 100644 index 0000000..ffc10d7 Binary files /dev/null and b/assets/img/countries/lv.png differ diff --git a/assets/img/countries/ly.png b/assets/img/countries/ly.png new file mode 100644 index 0000000..a63631f Binary files /dev/null and b/assets/img/countries/ly.png differ diff --git a/assets/img/countries/ma.png b/assets/img/countries/ma.png new file mode 100644 index 0000000..8d0b65c Binary files /dev/null and b/assets/img/countries/ma.png differ diff --git a/assets/img/countries/mc.png b/assets/img/countries/mc.png new file mode 100644 index 0000000..9074f5f Binary files /dev/null and b/assets/img/countries/mc.png differ diff --git a/assets/img/countries/md.png b/assets/img/countries/md.png new file mode 100644 index 0000000..c326e02 Binary files /dev/null and b/assets/img/countries/md.png differ diff --git a/assets/img/countries/me.png b/assets/img/countries/me.png new file mode 100644 index 0000000..ab619f2 Binary files /dev/null and b/assets/img/countries/me.png differ diff --git a/assets/img/countries/mf.png b/assets/img/countries/mf.png new file mode 100644 index 0000000..dbdd329 Binary files /dev/null and b/assets/img/countries/mf.png differ diff --git a/assets/img/countries/mg.png b/assets/img/countries/mg.png new file mode 100644 index 0000000..be20579 Binary files /dev/null and b/assets/img/countries/mg.png differ diff --git a/assets/img/countries/mh.png b/assets/img/countries/mh.png new file mode 100644 index 0000000..7382382 Binary files /dev/null and b/assets/img/countries/mh.png differ diff --git a/assets/img/countries/mk.png b/assets/img/countries/mk.png new file mode 100644 index 0000000..f7c7b19 Binary files /dev/null and b/assets/img/countries/mk.png differ diff --git a/assets/img/countries/ml.png b/assets/img/countries/ml.png new file mode 100644 index 0000000..0513efd Binary files /dev/null and b/assets/img/countries/ml.png differ diff --git a/assets/img/countries/mm.png b/assets/img/countries/mm.png new file mode 100644 index 0000000..8742d22 Binary files /dev/null and b/assets/img/countries/mm.png differ diff --git a/assets/img/countries/mn.png b/assets/img/countries/mn.png new file mode 100644 index 0000000..2453a2a Binary files /dev/null and b/assets/img/countries/mn.png differ diff --git a/assets/img/countries/mo.png b/assets/img/countries/mo.png new file mode 100644 index 0000000..8482f5b Binary files /dev/null and b/assets/img/countries/mo.png differ diff --git a/assets/img/countries/mp.png b/assets/img/countries/mp.png new file mode 100644 index 0000000..09af77c Binary files /dev/null and b/assets/img/countries/mp.png differ diff --git a/assets/img/countries/mq.png b/assets/img/countries/mq.png new file mode 100644 index 0000000..08ce439 Binary files /dev/null and b/assets/img/countries/mq.png differ diff --git a/assets/img/countries/mr.png b/assets/img/countries/mr.png new file mode 100644 index 0000000..1986c78 Binary files /dev/null and b/assets/img/countries/mr.png differ diff --git a/assets/img/countries/ms.png b/assets/img/countries/ms.png new file mode 100644 index 0000000..d457df3 Binary files /dev/null and b/assets/img/countries/ms.png differ diff --git a/assets/img/countries/mt.png b/assets/img/countries/mt.png new file mode 100644 index 0000000..cba7faa Binary files /dev/null and b/assets/img/countries/mt.png differ diff --git a/assets/img/countries/mu.png b/assets/img/countries/mu.png new file mode 100644 index 0000000..1743cfc Binary files /dev/null and b/assets/img/countries/mu.png differ diff --git a/assets/img/countries/mv.png b/assets/img/countries/mv.png new file mode 100644 index 0000000..e04f8f5 Binary files /dev/null and b/assets/img/countries/mv.png differ diff --git a/assets/img/countries/mw.png b/assets/img/countries/mw.png new file mode 100644 index 0000000..3f04591 Binary files /dev/null and b/assets/img/countries/mw.png differ diff --git a/assets/img/countries/mx.png b/assets/img/countries/mx.png new file mode 100644 index 0000000..1fc0a22 Binary files /dev/null and b/assets/img/countries/mx.png differ diff --git a/assets/img/countries/my.png b/assets/img/countries/my.png new file mode 100644 index 0000000..1ad9cc7 Binary files /dev/null and b/assets/img/countries/my.png differ diff --git a/assets/img/countries/mz.png b/assets/img/countries/mz.png new file mode 100644 index 0000000..6caccbd Binary files /dev/null and b/assets/img/countries/mz.png differ diff --git a/assets/img/countries/na.png b/assets/img/countries/na.png new file mode 100644 index 0000000..8fb195a Binary files /dev/null and b/assets/img/countries/na.png differ diff --git a/assets/img/countries/nc.png b/assets/img/countries/nc.png new file mode 100644 index 0000000..ddaf174 Binary files /dev/null and b/assets/img/countries/nc.png differ diff --git a/assets/img/countries/ne.png b/assets/img/countries/ne.png new file mode 100644 index 0000000..817ef1c Binary files /dev/null and b/assets/img/countries/ne.png differ diff --git a/assets/img/countries/nf.png b/assets/img/countries/nf.png new file mode 100644 index 0000000..1cf9d8a Binary files /dev/null and b/assets/img/countries/nf.png differ diff --git a/assets/img/countries/ng.png b/assets/img/countries/ng.png new file mode 100644 index 0000000..f70d5bf Binary files /dev/null and b/assets/img/countries/ng.png differ diff --git a/assets/img/countries/ni.png b/assets/img/countries/ni.png new file mode 100644 index 0000000..08f862a Binary files /dev/null and b/assets/img/countries/ni.png differ diff --git a/assets/img/countries/nl.png b/assets/img/countries/nl.png new file mode 100644 index 0000000..3097029 Binary files /dev/null and b/assets/img/countries/nl.png differ diff --git a/assets/img/countries/no.png b/assets/img/countries/no.png new file mode 100644 index 0000000..2697cba Binary files /dev/null and b/assets/img/countries/no.png differ diff --git a/assets/img/countries/np.png b/assets/img/countries/np.png new file mode 100644 index 0000000..64bd3fd Binary files /dev/null and b/assets/img/countries/np.png differ diff --git a/assets/img/countries/nr.png b/assets/img/countries/nr.png new file mode 100644 index 0000000..720e9ee Binary files /dev/null and b/assets/img/countries/nr.png differ diff --git a/assets/img/countries/nu.png b/assets/img/countries/nu.png new file mode 100644 index 0000000..534ac7e Binary files /dev/null and b/assets/img/countries/nu.png differ diff --git a/assets/img/countries/nz.png b/assets/img/countries/nz.png new file mode 100644 index 0000000..92228be Binary files /dev/null and b/assets/img/countries/nz.png differ diff --git a/assets/img/countries/om.png b/assets/img/countries/om.png new file mode 100644 index 0000000..fdc134f Binary files /dev/null and b/assets/img/countries/om.png differ diff --git a/assets/img/countries/pa.png b/assets/img/countries/pa.png new file mode 100644 index 0000000..ddf66ed Binary files /dev/null and b/assets/img/countries/pa.png differ diff --git a/assets/img/countries/pe.png b/assets/img/countries/pe.png new file mode 100644 index 0000000..a4b0f60 Binary files /dev/null and b/assets/img/countries/pe.png differ diff --git a/assets/img/countries/pf.png b/assets/img/countries/pf.png new file mode 100644 index 0000000..53b68ad Binary files /dev/null and b/assets/img/countries/pf.png differ diff --git a/assets/img/countries/pg.png b/assets/img/countries/pg.png new file mode 100644 index 0000000..d36543c Binary files /dev/null and b/assets/img/countries/pg.png differ diff --git a/assets/img/countries/ph.png b/assets/img/countries/ph.png new file mode 100644 index 0000000..1176deb Binary files /dev/null and b/assets/img/countries/ph.png differ diff --git a/assets/img/countries/pk.png b/assets/img/countries/pk.png new file mode 100644 index 0000000..8d2ee42 Binary files /dev/null and b/assets/img/countries/pk.png differ diff --git a/assets/img/countries/pl.png b/assets/img/countries/pl.png new file mode 100644 index 0000000..43feb64 Binary files /dev/null and b/assets/img/countries/pl.png differ diff --git a/assets/img/countries/pm.png b/assets/img/countries/pm.png new file mode 100644 index 0000000..dbdd329 Binary files /dev/null and b/assets/img/countries/pm.png differ diff --git a/assets/img/countries/pn.png b/assets/img/countries/pn.png new file mode 100644 index 0000000..e2bd38c Binary files /dev/null and b/assets/img/countries/pn.png differ diff --git a/assets/img/countries/pr.png b/assets/img/countries/pr.png new file mode 100644 index 0000000..50c29cb Binary files /dev/null and b/assets/img/countries/pr.png differ diff --git a/assets/img/countries/ps.png b/assets/img/countries/ps.png new file mode 100644 index 0000000..093d7e5 Binary files /dev/null and b/assets/img/countries/ps.png differ diff --git a/assets/img/countries/pt.png b/assets/img/countries/pt.png new file mode 100644 index 0000000..67bd032 Binary files /dev/null and b/assets/img/countries/pt.png differ diff --git a/assets/img/countries/pw.png b/assets/img/countries/pw.png new file mode 100644 index 0000000..6986534 Binary files /dev/null and b/assets/img/countries/pw.png differ diff --git a/assets/img/countries/py.png b/assets/img/countries/py.png new file mode 100644 index 0000000..c6289f4 Binary files /dev/null and b/assets/img/countries/py.png differ diff --git a/assets/img/countries/qa.png b/assets/img/countries/qa.png new file mode 100644 index 0000000..1409f55 Binary files /dev/null and b/assets/img/countries/qa.png differ diff --git a/assets/img/countries/re.png b/assets/img/countries/re.png new file mode 100644 index 0000000..08ce439 Binary files /dev/null and b/assets/img/countries/re.png differ diff --git a/assets/img/countries/ro.png b/assets/img/countries/ro.png new file mode 100644 index 0000000..4772ffd Binary files /dev/null and b/assets/img/countries/ro.png differ diff --git a/assets/img/countries/rs.png b/assets/img/countries/rs.png new file mode 100644 index 0000000..1acb525 Binary files /dev/null and b/assets/img/countries/rs.png differ diff --git a/assets/img/countries/ru.png b/assets/img/countries/ru.png new file mode 100644 index 0000000..0052370 Binary files /dev/null and b/assets/img/countries/ru.png differ diff --git a/assets/img/countries/rw.png b/assets/img/countries/rw.png new file mode 100644 index 0000000..201717b Binary files /dev/null and b/assets/img/countries/rw.png differ diff --git a/assets/img/countries/sa.png b/assets/img/countries/sa.png new file mode 100644 index 0000000..d48f3e9 Binary files /dev/null and b/assets/img/countries/sa.png differ diff --git a/assets/img/countries/sb.png b/assets/img/countries/sb.png new file mode 100644 index 0000000..8975d1f Binary files /dev/null and b/assets/img/countries/sb.png differ diff --git a/assets/img/countries/sc.png b/assets/img/countries/sc.png new file mode 100644 index 0000000..25aff1a Binary files /dev/null and b/assets/img/countries/sc.png differ diff --git a/assets/img/countries/sd.png b/assets/img/countries/sd.png new file mode 100644 index 0000000..aaa48d9 Binary files /dev/null and b/assets/img/countries/sd.png differ diff --git a/assets/img/countries/se.png b/assets/img/countries/se.png new file mode 100644 index 0000000..9536a91 Binary files /dev/null and b/assets/img/countries/se.png differ diff --git a/assets/img/countries/sg.png b/assets/img/countries/sg.png new file mode 100644 index 0000000..cedc4ef Binary files /dev/null and b/assets/img/countries/sg.png differ diff --git a/assets/img/countries/sh.png b/assets/img/countries/sh.png new file mode 100644 index 0000000..d3508b4 Binary files /dev/null and b/assets/img/countries/sh.png differ diff --git a/assets/img/countries/si.png b/assets/img/countries/si.png new file mode 100644 index 0000000..dfcfd72 Binary files /dev/null and b/assets/img/countries/si.png differ diff --git a/assets/img/countries/sj.png b/assets/img/countries/sj.png new file mode 100644 index 0000000..65b5578 Binary files /dev/null and b/assets/img/countries/sj.png differ diff --git a/assets/img/countries/sk.png b/assets/img/countries/sk.png new file mode 100644 index 0000000..6a495fa Binary files /dev/null and b/assets/img/countries/sk.png differ diff --git a/assets/img/countries/sl.png b/assets/img/countries/sl.png new file mode 100644 index 0000000..35d735a Binary files /dev/null and b/assets/img/countries/sl.png differ diff --git a/assets/img/countries/sm.png b/assets/img/countries/sm.png new file mode 100644 index 0000000..36bd274 Binary files /dev/null and b/assets/img/countries/sm.png differ diff --git a/assets/img/countries/sn.png b/assets/img/countries/sn.png new file mode 100644 index 0000000..397ac5d Binary files /dev/null and b/assets/img/countries/sn.png differ diff --git a/assets/img/countries/so.png b/assets/img/countries/so.png new file mode 100644 index 0000000..c1a3177 Binary files /dev/null and b/assets/img/countries/so.png differ diff --git a/assets/img/countries/sr.png b/assets/img/countries/sr.png new file mode 100644 index 0000000..4c98cc9 Binary files /dev/null and b/assets/img/countries/sr.png differ diff --git a/assets/img/countries/ss.png b/assets/img/countries/ss.png new file mode 100644 index 0000000..efbc968 Binary files /dev/null and b/assets/img/countries/ss.png differ diff --git a/assets/img/countries/st.png b/assets/img/countries/st.png new file mode 100644 index 0000000..344db8a Binary files /dev/null and b/assets/img/countries/st.png differ diff --git a/assets/img/countries/sv.png b/assets/img/countries/sv.png new file mode 100644 index 0000000..e24595c Binary files /dev/null and b/assets/img/countries/sv.png differ diff --git a/assets/img/countries/sx.png b/assets/img/countries/sx.png new file mode 100644 index 0000000..acd1de2 Binary files /dev/null and b/assets/img/countries/sx.png differ diff --git a/assets/img/countries/sy.png b/assets/img/countries/sy.png new file mode 100644 index 0000000..e05b447 Binary files /dev/null and b/assets/img/countries/sy.png differ diff --git a/assets/img/countries/sz.png b/assets/img/countries/sz.png new file mode 100644 index 0000000..727232a Binary files /dev/null and b/assets/img/countries/sz.png differ diff --git a/assets/img/countries/ta.png b/assets/img/countries/ta.png new file mode 100644 index 0000000..d3508b4 Binary files /dev/null and b/assets/img/countries/ta.png differ diff --git a/assets/img/countries/tc.png b/assets/img/countries/tc.png new file mode 100644 index 0000000..da85b4f Binary files /dev/null and b/assets/img/countries/tc.png differ diff --git a/assets/img/countries/td.png b/assets/img/countries/td.png new file mode 100644 index 0000000..41dad3b Binary files /dev/null and b/assets/img/countries/td.png differ diff --git a/assets/img/countries/tf.png b/assets/img/countries/tf.png new file mode 100644 index 0000000..14df3e1 Binary files /dev/null and b/assets/img/countries/tf.png differ diff --git a/assets/img/countries/tg.png b/assets/img/countries/tg.png new file mode 100644 index 0000000..6a6dc2d Binary files /dev/null and b/assets/img/countries/tg.png differ diff --git a/assets/img/countries/th.png b/assets/img/countries/th.png new file mode 100644 index 0000000..ece93ce Binary files /dev/null and b/assets/img/countries/th.png differ diff --git a/assets/img/countries/tj.png b/assets/img/countries/tj.png new file mode 100644 index 0000000..f10f228 Binary files /dev/null and b/assets/img/countries/tj.png differ diff --git a/assets/img/countries/tk.png b/assets/img/countries/tk.png new file mode 100644 index 0000000..0da0318 Binary files /dev/null and b/assets/img/countries/tk.png differ diff --git a/assets/img/countries/tl.png b/assets/img/countries/tl.png new file mode 100644 index 0000000..db79478 Binary files /dev/null and b/assets/img/countries/tl.png differ diff --git a/assets/img/countries/tm.png b/assets/img/countries/tm.png new file mode 100644 index 0000000..ac0f330 Binary files /dev/null and b/assets/img/countries/tm.png differ diff --git a/assets/img/countries/tn.png b/assets/img/countries/tn.png new file mode 100644 index 0000000..73b26cc Binary files /dev/null and b/assets/img/countries/tn.png differ diff --git a/assets/img/countries/to.png b/assets/img/countries/to.png new file mode 100644 index 0000000..5b41de4 Binary files /dev/null and b/assets/img/countries/to.png differ diff --git a/assets/img/countries/tr.png b/assets/img/countries/tr.png new file mode 100644 index 0000000..7f88c20 Binary files /dev/null and b/assets/img/countries/tr.png differ diff --git a/assets/img/countries/tt.png b/assets/img/countries/tt.png new file mode 100644 index 0000000..6497fe8 Binary files /dev/null and b/assets/img/countries/tt.png differ diff --git a/assets/img/countries/tv.png b/assets/img/countries/tv.png new file mode 100644 index 0000000..098a895 Binary files /dev/null and b/assets/img/countries/tv.png differ diff --git a/assets/img/countries/tw.png b/assets/img/countries/tw.png new file mode 100644 index 0000000..f2367bc Binary files /dev/null and b/assets/img/countries/tw.png differ diff --git a/assets/img/countries/tz.png b/assets/img/countries/tz.png new file mode 100644 index 0000000..e49e1a8 Binary files /dev/null and b/assets/img/countries/tz.png differ diff --git a/assets/img/countries/ua.png b/assets/img/countries/ua.png new file mode 100644 index 0000000..152ced5 Binary files /dev/null and b/assets/img/countries/ua.png differ diff --git a/assets/img/countries/ug.png b/assets/img/countries/ug.png new file mode 100644 index 0000000..88f2542 Binary files /dev/null and b/assets/img/countries/ug.png differ diff --git a/assets/img/countries/um.png b/assets/img/countries/um.png new file mode 100644 index 0000000..ae19d47 Binary files /dev/null and b/assets/img/countries/um.png differ diff --git a/assets/img/countries/un.png b/assets/img/countries/un.png new file mode 100644 index 0000000..bfb6d2e Binary files /dev/null and b/assets/img/countries/un.png differ diff --git a/assets/img/countries/us.png b/assets/img/countries/us.png new file mode 100644 index 0000000..64b03d1 Binary files /dev/null and b/assets/img/countries/us.png differ diff --git a/assets/img/countries/uy.png b/assets/img/countries/uy.png new file mode 100644 index 0000000..f9b0a65 Binary files /dev/null and b/assets/img/countries/uy.png differ diff --git a/assets/img/countries/uz.png b/assets/img/countries/uz.png new file mode 100644 index 0000000..9172bc8 Binary files /dev/null and b/assets/img/countries/uz.png differ diff --git a/assets/img/countries/va.png b/assets/img/countries/va.png new file mode 100644 index 0000000..aa8f4c9 Binary files /dev/null and b/assets/img/countries/va.png differ diff --git a/assets/img/countries/vc.png b/assets/img/countries/vc.png new file mode 100644 index 0000000..a02d527 Binary files /dev/null and b/assets/img/countries/vc.png differ diff --git a/assets/img/countries/ve.png b/assets/img/countries/ve.png new file mode 100644 index 0000000..58803ac Binary files /dev/null and b/assets/img/countries/ve.png differ diff --git a/assets/img/countries/vg.png b/assets/img/countries/vg.png new file mode 100644 index 0000000..2138a2c Binary files /dev/null and b/assets/img/countries/vg.png differ diff --git a/assets/img/countries/vi.png b/assets/img/countries/vi.png new file mode 100644 index 0000000..fb71ddc Binary files /dev/null and b/assets/img/countries/vi.png differ diff --git a/assets/img/countries/vn.png b/assets/img/countries/vn.png new file mode 100644 index 0000000..16bddd9 Binary files /dev/null and b/assets/img/countries/vn.png differ diff --git a/assets/img/countries/vu.png b/assets/img/countries/vu.png new file mode 100644 index 0000000..0a1c8f2 Binary files /dev/null and b/assets/img/countries/vu.png differ diff --git a/assets/img/countries/wf.png b/assets/img/countries/wf.png new file mode 100644 index 0000000..dbdd329 Binary files /dev/null and b/assets/img/countries/wf.png differ diff --git a/assets/img/countries/ws.png b/assets/img/countries/ws.png new file mode 100644 index 0000000..27bb6f7 Binary files /dev/null and b/assets/img/countries/ws.png differ diff --git a/assets/img/countries/xk.png b/assets/img/countries/xk.png new file mode 100644 index 0000000..692130f Binary files /dev/null and b/assets/img/countries/xk.png differ diff --git a/assets/img/countries/xx.png b/assets/img/countries/xx.png new file mode 100644 index 0000000..7060296 Binary files /dev/null and b/assets/img/countries/xx.png differ diff --git a/assets/img/countries/ye.png b/assets/img/countries/ye.png new file mode 100644 index 0000000..c373cd2 Binary files /dev/null and b/assets/img/countries/ye.png differ diff --git a/assets/img/countries/yt.png b/assets/img/countries/yt.png new file mode 100644 index 0000000..dbdd329 Binary files /dev/null and b/assets/img/countries/yt.png differ diff --git a/assets/img/countries/za.png b/assets/img/countries/za.png new file mode 100644 index 0000000..6e61d55 Binary files /dev/null and b/assets/img/countries/za.png differ diff --git a/assets/img/countries/zm.png b/assets/img/countries/zm.png new file mode 100644 index 0000000..d59ec47 Binary files /dev/null and b/assets/img/countries/zm.png differ diff --git a/assets/img/countries/zw.png b/assets/img/countries/zw.png new file mode 100644 index 0000000..ecd6e20 Binary files /dev/null and b/assets/img/countries/zw.png differ diff --git a/assets/js/ip_location_service.js b/assets/js/ip_location_service.js new file mode 100644 index 0000000..2814188 --- /dev/null +++ b/assets/js/ip_location_service.js @@ -0,0 +1,43 @@ +/** + * IP location service client + * + * @author Pierre Hubert + */ + +/** + * Apply location information where requested + */ +async function apply_location_information() { + for (const el of document.querySelectorAll("locateip")) { + if (el.hasAttribute("updated")) + continue; + + el.setAttribute("updated", "1"); + + try { + if(typeof IP_LOCATION_API === undefined) + throw new Error("IP location service is undefined!"); + + const URL = IP_LOCATION_API + "?ip=" + el.getAttribute("ip"); + const res = await (await fetch(URL)).json(); + + if (res.country_code === undefined || res.country_name === undefined) + throw new Error("IP location information unavailable!"); + + let loc = " "; + + if (res.region_name !== undefined && res.region_name !== "") + loc += res.region_name + " (" + res.country_name + ")"; + else + loc += res.country_name; + + el.innerHTML = loc; + + } catch(e) { + console.error(e); + el.innerHTML = "Unavailable"; + } + } +} + +window.addEventListener("load", () => apply_location_information()); diff --git a/src/controllers/openid_controller.rs b/src/controllers/openid_controller.rs index 766180a..c65f4e2 100644 --- a/src/controllers/openid_controller.rs +++ b/src/controllers/openid_controller.rs @@ -23,7 +23,7 @@ use crate::data::user::User; use crate::utils::string_utils::rand_str; use crate::utils::time::time; -pub async fn get_configuration(req: HttpRequest, app_conf: web::Data) -> impl Responder { +pub async fn get_configuration(req: HttpRequest) -> impl Responder { let is_secure_request = req .headers() .get("HTTP_X_FORWARDED_PROTO") @@ -45,8 +45,8 @@ pub async fn get_configuration(req: HttpRequest, app_conf: web::Data) ); HttpResponse::Ok().json(OpenIDConfig { - issuer: app_conf.website_origin.clone(), - authorization_endpoint: app_conf.full_url(AUTHORIZE_URI), + issuer: AppConfig::get().website_origin.clone(), + authorization_endpoint: AppConfig::get().full_url(AUTHORIZE_URI), token_endpoint: curr_origin.clone() + TOKEN_URI, userinfo_endpoint: curr_origin.clone() + USERINFO_URI, jwks_uri: curr_origin + CERT_URI, @@ -263,7 +263,6 @@ pub async fn token( req: HttpRequest, query: web::Form, clients: web::Data, - app_config: web::Data, sessions: web::Data>, users: web::Data>, jwt_signer: web::Data, @@ -416,7 +415,7 @@ pub async fn token( )); } - session.regenerate_access_and_refresh_tokens(&app_config, &jwt_signer)?; + session.regenerate_access_and_refresh_tokens(AppConfig::get(), &jwt_signer)?; sessions .send(openid_sessions_actor::UpdateSession(session.clone())) @@ -435,7 +434,7 @@ pub async fn token( // Generate id token let id_token = IdToken { - issuer: app_config.website_origin.to_string(), + issuer: AppConfig::get().website_origin.to_string(), subject_identifier: session.user.0, audience: session.client.0.to_string(), expiration_time: session.access_token_expire_at, @@ -488,7 +487,7 @@ pub async fn token( )); } - session.regenerate_access_and_refresh_tokens(&app_config, &jwt_signer)?; + session.regenerate_access_and_refresh_tokens(AppConfig::get(), &jwt_signer)?; sessions .send(openid_sessions_actor::UpdateSession(session.clone())) diff --git a/src/controllers/settings_controller.rs b/src/controllers/settings_controller.rs index a23f3ce..991c924 100644 --- a/src/controllers/settings_controller.rs +++ b/src/controllers/settings_controller.rs @@ -6,6 +6,7 @@ use crate::actors::bruteforce_actor::BruteForceActor; use crate::actors::users_actor::UsersActor; use crate::actors::{bruteforce_actor, users_actor}; use crate::constants::{APP_NAME, MAX_FAILED_LOGIN_ATTEMPTS, MIN_PASS_LEN}; +use crate::data::app_config::AppConfig; use crate::data::current_user::CurrentUser; use crate::data::remote_ip::RemoteIP; use crate::data::user::User; @@ -18,6 +19,7 @@ pub(crate) struct BaseSettingsPage { pub is_admin: bool, pub user_name: String, pub version: &'static str, + pub ip_location_api: Option<&'static str>, } impl BaseSettingsPage { @@ -35,6 +37,7 @@ impl BaseSettingsPage { is_admin: user.admin, user_name: user.username.to_string(), version: env!("CARGO_PKG_VERSION"), + ip_location_api: AppConfig::get().ip_location_service.as_deref(), } } } diff --git a/src/controllers/two_factors_controller.rs b/src/controllers/two_factors_controller.rs index ad4e979..a9dc6e7 100644 --- a/src/controllers/two_factors_controller.rs +++ b/src/controllers/two_factors_controller.rs @@ -1,6 +1,6 @@ use std::ops::Deref; -use actix_web::{web, HttpResponse, Responder}; +use actix_web::{HttpResponse, Responder}; use askama::Template; use qrcode_generator::QrCodeEcc; @@ -48,14 +48,14 @@ pub async fn two_factors_route(user: CurrentUser) -> impl Responder { } /// Configure a new TOTP authentication factor -pub async fn add_totp_factor_route( - user: CurrentUser, - app_conf: web::Data, -) -> impl Responder { +pub async fn add_totp_factor_route(user: CurrentUser) -> impl Responder { let key = TotpKey::new_random(); - let qr_code = - qrcode_generator::to_png_to_vec(key.url_for_user(&user, &app_conf), QrCodeEcc::Low, 1024); + let qr_code = qrcode_generator::to_png_to_vec( + key.url_for_user(&user, AppConfig::get()), + QrCodeEcc::Low, + 1024, + ); let qr_code = match qr_code { Ok(q) => q, Err(e) => { @@ -68,7 +68,7 @@ pub async fn add_totp_factor_route( AddTotpPage { _p: BaseSettingsPage::get("New authenticator app", &user, None, None), qr_code: base64::encode(qr_code), - account_name: key.account_name(&user, &app_conf), + account_name: key.account_name(&user, AppConfig::get()), secret_key: key.get_secret(), } .render() diff --git a/src/data/app_config.rs b/src/data/app_config.rs index 30dff4e..f5298b5 100644 --- a/src/data/app_config.rs +++ b/src/data/app_config.rs @@ -27,9 +27,35 @@ pub struct AppConfig { /// Proxy IP, might end with a star "*" #[clap(short, long, env)] pub proxy_ip: Option, + + /// IP location service API + /// + /// Up instance of IP location service : https://gitlab.com/pierre42100/iplocationserver + /// + /// Example: "https://api.geoip.rs" + #[arg(long, short, env)] + pub ip_location_service: Option, +} + +lazy_static::lazy_static! { + static ref ARGS: AppConfig = { + let mut config = AppConfig::parse(); + + // In debug mode only, use dummy token + if cfg!(debug_assertions) && config.token_key.is_empty() { + config.token_key = String::from_utf8_lossy(&[32; 64]).to_string(); + } + + config + }; } impl AppConfig { + /// Get parsed command line arguments + pub fn get() -> &'static AppConfig { + &ARGS + } + pub fn secure_cookie(&self) -> bool { self.website_origin.starts_with("https:") } @@ -58,3 +84,14 @@ impl AppConfig { self.website_origin.split('/').nth(2).unwrap_or(APP_NAME) } } + +#[cfg(test)] +mod test { + use crate::data::app_config::AppConfig; + + #[test] + fn verify_cli() { + use clap::CommandFactory; + AppConfig::command().debug_assert() + } +} diff --git a/src/data/remote_ip.rs b/src/data/remote_ip.rs index 25b5b2a..98b7531 100644 --- a/src/data/remote_ip.rs +++ b/src/data/remote_ip.rs @@ -1,7 +1,7 @@ use std::net::IpAddr; use actix_web::dev::Payload; -use actix_web::{web, Error, FromRequest, HttpRequest}; +use actix_web::{Error, FromRequest, HttpRequest}; use futures_util::future::{ready, Ready}; use crate::data::app_config::AppConfig; @@ -22,7 +22,9 @@ impl FromRequest for RemoteIP { #[inline] fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future { - let config: &web::Data = req.app_data().expect("AppData undefined!"); - ready(Ok(RemoteIP(get_remote_ip(req, config.proxy_ip.as_deref())))) + ready(Ok(RemoteIP(get_remote_ip( + req, + AppConfig::get().proxy_ip.as_deref(), + )))) } } diff --git a/src/main.rs b/src/main.rs index 4243b19..affbe37 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,6 @@ use actix_session::SessionMiddleware; use actix_web::cookie::{Key, SameSite}; use actix_web::middleware::Logger; use actix_web::{get, middleware, web, App, HttpResponse, HttpServer}; -use clap::Parser; use basic_oidc::actors::bruteforce_actor::BruteForceActor; use basic_oidc::actors::openid_sessions_actor::OpenIDSessionsActor; @@ -34,12 +33,7 @@ async fn health() -> &'static str { async fn main() -> std::io::Result<()> { env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); - let mut config: AppConfig = AppConfig::parse(); - - // In debug mode only, use dummy token - if cfg!(debug_assertions) && config.token_key.is_empty() { - config.token_key = String::from_utf8_lossy(&[32; 64]).to_string(); - } + let config = AppConfig::get(); if !config.storage_path().exists() { log::error!( @@ -73,7 +67,7 @@ async fn main() -> std::io::Result<()> { let bruteforce_actor = BruteForceActor::default().start(); let openid_sessions_actor = OpenIDSessionsActor::default().start(); let jwt_signer = JWTSigner::gen_from_memory().expect("Failed to generate JWKS key"); - let webauthn_manager = Arc::new(WebAuthManager::init(&config)); + let webauthn_manager = Arc::new(WebAuthManager::init(config)); log::info!("Server will listen on {}", config.listen_address); let listen_address = config.listen_address.to_string(); @@ -102,7 +96,6 @@ async fn main() -> std::io::Result<()> { .app_data(web::Data::new(users_actor.clone())) .app_data(web::Data::new(bruteforce_actor.clone())) .app_data(web::Data::new(openid_sessions_actor.clone())) - .app_data(web::Data::new(config.clone())) .app_data(web::Data::new(clients)) .app_data(web::Data::new(jwt_signer.clone())) .app_data(web::Data::new(webauthn_manager.clone())) diff --git a/src/middlewares/auth_middleware.rs b/src/middlewares/auth_middleware.rs index 3791af4..546bb4b 100644 --- a/src/middlewares/auth_middleware.rs +++ b/src/middlewares/auth_middleware.rs @@ -9,7 +9,7 @@ use actix_web::body::EitherBody; use actix_web::http::{header, Method}; use actix_web::{ dev::{forward_ready, Service, ServiceRequest, ServiceResponse, Transform}, - web, Error, HttpResponse, + Error, HttpResponse, }; use crate::constants::{ @@ -87,14 +87,16 @@ where // Forward request Box::pin(async move { - let config: &web::Data = req.app_data().expect("AppData undefined!"); - // Check if POST request comes from another website (block invalid origins) let origin = req.headers().get(header::ORIGIN); if req.method() == Method::POST && req.path() != TOKEN_URI && req.path() != USERINFO_URI { if let Some(o) = origin { - if !o.to_str().unwrap_or("bad").eq(&config.website_origin) { + if !o + .to_str() + .unwrap_or("bad") + .eq(&AppConfig::get().website_origin) + { log::warn!( "Blocked POST request from invalid origin! Origin given {:?}", o diff --git a/templates/settings/base_settings_page.html b/templates/settings/base_settings_page.html index 2d407d0..88328b7 100644 --- a/templates/settings/base_settings_page.html +++ b/templates/settings/base_settings_page.html @@ -83,8 +83,10 @@ if(el.href === location.href) el.classList.add("active"); else el.classList.remove("active") }) - - +{% if _p.ip_location_api.is_some() %} + +{% endif %} + \ No newline at end of file diff --git a/templates/settings/two_factors_page.html b/templates/settings/two_factors_page.html index f7a34cc..765217f 100644 --- a/templates/settings/two_factors_page.html +++ b/templates/settings/two_factors_page.html @@ -44,6 +44,7 @@ IP address + Location Date Bypass 2FA @@ -52,6 +53,7 @@ {% for e in user.get_formatted_2fa_successful_logins() %} {{ e.ip }} + {{ e.fmt_time() }} {% if e.can_bypass_2fa %}YES{% else %}NO{% endif %}