Integrate validated catalog loading (T-201)
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://softbox.invalid/schemas/manifest.schema.json",
|
||||
"title": "SoftBox Catalog Manifest v1",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"schema_version",
|
||||
"channel",
|
||||
"generated_at",
|
||||
"min_box_version",
|
||||
"apps",
|
||||
"signature"
|
||||
],
|
||||
"properties": {
|
||||
"schema_version": {
|
||||
"const": 1
|
||||
},
|
||||
"channel": {
|
||||
"enum": ["modern", "win7"]
|
||||
},
|
||||
"generated_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"min_box_version": {
|
||||
"$ref": "#/$defs/semver"
|
||||
},
|
||||
"apps": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/$defs/app"
|
||||
}
|
||||
},
|
||||
"signature": {
|
||||
"$ref": "#/$defs/ed25519Signature"
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"semver": {
|
||||
"type": "string",
|
||||
"pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$"
|
||||
},
|
||||
"ed25519Signature": {
|
||||
"type": "string",
|
||||
"pattern": "^[A-Za-z0-9+/]{86}==$"
|
||||
},
|
||||
"sha256": {
|
||||
"type": "string",
|
||||
"pattern": "^[0-9A-Fa-f]{64}$"
|
||||
},
|
||||
"httpsUrl": {
|
||||
"type": "string",
|
||||
"format": "uri",
|
||||
"pattern": "^https://"
|
||||
},
|
||||
"package": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["url", "size", "sha256", "signature"],
|
||||
"properties": {
|
||||
"url": {
|
||||
"$ref": "#/$defs/httpsUrl"
|
||||
},
|
||||
"size": {
|
||||
"type": "integer",
|
||||
"minimum": 1
|
||||
},
|
||||
"sha256": {
|
||||
"$ref": "#/$defs/sha256"
|
||||
},
|
||||
"signature": {
|
||||
"$ref": "#/$defs/ed25519Signature"
|
||||
}
|
||||
}
|
||||
},
|
||||
"app": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"id",
|
||||
"name",
|
||||
"description",
|
||||
"version",
|
||||
"channel",
|
||||
"status",
|
||||
"category",
|
||||
"tags",
|
||||
"min_os",
|
||||
"architectures",
|
||||
"entry_exe",
|
||||
"requires_admin",
|
||||
"packages"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z0-9-]+$"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"version": {
|
||||
"$ref": "#/$defs/semver"
|
||||
},
|
||||
"channel": {
|
||||
"const": "stable"
|
||||
},
|
||||
"status": {
|
||||
"enum": ["active", "deprecated", "hidden"]
|
||||
},
|
||||
"category": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"tags": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"pattern": "^sha256:[0-9A-Fa-f]{64}$"
|
||||
},
|
||||
"homepage": {
|
||||
"$ref": "#/$defs/httpsUrl"
|
||||
},
|
||||
"tutorial": {
|
||||
"$ref": "#/$defs/httpsUrl"
|
||||
},
|
||||
"min_os": {
|
||||
"enum": ["windows-7-sp1", "windows-10", "windows-11"]
|
||||
},
|
||||
"architectures": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"items": {
|
||||
"enum": ["386", "amd64"]
|
||||
}
|
||||
},
|
||||
"entry_exe": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"pattern": "^(?!/)(?!.*\\\\)(?!.*:)(?!\\.\\.?(/|$)).+$"
|
||||
},
|
||||
"requires_admin": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"packages": {
|
||||
"type": "object",
|
||||
"minProperties": 1,
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"386": {
|
||||
"$ref": "#/$defs/package"
|
||||
},
|
||||
"amd64": {
|
||||
"$ref": "#/$defs/package"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user