nx_atlas_citeverify2.nx source
↩ module page · 78 lines · 3033 B
1// nx_atlas_citeverify2.nx -- atlas-hygiene MULTI-AUTHORITY CITATION FIREWALL (beyond-SOTA / Callout 1+).
2// Cross-checks a DOI against TWO independent authorities: Crossref AND OpenAlex. VERIFIED (exit 0) only if
3// BOTH return 200; QUARANTINE (exit 5) if either misses -- resilient to one authority being down or wrong,
4// which a single-source check is not. Forks the deployed nx_https_get.elf twice. license_tier: ORIGINAL expect_exit: 0
5import "nx_syscalls.nx"
6import "nx_tool_run.nx"
7const K_MAGIC_1048576: i64 = 1048576
8const K_MAGIC_1024: i64 = 1024
9func cv_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
10func cv_puts(s: *u8) -> i64 { sys_write(1, s, cv_slen(s)); return 0 }
11func cv_contains(buf: *u8, n: i64, needle: *u8) -> i64 {
12 let m: i64 = cv_slen(needle)
13 if m == 0 { return 1 }
14 var i: i64 = 0
15 while i + m <= n {
16 var k: i64 = 0
17 while k < m { if buf[i + k] != needle[k] { k = m + 9 } else { k = k + 1 } }
18 if k == m { return 1 }
19 i = i + 1
20 }
21 return 0
22}
23func cv_append(dst: *u8, di: i64, src: *u8) -> i64 {
24 var j: i64 = 0
25 var i: i64 = di
26 while src[j] != (0 as u8) { dst[i] = src[j]; i = i + 1; j = j + 1 }
27 return i
28}
29func cv_fetch(url: *u8, out: *u8, olen: *i64) -> i64 {
30 let path: *u8 = "./nx_https_get.elf" as *u8
31 let av: *i64 = sys_mmap(256) as *i64
32 av[0] = path as i64
33 av[1] = url as i64
34 av[2] = 0
35 return tr_run_capture(path, av, out, K_MAGIC_1048576, olen)
36}
37func main(argc: i64, argv: *i64) -> i64 {
38 if argc < 2 {
39 cv_puts("ATLASCITE2 ERR need doi\n" as *u8)
40 sys_exit(2)
41 return 2
42 }
43 let doi: *u8 = argv[1] as *u8
44 let curl: *u8 = sys_mmap(K_MAGIC_1024)
45 var ci: i64 = cv_append(curl, 0, "https://api.crossref.org/works/" as *u8)
46 ci = cv_append(curl, ci, doi)
47 curl[ci] = 0 as u8
48 let ourl: *u8 = sys_mmap(K_MAGIC_1024)
49 var oi: i64 = cv_append(ourl, 0, "https://api.openalex.org/works/doi:" as *u8)
50 oi = cv_append(ourl, oi, doi)
51 ourl[oi] = 0 as u8
52 let cout: *u8 = sys_mmap(K_MAGIC_1048576)
53 let colen: *i64 = sys_mmap(16) as *i64
54 let oout: *u8 = sys_mmap(K_MAGIC_1048576)
55 let oolen: *i64 = sys_mmap(16) as *i64
56 cv_fetch(curl, cout, colen)
57 cv_fetch(ourl, oout, oolen)
58 let c200: i64 = cv_contains(cout, colen[0], "200 OK" as *u8)
59 let o200: i64 = cv_contains(oout, oolen[0], "200 OK" as *u8)
60 if c200 == 1 {
61 if o200 == 1 {
62 cv_puts("ATLASCITE2 VERIFIED both-authorities crossref+openalex doi=" as *u8)
63 cv_puts(doi)
64 cv_puts("\n" as *u8)
65 sys_exit(0)
66 return 0
67 }
68 }
69 cv_puts("ATLASCITE2 QUARANTINE authority-miss doi=" as *u8)
70 cv_puts(doi)
71 cv_puts(" crossref200=" as *u8)
72 if c200 == 1 { cv_puts("Y" as *u8) } else { cv_puts("N" as *u8) }
73 cv_puts(" openalex200=" as *u8)
74 if o200 == 1 { cv_puts("Y" as *u8) } else { cv_puts("N" as *u8) }
75 cv_puts("\n" as *u8)
76 sys_exit(5)
77 return 5
78}