Audit Permissions-Policy browser capability boundaries in MoonBit.
moon check
moon test
moon run cmd/mainlet header =
"camera=(), microphone=(), geolocation=(), fullscreen=(self \"https://video.example\")"
let policy = @permscope.parse(header)
let can_use_camera = @permscope.allows(
policy,
"camera",
"https://app.example",
"https://app.example",
)
let report = @permscope.audit(
policy,
@permscope.default_baseline("https://app.example"),
)
let contract = @permscope.capability_contract(
"video-room",
"https://app.example",
[
@permscope.capability_need("camera", ["self"], "local preview"),
@permscope.capability_need(
"fullscreen",
["self", "https://video.example"],
"embedded player",
),
],
true,
)
let contract_policy = @permscope.parse(
@permscope.minimal_policy_for_contract(contract),
)
let contract_report = @permscope.audit_capability_contract(
contract_policy,
contract,
)
println(can_use_camera.to_string())
println(@permscope.render_report(report))
println(@permscope.render_capability_contract_report(contract_report))moon run cmd/mainpermscope demo
camera cross-site=false
effective=permissions-policy
permscope access matrix document=https://app.example
permscope capability contract
contract=video-room
score 80/80 percent=100 grade=A
permscope batch security audit
permscope: passmoon fmt --check
moon check --deny-warn
moon build
moon test --deny-warn
moon info
moon run cmd/mainpub struct BatchAudit {
samples : Array[ResponseSample]
audits : Array[SecurityAudit]
scores : Array[SampleScore]
average_percent : Int
worst_grade : String
high_total : Int
warning_total : Int
} derive(Eq, Debug)pub struct CapabilityContract {
name : String
document_origin : String
needs : Array[CapabilityNeed]
forbid_unspecified : Bool
} derive(Eq, Debug)pub struct CapabilityContractReport {
contract : CapabilityContract
ok : Bool
findings : Array[CapabilityFinding]
allowed : Int
missing : Int
overbroad : Int
unexpected : Int
} derive(Eq, Debug)pub struct CspPolicy {
directives : Array[CspDirective]
warnings : Array[ParseWarning]
} derive(Eq, Debug)pub struct Directive {
feature : String
tokens : Array[AllowToken]
raw : String
index : Int
} derive(Eq, Debug)pub struct FeatureSpec {
feature : String
category : FeatureCategory
risk : RiskLevel
recommended : PolicyIntent
rationale : String
} derive(Eq, Debug)pub struct HeaderLine {
name : String
value : String
index : Int
kind : HeaderKind
} derive(Eq, Debug)pub struct SecurityAudit {
headers : HeaderSet
csp : CspPolicy?
permissions : HeaderAudit
checks : Array[HeaderCheck]
score : SecurityScore
} derive(Eq, Debug)pub struct SecurityHeaderBundle {
name : String
description : String
document_origin : String
headers : Array[SecurityHeaderEntry]
notes : Array[String]
} derive(Eq, Debug)fn access_matrix(policy : Policy, features : Array[String], document_origin : String, target_origins : Array[String]) -> AccessMatrixfn allows(policy : Policy, feature : String, document_origin : String, target_origin : String) -> Boolfn audit_capability_contract(policy : Policy, contract : CapabilityContract) -> CapabilityContractReportfn batch_security_gate(batch : BatchAudit, required_grade : String, max_high : Int, max_warning : Int) -> BatchGatefn capability_contract(name : String, document_origin : String, needs : Array[CapabilityNeed], forbid_unspecified : Bool) -> CapabilityContractfn capability_need(feature : String, target_origins : Array[String], reason : String) -> CapabilityNeedfn compare_security_audits(before : SecurityAudit, after : SecurityAudit) -> Array[SecurityRegression]fn device_lab_security_bundle(document_origin : String, trusted_device_origins : Array[String]) -> SecurityHeaderBundlefn media_security_bundle(document_origin : String, api_origins : Array[String], media_origins : Array[String]) -> SecurityHeaderBundlefn migrate_feature_policy(header : String) -> Stringfn optional_capability_need(feature : String, target_origins : Array[String], reason : String) -> CapabilityNeedfn profile_intents(profile : BaselineProfile, trusted_origins : Array[String]) -> Array[PolicyIntent]fn response_sample(name : String, path : String, document_origin : String, header_block : String) -> ResponseSamplefn response_sample_from_bundle(name : String, path : String, bundle : SecurityHeaderBundle) -> ResponseSamplefn security_gate(audit : SecurityAudit, required_grade : String, allow_warnings : Bool) -> SecurityGatefn strict_csp_header() -> StringAudit Permissions-Policy browser capability boundaries in MoonBit.