Revision 2fa41a54
Added by koszko about 2 years ago
| common/sanitize_JSON.js | ||
|---|---|---|
| 31 | 31 |
|
| 32 | 32 |
function sanitize_unknown(schema, item) |
| 33 | 33 |
{
|
| 34 |
console.log(`sanitize_unknown ${JSON.stringify(schema)}`);
|
|
| 35 | 34 |
let error_msg = undefined; |
| 36 | 35 |
let schema_options = []; |
| 37 | 36 |
let has_default = false; |
| ... | ... | |
| 89 | 88 |
|
| 90 | 89 |
function sanitize_unknown_no_alternatives(schema, item) |
| 91 | 90 |
{
|
| 92 |
console.log(`sanitize_unknown_no_alternatives ${JSON.stringify(schema)}`);
|
|
| 93 | 91 |
for (const [schema_check, item_check, sanitizer, type_name] of checks) {
|
| 94 |
console.log(`checking ${type_name}`);
|
|
| 95 | 92 |
if (schema_check(schema)) {
|
| 96 | 93 |
if (item_check(item)) |
| 97 | 94 |
return sanitizer(schema, item); |
| ... | ... | |
| 205 | 202 |
|
| 206 | 203 |
function sanitize_array(schema, array) |
| 207 | 204 |
{
|
| 208 |
console.log(`sanitize_array ${JSON.stringify(schema)}`);
|
|
| 209 | 205 |
let min_length = 0; |
| 210 | 206 |
let max_length = Infinity; |
| 211 | 207 |
let repeat_length = 1; |
| ... | ... | |
| 231 | 227 |
} |
| 232 | 228 |
if (["repeat", "repeatfull"].includes(schema[schema.length - 1])) {
|
| 233 | 229 |
var repeat_directive = schema.pop(); |
| 234 |
repeat = schema.splice(schema.length - repeat_length); |
|
| 230 |
var repeat = schema.splice(schema.length - repeat_length);
|
|
| 235 | 231 |
} else if (schema.length !== array.length) {
|
| 236 |
throw error_message(`does not not have exactly ${schema.length} items`);
|
|
| 232 |
throw error_message(`does not have exactly ${schema.length} items`);
|
|
| 237 | 233 |
} |
| 238 | 234 |
|
| 239 | 235 |
if (repeat_directive === "repeatfull" && |
| 240 | 236 |
(array.length - schema.length) % repeat_length !== 0) |
| 241 |
throw error_message(`does not not contain a full number of item group repetitions`);
|
|
| 237 |
throw error_message(`does not contain a full number of item group repetitions`); |
|
| 242 | 238 |
|
| 243 | 239 |
if (array.length < min_length) |
| 244 | 240 |
throw error_message(`has less than ${min_length} element${min_length === 1 ? "" : "s"}`);
|
| ... | ... | |
| 246 | 242 |
if (array.length > max_length) |
| 247 | 243 |
throw error_message(`has more than ${max_length} element${max_length === 1 ? "" : "s"}`);
|
| 248 | 244 |
|
| 249 |
console.log(schema, repeat); |
|
| 250 |
|
|
| 251 | 245 |
for (const item of array) {
|
| 252 | 246 |
if (i >= schema.length) {
|
| 253 | 247 |
i = 0; |
| ... | ... | |
| 268 | 262 |
|
| 269 | 263 |
function sanitize_regex(schema, string) |
| 270 | 264 |
{
|
| 271 |
console.log(`sanitize_regex ${schema}`);
|
|
| 272 | 265 |
if (schema.test(string)) |
| 273 | 266 |
return string; |
| 274 | 267 |
|
| ... | ... | |
| 279 | 272 |
|
| 280 | 273 |
function sanitize_string(schema, string) |
| 281 | 274 |
{
|
| 282 |
console.log(`sanitize_string ${JSON.stringify(schema)}`);
|
|
| 283 | 275 |
const regex = string_spec_regex.exec(schema)[2]; |
| 284 | 276 |
|
| 285 | 277 |
if (regex === undefined) |
| ... | ... | |
| 290 | 282 |
|
| 291 | 283 |
function sanitize_object(schema, object) |
| 292 | 284 |
{
|
| 293 |
console.log(`sanitize_object ${JSON.stringify(schema)}`);
|
|
| 294 | 285 |
const result = {};
|
| 295 | 286 |
|
| 296 | 287 |
for (let [key, entry_schema] of Object.entries(schema)) {
|
| ... | ... | |
| 304 | 295 |
|
| 305 | 296 |
function sanitize_object_entry(result, key, entry_schema, object) |
| 306 | 297 |
{
|
| 307 |
console.log(`sanitize_object_entry ${JSON.stringify(entry_schema)}`);
|
|
| 308 | 298 |
let optional = false; |
| 309 | 299 |
let has_default = false; |
| 310 | 300 |
let _default = undefined; |
| ... | ... | |
| 347 | 337 |
|
| 348 | 338 |
function take_literal(schema, item) |
| 349 | 339 |
{
|
| 350 |
console.log(`take_literal ${JSON.stringify(schema)}`);
|
|
| 351 | 340 |
return item; |
| 352 | 341 |
} |
| 353 | 342 |
|
| ... | ... | |
| 357 | 346 |
*/ |
| 358 | 347 |
function discard(schema, item) |
| 359 | 348 |
{
|
| 360 |
console.log(`discard ${JSON.stringify(schema)}`);
|
|
| 361 | 349 |
return discard; |
| 362 | 350 |
} |
| 363 | 351 |
|
| html/options_main.js | ||
|---|---|---|
| 12 | 12 |
* IMPORT TYPE_NAME |
| 13 | 13 |
* IMPORT list_prefixes |
| 14 | 14 |
* IMPORT nice_name |
| 15 |
* IMPORT parse_json_with_schema |
|
| 15 | 16 |
* IMPORTS_END |
| 16 | 17 |
*/ |
| 17 | 18 |
|
| ... | ... | |
| 223 | 224 |
ul.work_li.insertBefore(bag_components_ul, old_components_ul); |
| 224 | 225 |
ul.work_li.removeChild(old_components_ul); |
| 225 | 226 |
|
| 227 |
console.log("bag components", components);
|
|
| 226 | 228 |
add_bag_components(components); |
| 227 | 229 |
} |
| 228 | 230 |
|
| ... | ... | |
| 543 | 545 |
_read_file(file, resolve, reject)); |
| 544 | 546 |
} |
| 545 | 547 |
|
| 548 |
const url_regex = /^[a-z0-9]+:\/\/[^/]+\.[^/]{2}(\/[^?#]*)?$/;
|
|
| 549 |
const sha256_regex = /^[0-9a-f]{64}$/;
|
|
| 550 |
const component_schema = [ |
|
| 551 |
new RegExp(`^[${TYPE_PREFIX.SCRIPT}${TYPE_PREFIX.BAG}]$`),
|
|
| 552 |
/.+/ |
|
| 553 |
]; |
|
| 554 |
|
|
| 555 |
const settings_schema = [ |
|
| 556 |
[{}, "matchentry", "minentries", 1,
|
|
| 557 |
new RegExp(`^${TYPE_PREFIX.SCRIPT}`), {
|
|
| 558 |
/* script data */ |
|
| 559 |
"url": ["optional", url_regex], |
|
| 560 |
"sha256": ["optional", sha256_regex], |
|
| 561 |
"text": ["optional", "string"] |
|
| 562 |
}, |
|
| 563 |
new RegExp(`^${TYPE_PREFIX.BAG}`), [
|
|
| 564 |
"optional", |
|
| 565 |
[component_schema, "repeat"], |
|
| 566 |
"default", undefined |
|
| 567 |
], |
|
| 568 |
new RegExp(`^${TYPE_PREFIX.PAGE}`), {
|
|
| 569 |
/* page data */ |
|
| 570 |
"components": ["optional", component_schema] |
|
| 571 |
}], "repeat" |
|
| 572 |
] |
|
| 573 |
|
|
| 546 | 574 |
async function import_from_file(event) |
| 547 | 575 |
{
|
| 548 | 576 |
let files = event.target.files; |
| ... | ... | |
| 555 | 583 |
let result = undefined; |
| 556 | 584 |
|
| 557 | 585 |
try {
|
| 558 |
result = JSON.parse(await read_file(files[0])); |
|
| 586 |
result = parse_json_with_schema(settings_schema, |
|
| 587 |
await read_file(files[0])); |
|
| 559 | 588 |
} catch(e) {
|
| 560 | 589 |
bad_file_errormsg.textContent = "" + e; |
| 561 | 590 |
import_failed_radio.checked = true; |
| 562 | 591 |
return; |
| 563 | 592 |
} |
| 564 | 593 |
|
| 565 |
let errormsg = validate_settings(result); |
|
| 566 |
if (errormsg !== false) {
|
|
| 567 |
bad_file_errormsg.textContent = errormsg; |
|
| 568 |
import_failed_radio.checked = true; |
|
| 569 |
return; |
|
| 570 |
} |
|
| 571 |
|
|
| 572 | 594 |
populate_import_list(result); |
| 573 | 595 |
import_selection_radio.checked = true; |
| 574 | 596 |
} |
| 575 | 597 |
|
| 576 |
function validate_settings(settings) |
|
| 577 |
{
|
|
| 578 |
// TODO |
|
| 579 |
return false; |
|
| 580 |
} |
|
| 581 |
|
|
| 582 | 598 |
function import_li_id(prefix, item) |
| 583 | 599 |
{
|
| 584 | 600 |
return `ili_${prefix}_${item}`;
|
Also available in: Unified diff
validate settings on import