init
[garradin.git] / www / admin / static / wiki-encryption.js
1 (function () {
2 var aesEnabled = false;
3 var iteration = 0;
4 var encryptPassword = null;
5 var www_url = location.href.replace(/admin\/.*$/, 'admin/');
6
7 function loadAESlib()
8 {
9 if (aesEnabled)
10 {
11 return;
12 }
13
14 var s = document.createElement('script');
15 s.type = 'text/javascript';
16 s.src = www_url + 'static/gibberish-aes.min.js';
17
18 document.head.appendChild(s);
19 aesEnabled = true;
20 }
21
22 function formatContent(content)
23 {
24 // htmlspecialchars ENT_QUOTES
25 content = content.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
26 .replace(/'/g, '&#039;').replace(/"/g, '&quot');
27
28 // HTML simple
29 content = content.replace(/&lt;(\/?(del|pre|ins|b|i|strong|em|h\d|code|samp|tt))&gt;/g, '<$1>');
30 console.log(content);
31
32 // Intertitres
33 content = content.replace(/\{{3}([^\n]*)\}{3}/g, '<h3>$1</h3>');
34
35 // Gras
36 content = content.replace(/\{{2}([^\n]*)\}{2}/g, '<strong>$1</strong>');
37
38 // Italique
39 content = content.replace(/\{([^\n]*)\}/g, '<em>$1</em>');
40
41 // Espaces typograhiques
42 content = content.replace(/\h*([?!;:»])(\s+|$)/g, '&nbsp;$1$2');
43 content = content.replace(/(^|\s+)([«])\h*/g, '$1$2&nbsp;');
44
45 // Liens
46 content = content.replace(/\[([^-]+)-&gt;([^\]]+)\]/g, '<a href="$2">$1</a>');
47 content = content.replace(/\[([^\]]+)\]/g, '<a href="$1">$1</a>');
48
49 // nl2br
50 content = content.replace(/\r/g, '').replace(/\n/g, '<br />');
51
52 return content;
53 }
54
55 window.wikiDecrypt = function (edit)
56 {
57 loadAESlib();
58
59 encryptPassword = window.prompt('Mot de passe ?');
60
61 if (!encryptPassword)
62 {
63 encryptPassword = null;
64
65 if (edit)
66 {
67 if (window.confirm("Aucun mot de passe entré.\nsactiver le chiffrement et effacer le contenu ?"))
68 {
69 document.getElementById('f_contenu').value = '';
70 document.getElementById('f_chiffrement').checked = false;
71 checkEncryption(document.getElementById('f_chiffrement'));
72 }
73 else
74 {
75 wikiDecrypt(true);
76 }
77 }
78
79 return;
80 }
81
82 iteration = 0;
83 decrypt(edit);
84 };
85
86 var decrypt = function (edit)
87 {
88 if (typeof GibberishAES == 'undefined')
89 {
90 if (iteration >= 10)
91 {
92 iteration = 0;
93 encryptPassword = null;
94 window.alert("Impossible de charger la bibliothèque AES, empêchant le déchiffrement de la page.\nAttendez quelques instants avant de recommencer ou rechargez la page.");
95 return;
96 }
97
98 iteration++;
99 window.setTimeout(decrypt, 500);
100 return;
101 }
102
103 var content = document.getElementById(edit ? 'f_contenu' : 'wikiEncryptedContent');
104 var wikiContent = !edit ? (content.textContent ? content.textContent : content.innerText) : content.value;
105 wikiContent = wikiContent.replace(/\s+/g, '');
106
107 try {
108 wikiContent = GibberishAES.dec(wikiContent, encryptPassword);
109 }
110 catch (e)
111 {
112 encryptPassword = null;
113 window.alert('Impossible de déchiffrer. Mauvais mot de passe ?');
114
115 if (edit)
116 {
117 // Redemander le mot de passe
118 wikiDecrypt(true);
119 }
120 return false;
121 }
122
123 if (!edit)
124 {
125 content.style.display = 'block';
126 document.getElementById('wikiEncryptedMessage').style.display = 'none';
127 content.innerHTML = formatContent(wikiContent);
128 }
129 else
130 {
131 content.value = wikiContent;
132 checkEncryption(document.getElementById('f_chiffrement'));
133 }
134 };
135
136 window.checkEncryption = function(elm)
137 {
138 String.prototype.repeat = function(num)
139 {
140 return new Array(num + 1).join(this);
141 };
142
143 if (elm.checked)
144 {
145 if (!encryptPassword)
146 {
147 encryptPassword = window.prompt('Mot de passe à utiliser ?');
148 }
149
150 if (!encryptPassword)
151 {
152 elm.checked = false;
153 encryptPassword = null;
154 return;
155 }
156
157 loadAESlib();
158
159 var hidden = true;
160 var d = document.getElementById('encryptPasswordDisplay');
161 d.innerHTML = '&bull;'.repeat(encryptPassword.length);
162 d.title = 'Cliquer pour voir le mot de passe';
163 d.onclick = function () {
164 if (hidden)
165 {
166 this.innerHTML = encryptPassword;
167 this.title = 'Cliquer pour cacher le mot de passe.';
168 }
169 else
170 {
171 this.innerHTML = '&bull;'.repeat(encryptPassword.length);
172 this.title = 'Cliquer pour voir le mot de passe';
173 }
174 hidden = !hidden;
175 };
176
177 document.getElementById('f_form').onsubmit = function ()
178 {
179 if (typeof GibberishAES == 'undefined')
180 {
181 alert("Le chargement de la bibliothèque AES n'est pas terminé.\nLe chiffrement est impossible pour le moment, recommencez dans quelques instants ou désactivez le chiffrement.");
182 return false;
183 }
184
185 var content = document.getElementById('f_contenu');
186 content.value = GibberishAES.enc(content.value, encryptPassword);
187 content.readOnly = true;
188 return true;
189 };
190 }
191 else
192 {
193 encryptPassword = null;
194 var d = document.getElementById('encryptPasswordDisplay');
195 d.innerHTML = 'désactivé';
196 d.title = 'Chiffrement désactivé';
197 d.onclick = null;
198 document.getElementById('f_form').onsubmit = null;
199 }
200 };
201 } ());