//! Android allowlist verification (`TJ-ADAPT-09`). //! //! Validates that `spec_data.android_packages` contains exactly the //! version-1 allowlisted identifiers with correct roles. const std = @import("std"); const spec_data = @import("spec_data"); /// Expected Android Termux package identifiers in canonical order. const expected: []const []const u8 = &.{ "com.termux", "com.termux.api", "com.termux.boot", "com.termux.float", "com.termux.gui", "com.termux.styling", "com.termux.tasker", "com.termux.widget", "com.termux.x11", }; /// Verify allowlist identities and roles (`TJ-ADAPT-09`). /// Returns true if the allowlist is valid. pub fn verify() bool { // Check count matches if (spec_data.android_packages.len != expected.len) return false; // Check each identity is present exactly once var i: usize = 0; while (i < expected.len) : (i += 1) { const exp = expected[i]; const actual = spec_data.android_packages[i].identifier; if (!std.mem.eql(u8, exp, actual)) return false; // Check no duplicates var j: usize = 0; while (j < i) : (j += 1) { if (std.mem.eql(u8, spec_data.android_packages[j].identifier, exp)) { return false; } } // Check roles: com.termux is base, rest are add_on if (std.mem.eql(u8, exp, "com.termux")) { if (spec_data.android_packages[i].role != .base) return false; } else { if (spec_data.android_packages[i].role != .add_on) return false; } } return true; }