UNPKG

17 kBHTMLView Raw
1<html>
2
3<head>
4<!-- Materialze style -->
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 // https://stackoverflow.com/questions/14733374/how-to-generate-md5-file-hash-on-javascript
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<!-- you have to define 2 functions in the global scope: -->
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 // the function loadSettings has to exist ...
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 //obj.pass = MD5(obj.pass);
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>