Uses 1113K of libraries. Click here for Pure Java version (16211L/92K).
1 | !7 |
2 | |
3 | set flag DynModule. // central transpileRaw |
4 | |
5 | cm RemoteControlled > DynPrintLog { |
6 | S controllingComputers; |
7 | bool enabled; |
8 | switchable bool logAll; |
9 | transient Q q; |
10 | |
11 | visual |
12 | centerAndSouthWithMargins(super.visualize(), |
13 | vstackWithSpacing(jrightalignedline(dm_fieldCheckBox('enabled)), |
14 | withLabel("Computers that can control me:", dm_fieldTextField('controllingComputers)))); |
15 | |
16 | start { |
17 | dm_useLocalMechListCopies(); |
18 | dm_privateChat(); |
19 | q = dm_startQ(); |
20 | ownResource(vmBus_onMessage('gotFromChat, voidfunc(fS msg) { q.add(r { processMsg(null, msg) }) })); |
21 | ownResource(vmBus_onMessage('gotFromPrivateChat, voidfunc(fS sender, fS msg) { q.add(r { processMsg(sender, msg) }) })); |
22 | print("Remote Control " + (enabled ? "ENABLED" : "DISABLED") + ". Controlling computers: " + or2(controllingComputers, "-")); |
23 | } |
24 | |
25 | void processMsg(S sender, S msg) { |
26 | S originalMsg = msg; |
27 | LS computers = words2(controllingComputers); |
28 | PairS authorPair = getAuthorOfSignedText2(msg); |
29 | S author = pairB(authorPair); |
30 | //print("Author: " + author + ", controlling computers: " + computers); |
31 | bool allowed = computers.contains(author); |
32 | msg = trim(unsign(msg)); |
33 | new Matches m; |
34 | |
35 | if (jMatchStart("<id> eval fresh:", msg, m)) { |
36 | if (allowed) dm_refreshTranspilerAndLoadedFunctions(); |
37 | msg = $1 + " eval: " + m.rest(); |
38 | } |
39 | bool realEval = jMatchStart("<id> eval real", msg, m); |
40 | if (realEval) |
41 | msg = $1 + " eval " + m.rest(); |
42 | |
43 | if (jMatchStart("<id> eval fresh <id>:", msg, m)) { |
44 | if (allowed) dm_refreshTranspiler(); |
45 | msg = $1 + " eval " + $2 + ": " + m.rest(); |
46 | } |
47 | |
48 | if (jMatchStart("<id> eval <id>:", msg, m)) { |
49 | if (neqOneOf($1, "all", computerID())) ret with print("Not for me."); |
50 | else if (!enabled) print("Will not eval (module disabled)."); |
51 | else { |
52 | print(trim(indentx("EVAL from " + author + ": " + shorten(m.rest(), 1000)))); |
53 | O result = null; |
54 | S error = null; |
55 | try { |
56 | if (logAll) logQuoted(javaxCachesDir("signed-instructions.txt"), originalMsg); |
57 | if (!allowed) |
58 | if (pairB(authorPair) == null) { |
59 | print(l(originalMsg) + " " + quote(shorten(originalMsg, 1000))); |
60 | print(quote(takeLast(originalMsg, 1000))); |
61 | fail("Signature didn't verify (computer ID: " + pairA(authorPair) + ", public key md5: " + md5(getPublicKeyOfComputer(pairA(authorPair))) + ")"); |
62 | } else |
63 | fail("not accepting commands from " + author); |
64 | result = realEval ? dm_javaEval(m.rest()) : dm_javaEvalOrInterpret(m.rest()); |
65 | } catch print e { |
66 | error = getStackTrace(e); |
67 | } |
68 | S mode = "direct"; |
69 | S out; |
70 | if (result != null) { |
71 | int l = l_opt(result); |
72 | print(">> " + (l != 0 ? "[l=" + l + "] " : "") + result); |
73 | } |
74 | |
75 | if (error != null) { |
76 | mode = "error"; |
77 | out = error; |
78 | } else if (result instanceof byte[]) { |
79 | mode = "base64"; |
80 | out = base64((byte[]) result); |
81 | } else { |
82 | out = str(result); |
83 | if (empty(out) || trimmable(out) || containsNewLine(out)) { |
84 | out = quote(out); |
85 | mode = "quoted"; |
86 | } |
87 | } |
88 | S line = "done " + $2 + " " + mode + ": " + out; |
89 | if (sender == null) |
90 | dm_osChat_postSigned(line); |
91 | else |
92 | dm_privateChat_sendSigned(sender, line); |
93 | } |
94 | ret; |
95 | } |
96 | |
97 | if (!allowed) ret; |
98 | // old-style formats follow |
99 | |
100 | //print("Got signed message from " + author + ": " + msg); |
101 | if (jMatchStart("<id> eval:", msg, m)) { |
102 | if (neqOneOf($1, "all", computerID())) print("Not for me."); |
103 | else if (!enabled) print("Will not eval (module disabled)."); |
104 | else { |
105 | print(trim(indentx("EVAL: " + shorten(m.rest(), 1000)))); |
106 | O result = dm_javaEvalOrInterpret(m.rest()); |
107 | print(">> " + result); |
108 | } |
109 | } |
110 | } |
111 | |
112 | // API |
113 | |
114 | bool addControllingComputer(S computerID) { |
115 | if (contains(controllingComputers, computerID)) false; |
116 | setField(controllingComputers := trim(controllingComputers + " " + computerID)); |
117 | true; |
118 | } |
119 | } |
download show line numbers debug dex old transpilations
Travelled to 16 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, hpgrupgrauku, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt, whxojlpjdney
No comments. add comment
Snippet ID: | #1017127 |
Snippet name: | Execute Signed Instructions From Other Computer (Make Me Remote Controlled) |
Eternal ID of this version: | #1017127/65 |
Text MD5: | b6e7a6ebe9897aef90aeb32069624f3d |
Transpilation MD5: | cff3343387a52126bd189a9bb6bc5725 |
Author: | stefan |
Category: | javax / stefan's os |
Type: | JavaX source code (Dynamic Module) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2021-08-14 02:29:12 |
Source code size: | 4329 bytes / 119 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 671 / 422281 |
Version history: | 64 change(s) |
Referenced in: | [show references] |