mirror of
				https://github.com/dani-garcia/vaultwarden.git
				synced 2025-10-28 00:40:01 +02:00 
			
		
		
		
	Use the local scripts instead of cloudflare, remove jquery and update config so disabling a master toggle doesn't remove the values
This commit is contained in:
		
							
								
								
									
										86
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										86
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @@ -42,7 +42,7 @@ version = "0.2.13" | |||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", |  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -66,7 +66,7 @@ name = "backtrace-sys" | |||||||
| version = "0.1.31" | version = "0.1.31" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "cc 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", |  "cc 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", |  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| @@ -221,7 +221,7 @@ dependencies = [ | |||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| name = "cc" | name = "cc" | ||||||
| version = "1.0.40" | version = "1.0.41" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -280,7 +280,7 @@ dependencies = [ | |||||||
|  "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", |  "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", |  "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", |  "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "publicsuffix 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "publicsuffix 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)", |  "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", |  "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", |  "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| @@ -1068,7 +1068,7 @@ name = "libsqlite3-sys" | |||||||
| version = "0.12.0" | version = "0.12.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "cc 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", |  "cc 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", |  "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
| @@ -1308,7 +1308,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||||||
| dependencies = [ | dependencies = [ | ||||||
|  "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", |  "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", |  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1345,7 +1345,7 @@ dependencies = [ | |||||||
|  "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", |  "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", |  "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", |  "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1432,7 +1432,7 @@ version = "0.9.49" | |||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", |  "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "cc 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", |  "cc 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", |  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", |  "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| @@ -1500,7 +1500,7 @@ dependencies = [ | |||||||
|  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", |  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", |  "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1512,7 +1512,7 @@ dependencies = [ | |||||||
|  "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", |  "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", |  "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1527,7 +1527,7 @@ dependencies = [ | |||||||
|  "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", |  "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", |  "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", |  "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1541,7 +1541,7 @@ dependencies = [ | |||||||
|  "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", |  "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", |  "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", |  "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1694,7 +1694,7 @@ dependencies = [ | |||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| name = "proc-macro2" | name = "proc-macro2" | ||||||
| version = "1.0.1" | version = "1.0.2" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| @@ -1702,14 +1702,14 @@ dependencies = [ | |||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| name = "publicsuffix" | name = "publicsuffix" | ||||||
| version = "1.5.2" | version = "1.5.3" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", |  "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", |  "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", |  "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1743,7 +1743,7 @@ name = "quote" | |||||||
| version = "1.0.2" | version = "1.0.2" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", |  "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1770,7 +1770,7 @@ dependencies = [ | |||||||
|  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", |  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1788,7 +1788,7 @@ dependencies = [ | |||||||
|  "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1799,7 +1799,7 @@ dependencies = [ | |||||||
|  "getrandom 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", |  "getrandom 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", |  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| @@ -1818,7 +1818,7 @@ version = "0.2.1" | |||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1836,7 +1836,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| name = "rand_core" | name = "rand_core" | ||||||
| version = "0.5.0" | version = "0.5.1" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "getrandom 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", |  "getrandom 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| @@ -1855,7 +1855,7 @@ name = "rand_hc" | |||||||
| version = "0.2.0" | version = "0.2.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1873,7 +1873,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||||||
| dependencies = [ | dependencies = [ | ||||||
|  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", |  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1886,7 +1886,7 @@ dependencies = [ | |||||||
|  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", |  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1940,7 +1940,7 @@ name = "remove_dir_all" | |||||||
| version = "0.5.2" | version = "0.5.2" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -1981,12 +1981,12 @@ name = "ring" | |||||||
| version = "0.14.6" | version = "0.14.6" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "cc 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", |  "cc 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", |  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -2125,7 +2125,7 @@ version = "0.1.15" | |||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -2200,7 +2200,7 @@ name = "serde_derive" | |||||||
| version = "1.0.99" | version = "1.0.99" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", |  "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", |  "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
| @@ -2403,7 +2403,7 @@ name = "syn" | |||||||
| version = "1.0.5" | version = "1.0.5" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", |  "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
| @@ -2448,7 +2448,7 @@ dependencies = [ | |||||||
|  "rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", |  "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -2484,7 +2484,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||||||
| dependencies = [ | dependencies = [ | ||||||
|  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", |  "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", |  "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -2778,7 +2778,7 @@ version = "2.2.9" | |||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", |  "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| @@ -2822,7 +2822,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| name = "winapi" | name = "winapi" | ||||||
| version = "0.3.7" | version = "0.3.8" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| @@ -2844,7 +2844,7 @@ name = "winapi-util" | |||||||
| version = "0.1.2" | version = "0.1.2" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -2857,7 +2857,7 @@ name = "winreg" | |||||||
| version = "0.6.2" | version = "0.6.2" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -2865,7 +2865,7 @@ name = "winutil" | |||||||
| version = "0.1.1" | version = "0.1.1" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", |  "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
| ] | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| @@ -2949,7 +2949,7 @@ dependencies = [ | |||||||
| "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" | "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" | ||||||
| "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" | "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" | ||||||
| "checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101" | "checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101" | ||||||
| "checksum cc 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "b548a4ee81fccb95919d4e22cfea83c7693ebfd78f0495493178db20b3139da7" | "checksum cc 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)" = "8dae9c4b8fedcae85592ba623c4fd08cfdab3e3b72d6df780c6ead964a69bfff" | ||||||
| "checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" | "checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" | ||||||
| "checksum chashmap 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff41a3c2c1e39921b9003de14bf0439c7b63a9039637c291e1a64925d8ddfa45" | "checksum chashmap 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff41a3c2c1e39921b9003de14bf0439c7b63a9039637c291e1a64925d8ddfa45" | ||||||
| "checksum chrono 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "77d81f58b7301084de3b958691458a53c3f7e0b1d702f77e550b6a88e3a88abe" | "checksum chrono 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "77d81f58b7301084de3b958691458a53c3f7e0b1d702f77e550b6a88e3a88abe" | ||||||
| @@ -3110,8 +3110,8 @@ dependencies = [ | |||||||
| "checksum proc-macro-hack-impl 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "38c47dcb1594802de8c02f3b899e2018c78291168a22c281be21ea0fb4796842" | "checksum proc-macro-hack-impl 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "38c47dcb1594802de8c02f3b899e2018c78291168a22c281be21ea0fb4796842" | ||||||
| "checksum proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1b06e2f335f48d24442b35a19df506a835fb3547bc3c06ef27340da9acf5cae7" | "checksum proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1b06e2f335f48d24442b35a19df506a835fb3547bc3c06ef27340da9acf5cae7" | ||||||
| "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" | "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" | ||||||
| "checksum proc-macro2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c5c2380ae88876faae57698be9e9775e3544decad214599c3a6266cca6ac802" | "checksum proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "175a40b9cf564ce9bf050654633dbf339978706b8ead1a907bb970b63185dd95" | ||||||
| "checksum publicsuffix 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5afecba86dcf1e4fd610246f89899d1924fe12e1e89f555eb7c7f710f3c5ad1d" | "checksum publicsuffix 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9bf259a81de2b2eb9850ec990ec78e6a25319715584fd7652b9b26f96fcb1510" | ||||||
| "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" | "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" | ||||||
| "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" | "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" | ||||||
| "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" | "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" | ||||||
| @@ -3126,7 +3126,7 @@ dependencies = [ | |||||||
| "checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" | "checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" | ||||||
| "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" | "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" | ||||||
| "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" | "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" | ||||||
| "checksum rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "615e683324e75af5d43d8f7a39ffe3ee4a9dc42c5c701167a71dc59c3a493aca" | "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" | ||||||
| "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" | "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" | ||||||
| "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" | "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" | ||||||
| "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" | "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" | ||||||
| @@ -3236,7 +3236,7 @@ dependencies = [ | |||||||
| "checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" | "checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" | ||||||
| "checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" | "checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" | ||||||
| "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" | ||||||
| "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" | "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" | ||||||
| "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" | ||||||
| "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" | ||||||
| "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" | "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" | ||||||
|   | |||||||
| @@ -31,13 +31,13 @@ struct DuoData { | |||||||
|  |  | ||||||
| impl DuoData { | impl DuoData { | ||||||
|     fn global() -> Option<Self> { |     fn global() -> Option<Self> { | ||||||
|         match CONFIG.duo_host() { |         match (CONFIG._enable_duo(), CONFIG.duo_host()) { | ||||||
|             Some(host) => Some(Self { |             (true, Some(host)) => Some(Self { | ||||||
|                 host, |                 host, | ||||||
|                 ik: CONFIG.duo_ikey().unwrap(), |                 ik: CONFIG.duo_ikey().unwrap(), | ||||||
|                 sk: CONFIG.duo_skey().unwrap(), |                 sk: CONFIG.duo_skey().unwrap(), | ||||||
|             }), |             }), | ||||||
|             None => None, |             _ => None, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     fn msg(s: &str) -> Self { |     fn msg(s: &str) -> Self { | ||||||
|   | |||||||
| @@ -59,6 +59,10 @@ fn jsonify_yubikeys(yubikeys: Vec<String>) -> serde_json::Value { | |||||||
| } | } | ||||||
|  |  | ||||||
| fn get_yubico_credentials() -> Result<(String, String), Error> { | fn get_yubico_credentials() -> Result<(String, String), Error> { | ||||||
|  |     if !CONFIG._enable_yubico() { | ||||||
|  |         err!("Yubico support is disabled"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     match (CONFIG.yubico_client_id(), CONFIG.yubico_secret_key()) { |     match (CONFIG.yubico_client_id(), CONFIG.yubico_secret_key()) { | ||||||
|         (Some(id), Some(secret)) => Ok((id, secret)), |         (Some(id), Some(secret)) => Ok((id, secret)), | ||||||
|         _ => err!("`YUBICO_CLIENT_ID` or `YUBICO_SECRET_KEY` environment variable is not set. Yubikey OTP Disabled"), |         _ => err!("`YUBICO_CLIENT_ID` or `YUBICO_SECRET_KEY` environment variable is not set. Yubikey OTP Disabled"), | ||||||
|   | |||||||
| @@ -70,6 +70,11 @@ fn static_files(filename: String) -> Result<Content<&'static [u8]>, Error> { | |||||||
|         "mail-github.png" => Ok(Content(ContentType::PNG, include_bytes!("../static/images/mail-github.png"))), |         "mail-github.png" => Ok(Content(ContentType::PNG, include_bytes!("../static/images/mail-github.png"))), | ||||||
|         "logo-gray.png" => Ok(Content(ContentType::PNG, include_bytes!("../static/images/logo-gray.png"))), |         "logo-gray.png" => Ok(Content(ContentType::PNG, include_bytes!("../static/images/logo-gray.png"))), | ||||||
|         "error-x.svg" => Ok(Content(ContentType::SVG, include_bytes!("../static/images/error-x.svg"))), |         "error-x.svg" => Ok(Content(ContentType::SVG, include_bytes!("../static/images/error-x.svg"))), | ||||||
|  |  | ||||||
|  |         "bootstrap.css" => Ok(Content(ContentType::CSS, include_bytes!("../static/scripts/bootstrap.css"))), | ||||||
|  |         "bootstrap-native-v4.js" => Ok(Content(ContentType::JavaScript, include_bytes!("../static/scripts/bootstrap-native-v4.js"))), | ||||||
|  |         "md5.js" => Ok(Content(ContentType::JavaScript, include_bytes!("../static/scripts/md5.js"))), | ||||||
|  |         "identicon.js" => Ok(Content(ContentType::JavaScript, include_bytes!("../static/scripts/identicon.js"))), | ||||||
|         _ => err!("Image not found"), |         _ => err!("Image not found"), | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -328,7 +328,7 @@ make_config! { | |||||||
|     /// Email 2FA Settings |     /// Email 2FA Settings | ||||||
|     email_2fa: _enable_email_2fa { |     email_2fa: _enable_email_2fa { | ||||||
|         /// Enabled |> Disabling will prevent users from setting up new email 2FA and using existing email 2FA configured |         /// Enabled |> Disabling will prevent users from setting up new email 2FA and using existing email 2FA configured | ||||||
|         _enable_email_2fa:      bool,   true,   def,      true; |         _enable_email_2fa:      bool,   true,   auto,    |c| c._enable_smtp && c.smtp_host.is_some(); | ||||||
|         /// Token number length |> Length of the numbers in an email token. Minimum of 6. Maximum is 19. |         /// Token number length |> Length of the numbers in an email token. Minimum of 6. Maximum is 19. | ||||||
|         email_token_size:       u32,    true,   def,      6; |         email_token_size:       u32,    true,   def,      6; | ||||||
|         /// Token expiration time |> Maximum time in seconds a token is valid. The time the user has to open email client and copy token. |         /// Token expiration time |> Maximum time in seconds a token is valid. The time the user has to open email client and copy token. | ||||||
| @@ -369,16 +369,18 @@ fn validate_config(cfg: &ConfigItems) -> Result<(), Error> { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (cfg.duo_host.is_some() || cfg.duo_ikey.is_some() || cfg.duo_skey.is_some()) |     if cfg._enable_duo | ||||||
|  |         && (cfg.duo_host.is_some() || cfg.duo_ikey.is_some() || cfg.duo_skey.is_some()) | ||||||
|         && !(cfg.duo_host.is_some() && cfg.duo_ikey.is_some() && cfg.duo_skey.is_some()) |         && !(cfg.duo_host.is_some() && cfg.duo_ikey.is_some() && cfg.duo_skey.is_some()) | ||||||
|     { |     { | ||||||
|         err!("All Duo options need to be set for global Duo support") |         err!("All Duo options need to be set for global Duo support") | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if cfg.yubico_client_id.is_some() != cfg.yubico_secret_key.is_some() { |     if cfg._enable_yubico && cfg.yubico_client_id.is_some() != cfg.yubico_secret_key.is_some() { | ||||||
|         err!("Both `YUBICO_CLIENT_ID` and `YUBICO_SECRET_KEY` need to be set for Yubikey OTP support") |         err!("Both `YUBICO_CLIENT_ID` and `YUBICO_SECRET_KEY` need to be set for Yubikey OTP support") | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if cfg._enable_smtp { | ||||||
|         if cfg.smtp_host.is_some() == cfg.smtp_from.is_empty() { |         if cfg.smtp_host.is_some() == cfg.smtp_from.is_empty() { | ||||||
|             err!("Both `SMTP_HOST` and `SMTP_FROM` need to be set for email support") |             err!("Both `SMTP_HOST` and `SMTP_FROM` need to be set for email support") | ||||||
|         } |         } | ||||||
| @@ -387,13 +389,18 @@ fn validate_config(cfg: &ConfigItems) -> Result<(), Error> { | |||||||
|             err!("Both `SMTP_USERNAME` and `SMTP_PASSWORD` need to be set to enable email authentication") |             err!("Both `SMTP_USERNAME` and `SMTP_PASSWORD` need to be set to enable email authentication") | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     if cfg.email_token_size < 6 { |         if cfg._enable_email_2fa && (!cfg._enable_smtp || cfg.smtp_host.is_none()) { | ||||||
|  |             err!("To enable email 2FA, SMTP must be configured") | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if cfg._enable_email_2fa && cfg.email_token_size < 6 { | ||||||
|             err!("`EMAIL_TOKEN_SIZE` has a minimum size of 6") |             err!("`EMAIL_TOKEN_SIZE` has a minimum size of 6") | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     if cfg.email_token_size > 19 { |         if cfg._enable_email_2fa && cfg.email_token_size > 19 { | ||||||
|             err!("`EMAIL_TOKEN_SIZE` has a maximum size of 19") |             err!("`EMAIL_TOKEN_SIZE` has a maximum size of 19") | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     Ok(()) |     Ok(()) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										2009
									
								
								src/static/scripts/bootstrap-native-v4.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2009
									
								
								src/static/scripts/bootstrap-native-v4.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										10038
									
								
								src/static/scripts/bootstrap.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10038
									
								
								src/static/scripts/bootstrap.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										205
									
								
								src/static/scripts/identicon.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								src/static/scripts/identicon.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | |||||||
|  | /** | ||||||
|  |  * Identicon.js 2.3.3 | ||||||
|  |  * http://github.com/stewartlord/identicon.js | ||||||
|  |  * | ||||||
|  |  * PNGLib required for PNG output | ||||||
|  |  * http://www.xarg.org/download/pnglib.js | ||||||
|  |  * | ||||||
|  |  * Copyright 2018, Stewart Lord | ||||||
|  |  * Released under the BSD license | ||||||
|  |  * http://www.opensource.org/licenses/bsd-license.php | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | (function() { | ||||||
|  |     var PNGlib; | ||||||
|  |     if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { | ||||||
|  |         PNGlib = require('./pnglib'); | ||||||
|  |     } else { | ||||||
|  |         PNGlib = window.PNGlib; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     var Identicon = function(hash, options){ | ||||||
|  |         if (typeof(hash) !== 'string' || hash.length < 15) { | ||||||
|  |             throw 'A hash of at least 15 characters is required.'; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         this.defaults = { | ||||||
|  |             background: [240, 240, 240, 255], | ||||||
|  |             margin:     0.08, | ||||||
|  |             size:       64, | ||||||
|  |             saturation: 0.7, | ||||||
|  |             brightness: 0.5, | ||||||
|  |             format:     'png' | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |         this.options = typeof(options) === 'object' ? options : this.defaults; | ||||||
|  |  | ||||||
|  |         // backward compatibility with old constructor (hash, size, margin) | ||||||
|  |         if (typeof(arguments[1]) === 'number') { this.options.size   = arguments[1]; } | ||||||
|  |         if (arguments[2])                      { this.options.margin = arguments[2]; } | ||||||
|  |  | ||||||
|  |         this.hash        = hash | ||||||
|  |         this.background  = this.options.background || this.defaults.background; | ||||||
|  |         this.size        = this.options.size       || this.defaults.size; | ||||||
|  |         this.format      = this.options.format     || this.defaults.format; | ||||||
|  |         this.margin      = this.options.margin !== undefined ? this.options.margin : this.defaults.margin; | ||||||
|  |  | ||||||
|  |         // foreground defaults to last 7 chars as hue at 70% saturation, 50% brightness | ||||||
|  |         var hue          = parseInt(this.hash.substr(-7), 16) / 0xfffffff; | ||||||
|  |         var saturation   = this.options.saturation || this.defaults.saturation; | ||||||
|  |         var brightness   = this.options.brightness || this.defaults.brightness; | ||||||
|  |         this.foreground  = this.options.foreground || this.hsl2rgb(hue, saturation, brightness); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     Identicon.prototype = { | ||||||
|  |         background: null, | ||||||
|  |         foreground: null, | ||||||
|  |         hash:       null, | ||||||
|  |         margin:     null, | ||||||
|  |         size:       null, | ||||||
|  |         format:     null, | ||||||
|  |  | ||||||
|  |         image: function(){ | ||||||
|  |             return this.isSvg() | ||||||
|  |                 ? new Svg(this.size, this.foreground, this.background) | ||||||
|  |                 : new PNGlib(this.size, this.size, 256); | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         render: function(){ | ||||||
|  |             var image      = this.image(), | ||||||
|  |                 size       = this.size, | ||||||
|  |                 baseMargin = Math.floor(size * this.margin), | ||||||
|  |                 cell       = Math.floor((size - (baseMargin * 2)) / 5), | ||||||
|  |                 margin     = Math.floor((size - cell * 5) / 2), | ||||||
|  |                 bg         = image.color.apply(image, this.background), | ||||||
|  |                 fg         = image.color.apply(image, this.foreground); | ||||||
|  |  | ||||||
|  |             // the first 15 characters of the hash control the pixels (even/odd) | ||||||
|  |             // they are drawn down the middle first, then mirrored outwards | ||||||
|  |             var i, color; | ||||||
|  |             for (i = 0; i < 15; i++) { | ||||||
|  |                 color = parseInt(this.hash.charAt(i), 16) % 2 ? bg : fg; | ||||||
|  |                 if (i < 5) { | ||||||
|  |                     this.rectangle(2 * cell + margin, i * cell + margin, cell, cell, color, image); | ||||||
|  |                 } else if (i < 10) { | ||||||
|  |                     this.rectangle(1 * cell + margin, (i - 5) * cell + margin, cell, cell, color, image); | ||||||
|  |                     this.rectangle(3 * cell + margin, (i - 5) * cell + margin, cell, cell, color, image); | ||||||
|  |                 } else if (i < 15) { | ||||||
|  |                     this.rectangle(0 * cell + margin, (i - 10) * cell + margin, cell, cell, color, image); | ||||||
|  |                     this.rectangle(4 * cell + margin, (i - 10) * cell + margin, cell, cell, color, image); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return image; | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         rectangle: function(x, y, w, h, color, image){ | ||||||
|  |             if (this.isSvg()) { | ||||||
|  |                 image.rectangles.push({x: x, y: y, w: w, h: h, color: color}); | ||||||
|  |             } else { | ||||||
|  |                 var i, j; | ||||||
|  |                 for (i = x; i < x + w; i++) { | ||||||
|  |                     for (j = y; j < y + h; j++) { | ||||||
|  |                         image.buffer[image.index(i, j)] = color; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         // adapted from: https://gist.github.com/aemkei/1325937 | ||||||
|  |         hsl2rgb: function(h, s, b){ | ||||||
|  |             h *= 6; | ||||||
|  |             s = [ | ||||||
|  |                 b += s *= b < .5 ? b : 1 - b, | ||||||
|  |                 b - h % 1 * s * 2, | ||||||
|  |                 b -= s *= 2, | ||||||
|  |                 b, | ||||||
|  |                 b + h % 1 * s, | ||||||
|  |                 b + s | ||||||
|  |             ]; | ||||||
|  |  | ||||||
|  |             return[ | ||||||
|  |                 s[ ~~h    % 6 ] * 255, // red | ||||||
|  |                 s[ (h|16) % 6 ] * 255, // green | ||||||
|  |                 s[ (h|8)  % 6 ] * 255  // blue | ||||||
|  |             ]; | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         toString: function(raw){ | ||||||
|  |             // backward compatibility with old toString, default to base64 | ||||||
|  |             if (raw) { | ||||||
|  |                 return this.render().getDump(); | ||||||
|  |             } else { | ||||||
|  |                 return this.render().getBase64(); | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         isSvg: function(){ | ||||||
|  |             return this.format.match(/svg/i) | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     var Svg = function(size, foreground, background){ | ||||||
|  |         this.size       = size; | ||||||
|  |         this.foreground = this.color.apply(this, foreground); | ||||||
|  |         this.background = this.color.apply(this, background); | ||||||
|  |         this.rectangles = []; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     Svg.prototype = { | ||||||
|  |         size:       null, | ||||||
|  |         foreground: null, | ||||||
|  |         background: null, | ||||||
|  |         rectangles: null, | ||||||
|  |  | ||||||
|  |         color: function(r, g, b, a){ | ||||||
|  |             var values = [r, g, b].map(Math.round); | ||||||
|  |             values.push((a >= 0) && (a <= 255) ? a/255 : 1); | ||||||
|  |             return 'rgba(' + values.join(',') + ')'; | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         getDump: function(){ | ||||||
|  |           var i, | ||||||
|  |                 xml, | ||||||
|  |                 rect, | ||||||
|  |                 fg     = this.foreground, | ||||||
|  |                 bg     = this.background, | ||||||
|  |                 stroke = this.size * 0.005; | ||||||
|  |  | ||||||
|  |             xml = "<svg xmlns='http://www.w3.org/2000/svg'" | ||||||
|  |                 + " width='" + this.size + "' height='" + this.size + "'" | ||||||
|  |                 + " style='background-color:" + bg + ";'>" | ||||||
|  |                 + "<g style='fill:" + fg + "; stroke:" + fg + "; stroke-width:" + stroke + ";'>"; | ||||||
|  |  | ||||||
|  |             for (i = 0; i < this.rectangles.length; i++) { | ||||||
|  |                 rect = this.rectangles[i]; | ||||||
|  |                 if (rect.color == bg) continue; | ||||||
|  |                 xml += "<rect " | ||||||
|  |                     + " x='"      + rect.x + "'" | ||||||
|  |                     + " y='"      + rect.y + "'" | ||||||
|  |                     + " width='"  + rect.w + "'" | ||||||
|  |                     + " height='" + rect.h + "'" | ||||||
|  |                     + "/>"; | ||||||
|  |             } | ||||||
|  |             xml += "</g></svg>" | ||||||
|  |  | ||||||
|  |             return xml; | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         getBase64: function(){ | ||||||
|  |             if ('function' === typeof btoa) { | ||||||
|  |                 return btoa(this.getDump()); | ||||||
|  |             } else if (Buffer) { | ||||||
|  |                 return new Buffer(this.getDump(), 'binary').toString('base64'); | ||||||
|  |             } else { | ||||||
|  |                 throw 'Cannot generate base64 output'; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { | ||||||
|  |         module.exports = Identicon; | ||||||
|  |     } else { | ||||||
|  |         window.Identicon = Identicon; | ||||||
|  |     } | ||||||
|  | })(); | ||||||
							
								
								
									
										402
									
								
								src/static/scripts/md5.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										402
									
								
								src/static/scripts/md5.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,402 @@ | |||||||
|  | /* | ||||||
|  |  * JavaScript MD5 | ||||||
|  |  * https://github.com/blueimp/JavaScript-MD5 | ||||||
|  |  * | ||||||
|  |  * Copyright 2011, Sebastian Tschan | ||||||
|  |  * https://blueimp.net | ||||||
|  |  * | ||||||
|  |  * Licensed under the MIT license: | ||||||
|  |  * https://opensource.org/licenses/MIT | ||||||
|  |  * | ||||||
|  |  * Based on | ||||||
|  |  * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message | ||||||
|  |  * Digest Algorithm, as defined in RFC 1321. | ||||||
|  |  * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 | ||||||
|  |  * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet | ||||||
|  |  * Distributed under the BSD License | ||||||
|  |  * See http://pajhome.org.uk/crypt/md5 for more info. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* global define */ | ||||||
|  |  | ||||||
|  | /* eslint-disable strict */ | ||||||
|  |  | ||||||
|  | ;(function($) { | ||||||
|  |   'use strict' | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Add integers, wrapping at 2^32. | ||||||
|  |    * This uses 16-bit operations internally to work around bugs in interpreters. | ||||||
|  |    * | ||||||
|  |    * @param {number} x First integer | ||||||
|  |    * @param {number} y Second integer | ||||||
|  |    * @returns {number} Sum | ||||||
|  |    */ | ||||||
|  |   function safeAdd(x, y) { | ||||||
|  |     var lsw = (x & 0xffff) + (y & 0xffff) | ||||||
|  |     var msw = (x >> 16) + (y >> 16) + (lsw >> 16) | ||||||
|  |     return (msw << 16) | (lsw & 0xffff) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Bitwise rotate a 32-bit number to the left. | ||||||
|  |    * | ||||||
|  |    * @param {number} num 32-bit number | ||||||
|  |    * @param {number} cnt Rotation count | ||||||
|  |    * @returns {number} Rotated number | ||||||
|  |    */ | ||||||
|  |   function bitRotateLeft(num, cnt) { | ||||||
|  |     return (num << cnt) | (num >>> (32 - cnt)) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Basic operation the algorithm uses. | ||||||
|  |    * | ||||||
|  |    * @param {number} q q | ||||||
|  |    * @param {number} a a | ||||||
|  |    * @param {number} b b | ||||||
|  |    * @param {number} x x | ||||||
|  |    * @param {number} s s | ||||||
|  |    * @param {number} t t | ||||||
|  |    * @returns {number} Result | ||||||
|  |    */ | ||||||
|  |   function md5cmn(q, a, b, x, s, t) { | ||||||
|  |     return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b) | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * Basic operation the algorithm uses. | ||||||
|  |    * | ||||||
|  |    * @param {number} a a | ||||||
|  |    * @param {number} b b | ||||||
|  |    * @param {number} c c | ||||||
|  |    * @param {number} d d | ||||||
|  |    * @param {number} x x | ||||||
|  |    * @param {number} s s | ||||||
|  |    * @param {number} t t | ||||||
|  |    * @returns {number} Result | ||||||
|  |    */ | ||||||
|  |   function md5ff(a, b, c, d, x, s, t) { | ||||||
|  |     return md5cmn((b & c) | (~b & d), a, b, x, s, t) | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * Basic operation the algorithm uses. | ||||||
|  |    * | ||||||
|  |    * @param {number} a a | ||||||
|  |    * @param {number} b b | ||||||
|  |    * @param {number} c c | ||||||
|  |    * @param {number} d d | ||||||
|  |    * @param {number} x x | ||||||
|  |    * @param {number} s s | ||||||
|  |    * @param {number} t t | ||||||
|  |    * @returns {number} Result | ||||||
|  |    */ | ||||||
|  |   function md5gg(a, b, c, d, x, s, t) { | ||||||
|  |     return md5cmn((b & d) | (c & ~d), a, b, x, s, t) | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * Basic operation the algorithm uses. | ||||||
|  |    * | ||||||
|  |    * @param {number} a a | ||||||
|  |    * @param {number} b b | ||||||
|  |    * @param {number} c c | ||||||
|  |    * @param {number} d d | ||||||
|  |    * @param {number} x x | ||||||
|  |    * @param {number} s s | ||||||
|  |    * @param {number} t t | ||||||
|  |    * @returns {number} Result | ||||||
|  |    */ | ||||||
|  |   function md5hh(a, b, c, d, x, s, t) { | ||||||
|  |     return md5cmn(b ^ c ^ d, a, b, x, s, t) | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * Basic operation the algorithm uses. | ||||||
|  |    * | ||||||
|  |    * @param {number} a a | ||||||
|  |    * @param {number} b b | ||||||
|  |    * @param {number} c c | ||||||
|  |    * @param {number} d d | ||||||
|  |    * @param {number} x x | ||||||
|  |    * @param {number} s s | ||||||
|  |    * @param {number} t t | ||||||
|  |    * @returns {number} Result | ||||||
|  |    */ | ||||||
|  |   function md5ii(a, b, c, d, x, s, t) { | ||||||
|  |     return md5cmn(c ^ (b | ~d), a, b, x, s, t) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Calculate the MD5 of an array of little-endian words, and a bit length. | ||||||
|  |    * | ||||||
|  |    * @param {Array} x Array of little-endian words | ||||||
|  |    * @param {number} len Bit length | ||||||
|  |    * @returns {Array<number>} MD5 Array | ||||||
|  |    */ | ||||||
|  |   function binlMD5(x, len) { | ||||||
|  |     /* append padding */ | ||||||
|  |     x[len >> 5] |= 0x80 << len % 32 | ||||||
|  |     x[(((len + 64) >>> 9) << 4) + 14] = len | ||||||
|  |  | ||||||
|  |     var i | ||||||
|  |     var olda | ||||||
|  |     var oldb | ||||||
|  |     var oldc | ||||||
|  |     var oldd | ||||||
|  |     var a = 1732584193 | ||||||
|  |     var b = -271733879 | ||||||
|  |     var c = -1732584194 | ||||||
|  |     var d = 271733878 | ||||||
|  |  | ||||||
|  |     for (i = 0; i < x.length; i += 16) { | ||||||
|  |       olda = a | ||||||
|  |       oldb = b | ||||||
|  |       oldc = c | ||||||
|  |       oldd = d | ||||||
|  |  | ||||||
|  |       a = md5ff(a, b, c, d, x[i], 7, -680876936) | ||||||
|  |       d = md5ff(d, a, b, c, x[i + 1], 12, -389564586) | ||||||
|  |       c = md5ff(c, d, a, b, x[i + 2], 17, 606105819) | ||||||
|  |       b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330) | ||||||
|  |       a = md5ff(a, b, c, d, x[i + 4], 7, -176418897) | ||||||
|  |       d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426) | ||||||
|  |       c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341) | ||||||
|  |       b = md5ff(b, c, d, a, x[i + 7], 22, -45705983) | ||||||
|  |       a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416) | ||||||
|  |       d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417) | ||||||
|  |       c = md5ff(c, d, a, b, x[i + 10], 17, -42063) | ||||||
|  |       b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162) | ||||||
|  |       a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682) | ||||||
|  |       d = md5ff(d, a, b, c, x[i + 13], 12, -40341101) | ||||||
|  |       c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290) | ||||||
|  |       b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329) | ||||||
|  |  | ||||||
|  |       a = md5gg(a, b, c, d, x[i + 1], 5, -165796510) | ||||||
|  |       d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632) | ||||||
|  |       c = md5gg(c, d, a, b, x[i + 11], 14, 643717713) | ||||||
|  |       b = md5gg(b, c, d, a, x[i], 20, -373897302) | ||||||
|  |       a = md5gg(a, b, c, d, x[i + 5], 5, -701558691) | ||||||
|  |       d = md5gg(d, a, b, c, x[i + 10], 9, 38016083) | ||||||
|  |       c = md5gg(c, d, a, b, x[i + 15], 14, -660478335) | ||||||
|  |       b = md5gg(b, c, d, a, x[i + 4], 20, -405537848) | ||||||
|  |       a = md5gg(a, b, c, d, x[i + 9], 5, 568446438) | ||||||
|  |       d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690) | ||||||
|  |       c = md5gg(c, d, a, b, x[i + 3], 14, -187363961) | ||||||
|  |       b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501) | ||||||
|  |       a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467) | ||||||
|  |       d = md5gg(d, a, b, c, x[i + 2], 9, -51403784) | ||||||
|  |       c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473) | ||||||
|  |       b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734) | ||||||
|  |  | ||||||
|  |       a = md5hh(a, b, c, d, x[i + 5], 4, -378558) | ||||||
|  |       d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463) | ||||||
|  |       c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562) | ||||||
|  |       b = md5hh(b, c, d, a, x[i + 14], 23, -35309556) | ||||||
|  |       a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060) | ||||||
|  |       d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353) | ||||||
|  |       c = md5hh(c, d, a, b, x[i + 7], 16, -155497632) | ||||||
|  |       b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640) | ||||||
|  |       a = md5hh(a, b, c, d, x[i + 13], 4, 681279174) | ||||||
|  |       d = md5hh(d, a, b, c, x[i], 11, -358537222) | ||||||
|  |       c = md5hh(c, d, a, b, x[i + 3], 16, -722521979) | ||||||
|  |       b = md5hh(b, c, d, a, x[i + 6], 23, 76029189) | ||||||
|  |       a = md5hh(a, b, c, d, x[i + 9], 4, -640364487) | ||||||
|  |       d = md5hh(d, a, b, c, x[i + 12], 11, -421815835) | ||||||
|  |       c = md5hh(c, d, a, b, x[i + 15], 16, 530742520) | ||||||
|  |       b = md5hh(b, c, d, a, x[i + 2], 23, -995338651) | ||||||
|  |  | ||||||
|  |       a = md5ii(a, b, c, d, x[i], 6, -198630844) | ||||||
|  |       d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415) | ||||||
|  |       c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905) | ||||||
|  |       b = md5ii(b, c, d, a, x[i + 5], 21, -57434055) | ||||||
|  |       a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571) | ||||||
|  |       d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606) | ||||||
|  |       c = md5ii(c, d, a, b, x[i + 10], 15, -1051523) | ||||||
|  |       b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799) | ||||||
|  |       a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359) | ||||||
|  |       d = md5ii(d, a, b, c, x[i + 15], 10, -30611744) | ||||||
|  |       c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380) | ||||||
|  |       b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649) | ||||||
|  |       a = md5ii(a, b, c, d, x[i + 4], 6, -145523070) | ||||||
|  |       d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379) | ||||||
|  |       c = md5ii(c, d, a, b, x[i + 2], 15, 718787259) | ||||||
|  |       b = md5ii(b, c, d, a, x[i + 9], 21, -343485551) | ||||||
|  |  | ||||||
|  |       a = safeAdd(a, olda) | ||||||
|  |       b = safeAdd(b, oldb) | ||||||
|  |       c = safeAdd(c, oldc) | ||||||
|  |       d = safeAdd(d, oldd) | ||||||
|  |     } | ||||||
|  |     return [a, b, c, d] | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Convert an array of little-endian words to a string | ||||||
|  |    * | ||||||
|  |    * @param {Array<number>} input MD5 Array | ||||||
|  |    * @returns {string} MD5 string | ||||||
|  |    */ | ||||||
|  |   function binl2rstr(input) { | ||||||
|  |     var i | ||||||
|  |     var output = '' | ||||||
|  |     var length32 = input.length * 32 | ||||||
|  |     for (i = 0; i < length32; i += 8) { | ||||||
|  |       output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff) | ||||||
|  |     } | ||||||
|  |     return output | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Convert a raw string to an array of little-endian words | ||||||
|  |    * Characters >255 have their high-byte silently ignored. | ||||||
|  |    * | ||||||
|  |    * @param {string} input Raw input string | ||||||
|  |    * @returns {Array<number>} Array of little-endian words | ||||||
|  |    */ | ||||||
|  |   function rstr2binl(input) { | ||||||
|  |     var i | ||||||
|  |     var output = [] | ||||||
|  |     output[(input.length >> 2) - 1] = undefined | ||||||
|  |     for (i = 0; i < output.length; i += 1) { | ||||||
|  |       output[i] = 0 | ||||||
|  |     } | ||||||
|  |     var length8 = input.length * 8 | ||||||
|  |     for (i = 0; i < length8; i += 8) { | ||||||
|  |       output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32 | ||||||
|  |     } | ||||||
|  |     return output | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Calculate the MD5 of a raw string | ||||||
|  |    * | ||||||
|  |    * @param {string} s Input string | ||||||
|  |    * @returns {string} Raw MD5 string | ||||||
|  |    */ | ||||||
|  |   function rstrMD5(s) { | ||||||
|  |     return binl2rstr(binlMD5(rstr2binl(s), s.length * 8)) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Calculates the HMAC-MD5 of a key and some data (raw strings) | ||||||
|  |    * | ||||||
|  |    * @param {string} key HMAC key | ||||||
|  |    * @param {string} data Raw input string | ||||||
|  |    * @returns {string} Raw MD5 string | ||||||
|  |    */ | ||||||
|  |   function rstrHMACMD5(key, data) { | ||||||
|  |     var i | ||||||
|  |     var bkey = rstr2binl(key) | ||||||
|  |     var ipad = [] | ||||||
|  |     var opad = [] | ||||||
|  |     var hash | ||||||
|  |     ipad[15] = opad[15] = undefined | ||||||
|  |     if (bkey.length > 16) { | ||||||
|  |       bkey = binlMD5(bkey, key.length * 8) | ||||||
|  |     } | ||||||
|  |     for (i = 0; i < 16; i += 1) { | ||||||
|  |       ipad[i] = bkey[i] ^ 0x36363636 | ||||||
|  |       opad[i] = bkey[i] ^ 0x5c5c5c5c | ||||||
|  |     } | ||||||
|  |     hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8) | ||||||
|  |     return binl2rstr(binlMD5(opad.concat(hash), 512 + 128)) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Convert a raw string to a hex string | ||||||
|  |    * | ||||||
|  |    * @param {string} input Raw input string | ||||||
|  |    * @returns {string} Hex encoded string | ||||||
|  |    */ | ||||||
|  |   function rstr2hex(input) { | ||||||
|  |     var hexTab = '0123456789abcdef' | ||||||
|  |     var output = '' | ||||||
|  |     var x | ||||||
|  |     var i | ||||||
|  |     for (i = 0; i < input.length; i += 1) { | ||||||
|  |       x = input.charCodeAt(i) | ||||||
|  |       output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f) | ||||||
|  |     } | ||||||
|  |     return output | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Encode a string as UTF-8 | ||||||
|  |    * | ||||||
|  |    * @param {string} input Input string | ||||||
|  |    * @returns {string} UTF8 string | ||||||
|  |    */ | ||||||
|  |   function str2rstrUTF8(input) { | ||||||
|  |     return unescape(encodeURIComponent(input)) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Encodes input string as raw MD5 string | ||||||
|  |    * | ||||||
|  |    * @param {string} s Input string | ||||||
|  |    * @returns {string} Raw MD5 string | ||||||
|  |    */ | ||||||
|  |   function rawMD5(s) { | ||||||
|  |     return rstrMD5(str2rstrUTF8(s)) | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * Encodes input string as Hex encoded string | ||||||
|  |    * | ||||||
|  |    * @param {string} s Input string | ||||||
|  |    * @returns {string} Hex encoded string | ||||||
|  |    */ | ||||||
|  |   function hexMD5(s) { | ||||||
|  |     return rstr2hex(rawMD5(s)) | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * Calculates the raw HMAC-MD5 for the given key and data | ||||||
|  |    * | ||||||
|  |    * @param {string} k HMAC key | ||||||
|  |    * @param {string} d Input string | ||||||
|  |    * @returns {string} Raw MD5 string | ||||||
|  |    */ | ||||||
|  |   function rawHMACMD5(k, d) { | ||||||
|  |     return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d)) | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * Calculates the Hex encoded HMAC-MD5 for the given key and data | ||||||
|  |    * | ||||||
|  |    * @param {string} k HMAC key | ||||||
|  |    * @param {string} d Input string | ||||||
|  |    * @returns {string} Raw MD5 string | ||||||
|  |    */ | ||||||
|  |   function hexHMACMD5(k, d) { | ||||||
|  |     return rstr2hex(rawHMACMD5(k, d)) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Calculates MD5 value for a given string. | ||||||
|  |    * If a key is provided, calculates the HMAC-MD5 value. | ||||||
|  |    * Returns a Hex encoded string unless the raw argument is given. | ||||||
|  |    * | ||||||
|  |    * @param {string} string Input string | ||||||
|  |    * @param {string} [key] HMAC key | ||||||
|  |    * @param {boolean} [raw] Raw output switch | ||||||
|  |    * @returns {string} MD5 output | ||||||
|  |    */ | ||||||
|  |   function md5(string, key, raw) { | ||||||
|  |     if (!key) { | ||||||
|  |       if (!raw) { | ||||||
|  |         return hexMD5(string) | ||||||
|  |       } | ||||||
|  |       return rawMD5(string) | ||||||
|  |     } | ||||||
|  |     if (!raw) { | ||||||
|  |       return hexHMACMD5(key, string) | ||||||
|  |     } | ||||||
|  |     return rawHMACMD5(key, string) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if (typeof define === 'function' && define.amd) { | ||||||
|  |     define(function() { | ||||||
|  |       return md5 | ||||||
|  |     }) | ||||||
|  |   } else if (typeof module === 'object' && module.exports) { | ||||||
|  |     module.exports = md5 | ||||||
|  |   } else { | ||||||
|  |     $.md5 = md5 | ||||||
|  |   } | ||||||
|  | })(this) | ||||||
| @@ -6,16 +6,10 @@ | |||||||
|     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||||||
|     <title>Bitwarden_rs Admin Panel</title> |     <title>Bitwarden_rs Admin Panel</title> | ||||||
|  |  | ||||||
|     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.min.css" |     <link rel="stylesheet" href="/bwrs_static/bootstrap.css" /> | ||||||
|         integrity="sha256-YLGeXaapI0/5IgZopewRJcFXomhRMlYYjugPLSyNjTY=" crossorigin="anonymous" /> |     <script src="/bwrs_static/bootstrap-native-v4.js"></script> | ||||||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" |     <script src="/bwrs_static/md5.js"></script> | ||||||
|         integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script> |     <script src="/bwrs_static/identicon.js"></script> | ||||||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.10.0/js/md5.min.js" |  | ||||||
|         integrity="sha256-J9IhvkIJb0diRVJOyu+Ndtg41RibFkF8eaA60jdjtB8=" crossorigin="anonymous"></script> |  | ||||||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/identicon.js/2.3.3/identicon.min.js" |  | ||||||
|         integrity="sha256-nYoL3nK/HA1e1pJvLwNPnpKuKG9q89VFX862r5aohmA=" crossorigin="anonymous"></script> |  | ||||||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.bundle.min.js" |  | ||||||
|         integrity="sha256-fzFFyH01cBVPYzl16KT40wqjhgPtq6FFUB6ckN2+GGw=" crossorigin="anonymous"></script> |  | ||||||
|     <style> |     <style> | ||||||
|         body { |         body { | ||||||
|             padding-top: 70px; |             padding-top: 70px; | ||||||
|   | |||||||
| @@ -91,7 +91,7 @@ | |||||||
|                                 {{#case type "password"}} |                                 {{#case type "password"}} | ||||||
|                                 <div class="input-group-append"> |                                 <div class="input-group-append"> | ||||||
|                                     <button class="btn btn-outline-secondary" type="button" |                                     <button class="btn btn-outline-secondary" type="button" | ||||||
|                                         onclick="toggleVis('#input_{{name}}');">Show/hide</button> |                                         onclick="toggleVis('input_{{name}}');">Show/hide</button> | ||||||
|                                 </div> |                                 </div> | ||||||
|                                 {{/case}} |                                 {{/case}} | ||||||
|                             </div> |                             </div> | ||||||
| @@ -138,7 +138,7 @@ | |||||||
|                                 {{#case type "password"}} |                                 {{#case type "password"}} | ||||||
|                                 <div class="input-group-append"> |                                 <div class="input-group-append"> | ||||||
|                                     <button class="btn btn-outline-secondary" type="button" |                                     <button class="btn btn-outline-secondary" type="button" | ||||||
|                                         onclick="toggleVis('#input_{{name}}');">Show/hide</button> |                                         onclick="toggleVis('input_{{name}}');">Show/hide</button> | ||||||
|                                 </div> |                                 </div> | ||||||
|                                 {{/case}} |                                 {{/case}} | ||||||
|                             </div> |                             </div> | ||||||
| @@ -191,35 +191,38 @@ | |||||||
|  |  | ||||||
| <script> | <script> | ||||||
|     function reload() { window.location.reload(); } |     function reload() { window.location.reload(); } | ||||||
|  |     function msg(text) { alert(text); reload(); } | ||||||
|     function identicon(email) { |     function identicon(email) { | ||||||
|         const data = new Identicon(md5(email), { size: 48, format: 'svg' }); |         const data = new Identicon(md5(email), { size: 48, format: 'svg' }); | ||||||
|         return "data:image/svg+xml;base64," + data.toString(); |         return "data:image/svg+xml;base64," + data.toString(); | ||||||
|     } |     } | ||||||
|     function toggleVis(input_id) { |     function toggleVis(input_id) { | ||||||
|         var type = $(input_id).attr("type"); |         const elem = document.getElementById(input_id); | ||||||
|  |         const type = elem.getAttribute("type"); | ||||||
|         if (type === "text") { |         if (type === "text") { | ||||||
|             $(input_id).attr("type", "password"); |             elem.setAttribute("type", "password"); | ||||||
|         } else { |         } else { | ||||||
|             $(input_id).attr("type", "text"); |             elem.setAttribute("type", "text"); | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     function _post(url, successMsg, errMsg, data) { |     function _post(url, successMsg, errMsg, body) { | ||||||
|         $.post({ |         fetch(url, { | ||||||
|             url: url, |             method: 'POST', | ||||||
|             data: data, |             body: body, | ||||||
|             //async: false, |             mode: "same-origin", | ||||||
|             contentType: "application/json", |             credentials: "same-origin", | ||||||
|         }).done(function () { |             headers: { "Content-Type": "application/json" } | ||||||
|             alert(successMsg); |         }).then(e => { | ||||||
|         }).fail(function (e) { |             if (e.ok) { return msg(successMsg); } | ||||||
|             const r = e.responseJSON; |             e.json().then(json => { | ||||||
|             const msg = r ? r.ErrorModel.Message : "Unknown error"; |                 const msg = json ? json.ErrorModel.Message : "Unknown error"; | ||||||
|             alert(errMsg + ": " + msg); |                 msg(errMsg + ": " + msg); | ||||||
|         }).always(reload); |             }); | ||||||
|  |         }).catch(e => { msg(errMsg + ": Unknown error") }); | ||||||
|     } |     } | ||||||
|     function deleteUser(id, mail) { |     function deleteUser(id, mail) { | ||||||
|         var input_mail = prompt("To delete user '" + mail + "', please type the name below") |         var input_mail = prompt("To delete user '" + mail + "', please type the email below") | ||||||
|         if (input_mail != null) { |         if (input_mail != null) { | ||||||
|             if (input_mail == mail) { |             if (input_mail == mail) { | ||||||
|                 _post("/admin/users/" + id + "/delete", |                 _post("/admin/users/" + id + "/delete", | ||||||
| @@ -250,9 +253,9 @@ | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     function inviteUser() { |     function inviteUser() { | ||||||
|         inv = $("#email-invite"); |         inv = document.getElementById("email-invite"); | ||||||
|         data = JSON.stringify({ "email": inv.val() }); |         data = JSON.stringify({ "email": inv.value }); | ||||||
|         inv.val(""); |         inv.value = ""; | ||||||
|         _post("/admin/invite/", "User invited correctly", |         _post("/admin/invite/", "User invited correctly", | ||||||
|             "Error inviting user", data); |             "Error inviting user", data); | ||||||
|         return false; |         return false; | ||||||
| @@ -260,15 +263,15 @@ | |||||||
|     function getFormData() { |     function getFormData() { | ||||||
|         let data = {}; |         let data = {}; | ||||||
|  |  | ||||||
|         $(".conf-checkbox").each(function (i, e) { |         document.querySelectorAll(".conf-checkbox").forEach(function (e, i) { | ||||||
|             data[e.name] = $(e).is(":checked"); |             data[e.name] = e.checked; | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         $(".conf-number").each(function (i, e) { |         document.querySelectorAll(".conf-number").forEach(function (e, i) { | ||||||
|             data[e.name] = +e.value; |             data[e.name] = e.value ? +e.value : null; | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         $(".conf-text, .conf-password").each(function (i, e) { |         document.querySelectorAll(".conf-text, .conf-password").forEach(function (e, i) { | ||||||
|             data[e.name] = e.value || null; |             data[e.name] = e.value || null; | ||||||
|         }); |         }); | ||||||
|         return data; |         return data; | ||||||
| @@ -299,19 +302,17 @@ | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     function masterCheck(check_id, inputs_query) { |     function masterCheck(check_id, inputs_query) { | ||||||
|         function toggleEnabled(check_id, inputs_query, enabled) { |         function onChanged(checkbox, inputs_query) { | ||||||
|             $(inputs_query).prop("disabled", !enabled) |             return function _fn() { | ||||||
|             if (!enabled) |                 document.querySelectorAll(inputs_query).forEach(function (e, i) { e.disabled = !checkbox.checked; }); | ||||||
|                 $(inputs_query).val(""); |                 checkbox.disabled = false; | ||||||
|             $(check_id).prop("disabled", false); |  | ||||||
|             }; |             }; | ||||||
|         function onChanged(check_id, inputs_query) { |  | ||||||
|             return function _fn() { toggleEnabled(check_id, inputs_query, this.checked); }; |  | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         toggleEnabled(check_id, inputs_query, $(check_id).is(":checked")); |         const checkbox = document.getElementById(check_id); | ||||||
|         $(check_id).change(onChanged(check_id, inputs_query)); |         const onChange = onChanged(checkbox, inputs_query); | ||||||
|  |         onChange(); // Trigger the event initially | ||||||
|  |         checkbox.addEventListener("change", onChange); | ||||||
|     } |     } | ||||||
|     let OrgTypes = { |     let OrgTypes = { | ||||||
|         "0": { "name": "Owner", "color": "orange" }, |         "0": { "name": "Owner", "color": "orange" }, | ||||||
| @@ -319,13 +320,15 @@ | |||||||
|         "2": { "name": "User", "color": "blue" }, |         "2": { "name": "User", "color": "blue" }, | ||||||
|         "3": { "name": "Manager", "color": "green" }, |         "3": { "name": "Manager", "color": "green" }, | ||||||
|     }; |     }; | ||||||
|     $(window).on('load', function () { |  | ||||||
|         $("#invite-form").submit(inviteUser); |     document.getElementById("invite-form").addEventListener("submit", inviteUser); | ||||||
|         $("#config-form").submit(saveConfig); |     document.getElementById("config-form").addEventListener("submit", saveConfig); | ||||||
|         $("img.identicon").each(function (i, e) { |  | ||||||
|  |     document.querySelectorAll("img.identicon").forEach(function (e, i) { | ||||||
|         e.src = identicon(e.dataset.src); |         e.src = identicon(e.dataset.src); | ||||||
|     }); |     }); | ||||||
|         $('[data-orgtype]').each(function (i, e) { |  | ||||||
|  |     document.querySelectorAll("[data-orgtype]").forEach(function (e, i) { | ||||||
|         let orgtype = OrgTypes[e.dataset.orgtype]; |         let orgtype = OrgTypes[e.dataset.orgtype]; | ||||||
|         e.style.backgroundColor = orgtype.color; |         e.style.backgroundColor = orgtype.color; | ||||||
|         e.title = orgtype.name; |         e.title = orgtype.name; | ||||||
| @@ -334,7 +337,6 @@ | |||||||
|     // These are formatted because otherwise the  |     // These are formatted because otherwise the  | ||||||
|     // VSCode formatter breaks But they still work |     // VSCode formatter breaks But they still work | ||||||
|     // {{#each config}} {{#if grouptoggle}} |     // {{#each config}} {{#if grouptoggle}} | ||||||
|         masterCheck("#input_{{grouptoggle}}", "#g_{{group}} input"); |     masterCheck("input_{{grouptoggle}}", "#g_{{group}} input"); | ||||||
|     // {{/if}} {{/each}} |     // {{/if}} {{/each}} | ||||||
|     }); |  | ||||||
| </script> | </script> | ||||||
		Reference in New Issue
	
	Block a user