mirror of
https://github.com/YunoHost/SSOwat.git
synced 2024-09-03 20:06:27 +02:00
Compare commits
779 commits
Author | SHA1 | Date | |
---|---|---|---|
|
4826e7aa09 | ||
|
542a87f780 | ||
|
9c8482f2f2 | ||
|
9f0ca46717 | ||
|
25eb766389 | ||
|
0b333c5829 | ||
|
e990ac5bc7 | ||
|
c8e17aad2e | ||
|
1276a2160f | ||
|
bffb2ce730 | ||
|
1058bca3ed | ||
|
dad24738e2 | ||
|
accdb66e43 | ||
|
ff3e9054be | ||
|
96725a1742 | ||
|
72968e7486 | ||
|
38a6f23f38 | ||
|
79d0e7b497 | ||
|
c68f90b83e | ||
|
85591a5744 | ||
|
429db4e2d5 | ||
|
40389a9aff | ||
|
936ae051fc | ||
|
2e2c37700b | ||
|
8554e696f3 | ||
|
09914c6c4d | ||
|
548bdbd684 | ||
|
86a4c8a3f3 | ||
|
f0829a93ab | ||
|
5828a627ec | ||
|
bedcc33fb8 | ||
|
fa8be3795e | ||
|
dbfc8ce39d | ||
|
ebe37f3e4a | ||
|
c2d020cbc0 | ||
|
beed8a5c7f | ||
|
37bdfbae4d | ||
|
a3a4543850 | ||
|
ba5ffba490 | ||
|
46b58d3695 | ||
|
8faa8057f0 | ||
|
6cb7327688 | ||
|
4e92965eda | ||
|
d85dc4f999 | ||
|
92f1e0505a | ||
|
8621a1e1a3 | ||
|
7a2d0ed27a | ||
|
e60e95f5b4 | ||
|
5e378e5c2b | ||
|
2af882a69d | ||
|
66062d75f3 | ||
|
5d0d58fab2 | ||
|
08f89e9f1f | ||
|
336ce90510 | ||
|
1f367e523f | ||
|
20eebde86e | ||
|
f0bcde67d6 | ||
|
439ccf6547 | ||
|
b95a0e82de | ||
|
c4aa499a52 | ||
|
71f68b0d4b | ||
|
8c44475d39 | ||
|
7cd4965f6c | ||
|
81160e5d95 | ||
|
e2996f1451 | ||
|
a3507203a9 | ||
|
138466d059 | ||
|
65a1b0a1b7 | ||
|
22296cf122 | ||
|
69db86caa7 | ||
|
a9e15256d3 | ||
|
ce7127bcfa | ||
|
394a56350b | ||
|
f092162404 | ||
|
1fd701b8a4 | ||
|
aa40c7cabf | ||
|
a2d04e11bb | ||
|
758eebed29 | ||
|
f681dc7d1f | ||
|
e892357f70 | ||
|
b9557ae1db | ||
|
1d0216bd30 | ||
|
15371c81b2 | ||
|
372b48e372 | ||
|
31f17e2242 | ||
|
7ed96de114 | ||
|
159568cb03 | ||
|
57746e68cc | ||
|
e824a4bcac | ||
|
db9171dc7e | ||
|
dc8884be6b | ||
|
670a5d4285 | ||
|
ddbb5199aa | ||
|
dbea4126d5 | ||
|
808a511356 | ||
|
6ad55374d5 | ||
|
2229b71f09 | ||
|
1d1a3a4e49 | ||
|
6a15594c24 | ||
|
8e0485154b | ||
|
3695336802 | ||
|
3586b23365 | ||
|
fc976cab54 | ||
|
03a7e5b0ee | ||
|
beedb9b20f | ||
|
914cb0bce6 | ||
|
7c6a95b249 | ||
|
008632e0fb | ||
|
737d686623 | ||
|
981960fb50 | ||
|
08be399a49 | ||
|
0ce337e17f | ||
|
325964742d | ||
|
0141723db0 | ||
|
0e6369bb38 | ||
|
6e4c1facaf | ||
|
222ea76da0 | ||
|
fc4fab8aa0 | ||
|
9864abf022 | ||
|
59203278f2 | ||
|
98213ebd13 | ||
|
a7c085f5db | ||
|
8e40a8df76 | ||
|
1c2974df19 | ||
|
2c384db3ad | ||
|
dc3e54bf2f | ||
|
3055d90783 | ||
|
08a4734a94 | ||
|
7548bac055 | ||
|
a133de4c5c | ||
|
96c684725b | ||
|
7a148eb4fc | ||
|
c0b398dfd0 | ||
|
f53a9959bd | ||
|
6c3b52be2a | ||
|
429a87e565 | ||
|
c827c41c1c | ||
|
017b01411d | ||
|
551398907d | ||
|
6a2a9a709a | ||
|
35ee437272 | ||
|
ec5bca1367 | ||
|
8354c57978 | ||
|
614f79f9e6 | ||
|
6e7abb0841 | ||
|
570f40fe7d | ||
|
e85a0daf8a | ||
|
028a70fb63 | ||
|
c5e94bc448 | ||
|
ff471ca512 | ||
|
063d6d5346 | ||
|
374c5f8d54 | ||
|
f057e0178f | ||
|
46aefdbbcd | ||
|
07378dfd46 | ||
|
00722e9a03 | ||
|
b28788d708 | ||
|
6fe77fbf5c | ||
|
37b2db471b | ||
|
0452fdeb68 | ||
|
4eb92f9685 | ||
|
57a33cafef | ||
|
bc1bf77d5d | ||
|
a14cdc0ced | ||
|
d933788f33 | ||
|
fabbc8d813 | ||
|
5f6877d84b | ||
|
4fd99467e8 | ||
|
4126e09385 | ||
|
cc11adafa5 | ||
|
bdbc99ca12 | ||
|
c8631c2fa8 | ||
|
c34d9fd74d | ||
|
ecaecddac5 | ||
|
8d0998bc3a | ||
|
f6ddb7af65 | ||
|
6de4b10e81 | ||
|
ca2a605dce | ||
|
89d78ab312 | ||
|
b3741580da | ||
|
92728ac6cb | ||
|
dd778cbdbc | ||
|
7718f424d2 | ||
|
38d87adbc0 | ||
|
3cac2c4ee5 | ||
|
bf74cc12a5 | ||
|
6494a66701 | ||
|
690323e185 | ||
|
27e0d765ea | ||
|
d0c8604fad | ||
|
de849184c0 | ||
|
2f39de07c8 | ||
|
1b0ea601f1 | ||
|
a07c5ea19b | ||
|
009afbcf17 | ||
|
040fc7e271 | ||
|
3cc7549a99 | ||
|
6d7449eb71 | ||
|
55ea68ee07 | ||
|
2e8c2f9c67 | ||
|
cc4cabd205 | ||
|
45e4f9de05 | ||
|
24e7755e8a | ||
|
547e15157b | ||
|
2fe893e350 | ||
|
2709a64419 | ||
|
136e4f2ba6 | ||
|
81abda2f4e | ||
|
25866ed99b | ||
|
384889ae11 | ||
|
63a9c9bada | ||
|
7c572d559a | ||
|
dfd1072b15 | ||
|
95f35d55a5 | ||
|
8a215984e4 | ||
|
6c4c1ca54d | ||
|
73c5524518 | ||
|
50db509330 | ||
|
0ff5cc6af7 | ||
|
a756462e6c | ||
|
75cecb9a7a | ||
|
0704973f59 | ||
|
1747da0571 | ||
|
fec1e4cd3b | ||
|
072e24c622 | ||
|
2ca6847d4d | ||
|
a0129b437e | ||
|
708136da46 | ||
|
c10db038a5 | ||
|
fd8055a96a | ||
|
56669d37f9 | ||
|
9141bf3f51 | ||
|
ec2d13439f | ||
|
a7cdf10ec5 | ||
|
6a7a9d668e | ||
|
229939dfbc | ||
|
721777e299 | ||
|
c72b51b717 | ||
|
c97372ee97 | ||
|
ed6fa1aa49 | ||
|
06f1f30226 | ||
|
41ed91bbcb | ||
|
dcbf66d4e4 | ||
|
a11d8f0d87 | ||
|
abc38bbffe | ||
|
b2b9b9c8e3 | ||
|
ebcd75c1f9 | ||
|
15a2211026 | ||
|
63587ad67a | ||
|
5bb7de6954 | ||
|
4ab4d684a6 | ||
|
1ca22508fc | ||
|
41ac2e5bf8 | ||
|
3f362be371 | ||
|
9a140ae0ad | ||
|
074eef4a52 | ||
|
90fdbf1564 | ||
|
1142c76a59 | ||
|
6bcf840f4d | ||
|
971cd1802c | ||
|
1dae6e8a1e | ||
|
514c416c68 | ||
|
4a17d3216a | ||
|
b5a1d8dfed | ||
|
3b056bed76 | ||
|
20de3f5f37 | ||
|
fb45cd0441 | ||
|
70c81c6b89 | ||
|
6a14e78617 | ||
|
397f7b3910 | ||
|
6a240e1dea | ||
|
720e35df4e | ||
|
24b3f7dc3a | ||
|
400f88e6ca | ||
|
0f1eea3306 | ||
|
ddef4e519d | ||
|
08a6825ea8 | ||
|
4aa22c5e1d | ||
|
54a7838a50 | ||
|
cd006fc298 | ||
|
ff77289b8a | ||
|
4d7fe3beab | ||
|
9794f2d5b9 | ||
|
728620778e | ||
|
e4b415a64e | ||
|
e0a66428ea | ||
|
01bb2abd74 | ||
|
b7624e0e1d | ||
|
4bc65fe8d4 | ||
|
09e0fa37aa | ||
|
c72454c9d6 | ||
|
6ee3486783 | ||
|
2f991d84ca | ||
|
352de0a0fd | ||
|
9bd1cbc74b | ||
|
fb910facec | ||
|
286eb771a7 | ||
|
0fc89d0fc9 | ||
|
d8c74604c0 | ||
|
0b9f50246c | ||
|
0e2bfacabc | ||
|
8cc2bd4b28 | ||
|
ef3d6af9e0 | ||
|
b1080c1e1a | ||
|
2298a177c2 | ||
|
9844703c0e | ||
|
77afe5cf09 | ||
|
4f692c99d8 | ||
|
ac4974d2d2 | ||
|
ca1ae6710d | ||
|
c37db1928a | ||
|
8a9b24a424 | ||
|
eb2872d5ed | ||
|
bf0dc73381 | ||
|
97620aaac7 | ||
|
af892991af | ||
|
9628d51d2d | ||
|
f74619020d | ||
|
02b4ecec8c | ||
|
12412cc6c8 | ||
|
19ae10200d | ||
|
972d858959 | ||
|
527f392a9a | ||
|
e16cc2a745 | ||
|
77c6634da3 | ||
|
9d17c9001c | ||
|
d713d3bc47 | ||
|
995f395250 | ||
|
c1c40f809d | ||
|
61fec4d1b8 | ||
|
ff3f2bfdf2 | ||
|
9c98d7eb0d | ||
|
bc3bb1f318 | ||
|
62aaa2e715 | ||
|
72d382d81b | ||
|
5cc6620292 | ||
|
9282bebcdd | ||
|
6648411e4b | ||
|
f3ed6e5828 | ||
|
3ba5cac9a0 | ||
|
c4f519ba9c | ||
|
d85579de93 | ||
|
247847a203 | ||
|
927edc1c5f | ||
|
bc9aacd038 | ||
|
4643b75e74 | ||
|
5ba7050fd4 | ||
|
5a5fa2e940 | ||
|
ff700062a5 | ||
|
a13a2fee1e | ||
|
f8b895ab00 | ||
|
315bf5a978 | ||
|
e6fad6341f | ||
|
bdf678d725 | ||
|
d71075dfed | ||
|
1eb322df17 | ||
|
67a06135c8 | ||
|
85ee4879dc | ||
|
29ae8abc3a | ||
|
1a6641b2e9 | ||
|
ee67b6f728 | ||
|
b923d96752 | ||
|
474b922089 | ||
|
7cb61f1619 | ||
|
07e8a292f9 | ||
|
68c030a840 | ||
|
bc93eafd4a | ||
|
d40bfe438f | ||
|
1161367d0e | ||
|
1159322c35 | ||
|
3a3d0e95da | ||
|
5428b7fd4b | ||
|
c4ec12116a | ||
|
8abd9ce94d | ||
|
0c55f38fda | ||
|
360049f9a7 | ||
|
5c8f34d835 | ||
|
5fdaf74059 | ||
|
3a8a1bdaec | ||
|
d17f69f70a | ||
|
ad31e5c80f | ||
|
8100c57da6 | ||
|
bbc5b4e633 | ||
|
b0756e2494 | ||
|
d3e2999527 | ||
|
6670ffef65 | ||
|
a256762ae7 | ||
|
295a870912 | ||
|
520ac54d69 | ||
|
bcfee96249 | ||
|
37234b9279 | ||
|
2fcbbcb954 | ||
|
95ae0607d5 | ||
|
d76133504a | ||
|
339a3a5d65 | ||
|
9cbc50010b | ||
|
67221d5c40 | ||
|
1bd85ad506 | ||
|
28c0d001ce | ||
|
6f472dcb35 | ||
|
e9caa88504 | ||
|
4cbd063dab | ||
|
f815856a7f | ||
|
a194168b84 | ||
|
5b5bd2ef6c | ||
|
4c2a9da784 | ||
|
7396d099e6 | ||
|
13257e4de0 | ||
|
1a12c37eca | ||
|
4da84b0e30 | ||
|
4b97eb7c66 | ||
|
fc688418ce | ||
|
80f0733467 | ||
|
ce38f0aba0 | ||
|
32a9229ef4 | ||
|
23e78c2c39 | ||
|
fc6ef6bb49 | ||
|
94789bbd6e | ||
|
5123015613 | ||
|
b28d4ee5d7 | ||
|
36fd40fa91 | ||
|
0c377c3363 | ||
|
8e4da5af99 | ||
|
749c5c3925 | ||
|
67e253211c | ||
|
8ab98d3ed2 | ||
|
15b71ac5a0 | ||
|
016953f632 | ||
|
3c4d70b9ca | ||
|
5ded298e71 | ||
|
1b63d693f8 | ||
|
d47a216095 | ||
|
9be3fccbc3 | ||
|
d731ec5bd7 | ||
|
6a4bc62ef1 | ||
|
888030bb99 | ||
|
7036dd4673 | ||
|
c5ffdfdfb5 | ||
|
710c6ac6ab | ||
|
4e60f3b8a1 | ||
|
328c0b73f0 | ||
|
70e27e53a1 | ||
|
a39f8fa33d | ||
|
b054b262b5 | ||
|
11eae3314d | ||
|
39d4673d68 | ||
|
4b223b3d7b | ||
|
a361cf7910 | ||
|
cf5489c83d | ||
|
3537e0840c | ||
|
acfcabd727 | ||
|
5701322694 | ||
|
54d073975f | ||
|
d2d8fe6155 | ||
|
9845d99398 | ||
|
1eff5b7c23 | ||
|
afdc7cc73c | ||
|
91cca157c8 | ||
|
32323b4980 | ||
|
2f24e82f38 | ||
|
ac3dc39f9a | ||
|
3385732263 | ||
|
ad27933f54 | ||
|
d521d87d23 | ||
|
a19c198cd3 | ||
|
b3bdb9e30b | ||
|
7bc43392ce | ||
|
46b4903456 | ||
|
85d59c5e77 | ||
|
2646db9ea2 | ||
|
7fa5b91297 | ||
|
c62471703b | ||
|
7734d248c5 | ||
|
63846817c0 | ||
|
a80b4bdff1 | ||
|
c05e5ea7eb | ||
|
140eb042d9 | ||
|
5478ea7bcf | ||
|
40e78b6b0a | ||
|
356a53de52 | ||
|
ca0951e476 | ||
|
2bdc12b0a0 | ||
|
a84fbb55c8 | ||
|
e9b03188fd | ||
|
d33cd97556 | ||
|
23af640c8c | ||
|
3d7e606f1a | ||
|
94e15d9fe6 | ||
|
5bd4de4bfa | ||
|
d83c34bbcf | ||
|
53a738eae6 | ||
|
cb6a827157 | ||
|
f8ab0ba65f | ||
|
441f323094 | ||
|
e7a131063e | ||
|
dc007e7c3d | ||
|
b5ce673840 | ||
|
a52ed73a11 | ||
|
437f3c238a | ||
|
32d04dbac9 | ||
|
aa972625fa | ||
|
c272b4cffd | ||
|
7dc84973df | ||
|
c3a9380361 | ||
|
96d304124e | ||
|
253cde4b9a | ||
|
61035e3c27 | ||
|
b17439eb33 | ||
|
9a4df70932 | ||
|
7be6e76cb8 | ||
|
2699aa8db7 | ||
|
5f21d3f630 | ||
|
4d143f6d84 | ||
|
4a01420239 | ||
|
4ead78b127 | ||
|
08c2401bf5 | ||
|
17ec2bdf9c | ||
|
16e57f4ef0 | ||
|
2ff41d9920 | ||
|
b68ebc04c7 | ||
|
99c108f362 | ||
|
cb96f848d3 | ||
|
d305f6e919 | ||
|
3ad215124c | ||
|
90998555f0 | ||
|
11d0e0689a | ||
|
669feba0e4 | ||
|
ba2773b127 | ||
|
4dd22c87d8 | ||
|
4b85679471 | ||
|
c6ec5beed5 | ||
|
e5103c5298 | ||
|
8e4a7ba80e | ||
|
e4ee83cc8e | ||
|
deeb30637e | ||
|
410ba2e4a7 | ||
|
3e94b09d3b | ||
|
7627101eb5 | ||
|
349d486cec | ||
|
d83b522d50 | ||
|
945b04cc67 | ||
|
95e1c1cd2f | ||
|
ab8b040174 | ||
|
07c3db2c46 | ||
|
6e1e1e10ff | ||
|
a81e783aac | ||
|
7282dee0bb | ||
|
ddfe58eed6 | ||
|
4148bfb7fb | ||
|
7f3a4a3a44 | ||
|
1e4cb1868e | ||
|
b90153a5ca | ||
|
9cbe43862b | ||
|
c354571337 | ||
|
d9b9a497fd | ||
|
d3b267107f | ||
|
39af52562c | ||
|
d45f34eadd | ||
|
60411de493 | ||
|
f2ee9fede9 | ||
|
13c1625fa5 | ||
|
22c1adc03c | ||
|
8a98e38110 | ||
|
dee85631ab | ||
|
a5ba75a6c4 | ||
|
daa535a41b | ||
|
e0ac6f9e63 | ||
|
0d9f43967e | ||
|
23eb2fc3e4 | ||
|
09432a3c99 | ||
|
a41b76c251 | ||
|
fe267ba93d | ||
|
86adca76fe | ||
|
d27d731e4d | ||
|
219b278673 | ||
|
99e7f29f67 | ||
|
710128b711 | ||
|
43cbf11f10 | ||
|
ffcf553182 | ||
|
4a8ad06025 | ||
|
30ff28d1de | ||
|
cc1a279df9 | ||
|
426df8205c | ||
|
7493cce2d4 | ||
|
72f1682b71 | ||
|
8f669e9fe9 | ||
|
0ccfe6ee5a | ||
|
3996f8000e | ||
|
c28cb0000e | ||
|
8ff784ca4b | ||
|
8c900e4a9a | ||
|
1694139358 | ||
|
d38d5e3d29 | ||
|
1bf64408c9 | ||
|
db9059a55c | ||
|
6b6fd09f34 | ||
|
daa799111e | ||
|
c24a5ecd20 | ||
|
41c8997255 | ||
|
227ef2a6fc | ||
|
87dbee3e8d | ||
|
0e47b1f0a1 | ||
|
9b7fee7a1b | ||
|
98b1b53fbf | ||
|
d440d06ae7 | ||
|
c8c7fe7fc7 | ||
|
37938fd0f4 | ||
|
d16f3f81d0 | ||
|
2ff2fb92f3 | ||
|
97df24e794 | ||
|
47f01b3f6f | ||
|
044aa1d8eb | ||
|
3ecdb97bf6 | ||
|
a4445a862b | ||
|
c7bc762ea3 | ||
|
50fcc831bf | ||
|
aca5f054ab | ||
|
c1a388ccf0 | ||
|
5157415ce3 | ||
|
76677fab0d | ||
|
37c0980155 | ||
|
d105b28ccf | ||
|
25ce273120 | ||
|
fc52f05459 | ||
|
98a6879ab4 | ||
|
2456eda200 | ||
|
96b077fe02 | ||
|
c5bb6ef2ae | ||
|
054b7d1752 | ||
|
ad39e3ded5 | ||
|
46b6d1048e | ||
|
737ebba474 | ||
|
c019f9d208 | ||
|
442147bbbe | ||
|
2a648b8475 | ||
|
4450ba8f95 | ||
|
d0709ff1f3 | ||
|
5228bf4f0c | ||
|
3a04c42ae6 | ||
|
eba9c6ede2 | ||
|
d7ed67a586 | ||
|
ad274017d9 | ||
|
25eeff041d | ||
|
b1a1d55e66 | ||
|
edb1ea079c | ||
|
f68c7f9e44 | ||
|
ee971b453d | ||
|
16923ffc95 | ||
|
a6911d9037 | ||
|
9956a7c1c1 | ||
|
e6631df5b1 | ||
|
773d7a2830 | ||
|
2a8bf7c0a3 | ||
|
514f8d3d41 | ||
|
fff95314ce | ||
|
6bd8eb1a90 | ||
|
2eb38d3eaa | ||
|
a2af42144b | ||
|
fb99ee2177 | ||
|
1faf47e6b2 | ||
|
fd3338de99 | ||
|
0823062e30 | ||
|
e7b39d4d29 | ||
|
01e2b20e02 | ||
|
f3b64d3e50 | ||
|
a3a68ec8f8 | ||
|
47c9f1715a | ||
|
e539275f6d | ||
|
f659359d6d | ||
|
ee1ed686ca | ||
|
3936d73921 | ||
|
72b811a676 | ||
|
70f413af6b | ||
|
366dd6c443 | ||
|
c9f16d0014 | ||
|
eaaf1983a5 | ||
|
3751a0308f | ||
|
06c77ab799 | ||
|
09625b249b | ||
|
833937f33d | ||
|
7be93fc95c | ||
|
4933ad9ce0 | ||
|
cdce27fc5d | ||
|
edccfe992f | ||
|
1d02ee215a | ||
|
32ebe0d4cd | ||
|
b9c6fb976a | ||
|
908269bed7 | ||
|
bf24cf5e50 | ||
|
af53f4d393 | ||
|
3b2bc73df5 | ||
|
648b552297 | ||
|
1bceee6d64 | ||
|
764ff02139 | ||
|
cad882b08f | ||
|
a993c4b6a2 | ||
|
9dec95e233 | ||
|
4f2ef58530 | ||
|
b8cacc4cf5 | ||
|
1e9087b644 | ||
|
63fc1a3edb | ||
|
c61521e880 | ||
|
d88dce3d3c | ||
|
05c7f8f47c | ||
|
c8b6d1b9ac | ||
|
f9a9472179 | ||
|
5e41010458 | ||
|
c9b267f2d7 | ||
|
de4f560111 | ||
|
0391ff7707 | ||
|
df9e179ef1 | ||
|
afcd4691a3 | ||
|
a46be28b53 | ||
|
cd85f6b740 | ||
|
57f0a4c005 | ||
|
404fe510d2 | ||
|
d39f7d2b78 | ||
|
8ee3d6b93d | ||
|
e15c15812c | ||
|
f895e02986 | ||
|
0ebddc079a | ||
|
71e9ff1f68 | ||
|
84f32c4685 | ||
|
294b1d6058 | ||
|
89c813abe7 | ||
|
8953860017 | ||
|
f5bd2dcc2b | ||
|
bfd3cfdcab | ||
|
a87fb6c06e | ||
|
cd41a7c35a | ||
|
e96bb3e8d8 | ||
|
b9b6d09769 | ||
|
06be1fa65a | ||
|
1d44e53f7b | ||
|
5cc42fdcd2 | ||
|
cf78b8929d | ||
|
667484b326 | ||
|
32b730c11f | ||
|
a0163f9f39 | ||
|
2a9769f7d9 | ||
|
7a86897579 | ||
|
9a5ba3acfa | ||
|
28e0bc2a6a | ||
|
35e69a1bf2 | ||
|
84015149b9 | ||
|
7199430c87 | ||
|
3fbb7d6d0e | ||
|
8a0c1e4945 | ||
|
72e686bad6 | ||
|
83718fd05e | ||
|
48983a6e68 | ||
|
b59376814e | ||
|
696f09c8c2 | ||
|
d809c8de6a | ||
|
7f32fed667 | ||
|
c932716470 | ||
|
78934091b5 | ||
|
edd3e030f4 | ||
|
57f4dcdf97 | ||
|
d361f0e6bb | ||
|
866d51be14 | ||
|
bdeff813e5 | ||
|
a488d53e96 | ||
|
1327d6d090 | ||
|
73e8be4611 | ||
|
5852851c86 | ||
|
44d5f525b8 | ||
|
af65559ef1 | ||
|
7d0c71ef80 | ||
|
3b4d50fbd9 | ||
|
2e1117beff | ||
|
f32f278105 | ||
|
565f1e053d | ||
|
8eba1864a6 | ||
|
8f07aeade5 | ||
|
808b825be0 | ||
|
92fdca3a3d | ||
|
b2bcb48a37 | ||
|
3fe0a05ed6 |
108 changed files with 8179 additions and 3432 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1 +0,0 @@
|
|||
*.swp
|
59
CONTRIBUTORS.md
Normal file
59
CONTRIBUTORS.md
Normal file
|
@ -0,0 +1,59 @@
|
|||
SSOwat contributors
|
||||
===================
|
||||
|
||||
YunoHost is built and maintained by the YunoHost project community.
|
||||
Everyone is encouraged to submit issues and changes, and to contribute in other ways -- see https://yunohost.org/contribute to find out how.
|
||||
|
||||
--
|
||||
|
||||
SSOwat was initially built by Kload, for YunoHost v2.
|
||||
|
||||
Design was created by Théodore 'Tozz' Faure and Thomas 'Courgette' Lebeau and implemented by Courgette himself.
|
||||
|
||||
Most of code was written by Kload and opi, with help of numerous contributors.
|
||||
|
||||
Translation is made by a bunch of lovely people over the world.
|
||||
|
||||
We would like to thank anyone who ever helped the YunoHost project, and especially the SSOwat project <3
|
||||
|
||||
|
||||
SSOwat Contributors
|
||||
-------------------
|
||||
|
||||
- Kload
|
||||
- opi
|
||||
- Jérôme Lebleu
|
||||
- Maniack Crudelis
|
||||
- Julien 'ju' Malik
|
||||
- M5oul
|
||||
- Alexander Chalikiopoulos
|
||||
- Adrien 'Beudbeud' Beudin
|
||||
- Hnk Reno
|
||||
- Laurent 'Bram' Peuch
|
||||
- Loïc 'dzamlo' Damien
|
||||
- sidddy
|
||||
|
||||
|
||||
SSOwat Translators
|
||||
------------------
|
||||
|
||||
### French
|
||||
|
||||
- Jean-Baptiste Holcroft
|
||||
|
||||
### German
|
||||
|
||||
- Felix Bartels
|
||||
|
||||
### Hindi
|
||||
|
||||
- Anmol
|
||||
|
||||
### Portuguese
|
||||
|
||||
- Deleted User
|
||||
- Trollken
|
||||
|
||||
### Spanish
|
||||
|
||||
- Juanu
|
661
LICENSE
Normal file
661
LICENSE
Normal file
|
@ -0,0 +1,661 @@
|
|||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published
|
||||
by the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
214
README.md
214
README.md
|
@ -1,19 +1,34 @@
|
|||
SSOwat
|
||||
======
|
||||
|
||||
A simple LDAP SSO for nginx, written in Lua
|
||||
A simple LDAP SSO for NGINX, written in Lua.
|
||||
|
||||
<a href="https://translate.yunohost.org/engage/yunohost/?utm_source=widget">
|
||||
<img src="https://translate.yunohost.org/widgets/yunohost/-/287x66-white.png" alt="Translation status" />
|
||||
</a>
|
||||
|
||||
Issues
|
||||
------
|
||||
|
||||
- [Please report issues to the YunoHost bugtracker](https://github.com/YunoHost/issues).
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
- Nginx-extras from Debian wheezy-backports
|
||||
- lua-json
|
||||
- lua-ldap
|
||||
- `nginx-extras` from Debian wheezy-backports
|
||||
- `lua-json`
|
||||
- `lua-ldap`
|
||||
- `lua-filesystem`
|
||||
- `lua-socket`
|
||||
- `lua-rex-pcre`
|
||||
|
||||
**OR**
|
||||
|
||||
- Nginx "Openresty" flavored : http://openresty.org/
|
||||
- lua-ldap
|
||||
- "OpenResty" flavored NGINX: https://openresty.org/
|
||||
- `lua-ldap`
|
||||
- `lua-filesystem`
|
||||
- `lua-socket`
|
||||
- `lua-rex-pcre`
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
@ -21,14 +36,14 @@ Installation
|
|||
* Fetch the repository
|
||||
|
||||
```bash
|
||||
git clone https://github.com/Kloadut/SSOwat /etc/ssowat
|
||||
git clone https://github.com/YunoHost/SSOwat /etc/ssowat
|
||||
```
|
||||
|
||||
|
||||
Nginx configuration
|
||||
NGINX configuration
|
||||
-------------------
|
||||
|
||||
* Add SSOwat's Nginx configuration (`http{}` scope)
|
||||
* Add SSOwat's NGINX configuration (`http{}` scope)
|
||||
|
||||
```bash
|
||||
nano /etc/nginx/conf.d/ssowat.conf
|
||||
|
@ -49,6 +64,7 @@ SSOwat configuration
|
|||
--------------------
|
||||
|
||||
```
|
||||
mv /etc/ssowat/conf.json.example /etc/ssowat/conf.json
|
||||
nano /etc/ssowat/conf.json
|
||||
```
|
||||
|
||||
|
@ -56,100 +72,180 @@ If you use YunoHost, you may want to edit the `/etc/ssowat/conf.json.persistent`
|
|||
|
||||
## Available parameters
|
||||
|
||||
These are the SSOwat's configuration parameters. Only the first one is required, but it is recommended to know the others to fully understand what you can do with SSOwat.
|
||||
Only the `portal_domain` SSOwat configuration parameters is required, but it is recommended to know the others to fully understand what you can do with it.
|
||||
|
||||
#### portal_domain
|
||||
---------------
|
||||
|
||||
Domain of the authentication portal. It has to be a domain, IP addresses will not work with SSOwat (**Required**)
|
||||
### portal_domain
|
||||
|
||||
#### portal_path
|
||||
Domain of the authentication portal. It has to be a domain, IP addresses will not work with SSOwat (**Required**).
|
||||
|
||||
URI of the authentication portal (**default**: `/ssowat`)
|
||||
---------------
|
||||
|
||||
#### portal_port
|
||||
### portal_path
|
||||
|
||||
Web port of the authentication portal (**default**: `443`)
|
||||
URI of the authentication portal (**default**: `/ssowat/`). This path **must** end with “`/`”.
|
||||
|
||||
#### portal_scheme
|
||||
---------------
|
||||
|
||||
Whether authentication should use secure connection or not (**default**: `https`)
|
||||
### portal_port
|
||||
|
||||
#### domains
|
||||
Web port of the authentication portal (**default**: `443` for `https`, `80` for `http`).
|
||||
|
||||
List of handle domains (**default**: similar to `portal_domain`)
|
||||
---------------
|
||||
|
||||
#### ldap_host
|
||||
### portal_scheme
|
||||
|
||||
LDAP server hostname (**default**: `localhost`)
|
||||
Whether authentication should use secure connection or not (**default**: `https`).
|
||||
|
||||
#### ldap_group
|
||||
---------------
|
||||
|
||||
LDAP group to search in (**default**: `ou=users,dc=yunohost,dc=org`)
|
||||
### domains
|
||||
|
||||
#### ldap_identifier
|
||||
List of handled domains (**default**: similar to `portal_domain`).
|
||||
|
||||
LDAP user identifier (**default**: `uid`)
|
||||
---------------
|
||||
|
||||
#### ldap_attributes
|
||||
### ldap_host
|
||||
|
||||
User's attributes to fetch from LDAP (**default**: `["uid", "givenname", "sn", "cn", "homedirectory", "mail", "maildrop"]`)
|
||||
LDAP server hostname (**default**: `localhost`).
|
||||
|
||||
#### allow_mail_authentication
|
||||
---------------
|
||||
|
||||
Whether users can authenticate with their mail address (**default**: `true`)
|
||||
### ldap_group
|
||||
|
||||
#### login_arg
|
||||
LDAP group to search in (**default**: `ou=users,dc=yunohost,dc=org`).
|
||||
|
||||
URI argument to use for cross-domain authentication (**default**: `sso_login`)
|
||||
---------------
|
||||
|
||||
#### additional_headers
|
||||
### ldap_identifier
|
||||
|
||||
Array of additionnal HTTP headers to set once user is authenticated (**default**: `{ "Remote-User": "uid" }`)
|
||||
LDAP user identifier (**default**: `uid`).
|
||||
|
||||
#### session_timeout
|
||||
---------------
|
||||
|
||||
The session expiracy time limit in seconds, since the last connection (**default**: `86400` / one day)
|
||||
### ldap_attributes
|
||||
|
||||
#### session_max_timeout
|
||||
User's attributes to fetch from LDAP (**default**: `["uid", "givenname", "sn", "cn", "homedirectory", "mail", "maildrop"]`).
|
||||
|
||||
The session expiracy time limit in seconds (**default**: `604800` / one week)
|
||||
---------------
|
||||
|
||||
#### protected_urls
|
||||
### ldap_enforce_crypt
|
||||
|
||||
List of priorily protected URLs and/or URIs (**by default, every URL is protected**)
|
||||
Let SSOwat re-encrypt weakly-encrypted LDAP passwords into the safer sha-512 (crypt) (**default**: `true`).
|
||||
|
||||
#### protected_regex
|
||||
---------------
|
||||
|
||||
List of regular expressions to be matched against URLs **and** URIs to protect them
|
||||
### allow_mail_authentication
|
||||
|
||||
#### skipped_urls
|
||||
Whether users can authenticate with their mail address (**default**: `true`).
|
||||
|
||||
List of URLs and/or URIs that will not be affected by SSOwat
|
||||
---------------
|
||||
|
||||
#### skipped_regex
|
||||
### login_arg
|
||||
|
||||
List of regular expressions to be matched against URLs **and** URIs to ignore them
|
||||
URI argument to use for cross-domain authentication (**default**: `sso_login`).
|
||||
|
||||
#### unprotected_urls
|
||||
---------------
|
||||
|
||||
List of URLs and/or URIs that will not be affected by SSOwat **unless user is authenticated**
|
||||
### additional_headers
|
||||
|
||||
#### unprotected_regex
|
||||
Array of additionnal HTTP headers to set once user is authenticated (**default**: `{ "Remote-User": "uid" }`).
|
||||
|
||||
List of regular expressions to be matched against URLs **and** URIs to ignore them **unless user is authenticated**
|
||||
---------------
|
||||
|
||||
#### redirected_urls
|
||||
### session_timeout
|
||||
|
||||
Array of URLs and/or URIs to redirect and their redirect URI/URL (**example**: `{ "/", "example.org/subpath" }`)
|
||||
The session expiracy time limit in seconds, since the last connection (**default**: `86400` / one day).
|
||||
|
||||
#### redirected_regex
|
||||
---------------
|
||||
|
||||
Array of regular expressions to be matched against URLS **and** URIs and their redirect URI/URL (**example**: `{ "example.org/megusta$", "example.org/subpath" }`)
|
||||
### session_max_timeout
|
||||
|
||||
The session expiracy time limit in seconds (**default**: `604800` / one week).
|
||||
|
||||
---------------
|
||||
|
||||
### redirected_urls
|
||||
|
||||
Array of URLs and/or URIs to redirect and their redirect URI/URL (**example**: `{ "/": "example.org/subpath" }`).
|
||||
|
||||
---------------
|
||||
|
||||
### redirected_regex
|
||||
|
||||
Array of regular expressions to be matched against URLs **and** URIs and their redirect URI/URL (**example**: `{ "example.org/megusta$": "example.org/subpath" }`).
|
||||
|
||||
---------------
|
||||
|
||||
### default_language
|
||||
|
||||
Language code used by default in views (**default**: `en`).
|
||||
|
||||
---------------
|
||||
|
||||
### permissions
|
||||
|
||||
The list of permissions depicted as follows:
|
||||
|
||||
```json
|
||||
"myapp.main": {
|
||||
"auth_header": true,
|
||||
"label": "MyApp",
|
||||
"public": true,
|
||||
"show_tile": true,
|
||||
"uris": [
|
||||
"example.tld/myapp"
|
||||
],
|
||||
"users": [
|
||||
"JaneDoe",
|
||||
"JohnDoe"
|
||||
]
|
||||
},
|
||||
"myapp.admin": {
|
||||
"auth_header": true,
|
||||
"label": "MyApp (admin)",
|
||||
"public": false,
|
||||
"show_tile": false,
|
||||
"uris": [
|
||||
"example.tld/myapp/admin"
|
||||
],
|
||||
"users": [
|
||||
"JaneDoe"
|
||||
]
|
||||
},
|
||||
"myapp.api": {
|
||||
"auth_header": false,
|
||||
"label": "MyApp (api)",
|
||||
"public": true,
|
||||
"show_tile": false,
|
||||
"uris": [
|
||||
"re:domain%.tld/%.well%-known/.*"
|
||||
],
|
||||
"users": []
|
||||
}
|
||||
```
|
||||
|
||||
#### auth_header
|
||||
|
||||
Does the SSO add an authentication header that allows certain apps to connect automatically? (**True by default**)
|
||||
|
||||
#### label
|
||||
|
||||
A user-friendly name displayed in the portal and in the administration panel to manage permission. (**By convention it is of the form: Name of the app (specificity of this permission)**)
|
||||
|
||||
#### public
|
||||
|
||||
Can a person who is not connected to the SSO have access to this authorization?
|
||||
|
||||
#### show_tile
|
||||
|
||||
Display or not the tile in the user portal.
|
||||
|
||||
#### uris
|
||||
|
||||
A list of url attatched to this permission, a regex url start with `re:`.
|
||||
|
||||
#### users
|
||||
|
||||
2-level array containing usernames and their allowed URLs along with an App name (**example**: `{ "kload": { "kload.fr/myapp/": "My App" } }`)
|
||||
|
||||
#### default_language
|
||||
|
||||
Language code used by default in views (**default**: `en`)
|
||||
A list of users which is allowed to access to this permission. If `public`.
|
||||
|
|
1057
access.lua
1057
access.lua
File diff suppressed because it is too large
Load diff
30
conf.json
30
conf.json
|
@ -1,30 +0,0 @@
|
|||
{
|
||||
"portal_scheme": "https",
|
||||
"portal_domain": "mydomain.com",
|
||||
"portal_path": "/ssowat/",
|
||||
"domains": [
|
||||
"mydomain.com",
|
||||
"myotherdomain.com"
|
||||
],
|
||||
"skipped_urls": [
|
||||
"mydomain.com/megusta",
|
||||
"myotherdomain.com/somuchwin"
|
||||
],
|
||||
"unprotected_urls": ["mydomain.com/yunoprotect"],
|
||||
"additional_headers": {
|
||||
"Auth-User": "uid",
|
||||
"Remote-User": "uid",
|
||||
"Email": "mail",
|
||||
"Name": "cn"
|
||||
},
|
||||
"users": {
|
||||
"myuser": {
|
||||
"mydomain.com/myapp": "My App",
|
||||
"mydomain.com/myapp2": "My second App"
|
||||
},
|
||||
"myuser2": {
|
||||
"myotherdomain.com/myapp": "My other domain App",
|
||||
"mydomain.com/myapp2": "My second App"
|
||||
}
|
||||
}
|
||||
}
|
69
conf.json.example
Normal file
69
conf.json.example
Normal file
|
@ -0,0 +1,69 @@
|
|||
{
|
||||
"additional_headers": {
|
||||
"Auth-User": "uid",
|
||||
"Email": "mail",
|
||||
"Name": "cn",
|
||||
"Remote-User": "uid"
|
||||
},
|
||||
"domains": [
|
||||
"example.tld",
|
||||
"example.org"
|
||||
],
|
||||
"permissions": {
|
||||
"core_skipped": {
|
||||
"auth_header": false,
|
||||
"label": "Core permissions - skipped",
|
||||
"public": true,
|
||||
"show_tile": false,
|
||||
"uris": [
|
||||
"example.tld/yunohost/admin",
|
||||
"example.tld/yunohost/api",
|
||||
"re:^[^/]*/%.well%-known/ynh%-diagnosis/.*$",
|
||||
"re:^[^/]*/%.well%-known/acme%-challenge/.*$",
|
||||
"re:^[^/]*/%.well%-known/autoconfig/mail/config%-v1%.1%.xml.*$"
|
||||
],
|
||||
"users": []
|
||||
},
|
||||
"myapp.admin": {
|
||||
"auth_header": true,
|
||||
"label": "MyApp (admin)",
|
||||
"public": false,
|
||||
"show_tile": false,
|
||||
"uris": [
|
||||
"example.tld/myapp/admin"
|
||||
],
|
||||
"users": [
|
||||
"JaneDoe"
|
||||
]
|
||||
},
|
||||
"myapp.api": {
|
||||
"auth_header": false,
|
||||
"label": "MyApp (api)",
|
||||
"public": true,
|
||||
"show_tile": false,
|
||||
"uris": [
|
||||
"re:domain%.tld/%.well%-known/.*"
|
||||
],
|
||||
"users": []
|
||||
},
|
||||
"myapp.main": {
|
||||
"auth_header": true,
|
||||
"label": "MyApp",
|
||||
"public": true,
|
||||
"show_tile": true,
|
||||
"uris": [
|
||||
"example.tld/myapp"
|
||||
],
|
||||
"users": [
|
||||
"JaneDoe",
|
||||
"JohnDoe"
|
||||
]
|
||||
}
|
||||
},
|
||||
"portal_domain": "example.tld",
|
||||
"portal_path": "/yunohost/sso/",
|
||||
"redirected_regex": {
|
||||
"example.tld/yunohost[\\/]?$": "https://example.tld/yunohost/sso/"
|
||||
},
|
||||
"redirected_urls": {}
|
||||
}
|
132
config.lua
Normal file
132
config.lua
Normal file
|
@ -0,0 +1,132 @@
|
|||
--
|
||||
-- config.lua
|
||||
--
|
||||
-- This file loads the configuration from config files or default values.
|
||||
--
|
||||
|
||||
module('config', package.seeall)
|
||||
|
||||
local config_attributes = nil
|
||||
local config_persistent_attributes = nil
|
||||
|
||||
local conf = {}
|
||||
|
||||
function compare_attributes(file_attributes1, file_attributes2)
|
||||
if file_attributes1 == nil and file_attributes2 == nil then
|
||||
return true
|
||||
elseif file_attributes1 == nil and file_attributes2 ~= nil or file_attributes1 ~= nil and file_attributes2 == nil then
|
||||
return false
|
||||
end
|
||||
return file_attributes1["modification"] == file_attributes2["modification"] and file_attributes1["size"] == file_attributes2["size"]
|
||||
end
|
||||
|
||||
function update_language()
|
||||
-- Set the prefered language from the `Accept-Language` header
|
||||
conf.lang = ngx.req.get_headers()["Accept-Language"]
|
||||
|
||||
if conf.lang then
|
||||
conf.lang = string.sub(conf.lang, 1, 2)
|
||||
end
|
||||
end
|
||||
|
||||
function get_config()
|
||||
|
||||
-- Get config files attributes (timestamp modification and size)
|
||||
local new_config_attributes = lfs.attributes(conf_path, {"modification", "size"})
|
||||
local new_config_persistent_attributes = lfs.attributes(conf_path..".persistent", {"modification", "size"})
|
||||
|
||||
if compare_attributes(new_config_attributes, config_attributes) and compare_attributes(new_config_persistent_attributes, config_persistent_attributes) then
|
||||
update_language()
|
||||
return conf
|
||||
-- If the file is being written, its size may be 0 and reloading fails, return the last valid config
|
||||
elseif new_config_attributes == nil or new_config_attributes["size"] == 0 then
|
||||
update_language()
|
||||
return conf
|
||||
end
|
||||
|
||||
-- If the timestamp of the modification or the size is different, reload the configuration.
|
||||
config_attributes = new_config_attributes
|
||||
config_persistent_attributes = new_config_persistent_attributes
|
||||
|
||||
local conf_file = assert(io.open(conf_path, "r"), "Configuration file is missing")
|
||||
conf = json.decode(conf_file:read("*all"))
|
||||
conf_file:close()
|
||||
|
||||
-- Load additional rules from the `.persistent` configuration file.
|
||||
-- The `.persistent` file contains rules that will overwrite previous rules.
|
||||
-- It typically enables you to set custom rules.
|
||||
local persistent_conf_file = io.open(conf_path..".persistent", "r")
|
||||
if persistent_conf_file ~= nil then
|
||||
perm_conf = json.decode(persistent_conf_file:read("*all"))
|
||||
persistent_conf_file:close()
|
||||
for k, v in pairs(perm_conf) do
|
||||
|
||||
-- If the configuration key already exists and is a table, merge it
|
||||
if conf[k] and type(v) == "table" then
|
||||
for subk, subv in pairs(v) do
|
||||
if type(subk) == "number" then
|
||||
table.insert(conf[k], subv)
|
||||
else
|
||||
conf[k][subk] = subv
|
||||
end
|
||||
end
|
||||
|
||||
-- Else just take the persistent rule's value
|
||||
else
|
||||
conf[k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- Default configuration values
|
||||
default_conf = {
|
||||
portal_scheme = "https",
|
||||
portal_path = "/ssowat/",
|
||||
local_portal_domain = "yunohost.local",
|
||||
domains = { conf["portal_domain"], "yunohost.local" },
|
||||
session_timeout = 60 * 60 * 24, -- one day
|
||||
session_max_timeout = 60 * 60 * 24 * 7, -- one week
|
||||
login_arg = "sso_login",
|
||||
ldap_host = "localhost",
|
||||
ldap_group = "ou=users,dc=yunohost,dc=org",
|
||||
ldap_identifier = "uid",
|
||||
ldap_enforce_crypt = true,
|
||||
skipped_urls = {},
|
||||
ldap_attributes = {"uid", "givenname", "sn", "cn", "homedirectory", "mail", "maildrop"},
|
||||
allow_mail_authentication = true,
|
||||
default_language = "en",
|
||||
theme = "default",
|
||||
logging = "fatal", -- Only log fatal messages by default (so apriori nothing)
|
||||
permissions = {}
|
||||
}
|
||||
|
||||
|
||||
-- Load default values unless they are set in the configuration file.
|
||||
for param, default_value in pairs(default_conf) do
|
||||
conf[param] = conf[param] or default_value
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- If you access the SSO by a local domain, change the portal domain to
|
||||
-- avoid unwanted redirections.
|
||||
if ngx.var.host == conf["local_portal_domain"] then
|
||||
conf["original_portal_domain"] = conf["portal_domain"]
|
||||
conf["portal_domain"] = conf["local_portal_domain"]
|
||||
end
|
||||
|
||||
|
||||
-- Build portal full URL out of the configuration values
|
||||
conf.portal_url = conf["portal_scheme"].."://"..
|
||||
conf["portal_domain"]..
|
||||
conf["portal_path"]
|
||||
|
||||
|
||||
-- Always skip the portal to avoid redirection looping.
|
||||
table.insert(conf["permissions"]["core_skipped"]["uris"], conf["portal_domain"]..conf["portal_path"])
|
||||
|
||||
update_language()
|
||||
|
||||
return conf
|
||||
end
|
1016
debian/changelog
vendored
Normal file
1016
debian/changelog
vendored
Normal file
File diff suppressed because it is too large
Load diff
14
debian/control
vendored
Normal file
14
debian/control
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
Source: ssowat
|
||||
Section: net
|
||||
Priority: extra
|
||||
Maintainer: YunoHost Contributors <contrib@yunohost.org>
|
||||
Build-Depends: debhelper (>=8.0.0), debhelper-compat (= 13)
|
||||
Standards-Version: 3.9.1
|
||||
|
||||
Package: ssowat
|
||||
Architecture: all
|
||||
Depends: nginx-extras (>=1.6.2), lua-ldap, lua-json, lua-rex-pcre, lua-filesystem, lua-socket, whois
|
||||
Homepage: https://yunohost.org
|
||||
Description: user portal with single sign-on designed for Yunohost
|
||||
A minimalist user portal with single sign-on, designed to be
|
||||
interfaced with Yunohost.
|
339
debian/copyright
vendored
Normal file
339
debian/copyright
vendored
Normal file
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
9
debian/install
vendored
Normal file
9
debian/install
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
init.lua /usr/share/ssowat
|
||||
access.lua /usr/share/ssowat
|
||||
helpers.lua /usr/share/ssowat
|
||||
config.lua /usr/share/ssowat
|
||||
lustache.lua /usr/share/ssowat
|
||||
log.lua /usr/share/ssowat
|
||||
lustache /usr/share/ssowat
|
||||
portal /usr/share/ssowat
|
||||
conf.json.example /etc/ssowat
|
34
debian/postinst
vendored
Normal file
34
debian/postinst
vendored
Normal file
|
@ -0,0 +1,34 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
do_configure() {
|
||||
systemctl reload nginx || true
|
||||
}
|
||||
|
||||
# summary of how this script can be called:
|
||||
# * <postinst> `configure' <most-recently-configured-version>
|
||||
# * <old-postinst> `abort-upgrade' <new version>
|
||||
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
|
||||
# <new-version>
|
||||
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
|
||||
# <failed-install-package> <version> `removing'
|
||||
# <conflicting-package> <version>
|
||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||
# the debian-policy package
|
||||
|
||||
case "$1" in
|
||||
configure)
|
||||
do_configure
|
||||
;;
|
||||
abort-upgrade|abort-remove|abort-deconfigure)
|
||||
;;
|
||||
*)
|
||||
echo "postinst called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
8
debian/rules
vendored
Executable file
8
debian/rules
vendored
Executable file
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/make -f
|
||||
# -*- makefile -*-
|
||||
|
||||
# Uncomment this to turn on verbose mode.
|
||||
#export DH_VERBOSE=1
|
||||
|
||||
%:
|
||||
dh $@
|
1121
helpers.lua
Normal file
1121
helpers.lua
Normal file
File diff suppressed because it is too large
Load diff
151
hige.lua
151
hige.lua
|
@ -1,151 +0,0 @@
|
|||
module('hige', package.seeall)
|
||||
|
||||
local tags = { open = '{{', close = '}}' }
|
||||
local r = {}
|
||||
|
||||
local function merge_environment(...)
|
||||
local numargs, out = select('#', ...), {}
|
||||
for i = 1, numargs do
|
||||
local t = select(i, ...)
|
||||
if type(t) == 'table' then
|
||||
for k, v in pairs(t) do
|
||||
if (type(v) == 'function') then
|
||||
out[k] = setfenv(v, setmetatable(out, {
|
||||
__index = getmetatable(getfenv()).__index
|
||||
}))
|
||||
else
|
||||
out[k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return out
|
||||
end
|
||||
|
||||
local function escape(str)
|
||||
return str:gsub('[&"<>]', function(c)
|
||||
if c == '&' then return '&'
|
||||
elseif c == '"' then return '\"'
|
||||
elseif c == '\\' then return '\\\\'
|
||||
elseif c == '<' then return '<'
|
||||
elseif c == '>' then return '>'
|
||||
else return c end
|
||||
end)
|
||||
end
|
||||
|
||||
local function find(name, context)
|
||||
local value = context[name]
|
||||
if value == nil then
|
||||
return ''
|
||||
elseif type(value) == 'function' then
|
||||
return merge_environment(context, value)[name]()
|
||||
else
|
||||
return value
|
||||
end
|
||||
end
|
||||
|
||||
local operators = {
|
||||
-- comments
|
||||
['!'] = function(state, outer, name, context)
|
||||
return state.tag_open .. '!' .. outer .. state.tag_close
|
||||
end,
|
||||
-- the triple hige is unescaped
|
||||
['{'] = function(state, outer, name, context)
|
||||
return find(name, context)
|
||||
end,
|
||||
-- render partial
|
||||
['<'] = function(state, outer, name, context)
|
||||
return r.partial(state, name, context)
|
||||
end,
|
||||
-- set new delimiters
|
||||
['='] = function(state, outer, name, context)
|
||||
-- FIXME!
|
||||
error('setting new delimiters in the template is currently broken')
|
||||
--[[
|
||||
return name:gsub('^(.-)%s+(.-)$', function(open, close)
|
||||
state.tag_open, state.tag_close = open, close
|
||||
return ''
|
||||
end)
|
||||
]]
|
||||
end,
|
||||
}
|
||||
|
||||
function r.partial(state, name, context)
|
||||
local target_mt = setmetatable(context, { __index = state.lookup_env })
|
||||
local target_name = setfenv(loadstring('return ' .. name), target_mt)()
|
||||
local target_type = type(target_name)
|
||||
|
||||
if target_type == 'string' then
|
||||
return r.render(state, target_name, context)
|
||||
elseif target_type == 'table' then
|
||||
local target_template = setfenv(loadstring('return '..name..'_template'), target_mt)()
|
||||
return r.render(state, target_template, merge_environment(target_name, context))
|
||||
else
|
||||
error('unknown partial type "' .. tostring(name) .. '"')
|
||||
end
|
||||
end
|
||||
|
||||
function r.tags(state, template, context)
|
||||
local tag_path = state.tag_open..'([=!<{]?)(%s*([^#/]-)%s*)[=}]?%s*'..state.tag_close
|
||||
|
||||
return template:gsub(tag_path, function(op, outer, name)
|
||||
if operators[op] ~= nil then
|
||||
return tostring(operators[op](state, outer, name, context))
|
||||
else
|
||||
return escape(tostring((function()
|
||||
if name ~= '.' then
|
||||
return find(name, context)
|
||||
else
|
||||
return context
|
||||
end
|
||||
end)()))
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function r.section(state, template, context)
|
||||
for section_name in template:gmatch(state.tag_open..'#%s*([^#/]-)%s*'..state.tag_close) do
|
||||
local found, value = context[section_name] ~= nil, find(section_name, context)
|
||||
local section_path = state.tag_open..'#'..section_name..state.tag_close..'%s*(.*)'..state.tag_open..'/'..section_name..state.tag_close..'%s*'
|
||||
|
||||
template = template:gsub(section_path, function(inner)
|
||||
if found == false then return '' end
|
||||
|
||||
if value == true then
|
||||
return r.render(state, inner, context)
|
||||
elseif type(value) == 'table' then
|
||||
local output = {}
|
||||
for _, row in pairs(value) do
|
||||
local new_context
|
||||
if type(row) == 'table' then
|
||||
new_context = merge_environment(context, row)
|
||||
else
|
||||
new_context = row
|
||||
end
|
||||
table.insert(output, (r.render(state, inner, new_context)))
|
||||
end
|
||||
return table.concat(output)
|
||||
else
|
||||
return ''
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
return template
|
||||
end
|
||||
|
||||
function r.render(state, template, context)
|
||||
return r.tags(state, r.section(state, template, context), context)
|
||||
end
|
||||
|
||||
function render(template, context, env)
|
||||
if template:find(tags.open) == nil then return template end
|
||||
|
||||
local state = {
|
||||
lookup_env = env or _G,
|
||||
tag_open = tags.open,
|
||||
tag_close = tags.close,
|
||||
}
|
||||
|
||||
return r.render(state, template, context or {})
|
||||
end
|
57
init.lua
57
init.lua
|
@ -1,3 +1,17 @@
|
|||
--
|
||||
-- init.lua
|
||||
--
|
||||
-- This is the initialization file of SSOwat. It is called once at the Nginx
|
||||
-- server's start.
|
||||
-- Consequently, all the variables declared (along with libraries and
|
||||
-- translations) in this file will be *persistent* from one HTTP request to
|
||||
-- another.
|
||||
--
|
||||
|
||||
-- Path of the configuration
|
||||
conf_path = "/etc/ssowat/conf.json"
|
||||
log_file = "/var/log/nginx/ssowat.log"
|
||||
|
||||
-- Remove prepending '@' & trailing 'init.lua'
|
||||
script_path = string.sub(debug.getinfo(1).source, 2, -9)
|
||||
|
||||
|
@ -5,18 +19,41 @@ script_path = string.sub(debug.getinfo(1).source, 2, -9)
|
|||
package.path = package.path .. ";"..script_path.."?.lua"
|
||||
|
||||
-- Load libraries
|
||||
json = require "json"
|
||||
lualdap = require "lualdap"
|
||||
math = require "math"
|
||||
hige = require "hige"
|
||||
lfs = require "lfs"
|
||||
local json = require "json"
|
||||
local lualdap = require "lualdap"
|
||||
local math = require "math"
|
||||
local lfs = require "lfs"
|
||||
local socket = require "socket"
|
||||
local config = require "config"
|
||||
lustache = require "lustache"
|
||||
|
||||
-- Shared table
|
||||
-- Make sure the log file exists and we can write in it
|
||||
io.popen("touch "..log_file)
|
||||
io.popen("chown www-data "..log_file)
|
||||
io.popen("chmod u+w "..log_file)
|
||||
|
||||
-- Persistent shared table
|
||||
flashs = {}
|
||||
login = {}
|
||||
logout = {}
|
||||
i18n = {}
|
||||
|
||||
-- convert a string to a hex
|
||||
function tohex(str)
|
||||
return (str:gsub('.', function (c)
|
||||
return string.format('%02X', string.byte(c))
|
||||
end))
|
||||
end
|
||||
|
||||
-- Efficient function to get a random string
|
||||
function random_string()
|
||||
local length = 64
|
||||
local random_bytes = io.open("/dev/urandom"):read(length);
|
||||
if string.len(random_bytes) ~= length then
|
||||
error("Not enough random bytes read")
|
||||
end
|
||||
return tohex(random_bytes);
|
||||
end
|
||||
|
||||
-- Load translations in the "i18n" above table
|
||||
local locale_dir = script_path.."portal/locales/"
|
||||
for file in lfs.dir(locale_dir) do
|
||||
if string.sub(file, -4) == "json" then
|
||||
|
@ -26,7 +63,5 @@ for file in lfs.dir(locale_dir) do
|
|||
end
|
||||
end
|
||||
|
||||
-- Path of the configuration
|
||||
conf_path = "/etc/ssowat/conf.json"
|
||||
|
||||
-- You should see that in your Nginx error logs by default
|
||||
ngx.log(ngx.INFO, "SSOwat ready")
|
||||
|
|
84
log.lua
Normal file
84
log.lua
Normal file
|
@ -0,0 +1,84 @@
|
|||
--
|
||||
-- log.lua
|
||||
--
|
||||
-- Copyright (c) 2016 rxi
|
||||
--
|
||||
-- This library is free software; you can redistribute it and/or modify it
|
||||
-- under the terms of the MIT license. See LICENSE for details.
|
||||
--
|
||||
|
||||
local log = { _version = "0.1.0" }
|
||||
local conf = config.get_config()
|
||||
|
||||
log.usecolor = true
|
||||
log.level = conf.logging
|
||||
|
||||
local modes = {
|
||||
{ name = "trace", color = "\27[34m", },
|
||||
{ name = "debug", color = "\27[36m", },
|
||||
{ name = "info", color = "\27[32m", },
|
||||
{ name = "warn", color = "\27[33m", },
|
||||
{ name = "error", color = "\27[31m", },
|
||||
{ name = "fatal", color = "\27[35m", },
|
||||
}
|
||||
|
||||
|
||||
local levels = {}
|
||||
for i, v in ipairs(modes) do
|
||||
levels[v.name] = i
|
||||
end
|
||||
|
||||
|
||||
local round = function(x, increment)
|
||||
increment = increment or 1
|
||||
x = x / increment
|
||||
return (x > 0 and math.floor(x + .5) or math.ceil(x - .5)) * increment
|
||||
end
|
||||
|
||||
|
||||
local _tostring = tostring
|
||||
|
||||
local tostring = function(...)
|
||||
local t = {}
|
||||
for i = 1, select('#', ...) do
|
||||
local x = select(i, ...)
|
||||
if type(x) == "number" then
|
||||
x = round(x, .01)
|
||||
end
|
||||
t[#t + 1] = _tostring(x)
|
||||
end
|
||||
return table.concat(t, " ")
|
||||
end
|
||||
|
||||
|
||||
for i, x in ipairs(modes) do
|
||||
local nameupper = x.name:upper()
|
||||
log[x.name] = function(...)
|
||||
|
||||
-- Return early if we're below the log level
|
||||
if i < levels[log.level] then
|
||||
return
|
||||
end
|
||||
|
||||
local msg = tostring(...)
|
||||
local info = debug.getinfo(2, "Sl")
|
||||
|
||||
-- Output to console
|
||||
print(string.format("%s[%-6s%s]%s %s",
|
||||
log.usecolor and x.color or "",
|
||||
nameupper,
|
||||
os.date("%H:%M:%S"),
|
||||
log.usecolor and "\27[0m" or "",
|
||||
msg))
|
||||
|
||||
-- Output to log file
|
||||
local fp = io.open(log_file, "a")
|
||||
local str = string.format("[%-6s%s] %s\n",
|
||||
nameupper, os.date(), msg)
|
||||
fp:write(str)
|
||||
fp:close()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
return log
|
29
lustache.lua
Normal file
29
lustache.lua
Normal file
|
@ -0,0 +1,29 @@
|
|||
-- lustache: Lua mustache template parsing.
|
||||
-- Copyright 2013 Olivine Labs, LLC <projects@olivinelabs.com>
|
||||
-- MIT Licensed.
|
||||
|
||||
module('lustache', package.seeall)
|
||||
|
||||
local string_gmatch = string.gmatch
|
||||
|
||||
function string.split(str, sep)
|
||||
local out = {}
|
||||
for m in string_gmatch(str, "[^"..sep.."]+") do out[#out+1] = m end
|
||||
return out
|
||||
end
|
||||
|
||||
local lustache = {
|
||||
name = "lustache",
|
||||
version = "1.3.1-0",
|
||||
renderer = require("lustache.renderer"):new(),
|
||||
}
|
||||
|
||||
return setmetatable(lustache, {
|
||||
__index = function(self, idx)
|
||||
if self.renderer[idx] then return self.renderer[idx] end
|
||||
end,
|
||||
__newindex = function(self, idx, val)
|
||||
if idx == "partials" then self.renderer.partials = val end
|
||||
if idx == "tags" then self.renderer.tags = val end
|
||||
end
|
||||
})
|
22
lustache/LICENSE
Normal file
22
lustache/LICENSE
Normal file
|
@ -0,0 +1,22 @@
|
|||
The MIT License
|
||||
|
||||
Copyright (c) 2012 Olivine Labs
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
66
lustache/context.lua
Normal file
66
lustache/context.lua
Normal file
|
@ -0,0 +1,66 @@
|
|||
local string_find, string_split, tostring, type =
|
||||
string.find, string.split, tostring, type
|
||||
|
||||
local context = {}
|
||||
context.__index = context
|
||||
|
||||
function context:clear_cache()
|
||||
self.cache = {}
|
||||
end
|
||||
|
||||
function context:push(view)
|
||||
return self:new(view, self)
|
||||
end
|
||||
|
||||
function context:lookup(name)
|
||||
local value = self.cache[name]
|
||||
|
||||
if not value then
|
||||
if name == "." then
|
||||
value = self.view
|
||||
else
|
||||
local context = self
|
||||
|
||||
while context do
|
||||
if string_find(name, ".") > 0 then
|
||||
local names = string_split(name, ".")
|
||||
local i = 0
|
||||
|
||||
value = context.view
|
||||
|
||||
if(type(value)) == "number" then
|
||||
value = tostring(value)
|
||||
end
|
||||
|
||||
while value and i < #names do
|
||||
i = i + 1
|
||||
value = value[names[i]]
|
||||
end
|
||||
else
|
||||
value = context.view[name]
|
||||
end
|
||||
|
||||
if value then
|
||||
break
|
||||
end
|
||||
|
||||
context = context.parent
|
||||
end
|
||||
end
|
||||
|
||||
self.cache[name] = value
|
||||
end
|
||||
|
||||
return value
|
||||
end
|
||||
|
||||
function context:new(view, parent)
|
||||
local out = {
|
||||
view = view,
|
||||
parent = parent,
|
||||
cache = {},
|
||||
}
|
||||
return setmetatable(out, context)
|
||||
end
|
||||
|
||||
return context
|
388
lustache/renderer.lua
Normal file
388
lustache/renderer.lua
Normal file
|
@ -0,0 +1,388 @@
|
|||
local Scanner = require "lustache.scanner"
|
||||
local Context = require "lustache.context"
|
||||
|
||||
local error, ipairs, loadstring, pairs, setmetatable, tostring, type =
|
||||
error, ipairs, loadstring, pairs, setmetatable, tostring, type
|
||||
local math_floor, math_max, string_find, string_gsub, string_split, string_sub, table_concat, table_insert, table_remove =
|
||||
math.floor, math.max, string.find, string.gsub, string.split, string.sub, table.concat, table.insert, table.remove
|
||||
|
||||
local patterns = {
|
||||
white = "%s*",
|
||||
space = "%s+",
|
||||
nonSpace = "%S",
|
||||
eq = "%s*=",
|
||||
curly = "%s*}",
|
||||
tag = "[#\\^/>{&=!]"
|
||||
}
|
||||
|
||||
local html_escape_characters = {
|
||||
["&"] = "&",
|
||||
["<"] = "<",
|
||||
[">"] = ">",
|
||||
['"'] = """,
|
||||
["'"] = "'",
|
||||
["/"] = "/"
|
||||
}
|
||||
|
||||
local function is_array(array)
|
||||
if type(array) ~= "table" then return false end
|
||||
local max, n = 0, 0
|
||||
for k, _ in pairs(array) do
|
||||
if not (type(k) == "number" and k > 0 and math_floor(k) == k) then
|
||||
return false
|
||||
end
|
||||
max = math_max(max, k)
|
||||
n = n + 1
|
||||
end
|
||||
return n == max
|
||||
end
|
||||
|
||||
-- Low-level function that compiles the given `tokens` into a
|
||||
-- function that accepts two arguments: a Context and a
|
||||
-- Renderer.
|
||||
|
||||
local function compile_tokens(tokens, originalTemplate)
|
||||
local subs = {}
|
||||
|
||||
local function subrender(i, tokens)
|
||||
if not subs[i] then
|
||||
local fn = compile_tokens(tokens, originalTemplate)
|
||||
subs[i] = function(ctx, rnd) return fn(ctx, rnd) end
|
||||
end
|
||||
return subs[i]
|
||||
end
|
||||
|
||||
local function render(ctx, rnd)
|
||||
local buf = {}
|
||||
local token, section
|
||||
for i, token in ipairs(tokens) do
|
||||
local t = token.type
|
||||
buf[#buf+1] =
|
||||
t == "#" and rnd:_section(
|
||||
token, ctx, subrender(i, token.tokens), originalTemplate
|
||||
) or
|
||||
t == "^" and rnd:_inverted(
|
||||
token.value, ctx, subrender(i, token.tokens)
|
||||
) or
|
||||
t == ">" and rnd:_partial(token.value, ctx, originalTemplate) or
|
||||
(t == "{" or t == "&") and rnd:_name(token.value, ctx, false) or
|
||||
t == "name" and rnd:_name(token.value, ctx, true) or
|
||||
t == "text" and token.value or ""
|
||||
end
|
||||
return table_concat(buf)
|
||||
end
|
||||
return render
|
||||
end
|
||||
|
||||
local function escape_tags(tags)
|
||||
|
||||
return {
|
||||
string_gsub(tags[1], "%%", "%%%%").."%s*",
|
||||
"%s*"..string_gsub(tags[2], "%%", "%%%%"),
|
||||
}
|
||||
end
|
||||
|
||||
local function nest_tokens(tokens)
|
||||
local tree = {}
|
||||
local collector = tree
|
||||
local sections = {}
|
||||
local token, section
|
||||
|
||||
for i,token in ipairs(tokens) do
|
||||
if token.type == "#" or token.type == "^" then
|
||||
token.tokens = {}
|
||||
sections[#sections+1] = token
|
||||
collector[#collector+1] = token
|
||||
collector = token.tokens
|
||||
elseif token.type == "/" then
|
||||
if #sections == 0 then
|
||||
error("Unopened section: "..token.value)
|
||||
end
|
||||
|
||||
-- Make sure there are no open sections when we're done
|
||||
section = table_remove(sections, #sections)
|
||||
|
||||
if not section.value == token.value then
|
||||
error("Unclosed section: "..section.value)
|
||||
end
|
||||
|
||||
section.closingTagIndex = token.startIndex
|
||||
|
||||
if #sections > 0 then
|
||||
collector = sections[#sections].tokens
|
||||
else
|
||||
collector = tree
|
||||
end
|
||||
else
|
||||
collector[#collector+1] = token
|
||||
end
|
||||
end
|
||||
|
||||
section = table_remove(sections, #sections)
|
||||
|
||||
if section then
|
||||
error("Unclosed section: "..section.value)
|
||||
end
|
||||
|
||||
return tree
|
||||
end
|
||||
|
||||
-- Combines the values of consecutive text tokens in the given `tokens` array
|
||||
-- to a single token.
|
||||
local function squash_tokens(tokens)
|
||||
local out, txt = {}, {}
|
||||
local txtStartIndex, txtEndIndex
|
||||
for _, v in ipairs(tokens) do
|
||||
if v.type == "text" then
|
||||
if #txt == 0 then
|
||||
txtStartIndex = v.startIndex
|
||||
end
|
||||
txt[#txt+1] = v.value
|
||||
txtEndIndex = v.endIndex
|
||||
else
|
||||
if #txt > 0 then
|
||||
out[#out+1] = { type = "text", value = table_concat(txt), startIndex = txtStartIndex, endIndex = txtEndIndex }
|
||||
txt = {}
|
||||
end
|
||||
out[#out+1] = v
|
||||
end
|
||||
end
|
||||
if #txt > 0 then
|
||||
out[#out+1] = { type = "text", value = table_concat(txt), startIndex = txtStartIndex, endIndex = txtEndIndex }
|
||||
end
|
||||
return out
|
||||
end
|
||||
|
||||
local function make_context(view)
|
||||
if not view then return view end
|
||||
return getmetatable(view) == Context and view or Context:new(view)
|
||||
end
|
||||
|
||||
local renderer = { }
|
||||
|
||||
function renderer:clear_cache()
|
||||
self.cache = {}
|
||||
self.partial_cache = {}
|
||||
end
|
||||
|
||||
function renderer:compile(tokens, tags, originalTemplate)
|
||||
tags = tags or self.tags
|
||||
if type(tokens) == "string" then
|
||||
tokens = self:parse(tokens, tags)
|
||||
end
|
||||
|
||||
local fn = compile_tokens(tokens, originalTemplate)
|
||||
|
||||
return function(view)
|
||||
return fn(make_context(view), self)
|
||||
end
|
||||
end
|
||||
|
||||
function renderer:render(template, view, partials)
|
||||
if type(self) == "string" then
|
||||
error("Call mustache:render, not mustache.render!")
|
||||
end
|
||||
|
||||
if partials then
|
||||
-- remember partial table
|
||||
-- used for runtime lookup & compile later on
|
||||
self.partials = partials
|
||||
end
|
||||
|
||||
if not template then
|
||||
return ""
|
||||
end
|
||||
|
||||
local fn = self.cache[template]
|
||||
|
||||
if not fn then
|
||||
fn = self:compile(template, self.tags, template)
|
||||
self.cache[template] = fn
|
||||
end
|
||||
|
||||
return fn(view)
|
||||
end
|
||||
|
||||
function renderer:_section(token, context, callback, originalTemplate)
|
||||
local value = context:lookup(token.value)
|
||||
|
||||
if type(value) == "table" then
|
||||
if is_array(value) then
|
||||
local buffer = ""
|
||||
|
||||
for i,v in ipairs(value) do
|
||||
buffer = buffer .. callback(context:push(v), self)
|
||||
end
|
||||
|
||||
return buffer
|
||||
end
|
||||
|
||||
return callback(context:push(value), self)
|
||||
elseif type(value) == "function" then
|
||||
local section_text = string_sub(originalTemplate, token.endIndex+1, token.closingTagIndex - 1)
|
||||
|
||||
local scoped_render = function(template)
|
||||
return self:render(template, context)
|
||||
end
|
||||
|
||||
return value(section_text, scoped_render) or ""
|
||||
else
|
||||
if value then
|
||||
return callback(context, self)
|
||||
end
|
||||
end
|
||||
|
||||
return ""
|
||||
end
|
||||
|
||||
function renderer:_inverted(name, context, callback)
|
||||
local value = context:lookup(name)
|
||||
|
||||
-- From the spec: inverted sections may render text once based on the
|
||||
-- inverse value of the key. That is, they will be rendered if the key
|
||||
-- doesn't exist, is false, or is an empty list.
|
||||
|
||||
if value == nil or value == false or (type(value) == "table" and is_array(value) and #value == 0) then
|
||||
return callback(context, self)
|
||||
end
|
||||
|
||||
return ""
|
||||
end
|
||||
|
||||
function renderer:_partial(name, context, originalTemplate)
|
||||
local fn = self.partial_cache[name]
|
||||
|
||||
-- check if partial cache exists
|
||||
if (not fn and self.partials) then
|
||||
|
||||
local partial = self.partials[name]
|
||||
if (not partial) then
|
||||
return ""
|
||||
end
|
||||
|
||||
-- compile partial and store result in cache
|
||||
fn = self:compile(partial, nil, originalTemplate)
|
||||
self.partial_cache[name] = fn
|
||||
end
|
||||
return fn and fn(context, self) or ""
|
||||
end
|
||||
|
||||
function renderer:_name(name, context, escape)
|
||||
local value = context:lookup(name)
|
||||
|
||||
if type(value) == "function" then
|
||||
value = value(context.view)
|
||||
end
|
||||
|
||||
local str = value == nil and "" or value
|
||||
str = tostring(str)
|
||||
|
||||
if escape then
|
||||
return string_gsub(str, '[&<>"\'/]', function(s) return html_escape_characters[s] end)
|
||||
end
|
||||
|
||||
return str
|
||||
end
|
||||
|
||||
-- Breaks up the given `template` string into a tree of token objects. If
|
||||
-- `tags` is given here it must be an array with two string values: the
|
||||
-- opening and closing tags used in the template (e.g. ["<%", "%>"]). Of
|
||||
-- course, the default is to use mustaches (i.e. Mustache.tags).
|
||||
function renderer:parse(template, tags)
|
||||
tags = tags or self.tags
|
||||
local tag_patterns = escape_tags(tags)
|
||||
local scanner = Scanner:new(template)
|
||||
local tokens = {} -- token buffer
|
||||
local spaces = {} -- indices of whitespace tokens on the current line
|
||||
local has_tag = false -- is there a {{tag} on the current line?
|
||||
local non_space = false -- is there a non-space char on the current line?
|
||||
|
||||
-- Strips all whitespace tokens array for the current line if there was
|
||||
-- a {{#tag}} on it and otherwise only space
|
||||
local function strip_space()
|
||||
if has_tag and not non_space then
|
||||
while #spaces > 0 do
|
||||
table_remove(tokens, table_remove(spaces))
|
||||
end
|
||||
else
|
||||
spaces = {}
|
||||
end
|
||||
has_tag = false
|
||||
non_space = false
|
||||
end
|
||||
|
||||
local type, value, chr
|
||||
|
||||
while not scanner:eos() do
|
||||
local start = scanner.pos
|
||||
|
||||
value = scanner:scan_until(tag_patterns[1])
|
||||
|
||||
if value then
|
||||
for i = 1, #value do
|
||||
chr = string_sub(value,i,i)
|
||||
|
||||
if string_find(chr, "%s+") then
|
||||
spaces[#spaces+1] = #tokens + 1
|
||||
else
|
||||
non_space = true
|
||||
end
|
||||
|
||||
tokens[#tokens+1] = { type = "text", value = chr, startIndex = start, endIndex = start }
|
||||
start = start + 1
|
||||
if chr == "\n" then
|
||||
strip_space()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not scanner:scan(tag_patterns[1]) then
|
||||
break
|
||||
end
|
||||
|
||||
has_tag = true
|
||||
type = scanner:scan(patterns.tag) or "name"
|
||||
|
||||
scanner:scan(patterns.white)
|
||||
|
||||
if type == "=" then
|
||||
value = scanner:scan_until(patterns.eq)
|
||||
scanner:scan(patterns.eq)
|
||||
scanner:scan_until(tag_patterns[2])
|
||||
elseif type == "{" then
|
||||
local close_pattern = "%s*}"..tags[2]
|
||||
value = scanner:scan_until(close_pattern)
|
||||
scanner:scan(patterns.curly)
|
||||
scanner:scan_until(tag_patterns[2])
|
||||
else
|
||||
value = scanner:scan_until(tag_patterns[2])
|
||||
end
|
||||
|
||||
if not scanner:scan(tag_patterns[2]) then
|
||||
error("Unclosed tag at " .. scanner.pos)
|
||||
end
|
||||
|
||||
tokens[#tokens+1] = { type = type, value = value, startIndex = start, endIndex = scanner.pos - 1 }
|
||||
if type == "name" or type == "{" or type == "&" then
|
||||
non_space = true --> what does this do?
|
||||
end
|
||||
|
||||
if type == "=" then
|
||||
tags = string_split(value, patterns.space)
|
||||
tag_patterns = escape_tags(tags)
|
||||
end
|
||||
end
|
||||
|
||||
return nest_tokens(squash_tokens(tokens))
|
||||
end
|
||||
|
||||
function renderer:new()
|
||||
local out = {
|
||||
cache = {},
|
||||
partial_cache = {},
|
||||
tags = {"{{", "}}"}
|
||||
}
|
||||
return setmetatable(out, { __index = self })
|
||||
end
|
||||
|
||||
return renderer
|
57
lustache/scanner.lua
Normal file
57
lustache/scanner.lua
Normal file
|
@ -0,0 +1,57 @@
|
|||
local string_find, string_match, string_sub =
|
||||
string.find, string.match, string.sub
|
||||
|
||||
local scanner = {}
|
||||
|
||||
-- Returns `true` if the tail is empty (end of string).
|
||||
function scanner:eos()
|
||||
return self.tail == ""
|
||||
end
|
||||
|
||||
-- Tries to match the given regular expression at the current position.
|
||||
-- Returns the matched text if it can match, `null` otherwise.
|
||||
function scanner:scan(pattern)
|
||||
local match = string_match(self.tail, pattern)
|
||||
|
||||
if match and string_find(self.tail, pattern) == 1 then
|
||||
self.tail = string_sub(self.tail, #match + 1)
|
||||
self.pos = self.pos + #match
|
||||
|
||||
return match
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- Skips all text until the given regular expression can be matched. Returns
|
||||
-- the skipped string, which is the entire tail of this scanner if no match
|
||||
-- can be made.
|
||||
function scanner:scan_until(pattern)
|
||||
|
||||
local match
|
||||
local pos = string_find(self.tail, pattern)
|
||||
|
||||
if pos == nil then
|
||||
match = self.tail
|
||||
self.pos = self.pos + #self.tail
|
||||
self.tail = ""
|
||||
elseif pos == 1 then
|
||||
match = nil
|
||||
else
|
||||
match = string_sub(self.tail, 1, pos - 1)
|
||||
self.tail = string_sub(self.tail, pos)
|
||||
self.pos = self.pos + #match
|
||||
end
|
||||
|
||||
return match
|
||||
end
|
||||
|
||||
function scanner:new(str)
|
||||
local out = {
|
||||
str = str,
|
||||
tail = str,
|
||||
pos = 1
|
||||
}
|
||||
return setmetatable(out, { __index = self } )
|
||||
end
|
||||
|
||||
return scanner
|
37
maintenance/make_changelog.sh
Normal file
37
maintenance/make_changelog.sh
Normal file
|
@ -0,0 +1,37 @@
|
|||
VERSION="11.2.1"
|
||||
RELEASE="stable"
|
||||
REPO=$(basename $(git rev-parse --show-toplevel))
|
||||
REPO_URL=$(git remote get-url origin)
|
||||
ME=$(git config --get user.name)
|
||||
EMAIL=$(git config --get user.email)
|
||||
|
||||
LAST_RELEASE=$(git tag --list 'debian/11.*' --sort="v:refname" | tail -n 1)
|
||||
|
||||
echo "$REPO ($VERSION) $RELEASE; urgency=low"
|
||||
echo ""
|
||||
|
||||
git log $LAST_RELEASE.. -n 10000 --first-parent --pretty=tformat:' - %b%s (%h)' \
|
||||
| sed -E "s&Merge .*#([0-9]+).*\$& \([#\1]\(http://github.com/YunoHost/$REPO/pull/\1\)\)&g" \
|
||||
| sed -E "/Co-authored-by: .* <.*>/d" \
|
||||
| grep -v "Translations update from Weblate" \
|
||||
| tac
|
||||
|
||||
TRANSLATIONS=$(git log $LAST_RELEASE... -n 10000 --pretty=format:"%s" \
|
||||
| grep "Translated using Weblate" \
|
||||
| sed -E "s/Translated using Weblate \((.*)\)/\1/g" \
|
||||
| sort | uniq | tr '\n' ', ' | sed -e 's/,$//g' -e 's/,/, /g')
|
||||
[[ -z "$TRANSLATIONS" ]] || echo " - [i18n] Translations updated for $TRANSLATIONS"
|
||||
|
||||
echo ""
|
||||
CONTRIBUTORS=$(git log -n10 --pretty=format:'%Cred%h%Creset %C(bold blue)(%an) %Creset%Cgreen(%cr)%Creset - %s %C(yellow)%d%Creset' --abbrev-commit $LAST_RELEASE... -n 10000 --pretty=format:"%an" \
|
||||
| sort | uniq | grep -v "$ME" | grep -v 'yunohost-bot' | grep -vi 'weblate' \
|
||||
| tr '\n' ', ' | sed -e 's/,$//g' -e 's/,/, /g')
|
||||
[[ -z "$CONTRIBUTORS" ]] || echo " Thanks to all contributors <3 ! ($CONTRIBUTORS)"
|
||||
echo ""
|
||||
echo " -- $ME <$EMAIL> $(date -R)"
|
||||
echo ""
|
||||
|
||||
|
||||
|
||||
# PR links can be converted to regular texts using : sed -E 's@\[(#[0-9]*)\]\([^ )]*\)@\1@g'
|
||||
# Or readded with sed -E 's@#([0-9]*)@[YunoHost#\1](https://github.com/yunohost/yunohost/pull/\1)@g' | sed -E 's@\((\w+)\)@([YunoHost/\1](https://github.com/yunohost/yunohost/commit/\1))@g'
|
|
@ -1,83 +0,0 @@
|
|||
/* ==========================================================================
|
||||
Sommaire
|
||||
|
||||
1 = Default button
|
||||
2 = Important button
|
||||
3 = Validate button
|
||||
4 = Warning button
|
||||
5 = Classic button
|
||||
========================================================================== */
|
||||
|
||||
/* ==========================================================================
|
||||
1 = Default button
|
||||
========================================================================== */
|
||||
|
||||
.btn {
|
||||
background: #999;
|
||||
display: inline-block;
|
||||
padding: 0.5em 1em;
|
||||
line-height: normal;
|
||||
text-decoration: none;
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
.large-btn {
|
||||
padding: 0.8em 1.5em;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
button.btn,
|
||||
input.btn {
|
||||
border:0;
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
.btn:hover,
|
||||
.btn:focus {
|
||||
background: #AAA;
|
||||
}
|
||||
|
||||
|
||||
/* ==========================================================================
|
||||
2 = Important button
|
||||
========================================================================== */
|
||||
|
||||
.important-btn { background: #c0392b;
|
||||
}
|
||||
.important-btn:hover,
|
||||
.important-btn:focus {
|
||||
background: #e74c3c;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
3 = Validate button
|
||||
========================================================================== */
|
||||
|
||||
.validate-btn { background: #27ae60;
|
||||
}
|
||||
.validate-btn:hover,
|
||||
.validate-btn:focus {
|
||||
background: #2ecc71;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
3 = Warning button
|
||||
========================================================================== */
|
||||
|
||||
.warning-btn { background: #e67e22;
|
||||
}
|
||||
.warning-btn:hover,
|
||||
.warning-btn:focus {
|
||||
background: #f39c12;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
5 = Classic button
|
||||
========================================================================== */
|
||||
|
||||
.classic-btn { background: #2980b9;
|
||||
}
|
||||
.classic-btn:hover,
|
||||
.classic-btn:focus {
|
||||
background: #3498db;
|
||||
}
|
|
@ -1,87 +0,0 @@
|
|||
/* ==========================================================================
|
||||
Sommaire
|
||||
|
||||
1 = col
|
||||
2 = Sidebar Left
|
||||
3 = Sidebar Right
|
||||
4 = Col 2
|
||||
5 = Col 3
|
||||
6 = Col 4
|
||||
========================================================================== */
|
||||
|
||||
.col {
|
||||
letter-spacing: -5px; /*fix bug ff PC*/
|
||||
}
|
||||
|
||||
.col > * {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
letter-spacing: normal;
|
||||
}
|
||||
|
||||
.colMarge > * {
|
||||
margin-left: 1%;
|
||||
}
|
||||
|
||||
.colNomarge > * {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
2 = Sidebar left
|
||||
========================================================================== */
|
||||
|
||||
.colSidebarLeft > *:first-child {
|
||||
width:31%;
|
||||
margin-left:0;
|
||||
}
|
||||
.colSidebarLeft > *:first-child + * { width:68%; }
|
||||
|
||||
/* ==========================================================================
|
||||
3 = Sidebar right
|
||||
========================================================================== */
|
||||
|
||||
.colSidebarRight > *:first-child {
|
||||
width:68%;
|
||||
margin-left:0;
|
||||
}
|
||||
.colSidebarRight > *:first-child + * { width:31%; }
|
||||
|
||||
/* ==========================================================================
|
||||
4 = col 2
|
||||
========================================================================== */
|
||||
|
||||
.col2 > * {
|
||||
width: 49.5%!important;
|
||||
margin-bottom: 1%;
|
||||
}
|
||||
|
||||
.col2 > *:nth-child(2n+1) {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
5 = col 3
|
||||
========================================================================== */
|
||||
|
||||
.col3 > * {
|
||||
width: 32.65%;
|
||||
margin-bottom: 1%;
|
||||
}
|
||||
|
||||
.col3 > *:nth-child(3n+1) {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
6 = col 4
|
||||
========================================================================== */
|
||||
|
||||
.col4 > * {
|
||||
width: 24.25%;
|
||||
margin-bottom: 1%;
|
||||
}
|
||||
|
||||
.col4 > *:nth-child(4n+1) {
|
||||
margin-left: 0;
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
/* ==========================================================================
|
||||
Sommaire
|
||||
|
||||
1 = Messages
|
||||
========================================================================== */
|
||||
|
||||
.messages {
|
||||
color: #FFF;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.danger { background: #c0392b; }
|
||||
.warning { background: #e67e22; }
|
||||
.success { background: #27ae60; }
|
||||
.info { background: #2980b9; }
|
|
@ -1,265 +0,0 @@
|
|||
/*
|
||||
Ratatouille mini Framework css by Thomas LEBEAU
|
||||
Base on KNACSS => www.KNACSS.com (2013-10) @author: Raphael Goetter, Alsacreations
|
||||
and normalize.css
|
||||
*/
|
||||
|
||||
/* ==========================================================================
|
||||
Sommaire
|
||||
|
||||
1 = Mise en Forme
|
||||
2 = Mise en Page
|
||||
3 = Internet Explorer
|
||||
========================================================================== */
|
||||
|
||||
/* ==========================================================================
|
||||
1 = Mise en forme
|
||||
========================================================================== */
|
||||
|
||||
* {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: sans-serif; /* 1 */
|
||||
-ms-text-size-adjust: 100%; /* 2 */
|
||||
-webkit-text-size-adjust: 100%; /* 2 */
|
||||
}
|
||||
|
||||
body {
|
||||
font-size: 1em;
|
||||
line-height:1.5;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
h1:first-child,
|
||||
h2:first-child,
|
||||
h3:first-child,
|
||||
h4:first-child,
|
||||
h5:first-child,
|
||||
h6:first-child,
|
||||
p:first-child,
|
||||
ul:first-child,
|
||||
ol:first-child,
|
||||
dl:first-child{
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
code,
|
||||
kbd,
|
||||
pre,
|
||||
samp {
|
||||
font-family: monospace, serif;
|
||||
}
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
|
||||
.upper {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.inner {
|
||||
margin: 0 auto;
|
||||
max-width: 61.25em;/*980px*/
|
||||
}
|
||||
|
||||
table, img {
|
||||
max-width: 100%;
|
||||
height :auto;
|
||||
}
|
||||
|
||||
iframe {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.fl {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.fr {
|
||||
float: right;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
button,
|
||||
input,
|
||||
select,
|
||||
textarea {
|
||||
font-family: inherit;
|
||||
font-size: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
input[type="search"] {
|
||||
-webkit-appearance: textfield;
|
||||
}
|
||||
|
||||
input::-moz-focus-inner {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0){
|
||||
select{
|
||||
-webkit-appearance: none;
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
2 = Mise en page
|
||||
========================================================================== */
|
||||
|
||||
.ul-reset {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.ul-reset li {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.dib {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.dblock { display: block; }
|
||||
|
||||
.dnone { display: none; }
|
||||
|
||||
.dtable { display:table }
|
||||
|
||||
.dtable > * { display:table-row; }
|
||||
|
||||
.dtable > * > * { display:table-cell; }
|
||||
|
||||
.element-invisible {
|
||||
border: 0;
|
||||
clip: rect(0 0 0 0);
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
}
|
||||
|
||||
.x-text-small { font-size:x-small; }
|
||||
|
||||
.text-small { font-size:small; }
|
||||
|
||||
.text-large { font-size:large; }
|
||||
|
||||
.x-text-large { font-size:x-large; }
|
||||
|
||||
/*Width*/
|
||||
|
||||
.w100 { width:100%; }
|
||||
.w90 { width:90%; }
|
||||
.w80 { width:80%; }
|
||||
.w70 { width:70%; }
|
||||
.w60 { width:60%; }
|
||||
.w50 { width:50%; }
|
||||
.w40 { width:40%; }
|
||||
.w30 { width:30%; }
|
||||
.w20 { width:20%; }
|
||||
.w10 { width:10%; }
|
||||
|
||||
h1,
|
||||
.h1 {
|
||||
font-size: 2.5em;
|
||||
}
|
||||
|
||||
h2,
|
||||
.h2 {
|
||||
font-size: 1.8em;
|
||||
}
|
||||
|
||||
h3,
|
||||
.h3 {
|
||||
font-size: 1.4em;
|
||||
}
|
||||
|
||||
h4,
|
||||
.h4 {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
h5,
|
||||
.h5 {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
h6,
|
||||
.h6 {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
/*Table*/
|
||||
|
||||
table {
|
||||
color: #999;
|
||||
min-width: 100%;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
table thead {
|
||||
background: #CCC;
|
||||
}
|
||||
|
||||
table td, table th {
|
||||
padding: 0.5em;
|
||||
color: #333;
|
||||
border-color: #999;
|
||||
}
|
||||
|
||||
.box {
|
||||
padding: 1.5em;
|
||||
}
|
||||
|
||||
|
||||
/* ==========================================================================
|
||||
Internet Explorer
|
||||
========================================================================== */
|
||||
|
||||
/*IE8 and IE9*/
|
||||
|
||||
article,
|
||||
aside,
|
||||
details,
|
||||
figcaption,
|
||||
figure,
|
||||
footer,
|
||||
header,
|
||||
hgroup,
|
||||
main,
|
||||
nav,
|
||||
section,
|
||||
summary {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/*IE8 and IE9*/
|
||||
|
||||
audio,
|
||||
canvas,
|
||||
video {
|
||||
display: inline-block;
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
|
@ -1,68 +0,0 @@
|
|||
html, body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
}
|
||||
iframe {
|
||||
position: absolute;
|
||||
top: 0; bottom: 0; left: 0; width: 100%; height: 100%;
|
||||
border: none;
|
||||
box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;
|
||||
}
|
||||
#ynhtopbar {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 110px;
|
||||
background-color: black;
|
||||
color: black;
|
||||
z-index: 1000;
|
||||
font-family: "helvetica";
|
||||
}
|
||||
#ynhtoggle {
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
background-color: black;
|
||||
text-align: center;
|
||||
padding-top: 10px;
|
||||
top: 100px;
|
||||
left: 50px;
|
||||
width: 80px;
|
||||
height: 18px;
|
||||
z-index: 900;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 13px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
#ynhtoggle:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
.ynhapp {
|
||||
float: left;
|
||||
margin: 5px 15px;
|
||||
padding: 5px;
|
||||
width: 70px;
|
||||
height: 100px;
|
||||
color: white;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ynhapp.active .ynhappsquare {
|
||||
border: 1px dotted white;
|
||||
}
|
||||
.ynhappcaption {
|
||||
color: white;
|
||||
font-size: 13px;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ynhappsquare {
|
||||
height: 50px;
|
||||
width: 64px;
|
||||
padding-top: 14px;
|
||||
vertical-align: middle;
|
||||
font-size: 35px;
|
||||
border: 1px solid white;
|
||||
}
|
|
@ -1,755 +0,0 @@
|
|||
/* ==========================================================================
|
||||
Sommaire
|
||||
1 = Global
|
||||
2 = Apps
|
||||
3 = User
|
||||
4 = Form
|
||||
5 = Footer
|
||||
6 = Colors
|
||||
========================================================================== */
|
||||
|
||||
/* ==========================================================================
|
||||
1 = Global
|
||||
========================================================================== */
|
||||
|
||||
body {
|
||||
background: #41444f;
|
||||
font-family: 'source_sans_proregular';
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
|
||||
/* Layout */
|
||||
|
||||
.overlay {
|
||||
padding: 2%;
|
||||
}
|
||||
|
||||
.inner {
|
||||
max-width: 50em;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
width: 90%;
|
||||
margin: 2% 5%;
|
||||
z-index: 10;
|
||||
}
|
||||
.wrapper:before,
|
||||
.wrapper:after {content: " ";display: table;}
|
||||
.wrapper:after {clear: both;}
|
||||
|
||||
.logo {
|
||||
text-align: center;
|
||||
margin-bottom: 0;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.logo img {
|
||||
margin-top: 4%;
|
||||
width: 4em;
|
||||
}
|
||||
|
||||
.logged .logo {
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
right: 20px;
|
||||
z-index: 0;
|
||||
opacity: 0.7;
|
||||
}
|
||||
.logged .logo img {
|
||||
margin-top: 0;
|
||||
width: 2.5em;
|
||||
padding: 0.3em;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.ynh-panel-active .logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.messages {
|
||||
text-align: center;
|
||||
max-width: 21em;
|
||||
margin: 2% auto 1em auto;
|
||||
padding: 1.5em;
|
||||
}
|
||||
|
||||
.logged .messages {
|
||||
max-width: none;
|
||||
margin: 2% 5%;
|
||||
padding: 1.5em 15%;
|
||||
}
|
||||
|
||||
|
||||
/* Fonts & Colors */
|
||||
|
||||
a { text-decoration: none; }
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-family: 'source_sans_probold';
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.cwhite {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
select,
|
||||
.form-text,
|
||||
textarea {
|
||||
border: 0;
|
||||
font-family: 'source_sans_proregular';
|
||||
}
|
||||
|
||||
|
||||
.sourcePro {
|
||||
font-family: 'source_sans_proregular';
|
||||
}
|
||||
|
||||
.sourceProBold {
|
||||
font-family: 'source_sans_probold';
|
||||
}
|
||||
|
||||
.sourceProBlack {
|
||||
font-family: 'SourceSansPro-Black';
|
||||
}
|
||||
|
||||
|
||||
/* Icons */
|
||||
|
||||
[class^="icon-"]:before, [class*=" icon-"]:before {
|
||||
font-family: 'ynh_ssowat';
|
||||
font-size: 1em;
|
||||
speak: none;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-variant: normal;
|
||||
text-transform: none;
|
||||
line-height: 1;
|
||||
margin-right: 0.5em;
|
||||
|
||||
/* Better Font Rendering =========== */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-user:before { content: '\e801'; }
|
||||
.icon-lock:before { content: '\e800'; }
|
||||
.icon-connexion:before { content: '\e802'; }
|
||||
.icon-pencil:before { content: '\e804'; }
|
||||
.icon-trash:before { content: '\e80c'; }
|
||||
.icon-angle-left:before { content: '\e803'; }
|
||||
|
||||
|
||||
/* ==========================================================================
|
||||
2 = Apps
|
||||
========================================================================== */
|
||||
|
||||
.apps { margin: 4% 5%; }
|
||||
|
||||
.first-letter:before {
|
||||
content: attr(data-first-letter);
|
||||
}
|
||||
|
||||
.listing-apps li {
|
||||
margin: 0 0 1em 1em;
|
||||
box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.4),
|
||||
-2px -2px 3px 0 rgba(0, 0, 0, 0.7) inset;
|
||||
}
|
||||
|
||||
.listing-apps a {
|
||||
display: block;
|
||||
position: relative;
|
||||
padding: 0.2em;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 2.7em;
|
||||
height: 2.7em;
|
||||
background: #666;
|
||||
color: #fff;
|
||||
font-size: 4em;
|
||||
transition: all 0.3s ease;
|
||||
-webkit-transition: all 0.3s ease;
|
||||
}
|
||||
.listing-apps a:hover,
|
||||
.listing-apps a:focus {
|
||||
left: -10px;
|
||||
top: -10px;
|
||||
box-shadow: none;
|
||||
}
|
||||
.listing-apps a:hover:before,
|
||||
.listing-apps a:focus:before {
|
||||
height: 10px;
|
||||
}
|
||||
.listing-apps a:hover:after,
|
||||
.listing-apps a:focus:after {
|
||||
width: 10px;
|
||||
}
|
||||
|
||||
.listing-apps a:hover:after,
|
||||
.listing-apps a:focus:after,
|
||||
.listing-apps a:hover:before,
|
||||
.listing-apps a:focus:before {
|
||||
background: #333;
|
||||
}
|
||||
|
||||
.listing-apps a:after,
|
||||
.listing-apps a:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
transition: all 0.3s ease;
|
||||
-webkit-transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.listing-apps a:before {
|
||||
width: 100%;
|
||||
height: 0;
|
||||
left: 5px;
|
||||
top: 100%;
|
||||
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.4);
|
||||
transform: skew(45deg, 0deg);
|
||||
-webkit-transform: skew(45deg, 0deg);
|
||||
}
|
||||
|
||||
.listing-apps a:after {
|
||||
width: 0;
|
||||
height: 100%;
|
||||
left: 100%;
|
||||
top: 5px;
|
||||
box-shadow: 5px 0 10px rgba(0, 0, 0, 0.4);
|
||||
transform: skew(0deg, 45deg);
|
||||
-webkit-transform: skew(0deg, 45deg);
|
||||
}
|
||||
|
||||
.listing-apps span {
|
||||
display: block;
|
||||
margin: -1.2em 0 0 0.2em;
|
||||
}
|
||||
.listing-apps .first-letter { margin: 0; }
|
||||
.listing-apps span + span { font-size: 0.3em; }
|
||||
|
||||
@media screen and (max-width: 450px) {
|
||||
.apps {margin: 10% 5%;}
|
||||
.listing-apps a {font-size: 3em;}
|
||||
.listing-apps span + span { font-size: 0.32em; }
|
||||
.listing-apps a:hover,
|
||||
.listing-apps a:focus {left: -5px;top: -5px;}
|
||||
.listing-apps a:hover:before,
|
||||
.listing-apps a:focus:before {height: 5px;}
|
||||
.listing-apps a:hover:after,
|
||||
.listing-apps a:focus:after {width: 5px;}
|
||||
.listing-apps a:before {left: 3px;box-shadow: 0 3px 5px rgba(0, 0, 0, 0.4);}
|
||||
.listing-apps a:after {top: 3px;box-shadow: 3px 0 5px rgba(0, 0, 0, 0.4);}
|
||||
}
|
||||
@media screen and (max-width: 350px) {
|
||||
.listing-apps a {
|
||||
width: 2.5em;
|
||||
height: 2.5em;
|
||||
font-size: 2.8em;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* ==========================================================================
|
||||
3 = User
|
||||
========================================================================== */
|
||||
|
||||
.user-container {
|
||||
display:block;
|
||||
position: relative;
|
||||
max-width: 320px;
|
||||
padding: 0.4em 1em;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.user-container-edit:after,
|
||||
.user-container-password:after {
|
||||
content: '\e803';
|
||||
font-family: 'ynh_ssowat';
|
||||
display: block;
|
||||
height: 1em;
|
||||
width: 1em;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: -16px;
|
||||
z-index: 0;
|
||||
margin-top: -0.75em;
|
||||
font-size: 2em;
|
||||
font-weight: normal;
|
||||
color: #b4b4b4;
|
||||
opacity: 0;
|
||||
transition: all 0.1s ease;
|
||||
-webkit-transition: all 0.1s ease;
|
||||
}
|
||||
.user-container-edit:hover:after,
|
||||
.user-container-password:hover:after {
|
||||
left: -20px;
|
||||
opacity: 1;
|
||||
}
|
||||
@media screen and (max-width: 480px) {
|
||||
.user-container-edit:after,
|
||||
.user-container-password:after {left: -10px;}
|
||||
.user-container-edit:hover:after,
|
||||
.user-container-password:hover:after {left: -14px;}
|
||||
}
|
||||
|
||||
.user-container:before {
|
||||
display: block;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
float: left;
|
||||
margin-right: 10px;
|
||||
content: '\e801';
|
||||
display: block;
|
||||
font-family: 'ynh_ssowat';
|
||||
font-size: 4em;
|
||||
text-align: center;
|
||||
border: 3px solid #fff;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
border-radius: 90px;
|
||||
background: #b4b4b4;
|
||||
color: #dedede;
|
||||
overflow: hidden;
|
||||
transition: all 0.1s ease;
|
||||
-webkit-transition: all 0.1s ease;
|
||||
}
|
||||
.user-container:hover:before {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.user-container .user-username {
|
||||
font-size: 1.5em;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.user-container .user-fullname {
|
||||
font-size: 1em;
|
||||
font-family: 'source_sans_proregular';
|
||||
display: block;
|
||||
margin-top: -0.6em;
|
||||
}
|
||||
|
||||
|
||||
.user-container-info .user-username:after {
|
||||
content: '\e804';
|
||||
font-family: 'ynh_ssowat';
|
||||
color: #b4b4b4;
|
||||
display: inline-block;vertical-align: text-top;
|
||||
font-size: 0.8em;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
margin-left: .5em;
|
||||
opacity: 0;
|
||||
transition: all 0.1s ease;
|
||||
-webkit-transition: all 0.1s ease;
|
||||
}
|
||||
.user-container-info:hover .user-username:after {opacity: 1;}
|
||||
|
||||
.user-container .user-mail {
|
||||
color: #999;
|
||||
font-size: 0.9em;
|
||||
display: block;
|
||||
margin-top: -0.2em;
|
||||
}
|
||||
|
||||
|
||||
.user-menu {
|
||||
float: right;
|
||||
}
|
||||
.user-menu a {
|
||||
color: #999;
|
||||
display: block;
|
||||
padding: 1.25em 1em;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
transition: all 0.1s ease;
|
||||
-webkit-transition: all 0.1s ease;
|
||||
}
|
||||
.user-menu a:hover,
|
||||
.user-menu a:focus {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 480px) {
|
||||
.user-menu {
|
||||
float: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ==========================================================================
|
||||
4 = Forms
|
||||
========================================================================== */
|
||||
|
||||
|
||||
[type="submit"],
|
||||
[type="password"],
|
||||
[type="email"],
|
||||
[type="text"] {
|
||||
/* <3 Apple */
|
||||
-webkit-appearance: none;
|
||||
-webkit-border-radius:0;
|
||||
}
|
||||
|
||||
/* Extend artichaut-buttons.css */
|
||||
.link-btn { background: none;}
|
||||
.link-btn:hover,
|
||||
.link-btn:focus {background: #41444f;text-decoration: underline;}
|
||||
|
||||
|
||||
.form-text {
|
||||
padding: 0.8em;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
.form-section {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
width: 47%;
|
||||
}
|
||||
.form-section + .form-section {margin-left: 5%;}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
.form-section {width: 100%;}
|
||||
.form-section + .form-section {margin-left: 0;}
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-block;
|
||||
padding: 0.3em 1em;
|
||||
background: #30333b;
|
||||
color: #fff;
|
||||
font-size: 1.2em;
|
||||
margin-top: 1em;
|
||||
font-family: 'source_sans_probold';
|
||||
font-weight: normal;
|
||||
}
|
||||
label {cursor: pointer;}
|
||||
|
||||
label + .help-link {
|
||||
display: inline-block;
|
||||
padding: 0.3em 1em;
|
||||
font-size: 1.2em;
|
||||
background: #41444f;
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
transition: all 0.1s ease;
|
||||
-webkit-transition: all 0.1s ease;
|
||||
}
|
||||
label + .help-link:hover {background: #30333b;}
|
||||
|
||||
.btn {
|
||||
cursor: pointer;
|
||||
transition: all 0.1s ease;
|
||||
-webkit-transition: all 0.1s ease;
|
||||
}
|
||||
|
||||
.btn-group {
|
||||
margin: 4em 0;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.form-group {
|
||||
background: none;
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
.form-text {
|
||||
border: 0;
|
||||
background: #797b83;
|
||||
color: #fff;
|
||||
padding: 0.8em;
|
||||
margin-bottom: 0.3em;
|
||||
display: block;
|
||||
position: relative;z-index: 1; /* prevent strange label overlap */
|
||||
transition: all 0.1s ease;
|
||||
-webkit-transition: all 0.1s ease;
|
||||
}
|
||||
.form-test:-moz-placeholder{color:#ccc;}
|
||||
.form-text::-moz-placeholder{color:#ccc;}
|
||||
.form-text:-ms-input-placeholder{color:#ccc;}
|
||||
.form-text::-webkit-input-placeholder{color:#ccc;}
|
||||
:empty:invalid {box-shadow: none;}
|
||||
|
||||
.form-text:last-child {margin-bottom:0;}
|
||||
|
||||
.form-text:hover,
|
||||
.form-text:focus {
|
||||
background-color: #5d5f68;
|
||||
}
|
||||
|
||||
.form-text:disabled { color: #ccc; }
|
||||
.form-text:disabled:hover {background-color:rgba(255, 255, 255, 0.3);}
|
||||
input:disabled {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 480px) {
|
||||
label,
|
||||
label + .help-link {padding: 0.3em 0.8em;}
|
||||
.form-text {padding: 0.8em;}
|
||||
.form-group .btn {padding: 0.5em 0.8em;}
|
||||
}
|
||||
|
||||
/* Login form */
|
||||
|
||||
.login-form {
|
||||
max-width: 21em;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.login-form .btn {
|
||||
width: 100%;
|
||||
padding: 0.8em 1em;
|
||||
}
|
||||
|
||||
.login-form .form-group {
|
||||
position: relative;
|
||||
margin-bottom: 1em;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.login-form label {
|
||||
display: block;
|
||||
min-width: 1em;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.login-form label:before {
|
||||
background: #eee;
|
||||
color: #666;
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 2.5em;
|
||||
height: 100%;
|
||||
line-height: 3em;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.login-form .form-text {
|
||||
padding: 0.8em 0.8em 0.8em 3em;
|
||||
width: 100%;
|
||||
background: #fff;
|
||||
color: #41444f;
|
||||
}
|
||||
.login-form .form-test:-moz-placeholder{color:#999;}
|
||||
.login-form .form-text::-moz-placeholder{color:#999;}
|
||||
.login-form .form-text:-ms-input-placeholder{color:#999;}
|
||||
.login-form .form-text::-webkit-input-placeholder{color:#999;}
|
||||
|
||||
|
||||
/* Edit form*/
|
||||
|
||||
.form-edit .form-group .btn:before {
|
||||
content:"+";
|
||||
display: inline-block;
|
||||
padding-right: 0.75em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
|
||||
@media screen and (min-width: 768px) {
|
||||
.form-edit .btn-group {
|
||||
float: right;
|
||||
}
|
||||
.form-edit .btn-group + .btn-group {
|
||||
float: left;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* ==========================================================================
|
||||
5 = Footer
|
||||
========================================================================== */
|
||||
|
||||
.footer {
|
||||
display: inline-block;
|
||||
width: auto;
|
||||
}
|
||||
.footer nav {
|
||||
margin: 0 1em;
|
||||
padding: 0.25em;
|
||||
border-top: 1px solid #666;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.footer a {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
color: #999;
|
||||
}
|
||||
.footer a:before {
|
||||
content: "•";
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
padding: 0 0.5em 0 0.25em;
|
||||
color: #666;
|
||||
}
|
||||
.footer a:first-child:before {content: none;}
|
||||
|
||||
.footer a:hover,
|
||||
.footer a:active {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 480px) {
|
||||
.footer a {
|
||||
display: block;
|
||||
}
|
||||
.footer a:before {
|
||||
content: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
6 = Colors
|
||||
========================================================================== */
|
||||
|
||||
.listing-apps .purplebg {
|
||||
background: #9B59B6!important;
|
||||
}
|
||||
.purplebg:hover:after,
|
||||
.purplebg:focus:after,
|
||||
.purplebg:hover:before,
|
||||
.purplebg:focus:before {
|
||||
background: #532C64!important;
|
||||
}
|
||||
.yellowbg {
|
||||
background: #F1C40F!important;
|
||||
}
|
||||
.yellowbg:hover:after,
|
||||
.yellowbg:focus:after,
|
||||
.yellowbg:hover:before,
|
||||
.yellowbg:focus:before {
|
||||
background: #796307!important;
|
||||
}
|
||||
.pinkbg {
|
||||
background: #D66D92!important;
|
||||
}
|
||||
.pinkbg:hover:after,
|
||||
.pinkbg:focus:after,
|
||||
.pinkbg:hover:before,
|
||||
.pinkbg:focus:before {
|
||||
background: #992B52!important;
|
||||
}
|
||||
.orangebg {
|
||||
background: #F39C12!important;
|
||||
}
|
||||
.orangebg:hover:after,
|
||||
.orangebg:focus:after,
|
||||
.orangebg:hover:before,
|
||||
.orangebg:focus:before {
|
||||
background: #7F5006!important;
|
||||
}
|
||||
.redbg {
|
||||
background: #E74C3C!important;
|
||||
}
|
||||
.redbg:hover:after,
|
||||
.redbg:focus:after,
|
||||
.redbg:hover:before,
|
||||
.redbg:focus:before {
|
||||
background: #921E12!important;
|
||||
}
|
||||
.turquoisebg {
|
||||
background: #1ABC9C!important;
|
||||
}
|
||||
.turquoisebg:hover:after,
|
||||
.turquoisebg:focus:after,
|
||||
.turquoisebg:hover:before,
|
||||
.turquoisebg:focus:before {
|
||||
background: #0B4C3F!important;
|
||||
}
|
||||
.bluebg {
|
||||
background: #3498DB!important;
|
||||
}
|
||||
.bluebg:hover:after,
|
||||
.bluebg:focus:after,
|
||||
.bluebg:hover:before,
|
||||
.bluebg:focus:before {
|
||||
background: #16527A!important;
|
||||
}
|
||||
.greenbg {
|
||||
background: #2ECC71!important;
|
||||
}
|
||||
.greenbg:hover:after,
|
||||
.greenbg:focus:after,
|
||||
.greenbg:hover:before,
|
||||
.greenbg:focus:before {
|
||||
background: #176437!important;
|
||||
}
|
||||
.darkbluebg {
|
||||
background: #34495E!important;
|
||||
}
|
||||
.darkbluebg:hover:after,
|
||||
.darkbluebg:focus:after,
|
||||
.darkbluebg:hover:before,
|
||||
.darkbluebg:focus:before {
|
||||
background: #07090C!important;
|
||||
}
|
||||
.lightbluebg {
|
||||
background: #6A93D4!important;
|
||||
}
|
||||
.lightbluebg:hover:after,
|
||||
.lightbluebg:focus:after,
|
||||
.lightbluebg:hover:before,
|
||||
.lightbluebg:focus:before {
|
||||
background: #2B5394!important;
|
||||
}
|
||||
.lightpinkbg {
|
||||
background: #F76F87!important;
|
||||
}
|
||||
.lightpinkbg:hover:after,
|
||||
.lightpinkbg:focus:after,
|
||||
.lightpinkbg:hover:before,
|
||||
.lightpinkbg:focus:before {
|
||||
background: #DA0C31!important;
|
||||
}
|
||||
.lightyellow {
|
||||
background: #FFC973!important;
|
||||
}
|
||||
.lightyellow:hover:after,
|
||||
.lightyellow:focus:after,
|
||||
.lightyellow:hover:before,
|
||||
.lightyellow:focus:before {
|
||||
background: #F39500!important;
|
||||
}
|
||||
.lightgreen {
|
||||
background: #B5F36D!important;
|
||||
}
|
||||
.lightgreen:hover:after,
|
||||
.lightgreen:focus:after,
|
||||
.lightgreen:hover:before,
|
||||
.lightgreen:focus:before {
|
||||
background: #77CF11!important;
|
||||
}
|
||||
.purpledarkbg {
|
||||
background: #8E44AD!important;
|
||||
}
|
||||
.purpledarkbg:hover:after,
|
||||
.purpledarkbg:focus:after,
|
||||
.purpledarkbg:hover:before,
|
||||
.purpledarkbg:focus:before {
|
||||
background: #432051!important;
|
||||
}
|
||||
|
||||
|
||||
|
182
portal/assets/css/ynh_overlay.css
Normal file
182
portal/assets/css/ynh_overlay.css
Normal file
|
@ -0,0 +1,182 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contains CSS rules loaded on all apps page (*if* the app nginx's
|
||||
conf does include the appropriate snippet) for the small YunoHost button in
|
||||
bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/* ******************************************************************
|
||||
General
|
||||
******************************************************************* */
|
||||
|
||||
html.ynh-panel-active {
|
||||
/* Disable any scrolling on app */
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
|
||||
body {
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
#ynh-overlay-switch,
|
||||
#ynh-overlay-switch *,
|
||||
#ynh-overlay,
|
||||
#ynh-overlay * {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
|
||||
/* ******************************************************************
|
||||
Button
|
||||
******************************************************************* */
|
||||
#ynh-overlay-switch {
|
||||
display: block;
|
||||
position: fixed;
|
||||
z-index: 10000000;
|
||||
bottom: 20px;
|
||||
right: 35px;
|
||||
width: 100px;
|
||||
height: 90px;
|
||||
padding: 12px;
|
||||
border: 12px solid #41444f;
|
||||
border-radius: 5px;
|
||||
background: #41444f;
|
||||
background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE1LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluICAtLT4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIiBbCgk8IUVOVElUWSBuc19mbG93cyAiaHR0cDovL25zLmFkb2JlLmNvbS9GbG93cy8xLjAvIj4KXT4KPHN2ZyB2ZXJzaW9uPSIxLjEiCgkgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6YT0iaHR0cDovL25zLmFkb2JlLmNvbS9BZG9iZVNWR1ZpZXdlckV4dGVuc2lvbnMvMy4wLyIKCSB4PSIwcHgiIHk9IjBweCIgd2lkdGg9Ijk4cHgiIGhlaWdodD0iODVweCIgdmlld0JveD0iLTAuMjUgLTAuMjUgOTggODUiCgkgb3ZlcmZsb3c9InZpc2libGUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgLTAuMjUgLTAuMjUgOTggODUiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8ZGVmcz4KPC9kZWZzPgo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNOTcsNTFjLTIuMDIsNC45OC04LjMzLDUuNjctMTQsN2MtMC42MDksNi4yOSwzLjA1LDEwLjk1LTEsMTZjLTYuNDEtMC4yNi03LjQ3MS01Ljg1OS03LTEzYy0xLDAtMiwwLTMsMAoJYy0yLjA5LDIuNzcsMC45LDQuNTIsMCw4Yy0xLjEyLDQuMzQtNy44OCw3LjkxLTExLDdjLTIuMTgtMC42NDEtNS45Ni02LjYzLTUtMTJjMi44Mi0yLjcxLDIuNzYsMy4xMiw2LDNjNS4wNS03Ljg0LTkuNjMtOC41NS04LTE3CgljMS4yNC02LjQyLDExLjY2LTkuNjYsMTUtMWMxLjU0LDQuMjEtNS4xNywwLjE2LTUsM2MtMC4yNzksMS42MiwwLjk1LDEuNzIsMSwzYzIuNTIsMC43NywxLjY4LTIuMTYsMy0zYzEuODU5LTEuMTcsMy4wOS0wLjc1LDYtMQoJYzIuNDUtMi41NSwxLjA4LTguOTIsNC0xMWMzLjg3LDAuNDYsNi4wOCwyLjU5LDYsN0M5MS4wMSw0Ni4xMDksOTQuMyw0Ni4wNSw5Nyw1MXoiLz4KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTg3LDEzYzAuNjA5LDMuMjEsMi4zMiw0Ljk4LDIsOGMtMC4zNCwzLjIxLTIuOSw4LjgzLTQsOWMtMS4xNywwLjE4LTEuMzQsMS43OC0yLDIKCWMtNC42NiwxLjU3LTEyLjM5MS0xLjQ4LTE0LTdjLTEuMTYtMy45NywxLjktMTMuMzcsNC0xN2MxLjMtMi4yNSwxLjIyMS0yLjk5LDUtNGMyLjQxLTAuNjUsMy42NS0yLjI1LDYsMAoJYzAuNDcxLDAuNDUsMS4zLDAuNDksMS44NSwwLjg5Yy0wLjE5OSwwLDIsMy4xNCwyLjE1LDQuMTFDODguMzIsMTEuMDcsODYuNzcsMTEuNzgsODcsMTN6IE03OSwyMmMxLjc3OS0xLjg5LDMuMjktNC4wNCwzLTgKCUM3Ny40OSwxMi4zMyw3NC42NywyMS4zLDc5LDIyeiIvPgo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNNjcsMjFjLTAuMDcsNS44MSwyLjQ4LDEwLjcsMCwxNWMtNi43MywxLjA2LTcuMjQtNC4xLTExLTZjLTEuOTM5LDEuMzktMS40OSw1LjE4LTMsNwoJYy0zLjc4LDAuNDQtNC42OS0xLjk3LTctM2MyLjQ3LTcuODEsMS4yNi0xOC45OCwyLTI2YzguNTgtMC41OCw3LjY4LDguMzIsMTIsMTJjMC41Mi00LjM0LTAuMzU5LTE1LjUyLDMtMjAKCUM3MC4zMywzLjI5LDY3LjA5LDEyLjk5LDY3LDIxeiIvPgo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNNTIsNTVjMS45Myw4LjQxLDAuMTIsMjIuNjg5LTEyLDIwYy0xLjU5LTAuMzUtOC40Mi01LjIyLTktN2MtMS42Mi01LDAuMzQtMTMuMzQsMy0xNgoJQzM5LjAzLDQ2Ljk3LDQ1LjQ4LDUwLjM1OSw1Miw1NXogTTM5LDY2YzQuNTUsMC45Niw2LjMtNC4yLDQtN0MzOS4zNyw1OS4wMywzOC42MSw2MS45MzksMzksNjZ6Ii8+CjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zOSw4YzUuNTgsMC45LDYuNCw2LjgxLDUsMTVjLTEuNDMsOC4zOC0zLjAyLDE0LjU5LTksMTVjLTkuNTcsMC42NS0xMi4yNS0xNi42OS05LTI5CgljOC4zMiwxLjI3LDYuNTksMTAuMzYsNiwxN2MyLjcxLDAuODMsMi4yLTAuODUsMy0yQzM3LjA1LDIxLjA0LDM3LjgyLDEzLjYxLDM5LDh6Ii8+CjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0yOCw2MmMwLjEsNS42Nyw0LjQsMTEuMzMsMiwxN2MtNC4zMi0xLjAxLTYuNTctNC4wOS05LTdjLTMuMTUtMC40OC0yLjI2LDMuMDctNiwyCgljLTAuNjcsNS4wNjEsMi4yOSw3LjU3LTEsMTBjLTQuNy0wLjYzLTYuNjYtNC04LThjLTIuNjEtMS4zOC01LjQ4LTIuNTItNi02YzAuMTQtMy41Myw0LjQ4LTIuODUsNy00YzAuNDctNS41My0xLjQxLTEzLjQxLDItMTYKCWM4LjMxLDAuNDksOC4yMSw3LjEzLDcsMTVjNC4zNiwwLjI5LDQuOTQtNC4zNSw1LTdjMC4wNi0yLjQzLTEuODItOC4yNiwyLTExYzMuMDYtMC43MywyLjk0LDEuNzMsNiwxCglDMzIuMzUsNTIuNywyNy45Miw1Ny40MzksMjgsNjJ6Ii8+CjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0yNCwxMmMxLjA3LDcuMDctMy44Niw4LjE0LTYsMTJjMC4yMSw2Ljg4LTAuNDcsMTIuODYtMiwxOGMtNS44Ni0xLjMyLTguNy0xMC4zOC02LTE3CgljLTAuMzMtMy41Mi01LjI2LTQuMjItNy04Yy0wLjMtMC42Ni0wLjQ3LTQuNDMtMS03QzEuMDksNS42MywwLjU1LDQuMzEsMywxYzguMTYtMC40OSw3LjIxLDguMTMsOSwxNGM1LjA1LDAuMzksMy45MS01LjQyLDgtNgoJQzIwLjk4LDEwLjM1LDIyLjY3LDExLDI0LDEyeiIvPgo8L3N2Zz4K);
|
||||
background-position: center center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
opacity: 0.7;
|
||||
}
|
||||
/*#ynh-overlay-switch.visible,*/
|
||||
#ynh-overlay-switch:hover {
|
||||
background-color: #41444f;
|
||||
border-color: #41444f;
|
||||
background-color: #111;
|
||||
border-color: #111;
|
||||
}
|
||||
|
||||
|
||||
/* ******************************************************************
|
||||
Overlay
|
||||
******************************************************************* */
|
||||
|
||||
/* Background */
|
||||
#ynh-overlay {
|
||||
overflow-y: hidden;
|
||||
position: fixed;
|
||||
top:0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 9999999;
|
||||
display: none;
|
||||
border: none;
|
||||
color:#fff;
|
||||
background: #41444F;
|
||||
transition: all 0.2s ease;
|
||||
-moz-transition: all 0.2s ease;
|
||||
-webkit-transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
|
||||
/* ******************************************************************
|
||||
Animation
|
||||
******************************************************************* */
|
||||
|
||||
/*FadeIn*/
|
||||
@-webkit-keyframes ynhFadeIn {
|
||||
0% {
|
||||
visibility: hidden;
|
||||
opacity:0;
|
||||
}
|
||||
100% {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes ynhFadeIn {
|
||||
0% {
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.ynh-fadeIn {
|
||||
-webkit-animation-name: ynhFadeIn;
|
||||
animation-name: ynhFadeIn;
|
||||
-webkit-animation-duration: 0.5s;
|
||||
animation-duration: 0.5s;
|
||||
-webkit-animation-fill-mode: both;
|
||||
animation-fill-mode: both;
|
||||
-webkit-animation-timing-function: cubic-bezier(0.165, 0.840, 0.440, 1.000);
|
||||
animation-timing-function: cubic-bezier(0.165, 0.840, 0.440, 1.000);
|
||||
}
|
||||
/*
|
||||
.ynh-fadeIn.ynh-delay {
|
||||
animation-delay: 0.5s;
|
||||
-webkit-animation-delay: 0.5s;
|
||||
}
|
||||
*/
|
||||
|
||||
/*FadeOut*/
|
||||
@-webkit-keyframes ynhFadeOut {
|
||||
0% {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
@keyframes ynhFadeOut {
|
||||
0% {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
.ynh-fadeOut {
|
||||
-webkit-animation-name: ynhFadeOut;
|
||||
animation-name: ynhFadeOut;
|
||||
-webkit-animation-duration: 0.2s;
|
||||
animation-duration: 0.2s;
|
||||
-webkit-animation-fill-mode: both;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
/*
|
||||
.ynh-fadeOut.ynh-delay {
|
||||
animation-delay: 0.5s;
|
||||
-webkit-animation-delay: 0.5s;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/* ******************************************************************
|
||||
Media Queries
|
||||
******************************************************************* */
|
||||
|
||||
@media screen and (max-width: 500px) {
|
||||
#ynh-overlay-switch {
|
||||
width: 80px;
|
||||
height: 75px;
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,35 +0,0 @@
|
|||
document.addEventListener('DOMContentLoaded', function() {
|
||||
|
||||
// Variables
|
||||
var liMenu = document.querySelectorAll('#apps a')
|
||||
, colors = ['bluebg','purplebg','redbg','orangebg','greenbg','darkbluebg','lightbluebg','yellowbg','lightpinkbg']
|
||||
, addMailAlias = document.getElementById('add-mailalias')
|
||||
, addMaildrop = document.getElementById('add-maildrop')
|
||||
;
|
||||
|
||||
liMenu && [].forEach.call(liMenu, function(el, i) {
|
||||
// Add color class.
|
||||
el.classList.add(colors[i%colors.length]);
|
||||
// Set first-letter data attribute.
|
||||
el.querySelector('.first-letter').setAttribute('data-first-letter',el.textContent.substring(0, 2));
|
||||
});
|
||||
|
||||
addMailAlias && addMailAlias.addEventListener('click', function(){
|
||||
// Clone last input.
|
||||
var inputAliasClone = document.querySelector('.mailalias-input').cloneNode(true);
|
||||
// Empty value.
|
||||
inputAliasClone.value = '';
|
||||
// Append to form-group.
|
||||
addMailAlias.parentNode.insertBefore(inputAliasClone, addMailAlias);
|
||||
});
|
||||
|
||||
addMaildrop && addMaildrop.addEventListener('click', function(){
|
||||
// Clone last input.
|
||||
var inputDropClone = document.querySelector('.maildrop-input').cloneNode(true);
|
||||
// Empty value.
|
||||
inputDropClone.value = '';
|
||||
// Append to form-group.
|
||||
addMaildrop.parentNode.insertBefore(inputDropClone, addMaildrop);
|
||||
});
|
||||
|
||||
});
|
6
portal/assets/js/jquery-1.10.2.min.js
vendored
6
portal/assets/js/jquery-1.10.2.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
401
portal/assets/js/ynh_portal.js
Normal file
401
portal/assets/js/ynh_portal.js
Normal file
|
@ -0,0 +1,401 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This JS file is loaded :
|
||||
- in the YunoHost user portal
|
||||
- on every app page if the app nginx's conf does include the ynh snippet
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
=====================
|
||||
Utilities
|
||||
=====================
|
||||
*/
|
||||
|
||||
/* Console log fix */
|
||||
if (typeof(console) === 'undefined') {
|
||||
var console = {};
|
||||
console.log = console.error = console.info = console.debug = console.warn = console.trace = console.dir = console.dirxml = console.group = console.groupEnd = console.time = console.timeEnd = console.assert = console.profile = function() {};
|
||||
}
|
||||
|
||||
/* Cookies utilities */
|
||||
function setCookie(cName, cValue, expDays) {
|
||||
let date = new Date();
|
||||
date.setTime(date.getTime() + (expDays * 24 * 60 * 60 * 1000));
|
||||
const expires = "expires=" + date.toUTCString();
|
||||
document.cookie = cName + "=" + cValue + "; " + expires + "; path=/";
|
||||
}
|
||||
function getCookie(cName) {
|
||||
const name = cName + "=";
|
||||
const cDecoded = decodeURIComponent(document.cookie); //to be careful
|
||||
const cArr = cDecoded .split('; ');
|
||||
let res;
|
||||
cArr.forEach(val => {
|
||||
if (val.indexOf(name) === 0) res = val.substring(name.length);
|
||||
})
|
||||
return res;
|
||||
}
|
||||
|
||||
/* Array utilities
|
||||
https://github.com/Darklg/JavaScriptUtilities/blob/master/assets/js/vanilla-js/libs/vanilla-arrays.js
|
||||
-------------------------- */
|
||||
Array.contains = function(needle, haystack) {
|
||||
var i = 0,
|
||||
length = haystack.length;
|
||||
|
||||
for (; i < length; i++) {
|
||||
if (haystack[i] === needle) return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
Array.each = function(arrayToParse, callback) {
|
||||
var i = 0,
|
||||
length = arrayToParse.length;
|
||||
for (; i < length; i++) {
|
||||
callback(arrayToParse[i]);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* CSS classes utilities
|
||||
https://github.com/Darklg/JavaScriptUtilities/blob/master/assets/js/vanilla-js/libs/vanilla-classes.js
|
||||
-------------------------- */
|
||||
Element.getClassNames = function(element) {
|
||||
var classNames = [],
|
||||
elementClassName = element.className;
|
||||
if (elementClassName !== '') {
|
||||
elementClassName = elementClassName.replace(/\s+/g, ' ');
|
||||
classNames = elementClassName.split(' ');
|
||||
}
|
||||
return classNames;
|
||||
};
|
||||
Element.hasClass = function(element, className) {
|
||||
if (element.classList) {
|
||||
return element.classList.contains(className);
|
||||
}
|
||||
return Array.contains(className, Element.getClassNames(element));
|
||||
};
|
||||
Element.addClass = function(element, className) {
|
||||
if (element.classList) {
|
||||
element.classList.add(className);
|
||||
return;
|
||||
}
|
||||
if (!Element.hasClass(element, className)) {
|
||||
var elementClasses = Element.getClassNames(element);
|
||||
elementClasses.push(className);
|
||||
element.className = elementClasses.join(' ');
|
||||
}
|
||||
};
|
||||
Element.removeClass = function(element, className) {
|
||||
if (element.classList) {
|
||||
element.classList.remove(className);
|
||||
return;
|
||||
}
|
||||
var elementClasses = Element.getClassNames(element);
|
||||
var newElementClasses = [];
|
||||
var i = 0,
|
||||
arLength = elementClasses.length;
|
||||
for (; i < arLength; i++) {
|
||||
if (elementClasses[i] !== className) {
|
||||
newElementClasses.push(elementClasses[i]);
|
||||
}
|
||||
}
|
||||
element.className = newElementClasses.join(' ');
|
||||
};
|
||||
Element.toggleClass = function(element, className) {
|
||||
if (!Element.hasClass(element, className)) {
|
||||
Element.addClass(element, className);
|
||||
}
|
||||
else {
|
||||
Element.removeClass(element, className);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/* Add Event
|
||||
https://github.com/Darklg/JavaScriptUtilities/blob/master/assets/js/vanilla-js/libs/vanilla-events.js
|
||||
-------------------------- */
|
||||
window.addEvent = function(el, eventName, callback, options) {
|
||||
if (el == null) { return; }
|
||||
if (el.addEventListener) {
|
||||
if (!options || typeof(options) !== "object") {
|
||||
options = {};
|
||||
}
|
||||
|
||||
options.capture = false;
|
||||
el.addEventListener(eventName, callback, options);
|
||||
}
|
||||
else if (el.attachEvent) {
|
||||
el.attachEvent("on" + eventName, function(e) {
|
||||
return callback.call(el, e);
|
||||
});
|
||||
}
|
||||
};
|
||||
window.eventPreventDefault = function(event) {
|
||||
return (event.preventDefault) ? event.preventDefault() : event.returnValue = false;
|
||||
};
|
||||
|
||||
|
||||
/* Draggable
|
||||
|
||||
Sources :
|
||||
http://jsfiddle.net/5t3Ju/
|
||||
http://stackoverflow.com/questions/9334084/moveable-draggable-div
|
||||
http://jsfiddle.net/tovic/Xcb8d/light/
|
||||
-------------------------- */
|
||||
|
||||
function make_element_draggable(id) {
|
||||
|
||||
// Variables
|
||||
this.elem = document.getElementById(id),
|
||||
this.selected = null, // Selected element
|
||||
this.dragged = false, // Dragging status
|
||||
this.x_pos = 0, this.y_pos = 0, // Stores x & y coordinates of the mouse pointer
|
||||
this.x_elem = 0, this.y_elem = 0; // Stores top, left values (edge) of the element
|
||||
|
||||
var _initDrag = function(e){
|
||||
if (e.type === "touchstart"){
|
||||
x_pos = e.touches[0].clientX;
|
||||
y_pos = e.touches[0].clientY;
|
||||
}
|
||||
|
||||
selected = elem;
|
||||
x_elem = x_pos - selected.offsetLeft;
|
||||
y_elem = y_pos - selected.offsetTop;
|
||||
|
||||
// We add listening event for the iframe itself ...
|
||||
// otherwise dragging the tile on the iframe doesn't
|
||||
// work properly.
|
||||
// We do this at click time to have a better chance
|
||||
// that the iframe's body is indeed loaded ...
|
||||
// (a bit hackish but meh)
|
||||
portalOverlay = document.getElementById("ynh-overlay").contentDocument.body;
|
||||
window.addEvent(portalOverlay, 'mousemove', _onMove);
|
||||
window.addEvent(portalOverlay, 'touchmove', _onMove, {passive: false});
|
||||
};
|
||||
|
||||
var _shutDrag = function(e){
|
||||
selected = null;
|
||||
};
|
||||
|
||||
var _onMove = function(e){
|
||||
// Get position
|
||||
x_pos = document.all ? window.event: e.pageX;
|
||||
y_pos = document.all ? window.event : e.pageY;
|
||||
|
||||
if (e.type === "touchmove") {
|
||||
x_pos = e.touches[0].clientX;
|
||||
y_pos = e.touches[0].clientY;
|
||||
}
|
||||
|
||||
if (selected !== null) {
|
||||
if (e.type === "touchmove"){
|
||||
event.preventDefault();
|
||||
}
|
||||
dragged = true;
|
||||
selected.style.left = (x_pos - x_elem) + 'px';
|
||||
selected.style.top = (y_pos - y_elem) + 'px';
|
||||
// Store positions in cookies
|
||||
setCookie('ynh_overlay_top', selected.style.top, 30);
|
||||
setCookie('ynh_overlay_left', selected.style.left, 30);
|
||||
}
|
||||
};
|
||||
|
||||
// Prevent native D'n'D behavior
|
||||
window.addEvent(elem, 'dragstart', function(e){
|
||||
window.eventPreventDefault(e);
|
||||
});
|
||||
|
||||
// Start dragging
|
||||
window.addEvent(elem, 'mousedown', _initDrag);
|
||||
window.addEvent(elem, 'touchstart', _initDrag);
|
||||
|
||||
// Will be called when user dragging an element
|
||||
window.addEvent(window, 'mousemove', _onMove);
|
||||
window.addEvent(window, 'touchmove', _onMove, {passive: false});
|
||||
|
||||
// Destroy the object when we are done
|
||||
window.addEvent(window, 'mouseup', _shutDrag);
|
||||
window.addEvent(window, 'touchend', _shutDrag);
|
||||
window.addEvent(window, 'touchcancel', _shutDrag);
|
||||
|
||||
// Handle click event
|
||||
window.addEvent(elem, 'click', function(e){
|
||||
// Prevent default event
|
||||
window.eventPreventDefault(e);
|
||||
|
||||
// Do not propagate to other click event if dragged out
|
||||
if (dragged) {
|
||||
e.stopImmediatePropagation();
|
||||
}
|
||||
// Reset dragging status
|
||||
dragged = false;
|
||||
});
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------
|
||||
Main
|
||||
---------------------------------------------------------- */
|
||||
window.addEvent(document, 'DOMContentLoaded', function() {
|
||||
|
||||
// 3 different cases :
|
||||
// - this script is loaded from inside an app
|
||||
// - this script is loaded inside the portal, inside an iframe/overlay activated by clicking the portal button inside an app
|
||||
// - this script is loaded inside the "regular" portal when going to /yunohost/sso.
|
||||
|
||||
var in_app = ! document.body.classList.contains('ynh-user-portal');
|
||||
var in_overlay_iframe = (window.location != window.parent.location);
|
||||
|
||||
if (in_app)
|
||||
{
|
||||
// Do not load inside an app iframe (Roundcube visualisation panel for example).
|
||||
if (window.frameElement == null) {
|
||||
init_portal_button_and_overlay();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
init_portal();
|
||||
if (in_overlay_iframe) { tweak_portal_when_in_iframe(); }
|
||||
}
|
||||
});
|
||||
|
||||
//
|
||||
// This function is called when ynh_portal.js is included in an app
|
||||
//
|
||||
// It will create the small yunohost "portal button" usually in the bottom
|
||||
// right corner and initialize the portal overlay, shown when clicking the
|
||||
// portal button meant to make it easier to switch between apps.
|
||||
//
|
||||
function init_portal_button_and_overlay()
|
||||
{
|
||||
// Set and store meta viewport
|
||||
var meta_viewport = document.querySelector('meta[name="viewport"]');
|
||||
if (meta_viewport === null) {
|
||||
meta_viewport = document.createElement('meta');
|
||||
meta_viewport.setAttribute('name', "viewport");
|
||||
meta_viewport.setAttribute('content', "");
|
||||
document.getElementsByTagName('head')[0].insertBefore(meta_viewport, null);
|
||||
}
|
||||
meta_viewport = document.querySelector('meta[name="viewport"]');
|
||||
meta_viewport_content = meta_viewport.getAttribute('content');
|
||||
|
||||
// Prepare and inject the portal overlay (what is activated when clicking on the portal button)
|
||||
var portalOverlay = document.createElement('iframe');
|
||||
portalOverlay.src = "/yunohost/sso/portal.html";
|
||||
portalOverlay.setAttribute("id","ynh-overlay");
|
||||
portalOverlay.setAttribute("style","display: none;"); // make sure the overlay is invisible already when loading it
|
||||
// portalOverlay.setAttribute("class","ynh-fadeOut"); // set overlay as masked when loading it
|
||||
document.body.insertBefore(portalOverlay, null);
|
||||
|
||||
// Inject portal button
|
||||
var portalButton = document.createElement('a');
|
||||
portalButton.setAttribute('id', 'ynh-overlay-switch');
|
||||
portalButton.setAttribute('href', '/yunohost/sso/');
|
||||
portalButton.setAttribute('class', 'disableAjax');
|
||||
// Checks if cookies exist and apply positioning
|
||||
if (getCookie('ynh_overlay_top') != null && getCookie('ynh_overlay_left') != null) {
|
||||
portalButton.style.top = getCookie('ynh_overlay_top');
|
||||
portalButton.style.left = getCookie('ynh_overlay_left');
|
||||
}
|
||||
document.body.insertBefore(portalButton, null);
|
||||
// Make portal button draggable, for user convenience
|
||||
make_element_draggable('ynh-overlay-switch');
|
||||
|
||||
// Bind portal button
|
||||
window.addEvent(portalButton, 'click', function(e){
|
||||
// Prevent default click
|
||||
window.eventPreventDefault(e);
|
||||
// Toggle overlay on YNHPortal button click
|
||||
Element.toggleClass(document.querySelector('html'), 'ynh-panel-active');
|
||||
Element.toggleClass(portalOverlay, 'ynh-active');
|
||||
|
||||
if (Element.hasClass(portalOverlay, 'ynh-active')) {
|
||||
portalOverlay.setAttribute("style","display: block;");
|
||||
meta_viewport.setAttribute('content', meta_viewport_content);
|
||||
Element.addClass(portalOverlay, 'ynh-fadeIn');
|
||||
Element.removeClass(portalOverlay, 'ynh-fadeOut');
|
||||
} else {
|
||||
portalOverlay.setAttribute("style","display: none;");
|
||||
meta_viewport.setAttribute('content', "width=device-width");
|
||||
Element.removeClass(portalOverlay, 'ynh-fadeIn');
|
||||
Element.addClass(portalOverlay, 'ynh-fadeOut');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//
|
||||
// This function is called to initialize elements like the app tile colors and other things ...
|
||||
//
|
||||
function init_portal()
|
||||
{
|
||||
|
||||
window.addEvent(document.getElementById('add-mailalias'), "click", function() {
|
||||
// Clone last input.
|
||||
var inputAliasClone = document.querySelector('.mailalias-input').cloneNode(true);
|
||||
// Empty value.
|
||||
inputAliasClone.value = '';
|
||||
// Append to form-group.
|
||||
this.parentNode.insertBefore(inputAliasClone, this);
|
||||
});
|
||||
|
||||
window.addEvent(document.getElementById('add-maildrop'), "click", function() {
|
||||
// Clone last input.
|
||||
var inputDropClone = document.querySelector('.maildrop-input').cloneNode(true);
|
||||
// Empty value.
|
||||
inputDropClone.value = '';
|
||||
// Append to form-group.
|
||||
this.parentNode.insertBefore(inputDropClone, this);
|
||||
});
|
||||
|
||||
Array.each(document.getElementsByClassName("app-tile"), function(el) {
|
||||
// Set first-letter data attribute.
|
||||
el.querySelector('.first-letter').innerHTML = el.getAttribute("data-appname").substring(0, 2);
|
||||
// handle app links so they work both in plain info page and in the info iframe called from ynh_portal.js
|
||||
window.addEvent(el, 'click', function(event) {
|
||||
// if asked to open in new tab
|
||||
if (event.ctrlKey || event.shiftKey || event.metaKey
|
||||
|| (event.button && event.button == 1)) {
|
||||
return
|
||||
}
|
||||
// if asked in current tab
|
||||
else {
|
||||
event.preventDefault();
|
||||
parent.location.href=this.href;
|
||||
return false;
|
||||
};
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function tweak_portal_when_in_iframe()
|
||||
{
|
||||
// Set class to body to show we're in overlay
|
||||
document.body.classList.add('in_app_overlay');
|
||||
let userContainer = document.querySelector('a.user-container');
|
||||
if (userContainer) {
|
||||
userContainer.classList.replace('user-container-info', 'user-container-edit');
|
||||
userContainer.setAttribute('href', userContainer
|
||||
.getAttribute('href')
|
||||
.replace('edit.html', ''));
|
||||
window.addEvent(userContainer, 'click', function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
window.parent.location.href = userContainer.getAttribute('href');
|
||||
});
|
||||
}
|
||||
let logoutButton = document.getElementById('ynh-logout');
|
||||
if (logoutButton)
|
||||
{
|
||||
// We force to do the logout "globally", not just in the
|
||||
// iframe, otherwise after login out the url might still be
|
||||
// domain.tld/app which is weird ...
|
||||
window.addEvent(logoutButton, 'click', function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
window.parent.location.href = logoutButton.getAttribute("href");
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1,244 +0,0 @@
|
|||
/* ----------------------------------------------------------
|
||||
Utilities
|
||||
---------------------------------------------------------- */
|
||||
|
||||
/* Console log fix
|
||||
-------------------------- */
|
||||
if (typeof(console) === 'undefined') {
|
||||
var console = {};
|
||||
console.log = console.error = console.info = console.debug = console.warn = console.trace = console.dir = console.dirxml = console.group = console.groupEnd = console.time = console.timeEnd = console.assert = console.profile = function() {};
|
||||
}
|
||||
|
||||
|
||||
/* Array utilities
|
||||
https://github.com/Darklg/JavaScriptUtilities/blob/master/assets/js/vanilla-js/libs/vanilla-arrays.js
|
||||
-------------------------- */
|
||||
Array.contains = function(needle, haystack) {
|
||||
var i = 0,
|
||||
length = haystack.length;
|
||||
|
||||
for (; i < length; i++) {
|
||||
if (haystack[i] === needle) return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
Array.each = function(arrayToParse, callback) {
|
||||
var i = 0,
|
||||
length = arrayToParse.length;
|
||||
for (; i < length; i++) {
|
||||
callback(arrayToParse[i]);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* CSS classes utilities
|
||||
https://github.com/Darklg/JavaScriptUtilities/blob/master/assets/js/vanilla-js/libs/vanilla-classes.js
|
||||
-------------------------- */
|
||||
Element.getClassNames = function(element) {
|
||||
var classNames = [],
|
||||
elementClassName = element.className;
|
||||
if (elementClassName !== '') {
|
||||
elementClassName = elementClassName.replace(/\s+/g, ' ');
|
||||
classNames = elementClassName.split(' ');
|
||||
}
|
||||
return classNames;
|
||||
};
|
||||
Element.hasClass = function(element, className) {
|
||||
if (element.classList) {
|
||||
return element.classList.contains(className);
|
||||
}
|
||||
return Array.contains(className, Element.getClassNames(element));
|
||||
};
|
||||
Element.addClass = function(element, className) {
|
||||
if (element.classList) {
|
||||
element.classList.add(className);
|
||||
return;
|
||||
}
|
||||
if (!Element.hasClass(element, className)) {
|
||||
var elementClasses = Element.getClassNames(element);
|
||||
elementClasses.push(className);
|
||||
element.className = elementClasses.join(' ');
|
||||
}
|
||||
};
|
||||
Element.removeClass = function(element, className) {
|
||||
if (element.classList) {
|
||||
element.classList.remove(className);
|
||||
return;
|
||||
}
|
||||
var elementClasses = Element.getClassNames(element);
|
||||
var newElementClasses = [];
|
||||
var i = 0,
|
||||
arLength = elementClasses.length;
|
||||
for (; i < arLength; i++) {
|
||||
if (elementClasses[i] !== className) {
|
||||
newElementClasses.push(elementClasses[i]);
|
||||
}
|
||||
}
|
||||
element.className = newElementClasses.join(' ');
|
||||
};
|
||||
Element.toggleClass = function(element, className) {
|
||||
if (!Element.hasClass(element, className)) {
|
||||
Element.addClass(element, className);
|
||||
}
|
||||
else {
|
||||
Element.removeClass(element, className);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/* Add Event
|
||||
https://github.com/Darklg/JavaScriptUtilities/blob/master/assets/js/vanilla-js/libs/vanilla-events.js
|
||||
-------------------------- */
|
||||
window.addEvent = function(el, eventName, callback) {
|
||||
if (el.addEventListener) {
|
||||
el.addEventListener(eventName, callback, false);
|
||||
}
|
||||
else if (el.attachEvent) {
|
||||
el.attachEvent("on" + eventName, function(e) {
|
||||
return callback.call(el, e);
|
||||
});
|
||||
}
|
||||
};
|
||||
window.eventPreventDefault = function(event) {
|
||||
return (event.preventDefault) ? event.preventDefault() : event.returnValue = false;
|
||||
};
|
||||
|
||||
|
||||
/* Smallest DOMReady
|
||||
http://dustindiaz.com/smallest-domready-ever
|
||||
-------------------------- */
|
||||
function domReady(cb) {
|
||||
/in/.test(document.readyState) // in = loadINg
|
||||
? setTimeout('domReady('+cb+')', 9)
|
||||
: cb();
|
||||
}
|
||||
|
||||
|
||||
/* ----------------------------------------------------------
|
||||
Main
|
||||
---------------------------------------------------------- */
|
||||
domReady(function(){
|
||||
// Don't do this in iframe
|
||||
if (window.self !== window.top) {return false;}
|
||||
|
||||
// Set and store meta viewport
|
||||
var meta_viewport = document.querySelector('meta[name="viewport"]');
|
||||
if (meta_viewport === null) {
|
||||
meta_viewport = document.createElement('meta');
|
||||
meta_viewport.setAttribute('name', "viewport");
|
||||
meta_viewport.setAttribute('content', "");
|
||||
document.getElementsByTagName('head')[0].insertBefore(meta_viewport, null);
|
||||
}
|
||||
meta_viewport = document.querySelector('meta[name="viewport"]');
|
||||
meta_viewport_content = meta_viewport.getAttribute('content');
|
||||
|
||||
// Add portal stylesheet
|
||||
var portalStyle = document.createElement("link");
|
||||
portalStyle.setAttribute("rel", "stylesheet");
|
||||
portalStyle.setAttribute("type", "text/css");
|
||||
portalStyle.setAttribute("href", '/ynhpanel.css');
|
||||
document.getElementsByTagName("head")[0].insertBefore(portalStyle, null);
|
||||
|
||||
// Create portal link
|
||||
var portal = document.createElement('a');
|
||||
portal.setAttribute('id', 'ynhportal');
|
||||
portal.setAttribute('href', '/yunohost/sso/');
|
||||
portal.setAttribute('class', 'disableAjax');
|
||||
document.body.insertBefore(portal, null);
|
||||
|
||||
// Create overlay element
|
||||
var overlay = document.createElement("div");
|
||||
overlay.setAttribute("id","ynhoverlay");
|
||||
overlay.setAttribute("style","display:none");
|
||||
|
||||
document.body.insertBefore(overlay, null);
|
||||
|
||||
//Color Application
|
||||
var colors = ['bluebg','purplebg','redbg','orangebg','greenbg','darkbluebg','lightbluebg','yellowbg','lightpinkbg'];
|
||||
|
||||
// Get user's app
|
||||
var r = new XMLHttpRequest();
|
||||
r.open("GET", "/ynhpanel.json", true);
|
||||
r.onreadystatechange = function () {
|
||||
// Die if error
|
||||
if (r.readyState != 4 || r.status != 200) return;
|
||||
|
||||
// Response is JSON
|
||||
response = JSON.parse(r.responseText);
|
||||
|
||||
// Add overlay header
|
||||
overlay.innerHTML += '<div id="yuno-user" class="wrapper info">' +
|
||||
'<ul class="ul-reset user-menu"><li><a class="icon icon-connexion disableAjax" href="'+ response.portal_url +'?action=logout">'+response.t_logout+'</a></li></ul>'+
|
||||
'<a class="user-container user-container-info disableAjax" href="'+ response.portal_url +'edit.html">' +
|
||||
'<h2 class="user-username">'+ response.uid +'</h2>' +
|
||||
'<small class="user-fullname">'+ response.givenName + ' ' + response.sn +'</small>' +
|
||||
'<span class="user-mail">'+ response.mail +'</span>' +
|
||||
'</a>'
|
||||
'</div>';
|
||||
|
||||
|
||||
// Add application links
|
||||
var links = [];
|
||||
Array.prototype.forEach.call(response.app, function(app, n){
|
||||
links.push('<li><a class="'+colors[n%colors.length]+' disableAjax" href="//'+app.url+'"><span class="first-letter" data-first-letter="'+ app.name.substr(0,2) +'"></span><span class="sourcePro">'+app.name+'</span></a></li>');
|
||||
});
|
||||
overlay.innerHTML += '<div id="yuno-apps" class="wrapper apps"><ul class="ul-reset listing-apps col colNomarge sourceProBold">'+ links.join("\n") +'</ul></div>';
|
||||
|
||||
// Add footer links
|
||||
overlay.innerHTML += '<div id="yuno-footer" class="wrapper footer"><nav>' + "\n" +
|
||||
'<a class="link-profile-edit" href="/yunohost/sso/edit.html">'+ response.t_footerlink_edit +'</a>' + "\n" +
|
||||
'<a class="link-documentation" href="//yunohost.org/docs" target="_blank">'+ response.t_footerlink_documentation +'</a>' + "\n" +
|
||||
'<a class="link-documentation" href="//yunohost.org/support" target="_blank">'+ response.t_footerlink_support +'</a>' + "\n" +
|
||||
'<a class="link-admin" href="/yunohost/admin">'+ response.t_footerlink_administration +'</a>' + "\n" +
|
||||
'</nav></div>';
|
||||
|
||||
// Add overlay to DOM
|
||||
var btn = document.getElementById('logo'),
|
||||
yunoverlay = document.getElementById('ynhoverlay'),
|
||||
user = document.getElementById('yuno-user'),
|
||||
apps = document.getElementById('yuno-apps');
|
||||
|
||||
var pfx = ["webkit", "moz", "MS", "o", ""];
|
||||
function PrefixedEvent(element, type, callback) {
|
||||
for (var p = 0; p < pfx.length; p++) {
|
||||
if (!pfx[p]) type = type.toLowerCase();
|
||||
element.addEventListener(pfx[p]+type, callback, false);
|
||||
}
|
||||
}
|
||||
|
||||
// Bind YNH Button
|
||||
window.addEvent(portal, 'click', function(e){
|
||||
// Prevent default click
|
||||
window.eventPreventDefault(e);
|
||||
// Toggle overlay on YNHPortal button
|
||||
//Element.toggleClass(overlay, 'visible');
|
||||
Element.toggleClass(portal, 'visible');
|
||||
Element.toggleClass(document.querySelector('html'), 'ynh-panel-active');
|
||||
|
||||
|
||||
if(yunoverlay.classList.contains('yuno-active')) {
|
||||
meta_viewport.setAttribute('content', meta_viewport_content);
|
||||
yunoverlay.classList.add('yuno-fadeOut');
|
||||
PrefixedEvent(yunoverlay, "AnimationEnd", function(){
|
||||
if(yunoverlay.classList.contains('yuno-fadeOut')) {
|
||||
yunoverlay.classList.remove('yuno-active');
|
||||
}
|
||||
});
|
||||
apps.classList.remove('yuno-fadeIn', 'yuno-delay');
|
||||
apps.classList.remove('yuno-fadeInLeft', 'yuno-delay');
|
||||
user.classList.remove('yuno-slideintop');
|
||||
}else {
|
||||
meta_viewport.setAttribute('content', "width=device-width");
|
||||
yunoverlay.classList.remove('yuno-fadeOut');
|
||||
yunoverlay.classList.add('yuno-active');
|
||||
|
||||
apps.classList.add('yuno-fadeInLeft', 'yuno-delay');
|
||||
user.classList.add('yuno-slideintop');
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
r.send();
|
||||
|
||||
});
|
BIN
portal/assets/themes/clouds/background.jpg
Normal file
BIN
portal/assets/themes/clouds/background.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 299 KiB |
BIN
portal/assets/themes/clouds/cloud.png
Normal file
BIN
portal/assets/themes/clouds/cloud.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
17
portal/assets/themes/clouds/custom_overlay.css
Normal file
17
portal/assets/themes/clouds/custom_overlay.css
Normal file
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file may contain extra CSS rules loaded on all apps page (*if* the app
|
||||
nginx's conf does include the appropriate snippet) for the small YunoHost
|
||||
button in bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
||||
#ynh-overlay-switch {
|
||||
background-image: url("./cloud.png");
|
||||
}
|
43
portal/assets/themes/clouds/custom_portal.css
Normal file
43
portal/assets/themes/clouds/custom_portal.css
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contain extra CSS rules to customize the YunoHost user portal and
|
||||
can be used to customize app tiles, buttons, etc...
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/* Make page texts black */
|
||||
.user-container h2,
|
||||
.user-container small,
|
||||
.user-container .user-mail,
|
||||
.user-container .user-mail,
|
||||
.content .footer a,
|
||||
a.app-tile,
|
||||
#ynh-logout {
|
||||
color: black !important;
|
||||
}
|
||||
|
||||
.ynh-user-portal {
|
||||
background-image: url("background.jpg");
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/* Apps colors */
|
||||
.app-tile {
|
||||
background-color: rgba(255, 255, 255, 0.5) !important;
|
||||
}
|
||||
|
||||
.app-tile:hover:after,
|
||||
.app-tile:focus:after,
|
||||
.app-tile:hover:before,
|
||||
.app-tile:focus:before {
|
||||
background: rgba(255, 255, 255, 0.5) !important;
|
||||
}
|
||||
|
||||
/* Use a custom logo image */
|
||||
#ynh-logo {
|
||||
z-index: 10;
|
||||
background-image: url("./cloud.png");
|
||||
}
|
33
portal/assets/themes/clouds/custom_portal.js
Normal file
33
portal/assets/themes/clouds/custom_portal.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This JS file may be used to customize the YunoHost user portal *and* also
|
||||
will be loaded in all app pages if the app nginx's conf does include the
|
||||
appropriate snippet.
|
||||
|
||||
You can monkeypatch init_portal (loading of the user portal) and
|
||||
init_portal_button_and_overlay (loading of the button and overlay...) to do
|
||||
custom stuff
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
* Monkeypatch init_portal to customize the app tile style
|
||||
*
|
||||
init_portal_original = init_portal;
|
||||
init_portal = function()
|
||||
{
|
||||
init_portal_original();
|
||||
// Some stuff here
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
* Monkey patching example to do custom stuff when loading inside an app
|
||||
*
|
||||
init_portal_button_and_overlay_original = init_portal_button_and_overlay;
|
||||
init_portal_button_and_overlay = function()
|
||||
{
|
||||
init_portal_button_and_overlay_original();
|
||||
// Custom stuff to do when loading inside an app
|
||||
}
|
||||
*/
|
14
portal/assets/themes/default/custom_overlay.css
Normal file
14
portal/assets/themes/default/custom_overlay.css
Normal file
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file may contain extra CSS rules loaded on all apps page (*if* the app
|
||||
nginx's conf does include the appropriate snippet) for the small YunoHost
|
||||
button in bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
145
portal/assets/themes/default/custom_portal.css
Normal file
145
portal/assets/themes/default/custom_portal.css
Normal file
|
@ -0,0 +1,145 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contain extra CSS rules to customize the YunoHost user portal and
|
||||
can be used to customize app tiles, buttons, etc...
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
.bluebg {
|
||||
background: #3498DB!important;
|
||||
}
|
||||
.bluebg:hover:after,
|
||||
.bluebg:focus:after,
|
||||
.bluebg:hover:before,
|
||||
.bluebg:focus:before {
|
||||
background: #16527A!important;
|
||||
}
|
||||
|
||||
.purplebg {
|
||||
background: #9B59B6!important;
|
||||
}
|
||||
.purplebg:hover:after,
|
||||
.purplebg:focus:after,
|
||||
.purplebg:hover:before,
|
||||
.purplebg:focus:before {
|
||||
background: #532C64!important;
|
||||
}
|
||||
|
||||
.redbg {
|
||||
background: #E74C3C!important;
|
||||
}
|
||||
.redbg:hover:after,
|
||||
.redbg:focus:after,
|
||||
.redbg:hover:before,
|
||||
.redbg:focus:before {
|
||||
background: #921E12!important;
|
||||
}
|
||||
|
||||
.orangebg {
|
||||
background: #F39C12!important;
|
||||
}
|
||||
.orangebg:hover:after,
|
||||
.orangebg:focus:after,
|
||||
.orangebg:hover:before,
|
||||
.orangebg:focus:before {
|
||||
background: #7F5006!important;
|
||||
}
|
||||
|
||||
.greenbg {
|
||||
background: #2ECC71!important;
|
||||
}
|
||||
.greenbg:hover:after,
|
||||
.greenbg:focus:after,
|
||||
.greenbg:hover:before,
|
||||
.greenbg:focus:before {
|
||||
background: #176437!important;
|
||||
}
|
||||
|
||||
.darkbluebg {
|
||||
background: #34495E!important;
|
||||
}
|
||||
.darkbluebg:hover:after,
|
||||
.darkbluebg:focus:after,
|
||||
.darkbluebg:hover:before,
|
||||
.darkbluebg:focus:before {
|
||||
background: #07090C!important;
|
||||
}
|
||||
|
||||
.lightbluebg {
|
||||
background: #6A93D4!important;
|
||||
}
|
||||
.lightbluebg:hover:after,
|
||||
.lightbluebg:focus:after,
|
||||
.lightbluebg:hover:before,
|
||||
.lightbluebg:focus:before {
|
||||
background: #2B5394!important;
|
||||
}
|
||||
|
||||
.yellowbg {
|
||||
background: #F1C40F!important;
|
||||
}
|
||||
.yellowbg:hover:after,
|
||||
.yellowbg:focus:after,
|
||||
.yellowbg:hover:before,
|
||||
.yellowbg:focus:before {
|
||||
background: #796307!important;
|
||||
}
|
||||
|
||||
|
||||
.lightpinkbg {
|
||||
background: #F76F87!important;
|
||||
}
|
||||
.lightpinkbg:hover:after,
|
||||
.lightpinkbg:focus:after,
|
||||
.lightpinkbg:hover:before,
|
||||
.lightpinkbg:focus:before {
|
||||
background: #DA0C31!important;
|
||||
}
|
||||
|
||||
/* Following colors are not used yet */
|
||||
.pinkbg {
|
||||
background: #D66D92!important;
|
||||
}
|
||||
.pinkbg:hover:after,
|
||||
.pinkbg:focus:after,
|
||||
.pinkbg:hover:before,
|
||||
.pinkbg:focus:before {
|
||||
background: #992B52!important;
|
||||
}
|
||||
|
||||
.turquoisebg {
|
||||
background: #1ABC9C!important;
|
||||
}
|
||||
.turquoisebg:hover:after,
|
||||
.turquoisebg:focus:after,
|
||||
.turquoisebg:hover:before,
|
||||
.turquoisebg:focus:before {
|
||||
background: #0B4C3F!important;
|
||||
}
|
||||
.lightyellow {
|
||||
background: #FFC973!important;
|
||||
}
|
||||
.lightyellow:hover:after,
|
||||
.lightyellow:focus:after,
|
||||
.lightyellow:hover:before,
|
||||
.lightyellow:focus:before {
|
||||
background: #F39500!important;
|
||||
}
|
||||
.lightgreen {
|
||||
background: #B5F36D!important;
|
||||
}
|
||||
.lightgreen:hover:after,
|
||||
.lightgreen:focus:after,
|
||||
.lightgreen:hover:before,
|
||||
.lightgreen:focus:before {
|
||||
background: #77CF11!important;
|
||||
}
|
||||
.purpledarkbg {
|
||||
background: #8E44AD!important;
|
||||
}
|
||||
.purpledarkbg:hover:after,
|
||||
.purpledarkbg:focus:after,
|
||||
.purpledarkbg:hover:before,
|
||||
.purpledarkbg:focus:before {
|
||||
background: #432051!important;
|
||||
}
|
40
portal/assets/themes/default/custom_portal.js
Normal file
40
portal/assets/themes/default/custom_portal.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This JS file may be used to customize the YunoHost user portal *and* also
|
||||
will be loaded in all app pages if the app nginx's conf does include the
|
||||
appropriate snippet.
|
||||
|
||||
You can monkeypatch init_portal (loading of the user portal) and
|
||||
init_portal_button_and_overlay (loading of the button and overlay...) to do
|
||||
custom stuff
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
var app_tile_colors = ['redbg','purpledarkbg','darkbluebg','orangebg','greenbg', 'yellowbg','lightpinkbg','pinkbg','turquoisebg','lightbluebg', 'bluebg'];
|
||||
|
||||
function set_app_tile_style(el)
|
||||
{
|
||||
// Select a color value from the App label
|
||||
randomColorNumber = parseInt(el.textContent, 36) % app_tile_colors.length;
|
||||
// Add color class.
|
||||
el.classList.add(app_tile_colors[randomColorNumber]);
|
||||
}
|
||||
|
||||
// Monkeypatch init_portal to customize the app tile style
|
||||
init_portal_original = init_portal;
|
||||
init_portal = function()
|
||||
{
|
||||
init_portal_original();
|
||||
Array.each(document.getElementsByClassName("app-tile"), set_app_tile_style);
|
||||
}
|
||||
|
||||
/*
|
||||
* Monkey patching example to do custom stuff when loading inside an app
|
||||
*
|
||||
init_portal_button_and_overlay_original = init_portal_button_and_overlay;
|
||||
init_portal_button_and_overlay = function()
|
||||
{
|
||||
init_portal_button_and_overlay_original();
|
||||
// Custom stuff to do when loading inside an app
|
||||
}
|
||||
*/
|
26
portal/assets/themes/light/custom_overlay.css
Normal file
26
portal/assets/themes/light/custom_overlay.css
Normal file
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file may contain extra CSS rules loaded on all apps page (*if* the app
|
||||
nginx's conf does include the appropriate snippet) for the small YunoHost
|
||||
button in bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
#ynh-overlay-switch {
|
||||
/* FIXME : idk if this is an issue or not to have /yunohost/sso hard-coded here */
|
||||
background-image: url("/yunohost/sso/assets/img/logo-ynh.svg");
|
||||
border-color: #eee;
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
#ynh-overlay-switch:hover {
|
||||
border-color: #ccc;
|
||||
background-color: #ccc;
|
||||
}
|
179
portal/assets/themes/light/custom_portal.css
Normal file
179
portal/assets/themes/light/custom_portal.css
Normal file
|
@ -0,0 +1,179 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contain extra CSS rules to customize the YunoHost user portal and
|
||||
can be used to customize app tiles, buttons, etc...
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
body {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#ynh-logo {
|
||||
background-image: url("../../img/logo-ynh.svg");
|
||||
}
|
||||
|
||||
.login-form .form-group {
|
||||
border: 1px solid #bbb;
|
||||
}
|
||||
|
||||
.user-container,
|
||||
.user-menu a,
|
||||
.link-btn,
|
||||
.footer a {
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.user-menu a:hover,
|
||||
.footer a:hover {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.form-text:disabled:hover {
|
||||
background: #797b83;
|
||||
}
|
||||
|
||||
.link-btn,
|
||||
.link-btn:hover {
|
||||
background: none;
|
||||
}
|
||||
|
||||
|
||||
.bluebg {
|
||||
background: #3498DB!important;
|
||||
}
|
||||
.bluebg:hover:after,
|
||||
.bluebg:focus:after,
|
||||
.bluebg:hover:before,
|
||||
.bluebg:focus:before {
|
||||
background: #16527A!important;
|
||||
}
|
||||
|
||||
.purplebg {
|
||||
background: #9B59B6!important;
|
||||
}
|
||||
.purplebg:hover:after,
|
||||
.purplebg:focus:after,
|
||||
.purplebg:hover:before,
|
||||
.purplebg:focus:before {
|
||||
background: #532C64!important;
|
||||
}
|
||||
|
||||
.redbg {
|
||||
background: #E74C3C!important;
|
||||
}
|
||||
.redbg:hover:after,
|
||||
.redbg:focus:after,
|
||||
.redbg:hover:before,
|
||||
.redbg:focus:before {
|
||||
background: #921E12!important;
|
||||
}
|
||||
|
||||
.orangebg {
|
||||
background: #F39C12!important;
|
||||
}
|
||||
.orangebg:hover:after,
|
||||
.orangebg:focus:after,
|
||||
.orangebg:hover:before,
|
||||
.orangebg:focus:before {
|
||||
background: #7F5006!important;
|
||||
}
|
||||
|
||||
.greenbg {
|
||||
background: #2ECC71!important;
|
||||
}
|
||||
.greenbg:hover:after,
|
||||
.greenbg:focus:after,
|
||||
.greenbg:hover:before,
|
||||
.greenbg:focus:before {
|
||||
background: #176437!important;
|
||||
}
|
||||
|
||||
.darkbluebg {
|
||||
background: #34495E!important;
|
||||
}
|
||||
.darkbluebg:hover:after,
|
||||
.darkbluebg:focus:after,
|
||||
.darkbluebg:hover:before,
|
||||
.darkbluebg:focus:before {
|
||||
background: #07090C!important;
|
||||
}
|
||||
|
||||
.lightbluebg {
|
||||
background: #6A93D4!important;
|
||||
}
|
||||
.lightbluebg:hover:after,
|
||||
.lightbluebg:focus:after,
|
||||
.lightbluebg:hover:before,
|
||||
.lightbluebg:focus:before {
|
||||
background: #2B5394!important;
|
||||
}
|
||||
|
||||
.yellowbg {
|
||||
background: #F1C40F!important;
|
||||
}
|
||||
.yellowbg:hover:after,
|
||||
.yellowbg:focus:after,
|
||||
.yellowbg:hover:before,
|
||||
.yellowbg:focus:before {
|
||||
background: #796307!important;
|
||||
}
|
||||
|
||||
|
||||
.lightpinkbg {
|
||||
background: #F76F87!important;
|
||||
}
|
||||
.lightpinkbg:hover:after,
|
||||
.lightpinkbg:focus:after,
|
||||
.lightpinkbg:hover:before,
|
||||
.lightpinkbg:focus:before {
|
||||
background: #DA0C31!important;
|
||||
}
|
||||
|
||||
/* Following colors are not used yet */
|
||||
.pinkbg {
|
||||
background: #D66D92!important;
|
||||
}
|
||||
.pinkbg:hover:after,
|
||||
.pinkbg:focus:after,
|
||||
.pinkbg:hover:before,
|
||||
.pinkbg:focus:before {
|
||||
background: #992B52!important;
|
||||
}
|
||||
|
||||
.turquoisebg {
|
||||
background: #1ABC9C!important;
|
||||
}
|
||||
.turquoisebg:hover:after,
|
||||
.turquoisebg:focus:after,
|
||||
.turquoisebg:hover:before,
|
||||
.turquoisebg:focus:before {
|
||||
background: #0B4C3F!important;
|
||||
}
|
||||
.lightyellow {
|
||||
background: #FFC973!important;
|
||||
}
|
||||
.lightyellow:hover:after,
|
||||
.lightyellow:focus:after,
|
||||
.lightyellow:hover:before,
|
||||
.lightyellow:focus:before {
|
||||
background: #F39500!important;
|
||||
}
|
||||
.lightgreen {
|
||||
background: #B5F36D!important;
|
||||
}
|
||||
.lightgreen:hover:after,
|
||||
.lightgreen:focus:after,
|
||||
.lightgreen:hover:before,
|
||||
.lightgreen:focus:before {
|
||||
background: #77CF11!important;
|
||||
}
|
||||
.purpledarkbg {
|
||||
background: #8E44AD!important;
|
||||
}
|
||||
.purpledarkbg:hover:after,
|
||||
.purpledarkbg:focus:after,
|
||||
.purpledarkbg:hover:before,
|
||||
.purpledarkbg:focus:before {
|
||||
background: #432051!important;
|
||||
}
|
40
portal/assets/themes/light/custom_portal.js
Normal file
40
portal/assets/themes/light/custom_portal.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This JS file may be used to customize the YunoHost user portal *and* also
|
||||
will be loaded in all app pages if the app nginx's conf does include the
|
||||
appropriate snippet.
|
||||
|
||||
You can monkeypatch init_portal (loading of the user portal) and
|
||||
init_portal_button_and_overlay (loading of the button and overlay...) to do
|
||||
custom stuff
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
var app_tile_colors = ['redbg','purpledarkbg','darkbluebg','orangebg','greenbg', 'yellowbg','lightpinkbg','pinkbg','turquoisebg','lightbluebg', 'bluebg'];
|
||||
|
||||
function set_app_tile_style(el)
|
||||
{
|
||||
// Select a color value from the App label
|
||||
randomColorNumber = parseInt(el.textContent, 36) % app_tile_colors.length;
|
||||
// Add color class.
|
||||
el.classList.add(app_tile_colors[randomColorNumber]);
|
||||
}
|
||||
|
||||
// Monkeypatch init_portal to customize the app tile style
|
||||
init_portal_original = init_portal;
|
||||
init_portal = function()
|
||||
{
|
||||
init_portal_original();
|
||||
Array.each(document.getElementsByClassName("app-tile"), set_app_tile_style);
|
||||
}
|
||||
|
||||
/*
|
||||
* Monkey patching example to do custom stuff when loading inside an app
|
||||
*
|
||||
init_portal_button_and_overlay_original = init_portal_button_and_overlay;
|
||||
init_portal_button_and_overlay = function()
|
||||
{
|
||||
init_portal_button_and_overlay_original();
|
||||
// Custom stuff to do when loading inside an app
|
||||
}
|
||||
*/
|
BIN
portal/assets/themes/unsplash/cloud.png
Normal file
BIN
portal/assets/themes/unsplash/cloud.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
17
portal/assets/themes/unsplash/custom_overlay.css
Normal file
17
portal/assets/themes/unsplash/custom_overlay.css
Normal file
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file may contain extra CSS rules loaded on all apps page (*if* the app
|
||||
nginx's conf does include the appropriate snippet) for the small YunoHost
|
||||
button in bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
||||
#ynh-overlay-switch {
|
||||
background-image: url("./cloud.png");
|
||||
}
|
78
portal/assets/themes/unsplash/custom_portal.css
Normal file
78
portal/assets/themes/unsplash/custom_portal.css
Normal file
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contain extra CSS rules to customize the YunoHost user portal and
|
||||
can be used to customize app tiles, buttons, etc...
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/* Make page texts white */
|
||||
.user-container h2,
|
||||
.user-container small,
|
||||
.user-container .user-mail,
|
||||
.user-container .user-mail,
|
||||
.content .footer a,
|
||||
a.app-tile,
|
||||
#ynh-logout {
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
body {
|
||||
color: white !important;
|
||||
text-shadow: 3px 4px 4px rgba(0,0,0,.4), -1px -1px 6px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
.ynh-user-portal {
|
||||
background-image: url('https://source.unsplash.com/random/featured/?nature') !important;
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/* Apps colors */
|
||||
.app-tile {
|
||||
background-color: rgba(255, 255, 255, 0.5) !important;
|
||||
}
|
||||
|
||||
.app-tile:hover:after,
|
||||
.app-tile:focus:after,
|
||||
.app-tile:hover:before,
|
||||
.app-tile:focus:before {
|
||||
background: rgba(255, 255, 255, 0.5) !important;
|
||||
}
|
||||
|
||||
/* Use a custom logo image */
|
||||
#ynh-logo {
|
||||
z-index: 10;
|
||||
background-image: url("./cloud.png");
|
||||
}
|
||||
|
||||
/* Round the form */
|
||||
.login-form label:before {
|
||||
border-top-left-radius: 5em ;
|
||||
border-bottom-left-radius: 5em ;
|
||||
}
|
||||
|
||||
.login-form * {
|
||||
border-radius: 5em;
|
||||
}
|
||||
|
||||
/* Make form black */
|
||||
|
||||
.login-form label::before {
|
||||
background: #000;
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
.login-form .form-group * {
|
||||
background: #000;
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
.icon {
|
||||
background: #000;
|
||||
}
|
||||
|
||||
.messages {
|
||||
border-radius: .5em;
|
||||
}
|
14
portal/assets/themes/vapor/custom_overlay.css
Normal file
14
portal/assets/themes/vapor/custom_overlay.css
Normal file
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file may contain extra CSS rules loaded on all apps page (*if* the app
|
||||
nginx's conf does include the appropriate snippet) for the small YunoHost
|
||||
button in bottom-right corner + portal overlay.
|
||||
|
||||
The yunohost button corresponds to : #ynh-overlay-switch
|
||||
The yunohost portal overlay / iframe corresponds to : #ynh-overlay
|
||||
|
||||
BE CAREFUL that you should *not* add too-general rules that apply to
|
||||
non-yunohost elements (for instance all 'a' or 'p' elements...) as it will
|
||||
likely break app's rendering
|
||||
===============================================================================
|
||||
*/
|
109
portal/assets/themes/vapor/custom_portal.css
Normal file
109
portal/assets/themes/vapor/custom_portal.css
Normal file
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This file contain extra CSS rules to customize the YunoHost user portal and
|
||||
can be used to customize app tiles, buttons, etc...
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/* ==========================================================================
|
||||
Vaporwave theme
|
||||
========================================================================== */
|
||||
.ynh-user-portal {
|
||||
min-height: 100vh;
|
||||
background: rgb(205, 118, 255) !important;
|
||||
background: -moz-linear-gradient(45deg, rgb(205, 118, 255) 0%, rgb(93, 150, 168) 100%) !important;
|
||||
background: -webkit-gradient(linear, left bottom, right top, color-stop(0%, rgb(205, 118, 255)), color-stop(100%, rgb(93, 150, 168))) !important;
|
||||
background: -webkit-linear-gradient(45deg, rgb(205, 118, 255) 0%, rgb(93, 150, 168) 100%) !important;
|
||||
background: -o-linear-gradient(45deg, rgb(205, 118, 255) 0%, rgb(93, 150, 168) 100%) !important;
|
||||
background: -ms-linear-gradient(45deg, rgb(205, 118, 255) 0%, rgb(93, 150, 168) 100%) !important;
|
||||
background: linear-gradient(45deg, rgb(205, 118, 255) 0%, rgb(93, 150, 168) 100%) !important;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#C82BFF', endColorstr='#0C76A8', GradientType=1) !important;
|
||||
}
|
||||
|
||||
.messages.danger { background: #c0392b80; }
|
||||
.messages.warning { background: #e67e2280; }
|
||||
.messages.success { background: #27ae6080; }
|
||||
.messages.info { background: #2980b980; }
|
||||
|
||||
a, small, span,
|
||||
.ynh-wrapper.footer a,
|
||||
.user-menu a,
|
||||
.user-container.user-container-info span,
|
||||
input.btn.classic-btn.large-btn {
|
||||
color: #e0e0e0 !important;
|
||||
}
|
||||
|
||||
.form-group input::placeholder,
|
||||
.form-group input::-ms-input-placeholder,
|
||||
.form-group input:-ms-input-placeholder {
|
||||
color: #f4f4f4 !important;
|
||||
}
|
||||
|
||||
form.login-form input {
|
||||
color: #222 !important;
|
||||
}
|
||||
|
||||
a:hover,
|
||||
a:active,
|
||||
a:focus,
|
||||
.form-group input,
|
||||
input.btn.classic-btn.large-btn:hover,
|
||||
.ynh-wrapper.footer a:hover {
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.ynh-wrapper.footer a:before {
|
||||
color: #cc45ee !important;
|
||||
}
|
||||
|
||||
.ynh-wrapper.footer nav {
|
||||
border-color: #cc45ee !important;
|
||||
}
|
||||
|
||||
.listing-apps li a span,
|
||||
.listing-apps li a:hover span,
|
||||
.listing-apps li a:active span,
|
||||
.listing-apps li a:focus span {
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.listing-apps li,
|
||||
.listing-apps li a {
|
||||
transition: all 0.3s ease-in-out, background 0ms; /* fix gray flicker on initial load */
|
||||
border: none transparent !important;
|
||||
box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.1),
|
||||
-2px -2px 3px 0 rgba(0, 0, 0, 0.1) inset;
|
||||
}
|
||||
|
||||
.listing-apps li:hover,
|
||||
.listing-apps li a:hover {
|
||||
box-shadow: 2px 2px 3px rgba(0, 0, 0, 0),
|
||||
-2px -2px 3px 0 rgba(0, 0, 0, 0) inset;
|
||||
}
|
||||
|
||||
.btn.large-btn.classic-btn,
|
||||
.btn.large-btn.validate-btn {
|
||||
background: rgba(200, 200, 200, 0.4) !important;
|
||||
}
|
||||
|
||||
.btn.large-btn.classic-btn:hover,
|
||||
.btn.large-btn.validate-btn:hover {
|
||||
background: rgba(255, 255, 255, 0.4) !important;
|
||||
}
|
||||
|
||||
/* There are no colors, there is only vapor! */
|
||||
.app-tile,
|
||||
.form-group input,
|
||||
.form-group label,
|
||||
a.btn:hover,
|
||||
.btn.large-btn {
|
||||
background: rgba(200, 200, 200, 0.2) !important;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.app-tile:hover:after,
|
||||
.app-tile:focus:after,
|
||||
.app-tile:hover:before,
|
||||
.app-tile:focus:before {
|
||||
background: rgba(200, 200, 200, 0.4) !important;
|
||||
}
|
33
portal/assets/themes/vapor/custom_portal.js
Normal file
33
portal/assets/themes/vapor/custom_portal.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
===============================================================================
|
||||
This JS file may be used to customize the YunoHost user portal *and* also
|
||||
will be loaded in all app pages if the app nginx's conf does include the
|
||||
appropriate snippet.
|
||||
|
||||
You can monkeypatch init_portal (loading of the user portal) and
|
||||
init_portal_button_and_overlay (loading of the button and overlay...) to do
|
||||
custom stuff
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
* Monkeypatch init_portal to customize the app tile style
|
||||
*
|
||||
init_portal_original = init_portal;
|
||||
init_portal = function()
|
||||
{
|
||||
init_portal_original();
|
||||
// Some stuff here
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
* Monkey patching example to do custom stuff when loading inside an app
|
||||
*
|
||||
init_portal_button_and_overlay_original = init_portal_button_and_overlay;
|
||||
init_portal_button_and_overlay = function()
|
||||
{
|
||||
init_portal_button_and_overlay_original();
|
||||
// Custom stuff to do when loading inside an app
|
||||
}
|
||||
*/
|
|
@ -1,60 +1,58 @@
|
|||
<div class="wrapper user">
|
||||
<ul class="ul-reset user-menu">
|
||||
<li><a class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
|
||||
<div class="ynh-wrapper user">
|
||||
<ul class="user-menu">
|
||||
<li><a id="ynh-logout" class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
|
||||
</ul>
|
||||
|
||||
<a class="user-container user-container-edit" href="info.html">
|
||||
<a class="user-container user-container-edit" href="portal.html">
|
||||
<h2 class="user-username">{{{uid}}}</h2>
|
||||
<small class="user-fullname">{{givenName}} {{sn}}</small>
|
||||
<span class="user-mail">{{mail}}</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="wrapper edit">
|
||||
<div class="ynh-wrapper edit">
|
||||
<form class="form-edit" role="form" method="POST" action="edit.html">
|
||||
|
||||
<div class="form-section">
|
||||
<div class="form-group">
|
||||
<label for="uid" class="control-label">{{t_username}}</label>
|
||||
<input id="uid" type="text" name="uid" class="form-control form-text" value="{{uid}}" disabled required>
|
||||
<input type="text" id="uid" name="uid" class="form-text" value="{{uid}}" disabled required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="givenName" class="control-label">{{t_fullname}}</label>
|
||||
<input type="text" id="givenName" name="givenName" class="form-control form-text" value="{{givenName}}" placeholder="{{t_firstname}}" required>
|
||||
<input type="text" name="sn" class="form-control form-text" value="{{sn}}" placeholder="{{t_lastname}}" required>
|
||||
<input type="text" id="givenName" name="givenName" class="form-text" value="{{givenName}}" placeholder="{{t_firstname}}" required>
|
||||
<input type="text" name="sn" class="form-text" value="{{sn}}" placeholder="{{t_lastname}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-section">
|
||||
<div class="form-group" id="form-add-mail-alias">
|
||||
<label for="mail" class="control-label">{{t_mail_addresses}}</label>
|
||||
<a class="help-link" href="#">?</a>
|
||||
<input type="email" name="mail" class="form-control form-text" value="{{mail}}" placeholder="{{t_new_mail}}" required>
|
||||
<input type="email" name="mail" class="form-text" value="{{mail}}" placeholder="{{t_new_mail}}" required>
|
||||
{{#mailalias}}
|
||||
<input type="email" name="mailalias[]" class="form-control form-text" value="{{.}}">
|
||||
<input type="email" name="mailalias[]" class="form-text" value="{{.}}">
|
||||
{{/mailalias}}
|
||||
<input id="mail" type="email" name="mailalias[]" class="form-control mailalias-input form-text" placeholder="{{t_new_mail}}">
|
||||
<input id="mail" type="email" name="mailalias[]" class="mailalias-input form-text" placeholder="{{t_new_mail}}">
|
||||
<a class="btn link-btn" id="add-mailalias">{{t_add_mail}}</a>
|
||||
</div>
|
||||
|
||||
<div class="form-group" id="form-add-mail-drop">
|
||||
<label for="mailforward" class="control-label">{{t_mail_forward}}</label>
|
||||
<a class="help-link" href="#">?</a>
|
||||
{{#maildrop}}
|
||||
<input type="email" name="maildrop[]" class="form-control form-text" value="{{.}}">
|
||||
<input type="email" name="maildrop[]" class="form-text" value="{{.}}">
|
||||
{{/maildrop}}
|
||||
<input id="mailforward" type="email" name="maildrop[]" class="form-control maildrop-input form-text" placeholder="{{t_new_forward}}">
|
||||
<input id="mailforward" type="email" name="maildrop[]" class="maildrop-input form-text" placeholder="{{t_new_forward}}">
|
||||
<a class="btn link-btn" id="add-maildrop">{{t_add_forward}}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="btn-group">
|
||||
<a href="info.html" class="btn large-btn">{{t_cancel}}</a>
|
||||
<a role="button" href="portal.html" class="btn large-btn">{{t_cancel}}</a>
|
||||
<input type="submit" class="btn classic-btn large-btn" value="{{t_ok}}">
|
||||
</div>
|
||||
|
||||
<div class="btn-group">
|
||||
<a href="password.html" class="btn validate-btn large-btn">{{t_change_password}}</a>
|
||||
<a role="button" href="password.html" class="btn validate-btn large-btn">{{t_change_password}}</a>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
|
|
@ -1,13 +1,18 @@
|
|||
{{#connected}}
|
||||
<div class="wrapper footer"><nav>
|
||||
<a class="link-profile-edit" href="/yunohost/sso/edit.html">{{t_footerlink_edit}}</a>
|
||||
<div class="ynh-wrapper footer"><nav>
|
||||
<a class="link-profile-edit" href="edit.html">{{t_footerlink_edit}}</a>
|
||||
<a class="link-documentation" href="//yunohost.org/docs" target="_blank">{{t_footerlink_documentation}}</a>
|
||||
<a class="link-documentation" href="//yunohost.org/support" target="_blank">{{t_footerlink_support}}</a>
|
||||
<a class="link-admin" href="/yunohost/admin">{{t_footerlink_administration}}</a>
|
||||
<a class="link-documentation" href="//yunohost.org/help" target="_blank">{{t_footerlink_support}}</a>
|
||||
<a class="link-admin" href="/yunohost/admin/" target="_blank">{{t_footerlink_administration}}</a>
|
||||
</nav></div>
|
||||
{{/connected}}
|
||||
|
||||
</div>
|
||||
<script src="assets/js/global.js"></script>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="assets/js/ynh_portal.js"></script>
|
||||
{{#theme}}
|
||||
<script src="assets/themes/{{theme}}/custom_portal.js"></script>
|
||||
{{/theme}}
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -2,16 +2,20 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="format-detection" content="telephone=no" />
|
||||
<meta name="viewport" content="user-scalable=no, width=device-width, height=device-height" />
|
||||
<title>{{t_portal}}</title>
|
||||
|
||||
<!-- Responsive -->
|
||||
<meta name="format-detection" content="telephone=no" />
|
||||
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1" />
|
||||
|
||||
<!-- Do not index SSOWat pages -->
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<link rel="stylesheet" href="assets/css/artichaut.css">
|
||||
<link rel="stylesheet" href="assets/css/artichaut-col.css">
|
||||
<link rel="stylesheet" href="assets/css/artichaut-messages.css">
|
||||
<link rel="stylesheet" href="assets/css/artichaut-buttons.css">
|
||||
<link rel="stylesheet" href="assets/css/fonts.css">
|
||||
<link rel="stylesheet" href="assets/css/ynh-style.css">
|
||||
|
||||
<!-- Stylesheets -->
|
||||
<link rel="stylesheet" href="assets/css/ynh_portal.css">
|
||||
<link rel="stylesheet" href="assets/themes/{{theme}}/custom_portal.css">
|
||||
|
||||
<!-- Icons -->
|
||||
<link rel="shortcut icon" href="assets/icons/favicon.ico">
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="assets/icons/apple-touch-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="assets/icons/apple-touch-icon-114x114.png">
|
||||
|
@ -29,13 +33,13 @@
|
|||
<meta name="msapplication-TileColor" content="#41444f">
|
||||
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
|
||||
</head>
|
||||
<body class="{{#connected}}logged{{/connected}}">
|
||||
<body class="ynh-user-portal {{#connected}}logged{{/connected}}">
|
||||
|
||||
<h1 id="logo" class="logo">
|
||||
<img src="assets/img/logo-ynh-white.svg"/><span class="element-invisible">Yunohost</span>
|
||||
</h1>
|
||||
<div id="ynh-logo" class="ynh-logo">
|
||||
<span class="element-invisible">Yunohost</span>
|
||||
</div>
|
||||
|
||||
<div class="overlay">
|
||||
<div class="content">
|
||||
{{#flash_win}}
|
||||
<div class="wrapper messages success">{{.}}</div>
|
||||
{{/flash_win}}
|
||||
|
@ -47,4 +51,3 @@
|
|||
{{#flash_info}}
|
||||
<div class="wrapper messages info">{{.}}</div>
|
||||
{{/flash_info}}
|
||||
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
<div class="wrapper user">
|
||||
<ul class="ul-reset user-menu">
|
||||
<li><a class="icon icon-connexion" href="?action=logout">{{t_logout}}</a></li>
|
||||
</ul>
|
||||
|
||||
<a class="user-container user-container-info" href="edit.html">
|
||||
<h2 class="user-username">{{{uid}}}</h2>
|
||||
<small class="user-fullname">{{givenName}} {{sn}}</small>
|
||||
<span class="user-mail">{{mail}}</span>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="apps" class="wrapper apps">
|
||||
<ul class="ul-reset listing-apps col colNomarge sourceProBold">
|
||||
{{#app}}
|
||||
<li><a href="https://{{url}}"><span class="first-letter"></span><span class="sourcePro">{{name}}</span></a></li>
|
||||
{{/app}}
|
||||
</ul>
|
||||
</div>
|
49
portal/locales/ar.json
Normal file
49
portal/locales/ar.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"portal": "بوابة يونوهوست",
|
||||
"information": "معلوماتك",
|
||||
"username": "إسم المستخدم",
|
||||
"password": "كلمة السر",
|
||||
"fullname": "الإسم الكامل",
|
||||
"mail_addresses": "عناوين البريد الإلكترونية",
|
||||
"mail_forward": "عناوين توجيه البريد الإلكتروني",
|
||||
"new_mail": "newmail@mydomain.org",
|
||||
"new_forward": "newforward@myforeigndomain.org",
|
||||
"add_mail": "إضافة عنوان بريد إلكتروني مستعار",
|
||||
"add_forward": "إضافة عنوان آخر لتوجيه البريد",
|
||||
"ok": "موافق",
|
||||
"cancel": "إلغاء",
|
||||
"change_password": "تعديل كلمة السر",
|
||||
"edit": "تعديل",
|
||||
"current_password": "كلمة السر الحالية",
|
||||
"new_password": "كلمة السر الجديدة",
|
||||
"confirm": "تأكيد",
|
||||
"login": "لِج",
|
||||
"logout": "الخروج",
|
||||
"password_changed": "تم تغيير الكلمة السرية",
|
||||
"password_changed_error": "لا يمكن تعديل الكلمة السرية",
|
||||
"password_not_match": "كلمات السر غير متطابقة",
|
||||
"wrong_current_password": "كلمة السر الحالية خاطئة",
|
||||
"invalid_mail": "عنوان البريد الإلكتروني غير صالح",
|
||||
"invalid_domain": "النطاق غير صالح في",
|
||||
"invalid_mailforward": "عنوان بريد التحويل غير صالح",
|
||||
"mail_already_used": "عنوان البريد الإلكتروني مُستعمل مِن قَبل",
|
||||
"information_updated": "تم تحديث المعلومات",
|
||||
"user_saving_fail": "لا يمكن حفظ معلومات المستخدم",
|
||||
"missing_required_fields": "يُرجى ملئ الخانات المطلوبة",
|
||||
"wrong_username_password": "إسم المستخدم أو كلمة السر خاطئة",
|
||||
"logged_out": "تم تسجيل خروجك",
|
||||
"please_login": "يرجى تسجيل الدخول قصد النفاذ إلى هذا المحتوى",
|
||||
"please_login_from_portal": "يرجى تسجيل الدخول عبر البوابة",
|
||||
"redirection_error_invalid_url": "خطأ في التحويل : عنوان الرابط غير صالح",
|
||||
"redirection_error_unmanaged_domain": "خطأ في التحويل : لا يمكن إدارة النطاق",
|
||||
"footerlink_edit": "تعديل ملفي الشخصي",
|
||||
"footerlink_documentation": "الدليل",
|
||||
"footerlink_support": "المساعدة",
|
||||
"footerlink_administration": "الإدارة",
|
||||
"password_too_simple_1": "يجب أن يكون طول الكلمة السرية على الأقل 8 حروف",
|
||||
"good_practices_about_user_password": "اختر كلمة مرور مكونة مِن 8 أحرف على الأقل - مع العِلم أنّه مِن الممارسات الجيدة استخدام الأطول (أي عبارة مرور) و/أو إستخدام أنواع مختلفة من الأحرف (الحروف الكبيرة والصغيرة والأرقان والحروف الخاصة).",
|
||||
"password_too_simple_4": "يجب أن يكون طول الكلمة السرية 12 حرفًا على الأقل وأن تحتوي على أرقام وحروف علوية ودنيا وحروف رمزية",
|
||||
"password_too_simple_3": "يجب أن يكون طول كلمة المرور 8 حروف على الأقل وأن تحتوي على أرقام وحروف علوية ودنيا وحروف رمزية",
|
||||
"password_too_simple_2": "يجب أن يكون طول كلمة المرور 8 حروف على الأقل وأن تحتوي على أرقام وحروف علوية ودنيا",
|
||||
"password_listed": "إنّ الكلمة السرية هذه من بين أكثر الكلمات السرية إستخداما في العالم. الرجاء إختيار شيء فريد مِن نوعه."
|
||||
}
|
49
portal/locales/bn_BD.json
Normal file
49
portal/locales/bn_BD.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"footerlink_administration": "প্রশাসন",
|
||||
"footerlink_support": "সমর্থন",
|
||||
"footerlink_documentation": "নথিপত্র",
|
||||
"footerlink_edit": "আমার প্রোফাইল সম্পাদনা করুন",
|
||||
"redirection_error_unmanaged_domain": "পুনঃনির্দেশ ত্রুটি: নিয়ন্ত্রণহীন ডোমেন",
|
||||
"redirection_error_invalid_url": "পুনঃনির্দেশ ত্রুটি: অবৈধ ইউআরএল",
|
||||
"please_login_from_portal": "পোর্টাল থেকে লগ ইন করুন",
|
||||
"please_login": "এই সামগ্রীতে অ্যাক্সেস করতে লগ ইন করুন",
|
||||
"logged_out": "প্রস্থান",
|
||||
"wrong_username_password": "ভুল ব্যবহারকারী নাম বা পাসওয়ার্ড",
|
||||
"missing_required_fields": "প্রয়োজনীয় ক্ষেত্রগুলি পূরণ করুন",
|
||||
"user_saving_fail": "নতুন ব্যবহারকারীর তথ্য সংরক্ষণ করা যায়নি",
|
||||
"information_updated": "তথ্য আপডেট হয়েছে",
|
||||
"mail_already_used": "ই-মেইল ঠিকানা ইতিমধ্যে ব্যবহৃত",
|
||||
"invalid_mailforward": "অবৈধ ইমেল ফরোয়ার্ডিং ঠিকানা",
|
||||
"invalid_domain": "এতে অবৈধ ডোমেন",
|
||||
"invalid_mail": "অকার্যকর ইমেইল ঠিকানা",
|
||||
"wrong_current_password": "বর্তমান পাসওয়ার্ডটি ভুল",
|
||||
"good_practices_about_user_password": "কমপক্ষে 8 টি অক্ষরের ব্যবহারকারীর পাসওয়ার্ডটি চয়ন করুন - যদিও এটি দীর্ঘতর (যেমন একটি পাসফ্রেজ) এবং / অথবা বিভিন্ন ধরণের অক্ষর (বড় হাতের অক্ষর, ছোট হাতের অক্ষর এবং বিশেষ অক্ষর) ব্যবহার করা ভাল অনুশীলন।",
|
||||
"password_too_simple_4": "পাসওয়ার্ডটিতে কমপক্ষে 12 টি অক্ষর দীর্ঘ হওয়া দরকার এবং এতে অঙ্ক, উপরের, নিম্ন এবং বিশেষ অক্ষরগুলি থাকে",
|
||||
"password_too_simple_3": "পাসওয়ার্ডটিতে কমপক্ষে 8 টি অক্ষর দীর্ঘ হওয়া দরকার এবং এতে অঙ্ক, উপরের, নিম্ন এবং বিশেষ অক্ষরগুলি থাকে",
|
||||
"password_too_simple_2": "পাসওয়ার্ডটিতে কমপক্ষে 8 টি অক্ষর দীর্ঘ হওয়া দরকার এবং এতে অঙ্ক, উপরের এবং নীচের অক্ষরগুলি থাকে",
|
||||
"password_too_simple_1": "পাসওয়ার্ডটি কমপক্ষে 8 টি অক্ষরের দীর্ঘ হওয়া দরকার",
|
||||
"password_listed": "এই পাসওয়ার্ডটি বিশ্বের সর্বাধিক ব্যবহৃত পাসওয়ার্ডগুলির মধ্যে রয়েছে। দয়া করে কিছুটা অনন্য কিছু চয়ন করুন।",
|
||||
"password_not_match": "পাসওয়ার্ড মেলে না",
|
||||
"password_changed_error": "পাসওয়ার্ড পরিবর্তন করা যায়নি",
|
||||
"password_changed": "পাসওয়ার্ড পরিবর্তন",
|
||||
"logout": "প্রস্থান",
|
||||
"login": "প্রবেশ করুন",
|
||||
"confirm": "নিশ্চিত করুন",
|
||||
"new_password": "নতুন পাসওয়ার্ড",
|
||||
"current_password": "বর্তমান পাসওয়ার্ড",
|
||||
"edit": "সম্পাদন করা",
|
||||
"change_password": "পাসওয়ার্ড পরিবর্তন করুন",
|
||||
"cancel": "বাতিল",
|
||||
"ok": "ঠিক আছে",
|
||||
"add_forward": "একটি ইমেল ফরোয়ার্ডিং ঠিকানা যুক্ত করুন",
|
||||
"add_mail": "একটি ইমেল ওরফে যুক্ত করুন",
|
||||
"new_forward": "newforward@myforeigndomain.org",
|
||||
"new_mail": "newmail@mydomain.org",
|
||||
"mail_forward": "ই-মেইল ফরওয়ার্ডিং ঠিকানা",
|
||||
"mail_addresses": "ইমেইল ঠিকানা",
|
||||
"fullname": "পুরো নাম",
|
||||
"password": "পাসওয়ার্ড",
|
||||
"username": "ব্যবহারকারীর নাম",
|
||||
"information": "আপনার তথ্য",
|
||||
"portal": "ইউনোহোস্ট পোর্টাল"
|
||||
}
|
49
portal/locales/ca.json
Normal file
49
portal/locales/ca.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"portal": "Portal YunoHost",
|
||||
"information": "La teva informació",
|
||||
"username": "Nom d'usuari",
|
||||
"password": "Contrasenya",
|
||||
"fullname": "Nom complet",
|
||||
"mail_addresses": "Adreces de correu electrònic",
|
||||
"new_mail": "nou_correu@domini.org",
|
||||
"add_mail": "Afegir un àlies de correu electrònic",
|
||||
"ok": "OK",
|
||||
"cancel": "Cancel·lar",
|
||||
"change_password": "Canvia la contrasenya",
|
||||
"edit": "Editar",
|
||||
"current_password": "Contrasenya actual",
|
||||
"new_password": "Nova contrasenya",
|
||||
"confirm": "Confirmar",
|
||||
"login": "Iniciar sessió",
|
||||
"logout": "Tancar sessió",
|
||||
"password_changed": "Contrasenya canviada",
|
||||
"password_changed_error": "No s'ha pogut canviar la contrasenya",
|
||||
"password_not_match": "Les contrasenyes no coincideixen",
|
||||
"wrong_current_password": "La contrasenya actual és incorrecta",
|
||||
"invalid_mail": "El correu electrònic no és vàlid",
|
||||
"invalid_domain": "Domini invàlid a",
|
||||
"mail_already_used": "El correu electrònic ja utilitzat",
|
||||
"information_updated": "Informació actualitzada",
|
||||
"user_saving_fail": "No s'han pogut enregistrar les noves dades de l'usuari",
|
||||
"missing_required_fields": "Ompliu els camps obligatoris",
|
||||
"wrong_username_password": "Contrasenya o nom d'usuari incorrectes",
|
||||
"logged_out": "Sessió tancada",
|
||||
"please_login": "Inicieu sessió per accedir a aquest contingut",
|
||||
"please_login_from_portal": "Si us plau, inicieu sessió des del portal",
|
||||
"redirection_error_invalid_url": "Error de redirecció: URL no vàlida",
|
||||
"redirection_error_unmanaged_domain": "Error de redirecció: domini no gestionat",
|
||||
"footerlink_edit": "Editar el meu perfil",
|
||||
"footerlink_documentation": "Documentació",
|
||||
"footerlink_support": "Ajuda",
|
||||
"footerlink_administration": "Administració",
|
||||
"mail_forward": "Correu electrònic de reenviament",
|
||||
"new_forward": "noureenviament@dominiextern.org",
|
||||
"add_forward": "Afegir un correu electrònic de reenviament",
|
||||
"invalid_mailforward": "Correu electrònic de reenviament invàlid",
|
||||
"password_listed": "Aquesta contrasenya és una de les més utilitzades en el món. Si us plau utilitzeu-ne una més única.",
|
||||
"password_too_simple_1": "La contrasenya ha de tenir un mínim de 8 caràcters",
|
||||
"password_too_simple_2": "La contrasenya ha de tenir un mínim de 8 caràcters i ha de contenir dígits, majúscules i minúscules",
|
||||
"password_too_simple_3": "La contrasenya ha de tenir un mínim de 8 caràcters i tenir dígits, majúscules, minúscules i caràcters especials",
|
||||
"password_too_simple_4": "La contrasenya ha de tenir un mínim de 12 caràcters i tenir dígits, majúscules, minúscules i caràcters especials",
|
||||
"good_practices_about_user_password": "Tria una contrasenya d'un mínim de 8 caràcters - tot i que és de bona pràctica utilitzar contrasenyes més llargues (com per exemple una frase) i/o utilitzar diferents tipus de caràcters (majúscules, minúscules, dígits i caràcters especials)."
|
||||
}
|
1
portal/locales/ckb.json
Normal file
1
portal/locales/ckb.json
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
49
portal/locales/cs.json
Normal file
49
portal/locales/cs.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"add_mail": "Přidat e-mail alias",
|
||||
"new_forward": "newforward@myforeigndomain.org",
|
||||
"new_mail": "newmail@mydomain.org",
|
||||
"mail_forward": "E-mail pro přeposílání",
|
||||
"mail_addresses": "E-mailová adresa",
|
||||
"fullname": "Jméno a příjmení",
|
||||
"password": "Heslo",
|
||||
"username": "Uživatelské jméno",
|
||||
"information": "Vaše údaje",
|
||||
"portal": "YunoHost Portál",
|
||||
"footerlink_administration": "Administrace",
|
||||
"footerlink_support": "Podpora",
|
||||
"footerlink_documentation": "Dokumentace",
|
||||
"footerlink_edit": "Upravit svůj profil",
|
||||
"redirection_error_unmanaged_domain": "Chyba přesměrování: Doména není spravována",
|
||||
"redirection_error_invalid_url": "Chyba přesměrování: Neplatné URL",
|
||||
"please_login_from_portal": "Prosím přihlašte se z portálu",
|
||||
"please_login": "Pro přístup k obsahu se prosím přihlašte",
|
||||
"logged_out": "Jste odhlášen/a",
|
||||
"wrong_username_password": "Chybné uživatelské jméno nebo heslo",
|
||||
"missing_required_fields": "Vyplňte povinné údaje",
|
||||
"user_saving_fail": "Nelze uložit uživatelské údaje",
|
||||
"information_updated": "Údaje upraveny",
|
||||
"mail_already_used": "Tato e-mailová adresa se už používá",
|
||||
"invalid_mailforward": "Neplatná e-mailová adresa pro přeposílání",
|
||||
"invalid_domain": "Neplatná doména v",
|
||||
"invalid_mail": "Neplatná e-mailová adresa",
|
||||
"wrong_current_password": "Současné heslo je chybné",
|
||||
"good_practices_about_user_password": "Vyberte si heslo aspoň 8 znaků dlouhé - dobrou praxí je ale používat delší frázi a používat různé druhy znaků (velká a malá písmena, číslice a speciální znaky).",
|
||||
"password_too_simple_4": "Heslo musí být aspoň 12 znaků dlouhé a obsahovat čísla, velká a malá písmena a speciální znaky",
|
||||
"password_too_simple_3": "Heslo musí být aspoň 8 znaků dlouhé a obsahovat čísla, velká a malá písmena a speciální znaky",
|
||||
"password_too_simple_2": "Heslo musí být aspoň 8 znaků dlouhé a obsahovat číslici, velká a malá písmena",
|
||||
"password_too_simple_1": "Heslo musí být aspoň 8 znaků dlouhé",
|
||||
"password_listed": "Toto heslo je jedním z nejpoužívanějších na světě. Zvolte si prosím něco jediněčnějšího.",
|
||||
"password_not_match": "Hesla se neshodují",
|
||||
"password_changed_error": "Heslo nebylo změněno",
|
||||
"password_changed": "Heslo změněno",
|
||||
"logout": "Odhlásit se",
|
||||
"login": "Přihlásit se",
|
||||
"confirm": "Potvrdit",
|
||||
"new_password": "Nové heslo",
|
||||
"current_password": "Současné heslo",
|
||||
"edit": "Upravit",
|
||||
"change_password": "Změnit heslo",
|
||||
"cancel": "Storno",
|
||||
"ok": "OK",
|
||||
"add_forward": "Přidat e-mailovou adresu pro přeposílání"
|
||||
}
|
1
portal/locales/da.json
Normal file
1
portal/locales/da.json
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
49
portal/locales/de.json
Normal file
49
portal/locales/de.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"add_forward": "E-Mail-Weiterleitung hinzufügen",
|
||||
"add_mail": "E-Mail-Alias hinzufügen",
|
||||
"cancel": "Abbrechen",
|
||||
"change_password": "Passwort ändern",
|
||||
"confirm": "Bestätigen",
|
||||
"current_password": "Aktuelles Passwort",
|
||||
"edit": "Bearbeiten",
|
||||
"footerlink_administration": "Verwaltung",
|
||||
"footerlink_documentation": "Dokumentation",
|
||||
"footerlink_edit": "Mein Profil bearbeiten",
|
||||
"footerlink_support": "Support",
|
||||
"fullname": "Vollständiger Name",
|
||||
"information": "Ihre Informationen",
|
||||
"information_updated": "Informationen aktualisiert",
|
||||
"invalid_domain": "Ungültige Domäne angegeben",
|
||||
"invalid_mail": "Ungültige E-Mail-Adresse",
|
||||
"invalid_mailforward": "Ungültige E-Mail-Weiterleitung",
|
||||
"logged_out": "Abgemeldet",
|
||||
"login": "Anmelden",
|
||||
"logout": "Abmelden",
|
||||
"mail_addresses": "E-Mail-Adressen",
|
||||
"mail_already_used": "Diese E-Mail-Adresse wird bereits verwendet",
|
||||
"mail_forward": "E-Mail-Weiterleitung",
|
||||
"missing_required_fields": "Die notwendigen Felder müssen ausgefüllt werden",
|
||||
"new_forward": "neueweiterleitung@anderedomain.org",
|
||||
"new_mail": "neueadresse@meinedomain.org",
|
||||
"new_password": "Neues Passwort",
|
||||
"ok": "OK",
|
||||
"password": "Passwort",
|
||||
"password_changed": "Passwort geändert",
|
||||
"password_changed_error": "Passwort konnte nicht geändert werden",
|
||||
"password_not_match": "Die Passwörter stimmen nicht überein",
|
||||
"please_login": "Bitte melden Sie sich an, um auf diese Inhalte zuzugreifen",
|
||||
"please_login_from_portal": "Bitte melden Sie sich über das Portal an",
|
||||
"portal": "YunoHost-Portal",
|
||||
"user_saving_fail": "Neue Kontoinformationen konnten nicht gespeichert werden",
|
||||
"username": "Benutzername",
|
||||
"wrong_current_password": "Aktuelles Passwort ist falsch",
|
||||
"wrong_username_password": "Falscher Anmeldename oder Passwort",
|
||||
"redirection_error_invalid_url": "Weiterleitungsfehler: Ungültige URL",
|
||||
"redirection_error_unmanaged_domain": "Weiterleitungsfehler: Nicht-verwaltete Domain",
|
||||
"good_practices_about_user_password": "Wählen Sie ein Benutzerpasswort mit mindestens 8 Zeichen - es ist jedoch empfehlenswert, ein längeres Passwort (z.B. eine Passphrase) und/oder verschiedene Arten von Zeichen (Groß- und Kleinschreibung, Ziffern und Sonderzeichen) zu verwenden.",
|
||||
"password_too_simple_3": "Das Passwort muss mindestens 8 Zeichen lang sein und Grossbuchstaben, Kleinbuchstaben, Zahlen und Sonderzeichen enthalten",
|
||||
"password_too_simple_2": "Das Passwort muss mindestens 8 Zeichen lang sein und Gross- und Kleinbuchstaben sowie Zahlen enthalten",
|
||||
"password_listed": "Dieses Passwort zählt zu den meistgenutzten Passwörtern der Welt. Bitte wähle ein anderes, einzigartigeres Passwort.",
|
||||
"password_too_simple_4": "Das Passwort muss mindestens 12 Zeichen lang sein und Grossbuchstaben, Kleinbuchstaben, Zahlen und Sonderzeichen enthalten",
|
||||
"password_too_simple_1": "Das Passwort muss mindestens 8 Zeichen lang sein"
|
||||
}
|
49
portal/locales/el.json
Normal file
49
portal/locales/el.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"footerlink_administration": "Διαχείριση",
|
||||
"footerlink_support": "Υποστήριξη",
|
||||
"footerlink_documentation": "Τεκμηρίωση",
|
||||
"footerlink_edit": "Επεξεργασία του προφίλ μου",
|
||||
"redirection_error_unmanaged_domain": "Σφάλμα ανακατεύθυνσης: Μη διαχειριζόμενος τομέας",
|
||||
"redirection_error_invalid_url": "Σφάλμα ανακατεύθυνσης: Μη έγκυρο URL",
|
||||
"please_login_from_portal": "Συνδεθείτε από την πύλη",
|
||||
"please_login": "Συνδεθείτε για πρόσβαση σε αυτό το περιεχόμενο",
|
||||
"logged_out": "Αποσυνδέθηκα",
|
||||
"wrong_username_password": "Λάθος όνομα χρήστη ή κωδικός",
|
||||
"missing_required_fields": "Συμπληρώστε τα απαιτούμενα πεδία",
|
||||
"user_saving_fail": "Δεν ήταν δυνατή η αποθήκευση νέων πληροφοριών χρήστη",
|
||||
"information_updated": "Οι πληροφορίες ενημερώθηκαν",
|
||||
"mail_already_used": "Γίνεται ήδη χρήση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
|
||||
"invalid_mailforward": "Μη έγκυρη διεύθυνση προώθησης e-mail",
|
||||
"invalid_domain": "Μη έγκυρος τομέας στο",
|
||||
"invalid_mail": "Μη έγκυρη διεύθυνση e-mail",
|
||||
"wrong_current_password": "Ο τρέχων κωδικός πρόσβασης είναι λάθος",
|
||||
"good_practices_about_user_password": "Διαλέξτε έναν κωδικό πρόσβασης χρήστη με τουλάχιστον 8 χαρακτήρες - αν και είναι καλή πρακτική να χρησιμοποιείτε μακρύτερους (δηλαδή μια φράση πρόσβασης) ή / και να χρησιμοποιείτε διάφορους τύπους χαρακτήρων (κεφαλαία, πεζά, ψηφία και ειδικούς χαρακτήρες).",
|
||||
"password_too_simple_4": "Ο κωδικός πρόσβασης πρέπει να έχει μήκος τουλάχιστον 12 χαρακτήρων και περιέχει ψηφία, άνω, κάτω και ειδικούς χαρακτήρες",
|
||||
"password_too_simple_3": "Ο κωδικός πρόσβασης πρέπει να έχει τουλάχιστον 8 χαρακτήρες και περιέχει ψηφία, άνω, κάτω και ειδικούς χαρακτήρες",
|
||||
"password_too_simple_2": "Ο κωδικός πρόσβασης πρέπει να έχει τουλάχιστον 8 χαρακτήρες και περιέχει ψηφία, άνω και κάτω χαρακτήρες",
|
||||
"password_too_simple_1": "Ο κωδικός πρόσβασης πρέπει να έχει τουλάχιστον 8 χαρακτήρες",
|
||||
"password_listed": "Αυτός ο κωδικός πρόσβασης είναι από τους πιο χρησιμοποιούμενους κωδικούς πρόσβασης στον κόσμο. Επιλέξτε κάτι λίγο πιο μοναδικό.",
|
||||
"password_not_match": "Οι κωδικοί πρόσβασης δεν ταιριάζουν",
|
||||
"password_changed_error": "Δεν ήταν δυνατή η αλλαγή κωδικού πρόσβασης",
|
||||
"password_changed": "Ο κωδικός άλλαξε",
|
||||
"logout": "Αποσύνδεση",
|
||||
"login": "Σύνδεση",
|
||||
"confirm": "Επιβεβαιώνω",
|
||||
"new_password": "Νέος Κωδικός",
|
||||
"current_password": "Τρέχων κωδικός πρόσβασης",
|
||||
"edit": "Επεξεργασία",
|
||||
"change_password": "Αλλαξε κωδικό",
|
||||
"cancel": "Ματαίωση",
|
||||
"ok": "Εντάξει",
|
||||
"add_forward": "Προσθέστε μια διεύθυνση προώθησης email",
|
||||
"add_mail": "Προσθέστε ένα ψευδώνυμο email",
|
||||
"new_forward": "νέοπροςταεμπρός@οξένοςτομέαςμου.org",
|
||||
"new_mail": "νέοταχυδρομείο@οτομέαςμου.org",
|
||||
"mail_forward": "Διεύθυνση προώθησης ηλεκτρονικού ταχυδρομείου",
|
||||
"mail_addresses": "Διευθύνσεις ηλεκτρονικού ταχυδρομείου",
|
||||
"fullname": "Πλήρες όνομα",
|
||||
"password": "Κωδικός πρόσβασης",
|
||||
"username": "Όνομα χρήστη",
|
||||
"information": "Τα στοιχεία σας",
|
||||
"portal": "Πύλη YunoHost"
|
||||
}
|
|
@ -1,15 +1,15 @@
|
|||
{
|
||||
"portal": "YunoHost Portal",
|
||||
"informations": "Your informations",
|
||||
"information": "Your info",
|
||||
"username": "Username",
|
||||
"password": "Password",
|
||||
"fullname": "Fullname",
|
||||
"mail_addresses": "Mail addresses",
|
||||
"mail_forward": "Mail forward",
|
||||
"fullname": "Full name",
|
||||
"mail_addresses": "E-mail addresses",
|
||||
"mail_forward": "E-mail forwarding address",
|
||||
"new_mail": "newmail@mydomain.org",
|
||||
"new_forward": "newforward@myforeigndomain.org",
|
||||
"add_mail": "Add a mail alias",
|
||||
"add_forward": "Add a mail forward",
|
||||
"add_mail": "Add an e-mail alias",
|
||||
"add_forward": "Add an e-mail forwarding address",
|
||||
"ok": "OK",
|
||||
"cancel": "Cancel",
|
||||
"change_password": "Change password",
|
||||
|
@ -17,23 +17,31 @@
|
|||
"current_password": "Current password",
|
||||
"new_password": "New password",
|
||||
"confirm": "Confirm",
|
||||
"login": "Login",
|
||||
"logout": "Logout",
|
||||
"password_changed": "Password successfully changed",
|
||||
"password_changed_error": "An error occured on password changing",
|
||||
"password_not_match": "New passwords don't match",
|
||||
"wrong_current_password": "Current password is wrong",
|
||||
"invalid_mail": "Invalid mail address",
|
||||
"login": "Log in",
|
||||
"logout": "Log out",
|
||||
"password_changed": "Password changed",
|
||||
"password_changed_error": "Could not change password",
|
||||
"password_not_match": "The passwords don't match",
|
||||
"password_listed": "This password is among the most used passwords in the world. Please choose something a bit more unique.",
|
||||
"password_too_simple_1": "The password needs to be at least 8 characters long",
|
||||
"password_too_simple_2": "The password needs to be at least 8 characters long and contains digit, upper and lower characters",
|
||||
"password_too_simple_3": "The password needs to be at least 8 characters long and contains digit, upper, lower and special characters",
|
||||
"password_too_simple_4": "The password needs to be at least 12 characters long and contains digit, upper, lower and special characters",
|
||||
"good_practices_about_user_password": "Pick a user password of at least 8 characters - though it is good practice to use longer ones (i.e. a passphrase) and/or use various kind of characters (uppercase, lowercase, digits and special characters).",
|
||||
"wrong_current_password": "The current password is wrong",
|
||||
"invalid_mail": "Invalid e-mail address",
|
||||
"invalid_domain": "Invalid domain in",
|
||||
"invalid_mailforward": "Invalid mail forward address",
|
||||
"mail_already_used": "Mail address already used:",
|
||||
"informations_updated": "Informations updated",
|
||||
"user_saving_fail": "An error occured on user's modification saving",
|
||||
"missing_required_fields": "Required fields are missing",
|
||||
"invalid_mailforward": "Invalid e-mail forwarding address",
|
||||
"mail_already_used": "E-mail address already in use",
|
||||
"information_updated": "Info updated",
|
||||
"user_saving_fail": "Could not save new user info",
|
||||
"missing_required_fields": "Fill in the required fields",
|
||||
"wrong_username_password": "Wrong username or password",
|
||||
"logged_out": "Logged out",
|
||||
"please_login": "Please log in to access to this content",
|
||||
"please_login_from_portal": "Please log in from the portal",
|
||||
"redirection_error_invalid_url": "Redirection error: Invalid URL",
|
||||
"redirection_error_unmanaged_domain": "Redirection error: Unmanaged domain",
|
||||
"footerlink_edit": "Edit my profile",
|
||||
"footerlink_documentation": "Documentation",
|
||||
"footerlink_support": "Support",
|
||||
|
|
49
portal/locales/eo.json
Normal file
49
portal/locales/eo.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"password": "Pasvorto",
|
||||
"username": "Uzantnomo",
|
||||
"mail_addresses": "Retpoŝtadresoj",
|
||||
"information": "Via informoj",
|
||||
"new_password": "Nova pasvorto",
|
||||
"current_password": "Nuna pasvorto",
|
||||
"login": "Ensaluti",
|
||||
"logout": "Elsaluti",
|
||||
"change_password": "Ŝanĝi pasvorton",
|
||||
"edit": "Redakti",
|
||||
"cancel": "Nuligi",
|
||||
"portal": "Yunohost portalo",
|
||||
"fullname": "Plena nomo",
|
||||
"new_mail": "nova-adreso@mia-domajno.org",
|
||||
"confirm": "Konfirmu",
|
||||
"password_changed": "Pasvorto ŝanĝita",
|
||||
"password_changed_error": "Ne povis ŝanĝi pasvorton",
|
||||
"password_not_match": "La pasvortoj ne kongruas",
|
||||
"footerlink_administration": "Administrado",
|
||||
"footerlink_support": "Subteno",
|
||||
"footerlink_documentation": "Dokumentado",
|
||||
"footerlink_edit": "Redakti mian profilon",
|
||||
"redirection_error_unmanaged_domain": "Redirekta eraro: Ne administrita domajno",
|
||||
"redirection_error_invalid_url": "Redirekta eraro: Nevalida URL",
|
||||
"please_login_from_portal": "Bonvolu ensaluti de la portalo",
|
||||
"please_login": "Bonvolu ensaluti por aliri ĉi tiun enhavon",
|
||||
"logged_out": "Ensalutinta",
|
||||
"wrong_username_password": "Malĝusta uzantnomo aŭ pasvorto",
|
||||
"missing_required_fields": "Plenigu la postulatajn kampojn",
|
||||
"user_saving_fail": "Ne povis konservi novajn uzantinformojn",
|
||||
"information_updated": "Informoj ĝisdatigitaj",
|
||||
"mail_already_used": "Retpoŝtadreso jam en uzo",
|
||||
"invalid_mailforward": "Nevalida retpoŝtadreso",
|
||||
"invalid_domain": "Nevalida domajno en",
|
||||
"invalid_mail": "Nevalida retpoŝta adreso",
|
||||
"wrong_current_password": "Aktuala pasvorto estas malĝusta",
|
||||
"good_practices_about_user_password": "Elektu uzantan pasvorton de almenaŭ 8 signoj - kvankam ĝi estas bona praktiko uzi pli longajn (I.E. Pasfraso) kaj / aŭ uzas diversajn specojn de karakteroj (majusklaj, minusklaj, ciferoj kaj specialaj signoj).",
|
||||
"password_too_simple_4": "La pasvorto devas havi almenaŭ 12 signojn kaj enhavas ciferojn, suprajn, pli malaltajn kaj specialajn signojn",
|
||||
"password_too_simple_3": "La pasvorto devas havi almenaŭ 8 signojn kaj enhavas ciferojn, suprajn, pli malaltajn kaj specialajn signojn",
|
||||
"password_too_simple_2": "La pasvorto devas havi almenaŭ 8 signojn kaj enhavas ciferojn, suprajn kaj pli malaltajn signojn",
|
||||
"password_too_simple_1": "Pasvorto devas esti almenaŭ 8 signojn longa",
|
||||
"password_listed": "Ĉi tiu pasvorto estas inter la plej uzataj pasvortoj en la mondo. Bonvolu elekti ion pli unikan.",
|
||||
"ok": "bone",
|
||||
"add_forward": "Aldonu poŝton antaŭen",
|
||||
"add_mail": "Aldonu poŝton alias",
|
||||
"new_forward": "newforward@myforeigndomain.org",
|
||||
"mail_forward": "Poŝti antaŭen"
|
||||
}
|
49
portal/locales/es.json
Normal file
49
portal/locales/es.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"add_forward": "Añadir una dirección de reenvío de correo electrónico",
|
||||
"add_mail": "Añadir un alias de correo electrónico",
|
||||
"cancel": "Cancelar",
|
||||
"change_password": "Cambiar contraseña",
|
||||
"confirm": "Confirmar",
|
||||
"current_password": "Contraseña actual",
|
||||
"edit": "Editar",
|
||||
"footerlink_administration": "Administración",
|
||||
"footerlink_documentation": "Documentación",
|
||||
"footerlink_edit": "Editar mi perfil",
|
||||
"footerlink_support": "Ayuda",
|
||||
"fullname": "Nombre completo",
|
||||
"information": "Su información",
|
||||
"information_updated": "Información actualizada",
|
||||
"invalid_domain": "Dominio no válido en",
|
||||
"invalid_mail": "La dirección de correo electrónico no es válida",
|
||||
"invalid_mailforward": "La dirección de reenvío de correo electrónico no es válida",
|
||||
"logged_out": "Sesión cerrada",
|
||||
"login": "Iniciar sesión",
|
||||
"logout": "Cerrar sesión",
|
||||
"mail_addresses": "Direcciones de correo electrónico",
|
||||
"mail_already_used": "Dirección de correo electrónico ya está en uso",
|
||||
"mail_forward": "Dirección de reenvío de correo electrónico",
|
||||
"missing_required_fields": "Faltan campos obligatorios",
|
||||
"new_forward": "nuevoreenvio@midominioexterior.org",
|
||||
"new_mail": "nuevomail@midominio.org",
|
||||
"new_password": "Nueva contraseña",
|
||||
"ok": "OK",
|
||||
"password": "Contraseña",
|
||||
"password_changed": "Contraseña cambiada correctamente",
|
||||
"password_changed_error": "Se produjo un error cambiando la contraseña",
|
||||
"password_not_match": "Las nuevas contraseñas no coinciden",
|
||||
"please_login": "Inicie sesión para acceder a este contenido",
|
||||
"please_login_from_portal": "Por favor, inicie sesión desde el portal",
|
||||
"portal": "Portal YunoHost",
|
||||
"user_saving_fail": "Se produjo un error al guardar los cambios del usuario",
|
||||
"username": "Nombre de usuario",
|
||||
"wrong_current_password": "La contraseña actual es incorrecta",
|
||||
"wrong_username_password": "Nombre de usuario o contraseña incorrectos",
|
||||
"redirection_error_invalid_url": "Error de redirección: url inválido",
|
||||
"redirection_error_unmanaged_domain": "Error de redirección: Dominio no gestionado",
|
||||
"password_listed": "Esta contraseña se encuentra entre las contraseñas más utilizadas en el mundo. Por favor, elija algo un poco más único.",
|
||||
"password_too_simple_1": "La contraseña debe tener al menos 8 caracteres de longitud",
|
||||
"password_too_simple_2": "La contraseña debe tener al menos 8 caracteres de longitud y contiene dígitos, mayúsculas y minúsculas",
|
||||
"password_too_simple_3": "La contraseña debe ser de al menos 8 caracteres de longitud e incluir un número y caracteres en mayúsculas, minúsculas y caracteres especiales",
|
||||
"password_too_simple_4": "La contraseña debe ser de al menos 12 caracteres de longitud e incluir un número, mayúsculas, minúsculas y caracteres especiales",
|
||||
"good_practices_about_user_password": "Está a punto de establecer una nueva contraseña de usuario. La contraseña debería de ser de al menos 8 caracteres, aunque es una buena práctica usar una contraseña más larga (es decir, una frase de paso) y/o usar varias clases de caracteres (mayúsculas, minúsculas, dígitos y caracteres especiales)."
|
||||
}
|
49
portal/locales/eu.json
Normal file
49
portal/locales/eu.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"footerlink_administration": "Administrazioa",
|
||||
"footerlink_support": "Laguntza",
|
||||
"footerlink_documentation": "Dokumentazioa",
|
||||
"footerlink_edit": "Editatu profila",
|
||||
"redirection_error_unmanaged_domain": "Birzuzenketa errorea: kudeatu gabeko domeinua",
|
||||
"redirection_error_invalid_url": "Birbideraketa errorea: URL okerra",
|
||||
"please_login_from_portal": "Hasi saioa atarian",
|
||||
"please_login": "Hasi saioa edukira sartzeko",
|
||||
"logged_out": "Saioa amaituta",
|
||||
"wrong_username_password": "Erabiltzaile-izen edo pasahitz okerra",
|
||||
"missing_required_fields": "Bete beharreko eremuak",
|
||||
"user_saving_fail": "Ezinezkoa izan da erabiltzailearen informazio berria gordetzea",
|
||||
"information_updated": "Informazioa eguneratu da",
|
||||
"mail_already_used": "Helbide elektroniko hori erabiltzen ari zara dagoeneko",
|
||||
"invalid_mailforward": "Birbidalketarako helbide okerra",
|
||||
"invalid_domain": "Domeinu okerra",
|
||||
"invalid_mail": "Helbide elektronikoa ez da zuzena",
|
||||
"wrong_current_password": "Oraingo pasahitza okerra da",
|
||||
"good_practices_about_user_password": "Aukeratu gutxienez 8 karaktere dituen erabiltzaile-pasahitz bat — baina gomendioa pasahitz luzeagoak erabiltzea da (adibidez, esaldi bat) edota karaktere desberdinak erabiltzea (larriak, txikiak, zenbakiak eta karaktere bereziak).",
|
||||
"password_too_simple_4": "Pasahitzak 12 karaktere izan behar ditu gutxienez eta zenbakiren bat, hizki larriren bat, txikiren bat eta karaktere bereziren bat izan behar ditu",
|
||||
"password_too_simple_3": "Pasahitzak 8 karaktere izan behar ditu gutxienez eta zenbakiak, hizki larriak, hizki txikiak eta karaktere bereziak izan behar ditu",
|
||||
"password_too_simple_2": "Pasahitzak 8 karaktere izan behar ditu gutxienez eta zenbakiak, hizki larriak eta hizki txikiak izan behar ditu",
|
||||
"password_too_simple_1": "Pasahitzak 8 karaktere izan behar ditu gutxienez",
|
||||
"password_listed": "Pasahitz hau munduko pasahitz erabilienen artean dago. Aukeratu bereziagoa den zerbait.",
|
||||
"password_not_match": "Pasahitzak ez datoz bat",
|
||||
"password_changed_error": "Ezin izan da pasahitza aldatu",
|
||||
"password_changed": "Pasahitza aldatu da",
|
||||
"logout": "Amaitu saioa",
|
||||
"login": "Hasi saioa",
|
||||
"confirm": "Berretsi",
|
||||
"new_password": "Pasahitz berria",
|
||||
"current_password": "Oraingo pasahitza",
|
||||
"edit": "Editatu",
|
||||
"change_password": "Aldatu pasahitza",
|
||||
"cancel": "Utzi",
|
||||
"ok": "Ados",
|
||||
"add_forward": "Gehitu helbide elektronikoa birbidaltzeko e-maila",
|
||||
"add_mail": "Gehitu e-mail ezizen bat",
|
||||
"new_forward": "birbidalketaberria@nirekanpokodomeinua.eus",
|
||||
"new_mail": "postaberria@niredomeinua.eus",
|
||||
"mail_forward": "Birbidalketarako posta elektronikoa",
|
||||
"mail_addresses": "Helbide elektronikoak",
|
||||
"fullname": "Izen osoa",
|
||||
"password": "Pasahitza",
|
||||
"username": "Erabiltzaile-izena",
|
||||
"information": "Zure informazioa",
|
||||
"portal": "YunoHost ataria"
|
||||
}
|
49
portal/locales/fa.json
Normal file
49
portal/locales/fa.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"cancel": "لغو",
|
||||
"logged_out": "خارج شده",
|
||||
"password": "کلمه عبور",
|
||||
"ok": "خوب",
|
||||
"footerlink_administration": "مدیریت",
|
||||
"footerlink_support": "پشتیبانی",
|
||||
"footerlink_documentation": "مستندات",
|
||||
"footerlink_edit": "ویرایش پروفایل من",
|
||||
"redirection_error_unmanaged_domain": "خطای تغییر مسیر: دامنه مدیریت نشده",
|
||||
"redirection_error_invalid_url": "خطای تغییر مسیر: نشانی اینترنتی نامعتبر است",
|
||||
"please_login_from_portal": "لطفاً از درگاه پورتال وارد شوید",
|
||||
"please_login": "لطفاً برای دسترسی به این محتوا وارد شوید",
|
||||
"wrong_username_password": "نام کاربری یا رمز عبور اشتباه است",
|
||||
"missing_required_fields": "فیلدهای مورد نیاز را پر کنید",
|
||||
"user_saving_fail": "اطلاعات کاربر جدید ذخیره نشد",
|
||||
"information_updated": "اطلاعات به روز شد",
|
||||
"mail_already_used": "آدرس پست الکترونیکی قبلاً استفاده می شود",
|
||||
"invalid_mailforward": "آدرس ارسال ایمیل نامعتبر است",
|
||||
"invalid_domain": "دامنه نامعتبر در",
|
||||
"invalid_mail": "آدرس ایمیل نامعتبر است",
|
||||
"wrong_current_password": "رمز فعلی اشتباه است",
|
||||
"good_practices_about_user_password": "گذرواژه کاربر متشکل ازانواع مختلف کاراکترها (بزرگ ، کوچک ، رقم و کاراکتر های خاص)را حداقل با 8 کاراکتر انتخاب کنید - هرچند استفاده از کلمات طولانی تر تمرین خوبی است (مانند عبارت عبور).",
|
||||
"password_too_simple_4": "رمز عبور باید شامل اعداد ، حروف کوچک و بزرگ و کاراکترهای خاص باشد، و حداقل 12 کاراکتر طول داشته باشد",
|
||||
"password_too_simple_3": "رمز عبور باید شامل اعداد ، حروف کوچک و بزرگ و کاراکترهای خاص باشد، و حداقل 8 کاراکتر طول داشته باشد",
|
||||
"password_too_simple_2": "رمز عبور باید شامل اعداد و حروف کوچک و بزرگ، و حداقل 8 کاراکتر طول داشته باشد",
|
||||
"password_too_simple_1": "رمز عبور باید حداقل 8 کاراکتر باشد",
|
||||
"password_listed": "لطفاً گذرواژه کمی منحصر به فردتری انتخاب کنید. این رمز عبور جزو پر استفاده ترین رمزهای عبور جهان بشمار میرود.",
|
||||
"password_not_match": "گذرواژه ها مطابقت ندارند",
|
||||
"password_changed_error": "رمز عبور تغییر نکرد",
|
||||
"password_changed": "رمز عبور تغییر کرد",
|
||||
"logout": "خروج",
|
||||
"login": "ورود به سیستم",
|
||||
"confirm": "تائید کردن",
|
||||
"new_password": "رمز عبور جدید",
|
||||
"current_password": "رمز عبور فعلی",
|
||||
"edit": "ویرایش",
|
||||
"change_password": "تغییر رمز عبور",
|
||||
"add_forward": "آدرس هدایت ایمیل را اضافه کنید",
|
||||
"add_mail": "یک نام مستعار ایمیل اضافه کنید",
|
||||
"new_forward": "newforward@myforeigndomain.org",
|
||||
"new_mail": "newmail@mydomain.org",
|
||||
"mail_forward": "آدرس ارسال به جلو ایمیل",
|
||||
"mail_addresses": "آدرس ایمیل",
|
||||
"fullname": "نام و نام خانوادگی",
|
||||
"username": "نام کاربری",
|
||||
"information": "اطلاعات شما",
|
||||
"portal": "پورتال YunoHost"
|
||||
}
|
49
portal/locales/fi.json
Normal file
49
portal/locales/fi.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"cancel": "Peruuta",
|
||||
"portal": "YunoHost-portaali",
|
||||
"password": "Salasana",
|
||||
"ok": "OK",
|
||||
"information": "Sinun tiedot",
|
||||
"username": "Käyttäjänimi",
|
||||
"fullname": "Koko nimi",
|
||||
"mail_addresses": "Sähköpostiosoitteet",
|
||||
"mail_forward": "Sähköpostin välitysosoite",
|
||||
"new_mail": "uusiosoite@minundomain.fi",
|
||||
"new_forward": "uusivälitys@minunulkopuolinendomain.fi",
|
||||
"add_mail": "Lisää sähköposti-alias",
|
||||
"add_forward": "Lisää sähköpostin välitysosoite",
|
||||
"change_password": "Vaihda salasana",
|
||||
"edit": "Muokkaa",
|
||||
"current_password": "Nykyinen salasana",
|
||||
"new_password": "Uusi salasana",
|
||||
"confirm": "Vahvista",
|
||||
"login": "Kirjaudu sisään",
|
||||
"logout": "Kirjaudu ulos",
|
||||
"password_changed": "Salasana vaihdettu",
|
||||
"password_changed_error": "Salasanaa ei voitu vaihtaa",
|
||||
"password_not_match": "Salasanat eivät täsmänneet",
|
||||
"password_listed": "Tämä salasana on yksi maailman käytetyimmistä salasanoista. Valitse jotain hieman ainutlaatuisempaa.",
|
||||
"password_too_simple_1": "Salasanan pitää olla ainakin 8 merkin pituinen",
|
||||
"password_too_simple_2": "Salasanan on oltava vähintään 8 merkkiä pitkä ja sen on sisällettävä numeroita, isoja ja pieniä merkkejä",
|
||||
"wrong_current_password": "Nykyinen salasana on väärin",
|
||||
"invalid_mail": "Virheellinen sähköpostiosoite",
|
||||
"invalid_domain": "Virheellinen domain",
|
||||
"invalid_mailforward": "Virheellinen välityssähköpostiosoite",
|
||||
"mail_already_used": "Sähköpostiosoite on jo käytössä",
|
||||
"information_updated": "Tiedot päivitetty",
|
||||
"user_saving_fail": "Uuden käyttäjän tietoja ei voitu tallentaa",
|
||||
"missing_required_fields": "Täytä pakolliset kentät",
|
||||
"wrong_username_password": "Väärä käyttäjänimi tai salasana",
|
||||
"logged_out": "Kirjauduttu ulos",
|
||||
"please_login": "Kirjaudu sisään päästäksesi käsiksi tähän sisältöön",
|
||||
"please_login_from_portal": "Kirjaudu sisään portaalista",
|
||||
"redirection_error_invalid_url": "Uudelleenohjausvirhe: Virheellinen URL-osoite",
|
||||
"redirection_error_unmanaged_domain": "Uudelleenohjausvirhe: Hallitsematon domain",
|
||||
"footerlink_edit": "Muokkaa profiiliani",
|
||||
"footerlink_documentation": "Dokumentaatio",
|
||||
"footerlink_support": "Tuki",
|
||||
"footerlink_administration": "Ylläpito",
|
||||
"password_too_simple_3": "Salasanan on oltava vähintään 8 merkkiä pitkä ja sen on sisällettävä numeroita, isoja ja pieniä merkkejä",
|
||||
"password_too_simple_4": "Salasanan on oltava vähintään 12 merkkiä pitkä ja sen on sisällettävä numeroita, isoja ja pieniä merkkejä",
|
||||
"good_practices_about_user_password": "Valitse vähintään kahdeksan merkkiä pitkä salasana - on kuitenkin hyvä käyttää pidempiä salasanoja (esim. salasanalause) ja/tai erilaisia merkkejä (isoja ja pieniä kirjaimia, numeroita ja erikoismerkkejä)."
|
||||
}
|
|
@ -1,41 +1,49 @@
|
|||
{
|
||||
"portal": "Portail YunoHost",
|
||||
"informations": "Vos informations",
|
||||
"username": "Nom d'utilisateur",
|
||||
"password": "Mot de passe",
|
||||
"fullname": "Nom complet",
|
||||
"mail_addresses": "Adresses email",
|
||||
"mail_forward": "Adresses de transfert",
|
||||
"new_mail": "nouvelle_adresse@domaine.org",
|
||||
"new_forward": "nouveau_transfert@domainedistant.org",
|
||||
"add_mail": "Ajouter une adresse email",
|
||||
"add_forward": "Ajouter une adresse de transfert",
|
||||
"ok": "Valider",
|
||||
"cancel": "Annuler",
|
||||
"change_password": "Changer de mot de passe",
|
||||
"edit": "Éditer",
|
||||
"current_password": "Mot de passe actuel",
|
||||
"new_password": "Nouveau mot de passe",
|
||||
"confirm": "Confirmation",
|
||||
"login": "Connexion",
|
||||
"logout": "Déconnexion",
|
||||
"password_changed": "Mot de passe modifié",
|
||||
"password_changed_error": "Une erreur s'est produite lors du changement de mot de passe",
|
||||
"password_not_match": "Les nouveaux mots de passe ne correspondent pas",
|
||||
"wrong_current_password": "Le mot de passe actuel est incorrect",
|
||||
"invalid_mail": "Adresse email invalide",
|
||||
"invalid_domain": "Nom de domaine invalide dans",
|
||||
"invalid_mailforward": "Adresse email de transfert invalide",
|
||||
"mail_already_used": "Adresse déjà utilisée :",
|
||||
"informations_updated": "Informations mises à jour",
|
||||
"user_saving_fail": "Une erreur s'est produite lors de la modification des informations",
|
||||
"missing_required_fields": "Champs requis manquants",
|
||||
"wrong_username_password": "Nom d'utilisateur ou mot de passe incorrect",
|
||||
"logged_out": "Déconnecté",
|
||||
"please_login": "Veuillez vous identifier pour accéder à cette page",
|
||||
"please_login_from_portal": "Veuillez vous identifiez depuis le portail",
|
||||
"footerlink_edit": "Éditer mon profil",
|
||||
"footerlink_documentation": "Documentation",
|
||||
"footerlink_support": "Support",
|
||||
"footerlink_administration": "Administration"
|
||||
"add_forward": "Ajouter une adresse de transfert",
|
||||
"add_mail": "Ajouter un alias de courriel",
|
||||
"cancel": "Annuler",
|
||||
"change_password": "Changer de mot de passe",
|
||||
"confirm": "Confirmation",
|
||||
"current_password": "Mot de passe actuel",
|
||||
"edit": "Éditer",
|
||||
"footerlink_administration": "Administration",
|
||||
"footerlink_documentation": "Documentation",
|
||||
"footerlink_edit": "Éditer mon profil",
|
||||
"footerlink_support": "Support",
|
||||
"fullname": "Nom complet",
|
||||
"information": "Vos infos",
|
||||
"information_updated": "Info mises à jour",
|
||||
"invalid_domain": "Nom de domaine invalide dans",
|
||||
"invalid_mail": "Adresse de courriel invalide",
|
||||
"invalid_mailforward": "Adresse courriel de transfert invalide",
|
||||
"logged_out": "Déconnecté",
|
||||
"login": "Connexion",
|
||||
"logout": "Déconnexion",
|
||||
"mail_addresses": "Adresses de courriel",
|
||||
"mail_already_used": "Adresse de courriel déjà utilisée",
|
||||
"mail_forward": "Adresses de transfert",
|
||||
"missing_required_fields": "Remplir les champs obligatoires",
|
||||
"new_forward": "nouveau_transfert@domainedistant.org",
|
||||
"new_mail": "nouvelle_adresse@domaine.org",
|
||||
"new_password": "Nouveau mot de passe",
|
||||
"ok": "OK",
|
||||
"password": "Mot de passe",
|
||||
"password_changed": "Mot de passe modifié",
|
||||
"password_changed_error": "Impossible de changer le mot de passe",
|
||||
"password_not_match": "Les mots de passe ne correspondent pas",
|
||||
"please_login": "Veuillez vous identifier pour accéder à cette page",
|
||||
"please_login_from_portal": "Veuillez vous identifier depuis le portail",
|
||||
"portal": "Portail YunoHost",
|
||||
"user_saving_fail": "Impossible d'enregistrer les nouvelles informations de compte",
|
||||
"username": "Nom du compte",
|
||||
"wrong_current_password": "Le mot de passe actuel est incorrect",
|
||||
"wrong_username_password": "Nom de compte ou mot de passe incorrect",
|
||||
"redirection_error_invalid_url": "Erreur de redirection : URL invalide",
|
||||
"redirection_error_unmanaged_domain": "Erreur de redirection : domaine non géré",
|
||||
"password_listed": "Ce mot de passe est l'un des mots de passe les plus utilisés dans le monde. Veuillez choisir quelque chose d'un peu plus singulier.",
|
||||
"password_too_simple_1": "Le mot de passe doit comporter au moins 8 caractères",
|
||||
"password_too_simple_2": "Le mot de passe doit comporter au moins 8 caractères et contenir des chiffres, des majuscules et des minuscules",
|
||||
"password_too_simple_3": "Le mot de passe doit comporter au moins 8 caractères et contenir des chiffres, des majuscules, des minuscules et des caractères spéciaux",
|
||||
"password_too_simple_4": "Le mot de passe doit comporter au moins 12 caractères et contenir des chiffres, des majuscules, des minuscules et des caractères spéciaux",
|
||||
"good_practices_about_user_password": "Choisissez un mot de passe d’au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase secrète) et/ou une combinaison de caractères (majuscules, minuscules, chiffres et caractères spéciaux)."
|
||||
}
|
||||
|
|
49
portal/locales/gl.json
Normal file
49
portal/locales/gl.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"footerlink_administration": "Administración",
|
||||
"footerlink_support": "Axuda",
|
||||
"footerlink_documentation": "Documentación",
|
||||
"footerlink_edit": "Editar o meu perfil",
|
||||
"redirection_error_unmanaged_domain": "Erro na redirección: Dominio non xestionado",
|
||||
"redirection_error_invalid_url": "Erro na redirección: URL non válido",
|
||||
"please_login_from_portal": "Conéctate desde o portal",
|
||||
"please_login": "Conéctate para acceder a este contido",
|
||||
"logged_out": "Sesión pechada",
|
||||
"wrong_username_password": "Credenciais incorrectas",
|
||||
"missing_required_fields": "Completa os campos requeridos",
|
||||
"user_saving_fail": "Non se gardou a info da nova usuaria",
|
||||
"information_updated": "Info actualizada",
|
||||
"mail_already_used": "Xa está en uso o enderezo de email",
|
||||
"invalid_mailforward": "Enderezo de reenvío de email non válido",
|
||||
"invalid_domain": "Dominio non válido",
|
||||
"invalid_mail": "Enderezo de email non válido",
|
||||
"wrong_current_password": "O contrasinal actual é incorrecto",
|
||||
"good_practices_about_user_password": "Elixe un contrasinal con 8 caracteres como mínimo - é recomendable que sexa longo (ex. unha frase) e utilizar varios tipos de caracteres (maiúsculas, minúsculas, díxitos e caracteres especiais).",
|
||||
"password_too_simple_4": "O contrasinal debe ter 12 caracteres como mínimo e ter díxitos, maiúsculas e minúsculas e caracteres especiais",
|
||||
"password_too_simple_3": "O contrasinal debe ter 8 caracteres como mínimo e ter díxitos, maiúsculas e minúsculas e caracteres especiais",
|
||||
"password_too_simple_2": "O contrasinal debe ter 8 caracteres como mínimo e ter díxitos e caracteres en maiúsculas e minúsculas",
|
||||
"password_too_simple_1": "O contrasinal ten que ter 8 caracteres como mínimo",
|
||||
"password_listed": "Este contrasinal é un dos máis utilizados no mundo. Mellor elixe un que sexa máis orixinal.",
|
||||
"password_not_match": "Os contrasinais non concordan",
|
||||
"password_changed_error": "Non se cambiou o contrasinal",
|
||||
"password_changed": "Contrasinal cambiado",
|
||||
"logout": "Pechar sesión",
|
||||
"login": "Acceder",
|
||||
"confirm": "Confirmar",
|
||||
"new_password": "Novo contrasinal",
|
||||
"current_password": "Contrasinal actual",
|
||||
"edit": "Editar",
|
||||
"change_password": "Cambiar contrasinal",
|
||||
"cancel": "Cancelar",
|
||||
"ok": "Ok",
|
||||
"add_forward": "Engadir un enderezo de reenvío de email",
|
||||
"add_mail": "Engadir un alias de email",
|
||||
"new_forward": "novoreenvio@omeudominioexterno.org",
|
||||
"new_mail": "novomail@omeudominio.org",
|
||||
"mail_forward": "Enderezo de reenvío de email",
|
||||
"mail_addresses": "Enderezos de email",
|
||||
"fullname": "Nome completo",
|
||||
"password": "Contrasinal",
|
||||
"username": "Identificador",
|
||||
"information": "A túa info",
|
||||
"portal": "Portal YunoHost"
|
||||
}
|
1
portal/locales/he.json
Normal file
1
portal/locales/he.json
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
49
portal/locales/hi.json
Normal file
49
portal/locales/hi.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"logged_out": "लॉग आउट",
|
||||
"password": "पासवर्ड",
|
||||
"footerlink_administration": "प्रशासन",
|
||||
"footerlink_support": "समर्थन",
|
||||
"footerlink_documentation": "प्रलेखन",
|
||||
"footerlink_edit": "मेरे प्रोफ़ाइल संपादित करे",
|
||||
"redirection_error_unmanaged_domain": "पुनर्निर्देशन त्रुटि: अप्रबंधित डोमेन",
|
||||
"redirection_error_invalid_url": "पुनर्निर्देशन त्रुटि: अमान्य URL",
|
||||
"please_login_from_portal": "कृपया पोर्टल से लॉग इन करें",
|
||||
"please_login": "कृपया इस सामग्री तक पहुंचने के लिए लॉग इन करें",
|
||||
"wrong_username_password": "उपयोगकर्ता का गलत नाम और पासवर्ड",
|
||||
"missing_required_fields": "आवश्यक फ़ील्ड भरें",
|
||||
"user_saving_fail": "नई उपयोगकर्ता जानकारी को सहेज नहीं सका",
|
||||
"information_updated": "जानकारी अपडेट की गई",
|
||||
"mail_already_used": "यह ईमेल अड्रेस पहले से ही उपयोग में है",
|
||||
"invalid_mailforward": "अमान्य ई-मेल अग्रेषण पता",
|
||||
"invalid_domain": "में अमान्य डोमेन",
|
||||
"invalid_mail": "अमान्य ईमेल पता",
|
||||
"wrong_current_password": "वर्तमान पासवर्ड गलत है",
|
||||
"good_practices_about_user_password": "कम से कम 8 वर्णों का एक उपयोगकर्ता पासवर्ड चुनें - हालाँकि यह लंबे लोगों (यानी एक पासफ़्रेज़) और / या विभिन्न प्रकार के वर्ण (अपरकेस, लोअरकेस, अंक और विशेष वर्ण) का उपयोग करने के लिए अच्छा अभ्यास है।",
|
||||
"password_too_simple_4": "पासवर्ड को कम से कम 12 वर्णों का होना चाहिए और इसमें अंक, ऊपरी, निचले और विशेष वर्ण शामिल होने चाहिए",
|
||||
"password_too_simple_3": "पासवर्ड को कम से कम 8 वर्ण लंबा होना चाहिए और इसमें अंक, ऊपरी, निचले और विशेष वर्ण शामिल हैं",
|
||||
"password_too_simple_2": "पासवर्ड को कम से कम 8 वर्ण लंबा होना चाहिए और इसमें अंक, ऊपरी और निचले वर्ण शामिल हैं",
|
||||
"password_too_simple_1": "पासवर्ड को कम से कम 8 वर्ण लंबा होना चाहिए",
|
||||
"password_listed": "यह पासवर्ड दुनिया में सबसे ज्यादा इस्तेमाल किए जाने वाले पासवर्ड में से है। कृपया कुछ और अनोखा चुनें।",
|
||||
"password_not_match": "पासवर्ड मेल नहीं खाते",
|
||||
"password_changed_error": "पासवर्ड नहीं बदल सका",
|
||||
"password_changed": "पासवर्ड बदला गया",
|
||||
"logout": "लोग आउट",
|
||||
"login": "लॉग इन करें",
|
||||
"confirm": "की पुष्टि करें",
|
||||
"new_password": "नया पासवर्ड",
|
||||
"current_password": "वर्तमान पासवर्ड",
|
||||
"edit": "संपादित करें",
|
||||
"change_password": "पासवर्ड बदलें",
|
||||
"cancel": "रद्द करना",
|
||||
"ok": "ठीक है",
|
||||
"add_forward": "एक ई-मेल अग्रेषण पता जोड़ें",
|
||||
"add_mail": "एक ईमेल उपनाम जोड़ें",
|
||||
"new_forward": "newforward@myforeigndomain.org",
|
||||
"new_mail": "newmail@mydomain.org",
|
||||
"mail_forward": "ई-मेल अग्रेषण पता",
|
||||
"mail_addresses": "ईमेल पता",
|
||||
"fullname": "पूरा नाम",
|
||||
"username": "उपयोगकर्ता नाम",
|
||||
"information": "आपकी जानकारी",
|
||||
"portal": "यूनोहास्ट पोर्टल"
|
||||
}
|
49
portal/locales/hu.json
Normal file
49
portal/locales/hu.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"footerlink_administration": "Adminisztráció",
|
||||
"footerlink_support": "Támogatás",
|
||||
"footerlink_documentation": "Dokumentáció",
|
||||
"footerlink_edit": "Profilom szerkesztése",
|
||||
"redirection_error_unmanaged_domain": "Átirányítási hiba: Nem kezelt domain",
|
||||
"redirection_error_invalid_url": "Átirányítási hiba: érvénytelen URL",
|
||||
"please_login_from_portal": "Kérjük, jelentkezzen be a portálról",
|
||||
"please_login": "Kérjük, jelentkezzen be, hogy hozzáférjen ehhez a tartalomhoz",
|
||||
"logged_out": "Kilépett",
|
||||
"wrong_username_password": "Rossz felhasználónév vagy jelszó",
|
||||
"missing_required_fields": "Töltse ki a kötelező mezőket",
|
||||
"user_saving_fail": "Nem sikerült menteni az új felhasználói információkat",
|
||||
"information_updated": "Az információ frissítve",
|
||||
"mail_already_used": "Az e-mail cím már használatban van",
|
||||
"invalid_mailforward": "Érvénytelen e-mail továbbító cím",
|
||||
"invalid_domain": "Érvénytelen domain itt",
|
||||
"invalid_mail": "Érvénytelen e-mail cím",
|
||||
"wrong_current_password": "A jelenlegi jelszó helytelen",
|
||||
"good_practices_about_user_password": "Válasszon legalább 8 karakterből álló felhasználói jelszót - jó gyakorlat azonban hosszabb jelszó használata (azaz egy jelmondat) és/vagy különféle karakterek (nagybetűk, kisbetűk, számjegyek és speciális karakterek) használata.",
|
||||
"password_too_simple_4": "A jelszónak legalább 12 karakter hosszúnak kell lennie, és tartalmaznia kell számjegy, felső, alsó és speciális karaktereket",
|
||||
"password_too_simple_3": "A jelszónak legalább 8 karakter hosszúnak kell lennie, és tartalmaznia kell számjegy, felső, alsó és speciális karaktereket",
|
||||
"password_too_simple_2": "A jelszónak legalább 8 karakter hosszúnak kell lennie, és számjegyű, felső és alsó karaktereket kell tartalmaznia",
|
||||
"password_too_simple_1": "A jelszónak legalább 8 karakter hosszúnak kell lennie",
|
||||
"password_listed": "Ez a jelszó a világ egyik leggyakrabban használt jelszava. Kérjük, válasszon egy kicsit egyediabbat.",
|
||||
"password_not_match": "A jelszavak nem egyeznek",
|
||||
"password_changed_error": "Nem sikerült megváltoztatni a jelszót",
|
||||
"password_changed": "A jelszó megváltozott",
|
||||
"logout": "Kijelentkezés",
|
||||
"login": "Belépés",
|
||||
"confirm": "megerősít",
|
||||
"new_password": "Új jelszó",
|
||||
"current_password": "Jelenlegi jelszó",
|
||||
"edit": "Ezerkesztése",
|
||||
"change_password": "Jelszó módosítása",
|
||||
"cancel": "Megszünteti",
|
||||
"ok": "Rendben",
|
||||
"add_forward": "Adjon hozzá egy e-mail továbbító címet",
|
||||
"add_mail": "Adjon hozzá egy e-mail álnevet",
|
||||
"new_forward": "newforward@myforeigndomain.org",
|
||||
"new_mail": "newmail@mydomain.org",
|
||||
"mail_forward": "E-mail továbbítási cím",
|
||||
"mail_addresses": "Email címek",
|
||||
"fullname": "Teljes név",
|
||||
"password": "Jelszó",
|
||||
"username": "Felhasználónév",
|
||||
"information": "Az Ön adata",
|
||||
"portal": "YunoHost portál"
|
||||
}
|
49
portal/locales/id.json
Normal file
49
portal/locales/id.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"cancel": "Batal",
|
||||
"portal": "Portal YunoHost",
|
||||
"information": "Info Anda",
|
||||
"username": "Nama Pengguna",
|
||||
"password": "Kata sandi",
|
||||
"fullname": "Nama Lengkap",
|
||||
"mail_addresses": "Alamat surel",
|
||||
"mail_forward": "Alamat surel terusan",
|
||||
"new_mail": "surelbaru@domainku.org",
|
||||
"new_forward": "terusanbaru@domainlainku.org",
|
||||
"add_mail": "Buat surel alias",
|
||||
"add_forward": "Buat alamat surel terusan",
|
||||
"ok": "Oke",
|
||||
"change_password": "Ubah kata sandi",
|
||||
"edit": "Sunting",
|
||||
"current_password": "Kata sandi saat ini",
|
||||
"new_password": "Kata sandi baru",
|
||||
"confirm": "Konfirmasi",
|
||||
"login": "Masuk",
|
||||
"logout": "Keluar",
|
||||
"password_changed": "Kata sandi diubah",
|
||||
"password_changed_error": "Tidak dapat mengubah kata sandi",
|
||||
"password_not_match": "Kata sandi tidak sama",
|
||||
"password_listed": "Kata sandi ini merupakan salah satu kata sandi yang paling sering digunakan di dunia. Coba pilih sesuatu yang lebih unik.",
|
||||
"password_too_simple_1": "Panjang kata sandi harus paling tidak 8 karakter",
|
||||
"wrong_current_password": "Kata sandi saat ini salah",
|
||||
"invalid_mail": "Alamat surel tidak valid",
|
||||
"mail_already_used": "Alamat surel sudah digunakan",
|
||||
"information_updated": "Info diperbarui",
|
||||
"user_saving_fail": "Tidak dapat menyimpan info baru pengguna",
|
||||
"wrong_username_password": "Nama pengguna atau kata sandi salah",
|
||||
"logged_out": "Berhasil keluar",
|
||||
"please_login": "Masuk untuk mengakses konten ini",
|
||||
"please_login_from_portal": "Silakan masuk dari portal",
|
||||
"redirection_error_invalid_url": "Kesalahan pengalihan: URL tidak valid",
|
||||
"redirection_error_unmanaged_domain": "Kesalahan pengalihan: Domain tak dikelola",
|
||||
"footerlink_edit": "Sunting profil saya",
|
||||
"footerlink_documentation": "Dokumentasi",
|
||||
"footerlink_support": "Dukungan",
|
||||
"footerlink_administration": "Administrasi",
|
||||
"password_too_simple_2": "Kata sandi harus sekurang-kurangnya 8 karakter dan memiliki angka, huruf kapital dan huruf kecil",
|
||||
"password_too_simple_3": "Kata sandi harus sekurang-kurangnya 8 karakter dan memiliki angka, huruf kapital, huruf kecil, dan karakter spesial",
|
||||
"password_too_simple_4": "Kata sandi harus sekurang-kurangnya 12 karakter dan memiliki angka, huruf kapital, huruf kecil, dan karakter spesial",
|
||||
"good_practices_about_user_password": "Pilih kata sandi sekurang-kurangnya 8 karakter - meskipun memang adalah hal yang baik jika menggunakan yang lebih panjang (cth. parafrasa) dan/atau menggunakan berbagai macam karakter (kapital, huruf kecil, angka, dan karakter lainnya).",
|
||||
"invalid_domain": "Domain tidak valid di",
|
||||
"invalid_mailforward": "Alamat surel terusan tidak valid",
|
||||
"missing_required_fields": "Isi bidang yang diperlukan"
|
||||
}
|
49
portal/locales/it.json
Normal file
49
portal/locales/it.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"add_forward": "Aggiungi un indirizzo di inoltro e-mail",
|
||||
"add_mail": "Aggiungi un alias email",
|
||||
"cancel": "Annulla",
|
||||
"change_password": "Cambia password",
|
||||
"confirm": "Conferma",
|
||||
"current_password": "Password attuale",
|
||||
"edit": "Modifica",
|
||||
"footerlink_administration": "Amministrazione",
|
||||
"footerlink_documentation": "Documentazione",
|
||||
"footerlink_edit": "Modifica il mio profilo",
|
||||
"footerlink_support": "Supporto",
|
||||
"fullname": "Nome e cognome",
|
||||
"information": "Le tue informazioni",
|
||||
"information_updated": "Informazioni aggiornate",
|
||||
"invalid_domain": "Dominio non valido in",
|
||||
"invalid_mail": "Indirizzo email non valido",
|
||||
"invalid_mailforward": "Indirizzo di inoltro e-mail non valido",
|
||||
"logged_out": "Disconnesso",
|
||||
"login": "Accedi",
|
||||
"logout": "Esci",
|
||||
"mail_addresses": "Indirizzi email",
|
||||
"mail_already_used": "Indirizzo email già in uso",
|
||||
"mail_forward": "Indirizzo di inoltro e-mail",
|
||||
"missing_required_fields": "Compila i campi richiesti",
|
||||
"new_forward": "nuovoinoltro@miodominiodifferente.org",
|
||||
"new_mail": "nuovaemail@miodominio.org",
|
||||
"new_password": "Nuova password",
|
||||
"ok": "OK",
|
||||
"password": "Password",
|
||||
"password_changed": "Password cambiata",
|
||||
"password_changed_error": "Impossibile cambiare la password",
|
||||
"password_not_match": "Le password non corrispondono",
|
||||
"please_login": "Per favore, accedi per visualizzare il contenuto",
|
||||
"please_login_from_portal": "Per favore, accedi dal portale",
|
||||
"portal": "Portale YunoHost",
|
||||
"user_saving_fail": "Impossibile salvare le informazioni sul nuovo utente",
|
||||
"username": "Nome utente",
|
||||
"wrong_current_password": "La password attuale è sbagliata",
|
||||
"wrong_username_password": "Nome utente o password sbagliati",
|
||||
"redirection_error_invalid_url": "Errore di reindirizzamento: URL non valido",
|
||||
"redirection_error_unmanaged_domain": "Errore di redirezionamento: dominio non gestito",
|
||||
"password_listed": "Questa password è tra le password più utilizzate al mondo. Scegli qualcosa di un po 'più unico.",
|
||||
"password_too_simple_1": "La password deve contenere almeno 8 caratteri",
|
||||
"password_too_simple_2": "La password deve contenere almeno 8 caratteri e contiene cifre, caratteri superiori e inferiori",
|
||||
"password_too_simple_3": "La password deve contenere almeno 8 caratteri e contiene caratteri numerici, superiori, inferiori e speciali",
|
||||
"password_too_simple_4": "La password deve contenere almeno 12 caratteri e contiene caratteri numerici, superiori, inferiori e speciali",
|
||||
"good_practices_about_user_password": "Scegli una password utente di almeno 8 caratteri, anche se è buona norma utilizzare quelli più lunghi (ad esempio una passphrase) e / o utilizzare vari tipi di caratteri (lettere maiuscole, minuscole, cifre e caratteri speciali)."
|
||||
}
|
49
portal/locales/ja.json
Normal file
49
portal/locales/ja.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"portal": "YunoHost ポータル",
|
||||
"information": "あなたの情報",
|
||||
"username": "ユーザー名",
|
||||
"password": "パスワード",
|
||||
"fullname": "フルネーム",
|
||||
"mail_addresses": "電子メールアドレス",
|
||||
"mail_forward": "電子メール転送アドレス",
|
||||
"new_mail": "newmail@mydomain.org",
|
||||
"add_mail": "電子メール エイリアスを追加",
|
||||
"add_forward": "電子メール転送アドレスを追加",
|
||||
"ok": "OK",
|
||||
"change_password": "パスワード変更",
|
||||
"edit": "編集",
|
||||
"new_password": "新しいパスワード",
|
||||
"confirm": "確認",
|
||||
"logout": "ログアウト",
|
||||
"password_changed": "パスワードが変更されました",
|
||||
"password_not_match": "パスワードが一致しません",
|
||||
"password_too_simple_1": "パスワードは8文字以上である必要があります",
|
||||
"password_too_simple_2": "パスワードは8文字以上で、数字/大文字/小文字の全てを含む必要があります",
|
||||
"password_too_simple_3": "パスワードは8文字以上で、数字/大文字/小文字/特殊文字の全てを含む必要があります",
|
||||
"password_too_simple_4": "パスワードは12文字以上で、数字/大文字/小文字/特殊文字の全てを含む必要があります",
|
||||
"wrong_current_password": "現在のパスワードが間違っています",
|
||||
"invalid_mail": "不正な電子メールアドレス",
|
||||
"invalid_domain": "不正なドメイン",
|
||||
"invalid_mailforward": "不正な電子メール転送アドレス",
|
||||
"mail_already_used": "電子メールアドレスは既に使われています",
|
||||
"information_updated": "情報が更新されました",
|
||||
"user_saving_fail": "新しいユーザー情報を保存できませんでした",
|
||||
"missing_required_fields": "必須フィールドに入力してください",
|
||||
"wrong_username_password": "ユーザー名かパスワードが間違っています",
|
||||
"logged_out": "ログアウトしました",
|
||||
"please_login": "このコンテンツにアクセスするにはログインしてください",
|
||||
"please_login_from_portal": "ポータルからログインしてください",
|
||||
"redirection_error_invalid_url": "リダイレクションエラー: 不正なURL",
|
||||
"redirection_error_unmanaged_domain": "リダイレクションエラー: 管理されていないドメイン",
|
||||
"footerlink_edit": "プロフィールを編集する",
|
||||
"footerlink_documentation": "ドキュメント",
|
||||
"footerlink_support": "サポート",
|
||||
"footerlink_administration": "管理",
|
||||
"cancel": "キャンセル",
|
||||
"new_forward": "newforward@myforeigndomain.org",
|
||||
"current_password": "現在のパスワード",
|
||||
"login": "ログイン",
|
||||
"password_changed_error": "パスワードは変更できませんでした",
|
||||
"password_listed": "このパスワードは世界で最も使われているパスワードのひとつです。もう少しユニークなものを選んでください。",
|
||||
"good_practices_about_user_password": "ユーザーパスワードは最低でも8文字、より長いもの(パスフレーズなど)にしたり、さまざまな種類の文字(大文字、小文字、数字、特殊文字)を使うことが望ましいです。"
|
||||
}
|
18
portal/locales/kab.json
Normal file
18
portal/locales/kab.json
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"username": "Isem n useqdac",
|
||||
"password": "Awal n uɛeddi",
|
||||
"fullname": "Isem inek ummid",
|
||||
"ok": "Ih",
|
||||
"cancel": "Sefsex",
|
||||
"change_password": "Beddel awal n uffir",
|
||||
"edit": "Édition",
|
||||
"current_password": "Awal n uɛeddi amiran",
|
||||
"new_password": "Awal uffir amaynut",
|
||||
"confirm": "Sentem",
|
||||
"login": "Qqen",
|
||||
"logout": "Senser",
|
||||
"logged_out": "Yeffeɣ",
|
||||
"footerlink_documentation": "Tasemlit",
|
||||
"footerlink_support": "Tallalt",
|
||||
"footerlink_administration": "Tadbelt"
|
||||
}
|
1
portal/locales/ko.json
Normal file
1
portal/locales/ko.json
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
1
portal/locales/lt.json
Normal file
1
portal/locales/lt.json
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
1
portal/locales/mk.json
Normal file
1
portal/locales/mk.json
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
29
portal/locales/nb_NO.json
Normal file
29
portal/locales/nb_NO.json
Normal file
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"footerlink_administration": "Administrasjon",
|
||||
"footerlink_support": "Støtte",
|
||||
"footerlink_documentation": "Dokumentasjon",
|
||||
"footerlink_edit": "Rediger min profil",
|
||||
"redirection_error_unmanaged_domain": "Videresendingsfeil: Uhåndtert domene",
|
||||
"redirection_error_invalid_url": "Videresendingsfeil: Ugyldig nettadresse",
|
||||
"please_login_from_portal": "Logg inn fra portalen",
|
||||
"please_login": "Logg inn for å få tilgang til dette innholdet",
|
||||
"logged_out": "Utlogget",
|
||||
"wrong_username_password": "Feil brukernavn eller passord",
|
||||
"information_updated": "Info oppdatert",
|
||||
"invalid_domain": "Ugyldig domene i",
|
||||
"wrong_current_password": "Nåværende passord er feil",
|
||||
"password_changed": "Passord endret",
|
||||
"logout": "Logg ut",
|
||||
"login": "Logg inn",
|
||||
"confirm": "Bekreft",
|
||||
"new_password": "Nytt passord",
|
||||
"current_password": "Nåværende passord",
|
||||
"edit": "Rediger",
|
||||
"change_password": "Endre passord",
|
||||
"cancel": "Avbryt",
|
||||
"ok": "OK",
|
||||
"password": "Passord",
|
||||
"username": "Brukernavn",
|
||||
"information": "Din informasjon",
|
||||
"portal": "YunoHost-portal"
|
||||
}
|
49
portal/locales/ne.json
Normal file
49
portal/locales/ne.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"footerlink_administration": "प्रशासन",
|
||||
"footerlink_support": "समर्थन",
|
||||
"footerlink_documentation": "कागजात",
|
||||
"footerlink_edit": "मेरो प्रोफाइल सम्पादन गर्नुहोस्",
|
||||
"redirection_error_unmanaged_domain": "पुनर्निर्देशन त्रुटि: अव्यवस्थित डोमेन",
|
||||
"redirection_error_invalid_url": "रिडिरेसन त्रुटि: अवैध URL",
|
||||
"please_login_from_portal": "कृपया पोर्टलबाट लग ईन गर्नुहोस्",
|
||||
"please_login": "यस सामग्री पहुँच गर्न कृपया लग इन गर्नुहोस्",
|
||||
"logged_out": "लग आउट",
|
||||
"wrong_username_password": "गलत प्रयोगकर्ता नाम वा पासवर्ड",
|
||||
"missing_required_fields": "आवश्यक फिल्डहरू भर्नुहोस्",
|
||||
"user_saving_fail": "नयाँ प्रयोगकर्ता जानकारी बचत गर्न सकेन",
|
||||
"information_updated": "जानकारी अपडेट गरियो",
|
||||
"mail_already_used": "इ-मेल ठेगाना पहिले नै प्रयोगमा छ",
|
||||
"invalid_mailforward": "अवैध ईमेल फर्वार्डिंग ठेगाना",
|
||||
"invalid_domain": "अमान्य डोमेन भित्र",
|
||||
"invalid_mail": "अवैध ईमेल ठेगाना",
|
||||
"wrong_current_password": "हालको पासवर्ड गलत छ",
|
||||
"good_practices_about_user_password": "कम्तिमा characters क्यारेक्टरहरूको प्रयोगकर्ता पासवर्ड छान्नुहोस् - यद्यपि यो लामो अभ्यास (अर्थात पासफ्रेज) प्रयोग गर्न राम्रो अभ्यास हो र / वा विभिन्न प्रकारका वर्णहरू (अपरकेस, लोअरकेस, अंक र विशेष क्यारेक्टर) प्रयोग गर्नुहोस्।",
|
||||
"password_too_simple_4": "पासवर्ड कम्तिमा १२ वर्ण लामो हुनु पर्छ र अंक, माथिल्लो, तल्लो र विशेष क्यारेक्टर समावेश गर्दछ",
|
||||
"password_too_simple_3": "पासवर्ड कम्तिमा characters वर्ण लामो हुनु पर्छ र अंक, माथिल्लो, तल्लो र विशेष क्यारेक्टर समावेश गर्दछ",
|
||||
"password_too_simple_2": "पासवर्ड कम्तिमा characters क्यारेक्टर लामो हुनुपर्दछ र अंक, माथिल्लो र तल्लो वर्णहरू समावेश गर्दछ",
|
||||
"password_too_simple_1": "पासवर्ड कम्तिमा characters अक्षर लामो हुनु आवश्यक छ",
|
||||
"password_listed": "यो पासवर्ड विश्व मा सबै भन्दा बढी प्रयोग भएको पासवर्ड बीच हो। कृपया केहि अलि बढी अनौंठो छनौट गर्नुहोस्।",
|
||||
"password_not_match": "पासवर्ड मेल खाँदैन",
|
||||
"password_changed_error": "पासवर्ड परिवर्तन गर्न सकेन",
|
||||
"password_changed": "पासवर्ड परिवर्तन भयो",
|
||||
"logout": "बाहिर निस्कनु",
|
||||
"login": "लग - इन",
|
||||
"confirm": "पुष्टि गर्नुहोस्",
|
||||
"new_password": "नया पासवर्ड",
|
||||
"current_password": "वर्तमान पासवर्ड",
|
||||
"edit": "सम्पादन गर्नुहोस्",
|
||||
"change_password": "पासवर्ड परिवर्तन गर्नुहोस्",
|
||||
"cancel": "रद्द गर्नुहोस्",
|
||||
"ok": "ठिक छ",
|
||||
"add_forward": "एक ईमेल अग्रेषण ठेगाना जोड्नुहोस्",
|
||||
"add_mail": "ईमेल उपनाम थप्नुहोस्",
|
||||
"new_forward": "नयाँअगाडी@माईफोरिगेन्डोमाइन.org",
|
||||
"new_mail": "नयाँमेल@माईडोमेन.org",
|
||||
"mail_forward": "इ-मेल फर्वार्डिंग ठेगाना",
|
||||
"mail_addresses": "इ-मेल ठेगानाहरू",
|
||||
"fullname": "पुरा नाम",
|
||||
"password": "पासवर्ड",
|
||||
"username": "प्रयोगकर्ता नाम",
|
||||
"information": "तपाईको जानकारी",
|
||||
"portal": "YunoHost पोर्टल"
|
||||
}
|
49
portal/locales/nl.json
Normal file
49
portal/locales/nl.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"add_forward": "Voeg een e-mail doorstuuradres toe",
|
||||
"add_mail": "Voeg een e-mailalias toe",
|
||||
"cancel": "Annuleren",
|
||||
"change_password": "Verander wachtwoord",
|
||||
"confirm": "Bevestig",
|
||||
"current_password": "Huidig wachtwoord",
|
||||
"edit": "Bewerken",
|
||||
"footerlink_administration": "Administratie",
|
||||
"footerlink_documentation": "Documentatie",
|
||||
"footerlink_edit": "Bewerk mijn profiel",
|
||||
"footerlink_support": "Ondersteuning",
|
||||
"fullname": "Voor- en achternaam",
|
||||
"information": "Uw gegevens",
|
||||
"information_updated": "Informatie bijgewerkt",
|
||||
"invalid_domain": "Ongeldig domein in",
|
||||
"invalid_mail": "Ongeldig e-mailadres",
|
||||
"invalid_mailforward": "Ongeldig email-doorstuuradres",
|
||||
"logged_out": "Uitgelogd",
|
||||
"login": "Inloggen",
|
||||
"logout": "Uitloggen",
|
||||
"mail_addresses": "E-mailadressen",
|
||||
"mail_already_used": "E-mailadres al in gebruik",
|
||||
"mail_forward": "E-mail doorstuuradres",
|
||||
"missing_required_fields": "De verplichte velden moeten ingevuld worden",
|
||||
"new_forward": "nieuw_doorstuuradres@mijndomein.org",
|
||||
"new_mail": "nieuwe_email@mijndomein.org",
|
||||
"new_password": "Nieuw wachtwoord",
|
||||
"ok": "OK",
|
||||
"password": "Wachtwoord",
|
||||
"password_changed": "Wachtwoord veranderd",
|
||||
"password_changed_error": "Kon wachtwoord niet veranderen",
|
||||
"password_not_match": "De wachtwoorden komen niet overeen",
|
||||
"please_login": "Log in om toegang te krijgen tot deze inhoud",
|
||||
"please_login_from_portal": "Log in vanaf het portaal",
|
||||
"portal": "YunoHost Portaal",
|
||||
"user_saving_fail": "De nieuwe gebruikersinformatie kon niet opgeslagen worden",
|
||||
"username": "Gebruikersnaam",
|
||||
"wrong_current_password": "Het huidige wachtwoord is fout",
|
||||
"wrong_username_password": "Verkeerde gebruikersnaam of wachtwoord",
|
||||
"password_too_simple_2": "Het wachtwoord moet minimaal 8 tekens lang zijn en moet cijfers, hoofdletters en kleine letters bevatten",
|
||||
"password_too_simple_1": "Het wachtwoord moet minimaal 8 tekens lang zijn",
|
||||
"password_listed": "Dit wachtwoord is een van de meest gebruikte wachtwoorden ter wereld. Kies alstublieft iets wat minder voor de hand ligt.",
|
||||
"redirection_error_unmanaged_domain": "Omleidingsfout: onbeheerd domein",
|
||||
"redirection_error_invalid_url": "Omleidingsfout: ongeldige URL",
|
||||
"good_practices_about_user_password": "Kies een gebruikerswachtwoord van minimaal 8 tekens - hoewel het een goede gewoonte is om langere (bijvoorbeeld een wachtwoordzin) te gebruiken en/of verschillende soorten tekens te gebruiken (hoofdletters, kleine letters, cijfers en speciale tekens).",
|
||||
"password_too_simple_4": "Het wachtwoord moet minimaal 12 tekens lang zijn en moet cijfers, hoofdletters, kleine letters en speciale tekens bevatten",
|
||||
"password_too_simple_3": "Het wachtwoord moet minimaal 8 tekens lang zijn en moet cijfers, hoofdletters, kleine letters en speciale tekens bevatten"
|
||||
}
|
49
portal/locales/oc.json
Normal file
49
portal/locales/oc.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"portal": "Portal YunoHost",
|
||||
"information": "Vòstras informacions",
|
||||
"username": "Nom d’utilizaire",
|
||||
"password": "Senhal",
|
||||
"fullname": "Nom complèt",
|
||||
"mail_addresses": "Adreça de corrièl",
|
||||
"mail_forward": "Adreças de transferiment",
|
||||
"new_mail": "novela_adreça@domeni.org",
|
||||
"new_forward": "novel_transferiment@domenialonhat.org",
|
||||
"add_mail": "Ajustar un alias d’adreça electronica",
|
||||
"add_forward": "Ajustar una adreça de transferiment",
|
||||
"ok": "OK",
|
||||
"cancel": "Anullar",
|
||||
"change_password": "Cambiar lo senhal",
|
||||
"edit": "Editar",
|
||||
"current_password": "Senhal actual",
|
||||
"new_password": "Nòu senhal",
|
||||
"confirm": "Confirmar",
|
||||
"login": "Connexion",
|
||||
"logout": "Desconnexion",
|
||||
"password_changed": "Senhal modificat",
|
||||
"password_changed_error": "Una error s’es producha en cambiar lo senhal",
|
||||
"password_not_match": "Los nòus senhals correspondon pas",
|
||||
"wrong_current_password": "Lo senhal actual es incorrècte",
|
||||
"invalid_mail": "Adreça de corrièl invalida",
|
||||
"invalid_domain": "Nom de domeni invalid dins",
|
||||
"invalid_mailforward": "Adreça de transferiment invalida",
|
||||
"mail_already_used": "Adreça ja utilizada",
|
||||
"information_updated": "Informacions actualizadas",
|
||||
"user_saving_fail": "Enregistrament impossible de las nòvas informacions utilizaire",
|
||||
"missing_required_fields": "Garnissètz los camps requesits",
|
||||
"wrong_username_password": "Nom d’utilizaire o senhal incorrècte",
|
||||
"logged_out": "Desconnectat",
|
||||
"please_login": "Mercé de vos identificar per accedir a la pagina",
|
||||
"please_login_from_portal": "Mercés de vos identificar dins del portal",
|
||||
"redirection_error_invalid_url": "Error de redireccion : URL invalida",
|
||||
"redirection_error_unmanaged_domain": "Error de redireccion : domeni pas gerit",
|
||||
"footerlink_edit": "Editar lo perfil",
|
||||
"footerlink_documentation": "Documentacion",
|
||||
"footerlink_support": "Assisténcia",
|
||||
"footerlink_administration": "Administracion",
|
||||
"password_listed": "Aqueste senhal es un dels mai utilizats al monde. Se vos plai utilizatz-ne un mai unic.",
|
||||
"password_too_simple_1": "Lo senhal deu conténer almens 8 caractèrs",
|
||||
"password_too_simple_2": "Lo senhal deu conténer almens 8 caractèrs e nombres, majusculas e minusculas",
|
||||
"password_too_simple_3": "Lo senhal deu conténer almens 8 caractèrs e nombres, majusculas e minusculas e caractèrs especials",
|
||||
"password_too_simple_4": "Lo senhal deu conténer almens 12 caractèrs, de nombre, majusculas, minusculas e caractèrs especials",
|
||||
"good_practices_about_user_password": "Causissètz un senhal d’almens 8 caractèrs, es de bon far d’utilizar un senhal mai long (es a dire una frasa de senhal) e/o utilizar mantun tipe de caractèrs (majusculas, minusculas, nombres e caractèrs especials)."
|
||||
}
|
49
portal/locales/pl.json
Normal file
49
portal/locales/pl.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"add_mail": "Dodaj alias e-mail",
|
||||
"cancel": "Anuluj",
|
||||
"change_password": "Zmień hasło",
|
||||
"confirm": "Potwierdź",
|
||||
"current_password": "Aktualne hasło",
|
||||
"edit": "Edytuj",
|
||||
"footerlink_administration": "Panel administracyjny",
|
||||
"footerlink_documentation": "Dokumentacja",
|
||||
"footerlink_edit": "Edytuj mój profil",
|
||||
"footerlink_support": "Pomoc techniczna",
|
||||
"fullname": "Pełne imię i nazwisko",
|
||||
"information": "Twoje informacje",
|
||||
"logged_out": "Wylogowano",
|
||||
"login": "Zaloguj Się",
|
||||
"logout": "Wyloguj",
|
||||
"mail_addresses": "Adresy e-mail",
|
||||
"mail_already_used": "Adres e mailowy jest już używany",
|
||||
"new_forward": "newforward@myforeigndomain.org",
|
||||
"new_mail": "nowymail@domena.org",
|
||||
"new_password": "Nowe hasło",
|
||||
"ok": "OK",
|
||||
"password": "Hasło",
|
||||
"password_changed": "Hasło zostało zmienione",
|
||||
"please_login": "Proszę się zalogować by uzyskać dostęp do tej strony",
|
||||
"portal": "Portal YunoHost",
|
||||
"username": "Nazwa użytkownika",
|
||||
"wrong_username_password": "Zła nazwa użytkownika lub hasło",
|
||||
"redirection_error_unmanaged_domain": "Błąd przekierowania: domena niezarządzana",
|
||||
"redirection_error_invalid_url": "Błąd przekierowania: nieprawidłowy adres URL",
|
||||
"please_login_from_portal": "Zaloguj się z portalu",
|
||||
"missing_required_fields": "Wypełnij wymagane pola",
|
||||
"user_saving_fail": "Nie można zapisać nowych informacji o użytkowniku",
|
||||
"information_updated": "Informacje zaktualizowane",
|
||||
"invalid_mailforward": "Nieprawidłowy adres e-mail do przekazania",
|
||||
"invalid_domain": "Nieprawidłowa domena w",
|
||||
"invalid_mail": "Niepoprawny adres email",
|
||||
"wrong_current_password": "Obecne hasło jest nieprawidłowe",
|
||||
"good_practices_about_user_password": "Wybierz hasło użytkownika składające się z co najmniej 8 znaków — chociaż dobrą praktyką jest używanie dłuższych i / lub stosowanie różnego rodzaju znaków (wielkie i małe litery, cyfry i znaki specjalne).",
|
||||
"password_too_simple_4": "Hasło musi mieć co najmniej 12 znaków i zawierać cyfrę, duże i małe litery oraz znaki specjalne",
|
||||
"password_too_simple_3": "Hasło musi mieć co najmniej 8 znaków i zawierać cyfrę, duże i małe litery oraz znaki specjalne",
|
||||
"password_too_simple_2": "Hasło musi mieć co najmniej 8 znaków i zawierać cyfrę, górny i dolny znak",
|
||||
"password_too_simple_1": "Hasło musi mieć co najmniej 8 znaków",
|
||||
"password_listed": "To hasło jest jednym z najczęściej używanych haseł na świecie. Wybierz coś bardziej wyjątkowego.",
|
||||
"password_not_match": "Hasła się nie zgadzają",
|
||||
"password_changed_error": "Nie można zmienić hasła",
|
||||
"add_forward": "Dodaj adres e-mail do przekazywania",
|
||||
"mail_forward": "Adres do przekazywania wiadomości e-mail"
|
||||
}
|
49
portal/locales/pt.json
Normal file
49
portal/locales/pt.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"add_forward": "Adicionar um endereço de encaminhamento de email",
|
||||
"add_mail": "Adicionar um alias de email",
|
||||
"cancel": "Cancelar",
|
||||
"change_password": "Alterar senha",
|
||||
"confirm": "Confirmar",
|
||||
"current_password": "Senha atual",
|
||||
"edit": "Editar",
|
||||
"footerlink_administration": "Administração",
|
||||
"footerlink_documentation": "Documentação",
|
||||
"footerlink_edit": "Editar o meu perfil",
|
||||
"footerlink_support": "Suporte",
|
||||
"fullname": "Nome completo",
|
||||
"information": "Suas informações",
|
||||
"information_updated": "Informações atualizadas",
|
||||
"invalid_domain": "Domínio inválido em",
|
||||
"invalid_mail": "Endereço de email invalido",
|
||||
"invalid_mailforward": "Endereço de encaminhamento de email inválido",
|
||||
"logged_out": "Sessão terminada",
|
||||
"login": "Entrar",
|
||||
"logout": "Sair",
|
||||
"mail_addresses": "Endereço de e-mail",
|
||||
"mail_already_used": "Endereço de email já está em uso",
|
||||
"mail_forward": "Endereço de encaminhamento de email",
|
||||
"missing_required_fields": "Preencha os campos obrigatórios",
|
||||
"new_forward": "novoreenvio@dominioexterno.org",
|
||||
"new_mail": "novomail@meudominio.org",
|
||||
"new_password": "Nova senha",
|
||||
"ok": "Confirmar",
|
||||
"password": "Senha",
|
||||
"password_changed": "Senha alterada",
|
||||
"password_changed_error": "Não foi possível alterar a senha",
|
||||
"password_not_match": "As senhas não correspondem",
|
||||
"please_login": "Por favor inicie sessão para aceder a este conteúdo",
|
||||
"please_login_from_portal": "Por favor inicie sessão no portal",
|
||||
"portal": "Portal YunoHost",
|
||||
"user_saving_fail": "Não foi possível salvar as novas informações do usuário",
|
||||
"username": "Nome de utilizador",
|
||||
"wrong_current_password": "A senha atual está incorreta",
|
||||
"wrong_username_password": "Nome de utilizador e senha errados",
|
||||
"redirection_error_invalid_url": "Erro de redirecionamento: URL inválido",
|
||||
"redirection_error_unmanaged_domain": "Erro de redirecionamento: Dominio não gerenciado",
|
||||
"good_practices_about_user_password": "Escolha uma senha de usuário com pelo menos 8 caracteres - embora seja uma boa prática usar palavras mais longas (ou seja, uma senha) e/ou usar vários tipos de caracteres (maiúsculas, minúsculas, dígitos e caracteres especiais).",
|
||||
"password_too_simple_4": "A senha precisa ter pelo menos 12 caracteres e conter dígitos, caracteres superior, inferior e caracteres especiais",
|
||||
"password_too_simple_3": "A senha precisa ter pelo menos 8 caracteres e conter dígitos, caracteres superior, inferior e caracteres especiais",
|
||||
"password_too_simple_2": "A senha precisa ter pelo menos 8 caracteres e conter dígitos, caracteres superior e inferior",
|
||||
"password_too_simple_1": "A senha precisa ter pelo menos 8 caracteres",
|
||||
"password_listed": "Essa senha está entre as senhas mais usadas no mundo. Por favor, escolha algo um pouco mais exclusivo."
|
||||
}
|
1
portal/locales/pt_BR.json
Normal file
1
portal/locales/pt_BR.json
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
49
portal/locales/ru.json
Normal file
49
portal/locales/ru.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"portal": "Портал YunoHost",
|
||||
"information": "Ваша информация",
|
||||
"username": "Имя пользователя",
|
||||
"password": "Пароль",
|
||||
"fullname": "Полное имя",
|
||||
"mail_addresses": "Адрес электронной почты",
|
||||
"ok": "ОК",
|
||||
"cancel": "Отмена",
|
||||
"change_password": "Сменить пароль",
|
||||
"edit": "Редактировать",
|
||||
"current_password": "Действующий пароль",
|
||||
"new_password": "Новый пароль",
|
||||
"confirm": "Подтвердить",
|
||||
"login": "Авторизоваться",
|
||||
"logout": "Выйти",
|
||||
"password_changed": "Пароль изменён",
|
||||
"password_changed_error": "Не удалось сменить пароль",
|
||||
"invalid_mail": "Неверный адрес электронной почты",
|
||||
"invalid_mailforward": "Неверный адрес пересылки электронной почты",
|
||||
"mail_already_used": "Адрес электронной почты уже используется",
|
||||
"information_updated": "Информация обновлена",
|
||||
"user_saving_fail": "Не удалось сохранить информацию о новом пользователе",
|
||||
"mail_forward": "Адрес пересылки электронной почты",
|
||||
"new_mail": "newmail@mydomain.org",
|
||||
"new_forward": "newforward@myforeigndomain.org",
|
||||
"add_mail": "Добавьте псевдоним электронной почты",
|
||||
"add_forward": "Добавить адрес пересылки электронной почты",
|
||||
"password_not_match": "Пароли не совпадают",
|
||||
"wrong_current_password": "Неверный текущий пароль",
|
||||
"invalid_domain": "Неправильный домен",
|
||||
"missing_required_fields": "Заполните обязательные поля",
|
||||
"wrong_username_password": "Неправильное имя пользователя или пароль",
|
||||
"logged_out": "Вы вышли из системы",
|
||||
"please_login": "Пожалуйста, войдите",
|
||||
"please_login_from_portal": "Пожалуйста, войдите в портал",
|
||||
"redirection_error_invalid_url": "Ошибка перенаправления: неверный URL",
|
||||
"redirection_error_unmanaged_domain": "Ошибка перенаправления: неуправляемый домен",
|
||||
"footerlink_edit": "Редактировать профиль",
|
||||
"footerlink_documentation": "Документация",
|
||||
"footerlink_support": "Поддержка",
|
||||
"footerlink_administration": "Администрирование",
|
||||
"good_practices_about_user_password": "Выберите пароль пользователя длиной не менее 8 символов, хотя рекомендуется использовать более длинные (например, парольную фразу) и / или использовать символы различного типа (прописные, строчные буквы, цифры и специальные символы).",
|
||||
"password_too_simple_4": "Пароль должен содержать не менее 12 символов и включать цифры, заглавные и строчные буквы и специальные символы",
|
||||
"password_too_simple_3": "Пароль должен содержать не менее 8 символов и содержать цифры, заглавные и строчные буквы и специальные символы",
|
||||
"password_too_simple_2": "Пароль должен содержать не менее 8 символов и включать цифры, заглавные и строчные буквы",
|
||||
"password_too_simple_1": "Пароль должен быть не менее 8 символов",
|
||||
"password_listed": "Этот пароль является одним из наиболее часто используемых паролей в мире. Пожалуйста, выберите что-то более уникальное."
|
||||
}
|
49
portal/locales/sk.json
Normal file
49
portal/locales/sk.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"information": "Vaše údaje",
|
||||
"username": "Meno používateľa",
|
||||
"password": "Heslo",
|
||||
"fullname": "Meno a priezvisko",
|
||||
"mail_forward": "E-mail pre preposielanie",
|
||||
"new_mail": "novymail@mojadomena.org",
|
||||
"new_forward": "novepreposielanie@mojadalsiadomena.org",
|
||||
"add_mail": "Pridať e-mailovú prezývku/alias",
|
||||
"add_forward": "Pridať e-mailovú adresu pre preposielanie",
|
||||
"ok": "OK",
|
||||
"cancel": "Zrušiť",
|
||||
"change_password": "Zmeniť heslo",
|
||||
"edit": "Upraviť",
|
||||
"current_password": "Aktuálne heslo",
|
||||
"new_password": "Nové heslo",
|
||||
"confirm": "Potvrdiť",
|
||||
"login": "Prihlásiť sa",
|
||||
"logout": "Odhlásiť sa",
|
||||
"password_changed": "Heslo bolo zmenené",
|
||||
"password_changed_error": "Heslo nebolo zmenené",
|
||||
"password_not_match": "Heslá sa nezhodujú",
|
||||
"portal": "Portál YunoHost",
|
||||
"mail_addresses": "E-mailová adresa",
|
||||
"password_listed": "Toto heslo je jedným z najpoužívanejších na svete. Vyberte, prosím, niečo jedinečnejšie.",
|
||||
"password_too_simple_1": "Heslo sa musí skladať z aspoň 8 znakov",
|
||||
"password_too_simple_2": "Heslo musí obsahovať aspoň 8 znakov a musí sa v ňom nachádzať aspoň jedno číslo, veľké a malé písmeno",
|
||||
"password_too_simple_3": "Heslo musí obsahovať aspoň 8 znakov a musí sa v ňom nachádzať aspoň jedno číslo, veľké, malé písmeno a špeciálny znak",
|
||||
"wrong_current_password": "Aktuálne heslo je nesprávne",
|
||||
"invalid_mail": "Neplatná e-mailová adresa",
|
||||
"invalid_domain": "Neplatná doména v",
|
||||
"invalid_mailforward": "Neplatná e-mailová adresa pre preposielanie",
|
||||
"mail_already_used": "Táto e-mailová adresa sa už používa",
|
||||
"information_updated": "Údaje boli upravené",
|
||||
"user_saving_fail": "Nepodarilo sa uložiť údaje o používateľovi",
|
||||
"missing_required_fields": "Vyplňte požadované údaje",
|
||||
"wrong_username_password": "Chybné meno používateľa alebo heslo",
|
||||
"logged_out": "Boli ste odhlásený",
|
||||
"please_login": "Pre zobrazenie obsahu sa, prosím, prihláste",
|
||||
"please_login_from_portal": "Prosím, prihláste sa z portálu",
|
||||
"redirection_error_invalid_url": "Chyba presmerovania: Neplatná adresa URL",
|
||||
"redirection_error_unmanaged_domain": "Chyba presmerovania: Neregistrovaná doména",
|
||||
"footerlink_edit": "Upraviť môj profil",
|
||||
"footerlink_documentation": "Dokumentácia",
|
||||
"footerlink_support": "Podpora",
|
||||
"footerlink_administration": "Správa",
|
||||
"password_too_simple_4": "Heslo musí obsahovať aspoň 12 znakov a musí sa v ňom nachádzať aspoň jedno číslo, veľké, malé písmeno a špeciálny znak",
|
||||
"good_practices_about_user_password": "Vyberte si heslo, ktoré má aspoň 8 znakov - dobrou praxou je však používať dlhšie názvy a kombinovať pri tom rôzne typy znakov (veľké a malé písmená, číslice a špeciálne znaky)."
|
||||
}
|
3
portal/locales/sl.json
Normal file
3
portal/locales/sl.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"cancel": "Prekliči"
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue