1 | <html>
|
2 |
|
3 | <head>
|
4 |
|
5 | <link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
|
6 | <link rel="stylesheet" type="text/css" href="../../lib/css/materialize.css">
|
7 |
|
8 | <script type="text/javascript" src="../../lib/js/jquery-3.2.1.min.js"></script>
|
9 | <script type="text/javascript" src="../../socket.io/socket.io.js"></script>
|
10 |
|
11 | <script type="text/javascript" src="../../js/translate.js"></script>
|
12 | <script type="text/javascript" src="../../lib/js/materialize.js"></script>
|
13 | <script type="text/javascript" src="../../js/adapter-settings.js"></script>
|
14 | <script type="text/javascript" src="bcrypt.min.js"></script>
|
15 | <script type="text/javascript" src="words.js"></script>
|
16 |
|
17 | <script type="text/javascript">
|
18 |
|
19 | var MD5 = function (d) {
|
20 | var result = MM(V(Y(X(d), 8 * d.length)));
|
21 | return result.toLowerCase()
|
22 | };
|
23 |
|
24 | function MM(d) {
|
25 | var f = '';
|
26 | for (var _, m = '0123456789ABCDEF', r = 0; r < d.length; r++) {
|
27 | _ = d.charCodeAt(r);
|
28 | f += m.charAt(_ >>> 4 & 15) + m.charAt(15 & _);
|
29 | }
|
30 | return f;
|
31 | }
|
32 |
|
33 | function X(d) {
|
34 | var _;
|
35 | for (_ = Array(d.length >> 2), m = 0; m < _.length; m++) _[m] = 0;
|
36 | for (m = 0; m < 8 * d.length; m += 8) _[m >> 5] |= (255 & d.charCodeAt(m / 8)) << m % 32;
|
37 | return _;
|
38 | }
|
39 |
|
40 | function V(d) {
|
41 | var _;
|
42 | for (_ = '', m = 0; m < 32 * d.length; m += 8) {
|
43 | _ += String.fromCharCode(d[m >> 5] >>> m % 32 & 255);
|
44 | }
|
45 | return _;
|
46 | }
|
47 |
|
48 | function Y(d, _) {
|
49 | d[_ >> 5] |= 128 << _ % 32, d[14 + (_ + 64 >>> 9 << 4)] = _;
|
50 | for (var m = 1732584193, f = -271733879, r = -1732584194, i = 271733878, n = 0; n < d.length; n += 16) {
|
51 | var h = m, t = f, g = r, e = i;
|
52 | f = md5_ii(f = md5_ii(f = md5_ii(f = md5_ii(f = md5_hh(f = md5_hh(f = md5_hh(f = md5_hh(f = md5_gg(f = md5_gg(f = md5_gg(f = md5_gg(f = md5_ff(f = md5_ff(f = md5_ff(f = md5_ff(f, r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 0], 7, -680876936), f, r, d[n + 1], 12, -389564586), m, f, d[n + 2], 17, 606105819), i, m, d[n + 3], 22, -1044525330), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 4], 7, -176418897), f, r, d[n + 5], 12, 1200080426), m, f, d[n + 6], 17, -1473231341), i, m, d[n + 7], 22, -45705983), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 8], 7, 1770035416), f, r, d[n + 9], 12, -1958414417), m, f, d[n + 10], 17, -42063), i, m, d[n + 11], 22, -1990404162), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 12], 7, 1804603682), f, r, d[n + 13], 12, -40341101), m, f, d[n + 14], 17, -1502002290), i, m, d[n + 15], 22, 1236535329), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 1], 5, -165796510), f, r, d[n + 6], 9, -1069501632), m, f, d[n + 11], 14, 643717713), i, m, d[n + 0], 20, -373897302), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 5], 5, -701558691), f, r, d[n + 10], 9, 38016083), m, f, d[n + 15], 14, -660478335), i, m, d[n + 4], 20, -405537848), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 9], 5, 568446438), f, r, d[n + 14], 9, -1019803690), m, f, d[n + 3], 14, -187363961), i, m, d[n + 8], 20, 1163531501), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 13], 5, -1444681467), f, r, d[n + 2], 9, -51403784), m, f, d[n + 7], 14, 1735328473), i, m, d[n + 12], 20, -1926607734), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 5], 4, -378558), f, r, d[n + 8], 11, -2022574463), m, f, d[n + 11], 16, 1839030562), i, m, d[n + 14], 23, -35309556), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 1], 4, -1530992060), f, r, d[n + 4], 11, 1272893353), m, f, d[n + 7], 16, -155497632), i, m, d[n + 10], 23, -1094730640), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 13], 4, 681279174), f, r, d[n + 0], 11, -358537222), m, f, d[n + 3], 16, -722521979), i, m, d[n + 6], 23, 76029189), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 9], 4, -640364487), f, r, d[n + 12], 11, -421815835), m, f, d[n + 15], 16, 530742520), i, m, d[n + 2], 23, -995338651), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 0], 6, -198630844), f, r, d[n + 7], 10, 1126891415), m, f, d[n + 14], 15, -1416354905), i, m, d[n + 5], 21, -57434055), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 12], 6, 1700485571), f, r, d[n + 3], 10, -1894986606), m, f, d[n + 10], 15, -1051523), i, m, d[n + 1], 21, -2054922799), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 8], 6, 1873313359), f, r, d[n + 15], 10, -30611744), m, f, d[n + 6], 15, -1560198380), i, m, d[n + 13], 21, 1309151649), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 4], 6, -145523070), f, r, d[n + 11], 10, -1120210379), m, f, d[n + 2], 15, 718787259), i, m, d[n + 9], 21, -343485551), m = safe_add(m, h), f = safe_add(f, t), r = safe_add(r, g), i = safe_add(i, e);
|
53 | }
|
54 | return Array(m, f, r, i)
|
55 | }
|
56 |
|
57 | function md5_cmn(d, _, m, f, r, i) {
|
58 | return safe_add(bit_rol(safe_add(safe_add(_, d), safe_add(f, i)), r), m)
|
59 | }
|
60 |
|
61 | function md5_ff(d, _, m, f, r, i, n) {
|
62 | return md5_cmn(_ & m | ~_ & f, d, _, r, i, n)
|
63 | }
|
64 |
|
65 | function md5_gg(d, _, m, f, r, i, n) {
|
66 | return md5_cmn(_ & f | m & ~f, d, _, r, i, n)
|
67 | }
|
68 |
|
69 | function md5_hh(d, _, m, f, r, i, n) {
|
70 | return md5_cmn(_ ^ m ^ f, d, _, r, i, n)
|
71 | }
|
72 |
|
73 | function md5_ii(d, _, m, f, r, i, n) {
|
74 | return md5_cmn(m ^ (_ | ~f), d, _, r, i, n)
|
75 | }
|
76 |
|
77 | function safe_add(d, _) {
|
78 | var m = (65535 & d) + (65535 & _);
|
79 | return (d >> 16) + (_ >> 16) + (m >> 16) << 16 | 65535 & m
|
80 | }
|
81 |
|
82 | function bit_rol(d, _) {
|
83 | return d << _ | d >>> 32 - _
|
84 | }
|
85 |
|
86 | </script>
|
87 |
|
88 |
|
89 | <script type="text/javascript">
|
90 | var oldPass = '';
|
91 | function setValue(id, value, onChange) {
|
92 | var $value = $('#' + id + '.value');
|
93 | if ($value.attr('type') === 'checkbox') {
|
94 | $value.prop('checked', value).change(function() {
|
95 | onChange();
|
96 | });
|
97 | } else {
|
98 | $value.val(value).on('change', function() {
|
99 | onChange();
|
100 | }).on('keyup', function() {
|
101 | onChange();
|
102 | });
|
103 | }
|
104 | }
|
105 | function chips2list(selector) {
|
106 | var data = $(selector).chips('getData');
|
107 | var text = [];
|
108 | for (var lib = 0; lib < data.length; lib++) {
|
109 | text.push(data[lib].tag);
|
110 | }
|
111 | return text.join(' ');
|
112 | }
|
113 | function list2chips(selector, list, onChange) {
|
114 | var chips = list.split(/[,;\s]+/);
|
115 | var data = [];
|
116 | for (var c = 0; c < chips.length; c++) {
|
117 | if (chips[c] && chips[c].trim()) {
|
118 | data.push({tag: chips[c].trim()});
|
119 | }
|
120 | }
|
121 | $(selector).chips({
|
122 | data: data,
|
123 | placeholder: _('Module names'),
|
124 | secondaryPlaceholder: _('Add module'),
|
125 | onChipAdd: onChange,
|
126 | onChipDelete: onChange
|
127 | });
|
128 | }
|
129 |
|
130 |
|
131 | function showHideSettings() {
|
132 | var $secure = $('#secure');
|
133 |
|
134 | if ($secure.prop('checked')) {
|
135 | $('.col-certPublic').show();
|
136 | $('.col-certPrivate').show();
|
137 | $('#s').attr("value", "s");
|
138 | } else {
|
139 | $('.col-certPublic').hide();
|
140 | $('.col-certPrivate').hide();
|
141 | $('#s').attr("value", "");
|
142 | }
|
143 | }
|
144 |
|
145 | function showHideBackupWarning() {
|
146 | var $palletmanagerEnabled = $('#palletmanagerEnabled');
|
147 | var $projectsEnabled = $('#projectsEnabled');
|
148 |
|
149 | if($palletmanagerEnabled.prop('checked')) {
|
150 | $('.npmModules').hide();
|
151 | } else {
|
152 | $('.npmModules').show();
|
153 | }
|
154 |
|
155 | if ($palletmanagerEnabled.prop('checked') || $projectsEnabled.prop('checked')) {
|
156 | $('.backupWarn').show();
|
157 | } else {
|
158 | $('.backupWarn').hide();
|
159 | }
|
160 | }
|
161 |
|
162 |
|
163 | function load(settings, onChange) {
|
164 | if (!settings) return;
|
165 |
|
166 | if (settings.allowCreationOfForeignObjects === undefined) {
|
167 | settings.allowCreationOfForeignObjects = false;
|
168 | }
|
169 | if (settings.user === undefined) {
|
170 | settings.user = '';
|
171 | }
|
172 | if (settings.pass === undefined) {
|
173 | settings.pass = '';
|
174 | }
|
175 | if (settings.bind === undefined) {
|
176 | settings.bind = '0.0.0.0';
|
177 | }
|
178 | if (settings.maxMemory === undefined) {
|
179 | settings.maxMemory = 128;
|
180 | }
|
181 | if (settings.projectsEnabled === undefined) {
|
182 | settings.projectsEnabled = false;
|
183 | }
|
184 | if (settings.palletmanagerEnabled === undefined) {
|
185 | settings.palletmanagerEnabled = false;
|
186 | }
|
187 | oldPass = settings.pass;
|
188 | if (settings.pass) {
|
189 | settings.pass = '__pass__';
|
190 | }
|
191 |
|
192 | for (var key in settings) {
|
193 | if (settings.hasOwnProperty(key)) {
|
194 | setValue(key, settings[key], onChange);
|
195 | }
|
196 | }
|
197 | $('#update').on('click', function () {
|
198 | $('#update').addClass('disabled');
|
199 | sendTo(null, 'update', null, function (error) {
|
200 | $('#update').removeClass('disabled');
|
201 | if (!error) {
|
202 | showMessage(_('Successfully updated'))
|
203 | } else {
|
204 | showMessage(_('Cannot update:') + _(error))
|
205 | }
|
206 | });
|
207 | });
|
208 | getIPs(function (ips) {
|
209 | for (var i = 0; i < ips.length; i++) {
|
210 | $('#bind').append('<option value="' + ips[i].address + '">' + ips[i].name + '</option>');
|
211 | }
|
212 | $('#bind.value').val(settings.bind).select();
|
213 | });
|
214 |
|
215 | if (typeof common.npmLibs === 'object') {
|
216 | common.npmLibs = common.npmLibs.join(';');
|
217 | }
|
218 |
|
219 | list2chips('.libraries', common.npmLibs || '', onChange);
|
220 |
|
221 | getIsAdapterAlive(function (isAlive) {
|
222 | if (!isAlive) {
|
223 | $('#update').addClass('disabled');
|
224 | }
|
225 | });
|
226 |
|
227 | $('#secure').on('change', function () {
|
228 | showHideSettings();
|
229 | onChange();
|
230 | });
|
231 | onChange(false);
|
232 |
|
233 | fillSelectCertificates('#certPublic', 'public', settings.certPublic);
|
234 | fillSelectCertificates('#certPrivate', 'private', settings.certPrivate);
|
235 |
|
236 | $('#palletmanagerEnabled').on('change', function () {
|
237 | showHideBackupWarning();
|
238 | onChange();
|
239 | });
|
240 |
|
241 | $('#projectsEnabled').on('change', function () {
|
242 | showHideBackupWarning();
|
243 | onChange();
|
244 | });
|
245 |
|
246 | showHideSettings();
|
247 | showHideBackupWarning();
|
248 | }
|
249 |
|
250 | function save(callback) {
|
251 | var obj = {};
|
252 | $('.value').each(function () {
|
253 | var $this = $(this);
|
254 | if ($this.attr('type') === 'checkbox') {
|
255 | obj[$this.attr('id')] = $this.prop('checked');
|
256 | } else {
|
257 | obj[$this.attr('id')] = $this.val();
|
258 | }
|
259 | });
|
260 |
|
261 | if (obj.pass) {
|
262 | var bcrypt = dcodeIO.bcrypt;
|
263 | if (obj.pass !== '__pass__') {
|
264 | obj.pass = bcrypt.hashSync(obj.pass, 8);
|
265 |
|
266 | } else {
|
267 | obj.pass = oldPass;
|
268 | }
|
269 | }
|
270 |
|
271 | if ($('#secure').prop('checked') && (!$('#certPrivate').val() || !$('#certPublic').val())) {
|
272 | showToast(null, _('Set certificates or load it first in the system settings (right top).'));
|
273 | return;
|
274 | }
|
275 |
|
276 | common.npmLibs = chips2list('.libraries');
|
277 |
|
278 | callback(obj, {localLink: 'http://%ip%:' + obj.port, npmLibs: common.npmLibs});
|
279 | }
|
280 | </script>
|
281 | </head>
|
282 | <body>
|
283 | <div class="m adapter-container">
|
284 | <div class="row">
|
285 | <div class="col s12">
|
286 | <div class="row">
|
287 | <div class="col s6">
|
288 | <img src="node-red.png" class="logo" alt="logo"/>
|
289 | </div>
|
290 | </div>
|
291 | <div class="row backupWarn">
|
292 | <div class="col s12">
|
293 | <div class="card-panel red">
|
294 | <span class="white-text translate">Backups will not contain any projects or modules installed via the Palletmanager!</span>
|
295 | </div>
|
296 | </div>
|
297 | </div>
|
298 | <div class="row">
|
299 | <div class="col s12 m4">
|
300 | <input class="value" id="palletmanagerEnabled" type="checkbox" />
|
301 | <label class="translate" for="palletmanagerEnabled">Use palletmanager:</label>
|
302 | </div>
|
303 | </div>
|
304 | <div class="row npmModules">
|
305 | <div class="input-field col s12 m8 l6">
|
306 | <label class="translate">Additional npm modules:</label>
|
307 | <div class="chips libraries"></div>
|
308 | </div>
|
309 | </div>
|
310 | <div class="row">
|
311 | <div class="input-field col s12 m8 l4">
|
312 | <select class="value" id="bind"></select>
|
313 | <label class="translate" for="bind">IP:</label>
|
314 | </div>
|
315 | <div class="input-field col s12 m4 l2">
|
316 | <input class="value" id="port" type="number" min="1" max="65565"/>
|
317 | <label class="translate" for="port">Web server port:</label>
|
318 | </div>
|
319 | </div>
|
320 | <div class="row">
|
321 | <div class="col s12 m4">
|
322 | <input class="value" id="secure" type="checkbox" />
|
323 | <label class="translate" for="secure">Secure(HTTPS):</label>
|
324 | <input class="value" id="s" type="hidden" value="" />
|
325 | </div>
|
326 | <div class="col s12 m4 col-certPublic">
|
327 | <select id="certPublic" class="value"></select>
|
328 | <label class="translate" for="certPublic">Public certificate:</label>
|
329 | </div>
|
330 | <div class="col s12 m4 col-certPrivate">
|
331 | <select id="certPrivate" class="value"></select>
|
332 | <label class="translate" for="certPrivate">Private certificate:</label>
|
333 | </div>
|
334 | </div>
|
335 | <div class="row">
|
336 | <div class="input-field col s12 m4 l3">
|
337 | <input id="user" class="value" type="text"/>
|
338 | <label class="translate" for="user">User</label>
|
339 | <span class="translate">Leave blank to disable basic authentication</span>
|
340 | </div>
|
341 | <div class="input-field col s12 m4 l3">
|
342 | <input id="pass" class="value" type="password"/>
|
343 | <label class="translate" for="pass">Password</label>
|
344 | </div>
|
345 | </div>
|
346 | <div class="row">
|
347 | <div class="input-field col s12 m4 l3">
|
348 | <input id="httpRoot" class="value" type="text" style="width: 100%"/>
|
349 | <label class="translate" for="httpRoot">http root directory:</label>
|
350 | </div>
|
351 | </div>
|
352 | <div class="row">
|
353 | <div class="input-field col s12 m4 l3">
|
354 | <input class="value" id="valueConvert" type="checkbox" />
|
355 | <label class="translate" for="valueConvert">Convert values to string:</label>
|
356 | </div>
|
357 | <div class="input-field col s12 m4 l3">
|
358 | <input class="value" id="maxMemory" type="number" min="32"/>
|
359 | <label class="translate" for="maxMemory">Max allocated RAM:</label>
|
360 | </div>
|
361 | </div>
|
362 | <div class="row">
|
363 | <div class="input-field col s12 m4 l3">
|
364 | <input class="value" id="projectsEnabled" type="checkbox" />
|
365 | <label class="translate" for="projectsEnabled">Enable Projects Feature:</label>
|
366 | </div>
|
367 | <div class="input-field col s12 m4 l3">
|
368 | <input class="value" id="allowCreationOfForeignObjects" type="checkbox" />
|
369 | <label class="translate" for="allowCreationOfForeignObjects">Allow creation of foreign objects</label>
|
370 | </div>
|
371 | <div class="input-field col s12 m4 l3">
|
372 | <input class="value" id="safeMode" type="checkbox" />
|
373 | <label class="translate" for="safeMode">Safe mode</label>
|
374 | </div>
|
375 | </div>
|
376 | <div class="row">
|
377 | <div class="col s12">
|
378 | <a id="update" class="waves-effect waves-light btn"><i class="material-icons right">cloud</i><span class="translate">Update select dialog</span></a>
|
379 | </div>
|
380 | </div>
|
381 | </div>
|
382 | </div>
|
383 | </div>
|
384 | </body>
|
385 | </html>
|