ai-remote 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +50 -0
  2. package/dist/index.js +7 -0
  3. package/dist/index.js.map +7 -0
  4. package/dist/protocols/index.js +35 -0
  5. package/dist/protocols/index.js.map +7 -0
  6. package/dist/protocols/rdp/buffer.js +170 -0
  7. package/dist/protocols/rdp/buffer.js.map +7 -0
  8. package/dist/protocols/rdp/caps.js +260 -0
  9. package/dist/protocols/rdp/caps.js.map +7 -0
  10. package/dist/protocols/rdp/cert.js +135 -0
  11. package/dist/protocols/rdp/cert.js.map +7 -0
  12. package/dist/protocols/rdp/client.js +1068 -0
  13. package/dist/protocols/rdp/client.js.map +7 -0
  14. package/dist/protocols/rdp/cliprdr.js +240 -0
  15. package/dist/protocols/rdp/cliprdr.js.map +7 -0
  16. package/dist/protocols/rdp/credssp.js +254 -0
  17. package/dist/protocols/rdp/credssp.js.map +7 -0
  18. package/dist/protocols/rdp/crypto.js +369 -0
  19. package/dist/protocols/rdp/crypto.js.map +7 -0
  20. package/dist/protocols/rdp/display.js +589 -0
  21. package/dist/protocols/rdp/display.js.map +7 -0
  22. package/dist/protocols/rdp/gcc.js +132 -0
  23. package/dist/protocols/rdp/gcc.js.map +7 -0
  24. package/dist/protocols/rdp/keymap.js +132 -0
  25. package/dist/protocols/rdp/keymap.js.map +7 -0
  26. package/dist/protocols/rdp/mcs.js +223 -0
  27. package/dist/protocols/rdp/mcs.js.map +7 -0
  28. package/dist/protocols/rdp/ntlm.js +305 -0
  29. package/dist/protocols/rdp/ntlm.js.map +7 -0
  30. package/dist/protocols/rdp/pdu.js +444 -0
  31. package/dist/protocols/rdp/pdu.js.map +7 -0
  32. package/dist/protocols/rdp/rail.js +383 -0
  33. package/dist/protocols/rdp/rail.js.map +7 -0
  34. package/dist/protocols/rdp/rle.js +276 -0
  35. package/dist/protocols/rdp/rle.js.map +7 -0
  36. package/dist/protocols/rdp/sec.js +156 -0
  37. package/dist/protocols/rdp/sec.js.map +7 -0
  38. package/dist/protocols/rdp/session.js +307 -0
  39. package/dist/protocols/rdp/session.js.map +7 -0
  40. package/dist/protocols/rdp/tls.js +354 -0
  41. package/dist/protocols/rdp/tls.js.map +7 -0
  42. package/dist/protocols/rdp/vchannel.js +59 -0
  43. package/dist/protocols/rdp/vchannel.js.map +7 -0
  44. package/dist/protocols/rdp/x224.js +110 -0
  45. package/dist/protocols/rdp/x224.js.map +7 -0
  46. package/dist/protocols/ssh/kex.js +177 -0
  47. package/dist/protocols/ssh/kex.js.map +7 -0
  48. package/dist/protocols/ssh/messages.js +55 -0
  49. package/dist/protocols/ssh/messages.js.map +7 -0
  50. package/dist/protocols/ssh/session.js +608 -0
  51. package/dist/protocols/ssh/session.js.map +7 -0
  52. package/dist/protocols/ssh/terminal.js +191 -0
  53. package/dist/protocols/ssh/terminal.js.map +7 -0
  54. package/dist/protocols/ssh/transport.js +611 -0
  55. package/dist/protocols/ssh/transport.js.map +7 -0
  56. package/dist/protocols/ssh/wire.js +189 -0
  57. package/dist/protocols/ssh/wire.js.map +7 -0
  58. package/dist/protocols/types.js +1 -0
  59. package/dist/protocols/types.js.map +7 -0
  60. package/dist/protocols/vnc/input.js +16 -0
  61. package/dist/protocols/vnc/input.js.map +7 -0
  62. package/dist/protocols/vnc/session.js +259 -0
  63. package/dist/protocols/vnc/session.js.map +7 -0
  64. package/dist/shared/connection.js +114 -0
  65. package/dist/shared/connection.js.map +7 -0
  66. package/dist/shared/device.js +1 -0
  67. package/dist/shared/device.js.map +7 -0
  68. package/dist/shared/hosts.js +133 -0
  69. package/dist/shared/hosts.js.map +7 -0
  70. package/dist/shared/icons.js +42 -0
  71. package/dist/shared/icons.js.map +7 -0
  72. package/dist/shared/protocol.js +40 -0
  73. package/dist/shared/protocol.js.map +7 -0
  74. package/dist/shared/signals.js +42 -0
  75. package/dist/shared/signals.js.map +7 -0
  76. package/package.json +82 -0
  77. package/src/index.ts +14 -0
  78. package/src/protocols/index.ts +72 -0
  79. package/src/protocols/rdp/buffer.ts +204 -0
  80. package/src/protocols/rdp/caps.ts +304 -0
  81. package/src/protocols/rdp/cert.ts +190 -0
  82. package/src/protocols/rdp/client.ts +1363 -0
  83. package/src/protocols/rdp/cliprdr.ts +344 -0
  84. package/src/protocols/rdp/credssp.ts +319 -0
  85. package/src/protocols/rdp/crypto.ts +416 -0
  86. package/src/protocols/rdp/display.ts +750 -0
  87. package/src/protocols/rdp/gcc.ts +162 -0
  88. package/src/protocols/rdp/keymap.ts +68 -0
  89. package/src/protocols/rdp/mcs.ts +283 -0
  90. package/src/protocols/rdp/ntlm.ts +380 -0
  91. package/src/protocols/rdp/pdu.ts +497 -0
  92. package/src/protocols/rdp/rail.ts +480 -0
  93. package/src/protocols/rdp/rle.ts +343 -0
  94. package/src/protocols/rdp/sec.ts +184 -0
  95. package/src/protocols/rdp/session.ts +393 -0
  96. package/src/protocols/rdp/tls.ts +452 -0
  97. package/src/protocols/rdp/vchannel.ts +89 -0
  98. package/src/protocols/rdp/x224.ts +139 -0
  99. package/src/protocols/ssh/kex.ts +227 -0
  100. package/src/protocols/ssh/messages.ts +54 -0
  101. package/src/protocols/ssh/session.ts +878 -0
  102. package/src/protocols/ssh/terminal.ts +242 -0
  103. package/src/protocols/ssh/transport.ts +732 -0
  104. package/src/protocols/ssh/wire.ts +220 -0
  105. package/src/protocols/types.ts +146 -0
  106. package/src/protocols/vnc/input.ts +13 -0
  107. package/src/protocols/vnc/novnc.d.ts +75 -0
  108. package/src/protocols/vnc/session.ts +367 -0
  109. package/src/shared/connection.ts +206 -0
  110. package/src/shared/device.ts +28 -0
  111. package/src/shared/hosts.ts +240 -0
  112. package/src/shared/icons.ts +49 -0
  113. package/src/shared/protocol.ts +55 -0
  114. package/src/shared/signals.ts +67 -0
@@ -0,0 +1,444 @@
1
+ import { Reader, Writer } from "./buffer";
2
+ const PDU_TYPE = {
3
+ DEMAND_ACTIVE: 1,
4
+ CONFIRM_ACTIVE: 3,
5
+ DEACTIVATE_ALL: 6,
6
+ DATA: 7,
7
+ SERVER_REDIRECT: 10
8
+ };
9
+ const PDU_TYPE2 = {
10
+ UPDATE: 2,
11
+ CONTROL: 20,
12
+ POINTER: 27,
13
+ INPUT: 28,
14
+ SYNCHRONIZE: 31,
15
+ REFRESH_RECT: 33,
16
+ PLAY_SOUND: 34,
17
+ SUPPRESS_OUTPUT: 35,
18
+ SHUTDOWN_REQUEST: 36,
19
+ SHUTDOWN_DENIED: 37,
20
+ SAVE_SESSION_INFO: 38,
21
+ FONT_LIST: 39,
22
+ FONT_MAP: 40,
23
+ SET_ERROR_INFO: 47,
24
+ MONITOR_LAYOUT: 55
25
+ };
26
+ const UPDATE_TYPE = {
27
+ ORDERS: 0,
28
+ BITMAP: 1,
29
+ PALETTE: 2,
30
+ SYNCHRONIZE: 3
31
+ };
32
+ const CONTROL_ACTION = {
33
+ REQUEST_CONTROL: 1,
34
+ GRANTED_CONTROL: 2,
35
+ DETACH: 3,
36
+ COOPERATE: 4
37
+ };
38
+ const INPUT_EVENT = {
39
+ SYNC: 0,
40
+ SCANCODE: 4,
41
+ UNICODE: 5,
42
+ MOUSE: 32769,
43
+ MOUSEX: 32770
44
+ };
45
+ const KEYBOARD_FLAG = {
46
+ EXTENDED: 256,
47
+ DOWN: 16384,
48
+ RELEASE: 32768
49
+ };
50
+ const POINTER_FLAG = {
51
+ WHEEL: 512,
52
+ HWHEEL: 1024,
53
+ WHEEL_NEGATIVE: 256,
54
+ MOVE: 2048,
55
+ DOWN: 32768,
56
+ BUTTON1: 4096,
57
+ BUTTON2: 8192,
58
+ BUTTON3: 16384
59
+ };
60
+ function pointerWheelFlags(delta, horizontal = false) {
61
+ const steps = horizontal ? Math.sign(delta) : -Math.sign(delta);
62
+ if (steps === 0) return 0;
63
+ const wheelFlag = horizontal ? POINTER_FLAG.HWHEEL : POINTER_FLAG.WHEEL;
64
+ const rotation = 120;
65
+ return steps > 0 ? wheelFlag | rotation : wheelFlag | POINTER_FLAG.WHEEL_NEGATIVE | -rotation & 255;
66
+ }
67
+ const TOGGLE_FLAG = {
68
+ SCROLL_LOCK: 1,
69
+ NUM_LOCK: 2,
70
+ CAPS_LOCK: 4,
71
+ KANA_LOCK: 8
72
+ };
73
+ const POINTER_MESSAGE = {
74
+ SYSTEM: 1,
75
+ POSITION: 3,
76
+ COLOR: 6,
77
+ CACHED: 7,
78
+ POINTER: 8,
79
+ LARGE: 9
80
+ };
81
+ const INFO_FLAG = 1 | // INFO_MOUSE
82
+ 2 | // INFO_DISABLECTRLALTDEL
83
+ 16 | // INFO_UNICODE
84
+ 32 | // INFO_MAXIMIZESHELL
85
+ 64 | // INFO_LOGONNOTIFY
86
+ 256 | // INFO_ENABLEWINDOWSKEY
87
+ 65536 | // INFO_LOGONERRORS
88
+ 131072 | // INFO_MOUSE_HAS_WHEEL
89
+ 524288;
90
+ const INFO_AUTOLOGON = 8;
91
+ const INFO_RAIL = 32768;
92
+ const ERROR_INFO_MESSAGES = {
93
+ 1: "The host disconnected the session (an administrative API call ended it).",
94
+ 2: "The host logged the session off.",
95
+ 3: "The session was disconnected after being idle too long.",
96
+ 4: "The session was disconnected because sign-in took too long.",
97
+ 5: "The session was taken over by another connection.",
98
+ 6: "The host ran out of memory.",
99
+ 7: "The host denied the connection.",
100
+ 9: "This account does not have permission to sign in remotely.",
101
+ 10: "The host requires fresh credentials.",
102
+ 11: "A user on the host ended the session.",
103
+ 12: "The remote user signed out.",
104
+ 256: "Remote Desktop licensing failed on the host (internal error).",
105
+ 257: "The host could not reach a Remote Desktop licensing server.",
106
+ 258: "The host has no Remote Desktop licence available for this client.",
107
+ 259: "The host rejected this client during licensing.",
108
+ 260: "The stored Remote Desktop licence does not match this client.",
109
+ 261: "The host rejected the client licence.",
110
+ 262: "Remote Desktop licensing could not be completed.",
111
+ 263: "The client ended the licensing exchange.",
112
+ 264: "The host rejected the client licence encryption.",
113
+ 265: "The host could not upgrade the client licence.",
114
+ 266: "The host does not accept remote connections.",
115
+ 4345: "The host rejected a malformed capability set from this client.",
116
+ 4346: "The host rejected the client capability exchange."
117
+ };
118
+ function errorInfoMessage(errorInfo) {
119
+ return ERROR_INFO_MESSAGES[errorInfo] || `The host ended the session with error info 0x${errorInfo.toString(16).padStart(8, "0")}.`;
120
+ }
121
+ function shareControlPdu(pduType, userId, payload) {
122
+ const writer = new Writer(payload.length + 6);
123
+ writer.u16le(payload.length + 6);
124
+ writer.u16le(pduType | 16);
125
+ writer.u16le(userId);
126
+ writer.raw(payload);
127
+ return writer.take();
128
+ }
129
+ function shareDataPdu(shareId, userId, pduType2, payload) {
130
+ const writer = new Writer(payload.length + 12);
131
+ writer.u32le(shareId);
132
+ writer.u8(0);
133
+ writer.u8(1);
134
+ writer.u16le(payload.length + 18);
135
+ writer.u8(pduType2);
136
+ writer.u8(0);
137
+ writer.u16le(0);
138
+ writer.raw(payload);
139
+ return shareControlPdu(PDU_TYPE.DATA, userId, writer.take());
140
+ }
141
+ function unicodeField(writer, text) {
142
+ const start = writer.length;
143
+ writer.utf16le(text);
144
+ const byteLength = writer.length - start;
145
+ writer.u16le(0);
146
+ return byteLength;
147
+ }
148
+ function clientInfoPdu({ domain, username, password, performanceFlags, autoLogon, remoteApp = false }) {
149
+ const strings = new Writer(512);
150
+ const cbDomain = unicodeField(strings, domain || "");
151
+ const cbUsername = unicodeField(strings, username || "");
152
+ const cbPassword = unicodeField(strings, password || "");
153
+ const cbAlternateShell = unicodeField(strings, "");
154
+ const cbWorkingDir = unicodeField(strings, "");
155
+ const writer = new Writer(768);
156
+ writer.u32le(0);
157
+ writer.u32le((INFO_FLAG | (autoLogon ? INFO_AUTOLOGON : 0) | (remoteApp ? INFO_RAIL : 0)) >>> 0);
158
+ writer.u16le(cbDomain);
159
+ writer.u16le(cbUsername);
160
+ writer.u16le(cbPassword);
161
+ writer.u16le(cbAlternateShell);
162
+ writer.u16le(cbWorkingDir);
163
+ writer.raw(strings.take());
164
+ writer.u16le(2);
165
+ writer.u16le(2);
166
+ writer.u16le(0);
167
+ writer.u16le(2);
168
+ writer.u16le(0);
169
+ writer.zeros(172);
170
+ writer.u32le(0);
171
+ writer.u32le(performanceFlags >>> 0);
172
+ writer.u16le(0);
173
+ return writer.take();
174
+ }
175
+ function synchronizePdu(targetUser) {
176
+ const writer = new Writer(4);
177
+ writer.u16le(1);
178
+ writer.u16le(targetUser);
179
+ return writer.take();
180
+ }
181
+ function controlPdu(action) {
182
+ const writer = new Writer(8);
183
+ writer.u16le(action);
184
+ writer.u16le(0);
185
+ writer.u32le(0);
186
+ return writer.take();
187
+ }
188
+ function fontListPdu() {
189
+ const writer = new Writer(8);
190
+ writer.u16le(0);
191
+ writer.u16le(0);
192
+ writer.u16le(3);
193
+ writer.u16le(50);
194
+ return writer.take();
195
+ }
196
+ function confirmActivePdu(shareId, capabilities, capabilityCount) {
197
+ const sourceDescriptor = new TextEncoder().encode("MSTSC\0");
198
+ const writer = new Writer(capabilities.length + 32);
199
+ writer.u32le(shareId);
200
+ writer.u16le(1002);
201
+ writer.u16le(sourceDescriptor.length);
202
+ writer.u16le(capabilities.length + 4);
203
+ writer.raw(sourceDescriptor);
204
+ writer.u16le(capabilityCount);
205
+ writer.u16le(0);
206
+ writer.raw(capabilities);
207
+ return writer.take();
208
+ }
209
+ function inputEventsPdu(events) {
210
+ const writer = new Writer(events.length * 12 + 4);
211
+ writer.u16le(events.length);
212
+ writer.u16le(0);
213
+ for (const event of events) writer.raw(event);
214
+ return writer.take();
215
+ }
216
+ function inputEvent(messageType, write) {
217
+ const writer = new Writer(12);
218
+ writer.u32le(0);
219
+ writer.u16le(messageType);
220
+ write(writer);
221
+ return writer.take();
222
+ }
223
+ function scancodeEvent(scancode, pressed, extended) {
224
+ return inputEvent(INPUT_EVENT.SCANCODE, (writer) => {
225
+ writer.u16le(
226
+ (pressed ? KEYBOARD_FLAG.DOWN : KEYBOARD_FLAG.RELEASE) | (extended ? KEYBOARD_FLAG.EXTENDED : 0)
227
+ );
228
+ writer.u16le(scancode);
229
+ writer.u16le(0);
230
+ });
231
+ }
232
+ function unicodeEvent(codeUnit, pressed) {
233
+ return inputEvent(INPUT_EVENT.UNICODE, (writer) => {
234
+ writer.u16le(pressed ? KEYBOARD_FLAG.DOWN : KEYBOARD_FLAG.RELEASE);
235
+ writer.u16le(codeUnit);
236
+ writer.u16le(0);
237
+ });
238
+ }
239
+ function mouseEvent(flags, x, y) {
240
+ return inputEvent(INPUT_EVENT.MOUSE, (writer) => {
241
+ writer.u16le(flags);
242
+ writer.u16le(Math.max(0, Math.min(65535, Math.round(x))));
243
+ writer.u16le(Math.max(0, Math.min(65535, Math.round(y))));
244
+ });
245
+ }
246
+ function extendedMouseEvent(flags, x, y) {
247
+ return inputEvent(INPUT_EVENT.MOUSEX, (writer) => {
248
+ writer.u16le(flags);
249
+ writer.u16le(Math.max(0, Math.min(65535, Math.round(x))));
250
+ writer.u16le(Math.max(0, Math.min(65535, Math.round(y))));
251
+ });
252
+ }
253
+ function syncEvent(toggleFlags) {
254
+ return inputEvent(INPUT_EVENT.SYNC, (writer) => {
255
+ writer.u16le(0);
256
+ writer.u32le(toggleFlags >>> 0);
257
+ });
258
+ }
259
+ function refreshRectPdu(rects) {
260
+ const writer = new Writer(4 + rects.length * 8);
261
+ writer.u8(rects.length);
262
+ writer.zeros(3);
263
+ for (const rect of rects) {
264
+ writer.u16le(rect.left);
265
+ writer.u16le(rect.top);
266
+ writer.u16le(rect.right);
267
+ writer.u16le(rect.bottom);
268
+ }
269
+ return writer.take();
270
+ }
271
+ function suppressOutputPdu(allowDisplayUpdates, rect) {
272
+ const writer = new Writer(12);
273
+ writer.u8(allowDisplayUpdates ? 1 : 0);
274
+ writer.zeros(3);
275
+ if (allowDisplayUpdates && rect) {
276
+ writer.u16le(rect.left);
277
+ writer.u16le(rect.top);
278
+ writer.u16le(rect.right);
279
+ writer.u16le(rect.bottom);
280
+ }
281
+ return writer.take();
282
+ }
283
+ function parseShareControlHeader(bytes) {
284
+ const reader = new Reader(bytes);
285
+ const totalLength = reader.u16le();
286
+ const typeAndVersion = reader.u16le();
287
+ const pduSource = reader.u16le();
288
+ return {
289
+ totalLength,
290
+ pduType: typeAndVersion & 15,
291
+ pduSource,
292
+ payload: reader.rest().subarray(0, Math.max(0, totalLength - 6))
293
+ };
294
+ }
295
+ function parseShareDataHeader(bytes) {
296
+ const reader = new Reader(bytes);
297
+ const shareId = reader.u32le();
298
+ reader.u8();
299
+ reader.u8();
300
+ reader.u16le();
301
+ const pduType2 = reader.u8();
302
+ const compressedType = reader.u8();
303
+ const compressedLength = reader.u16le();
304
+ return { shareId, pduType2, compressedType, compressedLength, payload: reader.rest() };
305
+ }
306
+ function parseDemandActive(bytes) {
307
+ const reader = new Reader(bytes);
308
+ const shareId = reader.u32le();
309
+ const lengthSourceDescriptor = reader.u16le();
310
+ const lengthCombinedCapabilities = reader.u16le();
311
+ reader.skip(lengthSourceDescriptor);
312
+ const capabilities = reader.raw(Math.min(lengthCombinedCapabilities, reader.remaining));
313
+ return { shareId, capabilities };
314
+ }
315
+ const BITMAP_COMPRESSION = 1;
316
+ const NO_BITMAP_COMPRESSION_HDR = 1024;
317
+ function parseBitmapUpdate(reader) {
318
+ const count = reader.u16le();
319
+ const rects = [];
320
+ for (let i = 0; i < count && reader.remaining >= 18; i++) {
321
+ const left = reader.u16le();
322
+ const top = reader.u16le();
323
+ const right = reader.u16le();
324
+ const bottom = reader.u16le();
325
+ const width = reader.u16le();
326
+ const height = reader.u16le();
327
+ const bitsPerPixel = reader.u16le();
328
+ const flags = reader.u16le();
329
+ let bitmapLength = reader.u16le();
330
+ const compressed = Boolean(flags & BITMAP_COMPRESSION);
331
+ if (compressed && !(flags & NO_BITMAP_COMPRESSION_HDR)) {
332
+ reader.u16le();
333
+ const mainBodySize = reader.u16le();
334
+ reader.u16le();
335
+ reader.u16le();
336
+ bitmapLength = mainBodySize;
337
+ }
338
+ rects.push({
339
+ left,
340
+ top,
341
+ right,
342
+ bottom,
343
+ width,
344
+ height,
345
+ bitsPerPixel,
346
+ compressed,
347
+ data: reader.raw(Math.min(bitmapLength, reader.remaining))
348
+ });
349
+ }
350
+ return rects;
351
+ }
352
+ function parsePaletteUpdate(reader) {
353
+ reader.u16le();
354
+ reader.u16le();
355
+ const count = reader.u32le();
356
+ const palette = new Uint8Array(256 * 3);
357
+ for (let i = 0; i < count && i < 256 && reader.remaining >= 3; i++) {
358
+ palette[i * 3] = reader.u8();
359
+ palette[i * 3 + 1] = reader.u8();
360
+ palette[i * 3 + 2] = reader.u8();
361
+ }
362
+ return palette;
363
+ }
364
+ function parseColorPointer(reader, xorBpp) {
365
+ const cacheIndex = reader.u16le();
366
+ const hotSpotX = reader.u16le();
367
+ const hotSpotY = reader.u16le();
368
+ const width = reader.u16le();
369
+ const height = reader.u16le();
370
+ const andMaskLength = reader.u16le();
371
+ const xorMaskLength = reader.u16le();
372
+ const xorMask = reader.raw(Math.min(xorMaskLength, reader.remaining)).slice();
373
+ const andMask = reader.raw(Math.min(andMaskLength, reader.remaining)).slice();
374
+ return {
375
+ kind: "bitmap",
376
+ cacheIndex,
377
+ hotSpotX,
378
+ hotSpotY,
379
+ width,
380
+ height,
381
+ xorBpp: xorBpp || 24,
382
+ xorMask,
383
+ andMask
384
+ };
385
+ }
386
+ function parsePointerUpdate(reader) {
387
+ const messageType = reader.u16le();
388
+ reader.u16le();
389
+ if (messageType === POINTER_MESSAGE.POSITION) {
390
+ return { kind: "position", x: reader.u16le(), y: reader.u16le() };
391
+ }
392
+ if (messageType === POINTER_MESSAGE.SYSTEM) {
393
+ const systemPointerType = reader.u32le();
394
+ return { kind: "system", hidden: systemPointerType === 0 };
395
+ }
396
+ if (messageType === POINTER_MESSAGE.CACHED) {
397
+ return { kind: "cached", cacheIndex: reader.u16le() };
398
+ }
399
+ if (messageType === POINTER_MESSAGE.COLOR) {
400
+ return parseColorPointer(reader, 24);
401
+ }
402
+ if (messageType === POINTER_MESSAGE.POINTER) {
403
+ const xorBpp = reader.u16le();
404
+ return parseColorPointer(reader, xorBpp);
405
+ }
406
+ if (messageType === POINTER_MESSAGE.LARGE) {
407
+ return { kind: "unsupported", messageType };
408
+ }
409
+ return { kind: "unsupported", messageType };
410
+ }
411
+ export {
412
+ CONTROL_ACTION,
413
+ INPUT_EVENT,
414
+ KEYBOARD_FLAG,
415
+ PDU_TYPE,
416
+ PDU_TYPE2,
417
+ POINTER_FLAG,
418
+ TOGGLE_FLAG,
419
+ UPDATE_TYPE,
420
+ clientInfoPdu,
421
+ confirmActivePdu,
422
+ controlPdu,
423
+ errorInfoMessage,
424
+ extendedMouseEvent,
425
+ fontListPdu,
426
+ inputEventsPdu,
427
+ mouseEvent,
428
+ parseBitmapUpdate,
429
+ parseDemandActive,
430
+ parsePaletteUpdate,
431
+ parsePointerUpdate,
432
+ parseShareControlHeader,
433
+ parseShareDataHeader,
434
+ pointerWheelFlags,
435
+ refreshRectPdu,
436
+ scancodeEvent,
437
+ shareControlPdu,
438
+ shareDataPdu,
439
+ suppressOutputPdu,
440
+ syncEvent,
441
+ synchronizePdu,
442
+ unicodeEvent
443
+ };
444
+ //# sourceMappingURL=pdu.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/protocols/rdp/pdu.ts"],
4
+ "sourcesContent": ["// The share layer: PDU headers, the client info PDU, input events, and the\n// server update PDUs this client understands (MS-RDPBCGR 2.2.8, 2.2.9, 2.2.1.13).\n\nimport { Reader, Writer } from './buffer';\n\nexport const PDU_TYPE = {\n DEMAND_ACTIVE: 1,\n CONFIRM_ACTIVE: 3,\n DEACTIVATE_ALL: 6,\n DATA: 7,\n SERVER_REDIRECT: 10,\n};\n\nexport const PDU_TYPE2 = {\n UPDATE: 2,\n CONTROL: 20,\n POINTER: 27,\n INPUT: 28,\n SYNCHRONIZE: 31,\n REFRESH_RECT: 33,\n PLAY_SOUND: 34,\n SUPPRESS_OUTPUT: 35,\n SHUTDOWN_REQUEST: 36,\n SHUTDOWN_DENIED: 37,\n SAVE_SESSION_INFO: 38,\n FONT_LIST: 39,\n FONT_MAP: 40,\n SET_ERROR_INFO: 47,\n MONITOR_LAYOUT: 55,\n};\n\nexport const UPDATE_TYPE = {\n ORDERS: 0,\n BITMAP: 1,\n PALETTE: 2,\n SYNCHRONIZE: 3,\n};\n\nexport const CONTROL_ACTION = {\n REQUEST_CONTROL: 1,\n GRANTED_CONTROL: 2,\n DETACH: 3,\n COOPERATE: 4,\n};\n\nexport const INPUT_EVENT = {\n SYNC: 0x0000,\n SCANCODE: 0x0004,\n UNICODE: 0x0005,\n MOUSE: 0x8001,\n MOUSEX: 0x8002,\n};\n\nexport const KEYBOARD_FLAG = {\n EXTENDED: 0x0100,\n DOWN: 0x4000,\n RELEASE: 0x8000,\n};\n\nexport const POINTER_FLAG = {\n WHEEL: 0x0200,\n HWHEEL: 0x0400,\n WHEEL_NEGATIVE: 0x0100,\n MOVE: 0x0800,\n DOWN: 0x8000,\n BUTTON1: 0x1000,\n BUTTON2: 0x2000,\n BUTTON3: 0x4000,\n};\n\n/** Translate browser-style wheel direction to the signed RDP rotation flags. */\nexport function pointerWheelFlags(delta: number, horizontal = false): number {\n const steps = horizontal ? Math.sign(delta) : -Math.sign(delta);\n if (steps === 0) return 0;\n const wheelFlag = horizontal ? POINTER_FLAG.HWHEEL : POINTER_FLAG.WHEEL;\n const rotation = 120;\n return steps > 0\n ? wheelFlag | rotation\n : wheelFlag | POINTER_FLAG.WHEEL_NEGATIVE | ((-rotation) & 0xff);\n}\n\nexport const TOGGLE_FLAG = {\n SCROLL_LOCK: 0x0001,\n NUM_LOCK: 0x0002,\n CAPS_LOCK: 0x0004,\n KANA_LOCK: 0x0008,\n};\n\nconst POINTER_MESSAGE = {\n SYSTEM: 0x0001,\n POSITION: 0x0003,\n COLOR: 0x0006,\n CACHED: 0x0007,\n POINTER: 0x0008,\n LARGE: 0x0009,\n};\n\nconst INFO_FLAG =\n 0x00000001 | // INFO_MOUSE\n 0x00000002 | // INFO_DISABLECTRLALTDEL\n 0x00000010 | // INFO_UNICODE\n 0x00000020 | // INFO_MAXIMIZESHELL\n 0x00000040 | // INFO_LOGONNOTIFY\n 0x00000100 | // INFO_ENABLEWINDOWSKEY\n 0x00010000 | // INFO_LOGONERRORS\n 0x00020000 | // INFO_MOUSE_HAS_WHEEL\n 0x00080000; // INFO_NOAUDIOPLAYBACK\n\nconst INFO_AUTOLOGON = 0x00000008;\nconst INFO_RAIL = 0x00008000;\n\nconst ERROR_INFO_MESSAGES = {\n 0x00000001: 'The host disconnected the session (an administrative API call ended it).',\n 0x00000002: 'The host logged the session off.',\n 0x00000003: 'The session was disconnected after being idle too long.',\n 0x00000004: 'The session was disconnected because sign-in took too long.',\n 0x00000005: 'The session was taken over by another connection.',\n 0x00000006: 'The host ran out of memory.',\n 0x00000007: 'The host denied the connection.',\n 0x00000009: 'This account does not have permission to sign in remotely.',\n 0x0000000a: 'The host requires fresh credentials.',\n 0x0000000b: 'A user on the host ended the session.',\n 0x0000000c: 'The remote user signed out.',\n 0x00000100: 'Remote Desktop licensing failed on the host (internal error).',\n 0x00000101: 'The host could not reach a Remote Desktop licensing server.',\n 0x00000102: 'The host has no Remote Desktop licence available for this client.',\n 0x00000103: 'The host rejected this client during licensing.',\n 0x00000104: 'The stored Remote Desktop licence does not match this client.',\n 0x00000105: 'The host rejected the client licence.',\n 0x00000106: 'Remote Desktop licensing could not be completed.',\n 0x00000107: 'The client ended the licensing exchange.',\n 0x00000108: 'The host rejected the client licence encryption.',\n 0x00000109: 'The host could not upgrade the client licence.',\n 0x0000010a: 'The host does not accept remote connections.',\n 0x000010f9: 'The host rejected a malformed capability set from this client.',\n 0x000010fa: 'The host rejected the client capability exchange.',\n};\n\nexport function errorInfoMessage(errorInfo) {\n return (\n ERROR_INFO_MESSAGES[errorInfo] ||\n `The host ended the session with error info 0x${errorInfo.toString(16).padStart(8, '0')}.`\n );\n}\n\n// --- Outbound PDUs ----------------------------------------------------------\n\n/** TS_SHARECONTROLHEADER + payload. */\nexport function shareControlPdu(pduType, userId: number, payload: Uint8Array) {\n const writer = new Writer(payload.length + 6);\n writer.u16le(payload.length + 6);\n writer.u16le(pduType | 0x10); // low nibble is the type, high nibble the version\n writer.u16le(userId);\n writer.raw(payload);\n return writer.take();\n}\n\n/** TS_SHAREDATAHEADER inside a share control PDU of type DATA. */\nexport function shareDataPdu(shareId: number, userId: number, pduType2, payload: Uint8Array) {\n const writer = new Writer(payload.length + 12);\n writer.u32le(shareId);\n writer.u8(0); // pad\n writer.u8(1); // streamId: low priority\n writer.u16le(payload.length + 18); // uncompressedLength, headers included\n writer.u8(pduType2);\n writer.u8(0); // compressedType: none\n writer.u16le(0); // compressedLength\n writer.raw(payload);\n return shareControlPdu(PDU_TYPE.DATA, userId, writer.take());\n}\n\n/** Write a UTF-16LE field with its terminator, returning the length without it. */\nfunction unicodeField(writer: Writer, text: string) {\n const start = writer.length;\n writer.utf16le(text);\n const byteLength = writer.length - start;\n writer.u16le(0); // terminator\n return byteLength;\n}\n\n/**\n * Client Info PDU (MS-RDPBCGR 2.2.1.11). The credential lengths sit in front of\n * the strings, so the strings are written to a scratch buffer first.\n */\nexport function clientInfoPdu({ domain, username, password, performanceFlags, autoLogon, remoteApp = false }) {\n const strings = new Writer(512);\n const cbDomain = unicodeField(strings, domain || '');\n const cbUsername = unicodeField(strings, username || '');\n const cbPassword = unicodeField(strings, password || '');\n const cbAlternateShell = unicodeField(strings, '');\n const cbWorkingDir = unicodeField(strings, '');\n\n const writer = new Writer(768);\n writer.u32le(0); // codePage\n writer.u32le((INFO_FLAG | (autoLogon ? INFO_AUTOLOGON : 0) | (remoteApp ? INFO_RAIL : 0)) >>> 0);\n writer.u16le(cbDomain);\n writer.u16le(cbUsername);\n writer.u16le(cbPassword);\n writer.u16le(cbAlternateShell);\n writer.u16le(cbWorkingDir);\n writer.raw(strings.take());\n\n // TS_EXTENDED_INFO_PACKET\n writer.u16le(2); // clientAddressFamily: AF_INET\n writer.u16le(2); // cbClientAddress: just the terminator\n writer.u16le(0);\n writer.u16le(2); // cbClientDir\n writer.u16le(0);\n writer.zeros(172); // clientTimeZone\n writer.u32le(0); // clientSessionId\n writer.u32le(performanceFlags >>> 0);\n writer.u16le(0); // cbAutoReconnectCookie\n\n return writer.take();\n}\n\nexport function synchronizePdu(targetUser) {\n const writer = new Writer(4);\n writer.u16le(1); // SYNCMSGTYPE_SYNC\n writer.u16le(targetUser);\n return writer.take();\n}\n\nexport function controlPdu(action) {\n const writer = new Writer(8);\n writer.u16le(action);\n writer.u16le(0); // grantId\n writer.u32le(0); // controlId\n return writer.take();\n}\n\nexport function fontListPdu() {\n const writer = new Writer(8);\n writer.u16le(0); // numberFonts\n writer.u16le(0); // totalNumberFonts\n writer.u16le(0x0003); // listFlags: first and last\n writer.u16le(0x0032); // entrySize\n return writer.take();\n}\n\nexport function confirmActivePdu(shareId: number, capabilities, capabilityCount) {\n const sourceDescriptor = new TextEncoder().encode('MSTSC\\0');\n const writer = new Writer(capabilities.length + 32);\n\n writer.u32le(shareId);\n writer.u16le(0x03ea); // originatorId: the server channel\n writer.u16le(sourceDescriptor.length);\n writer.u16le(capabilities.length + 4); // lengthCombinedCapabilities\n writer.raw(sourceDescriptor);\n writer.u16le(capabilityCount);\n writer.u16le(0); // pad\n writer.raw(capabilities);\n\n return writer.take();\n}\n\n/** TS_INPUT_PDU_DATA: a batch of input events sharing one header. */\nexport function inputEventsPdu(events) {\n const writer = new Writer(events.length * 12 + 4);\n writer.u16le(events.length);\n writer.u16le(0); // pad\n for (const event of events) writer.raw(event);\n return writer.take();\n}\n\nfunction inputEvent(messageType, write) {\n const writer = new Writer(12);\n writer.u32le(0); // eventTime, ignored by every host\n writer.u16le(messageType);\n write(writer);\n return writer.take();\n}\n\nexport function scancodeEvent(scancode, pressed: boolean, extended) {\n return inputEvent(INPUT_EVENT.SCANCODE, (writer: Writer) => {\n writer.u16le(\n (pressed ? KEYBOARD_FLAG.DOWN : KEYBOARD_FLAG.RELEASE) |\n (extended ? KEYBOARD_FLAG.EXTENDED : 0)\n );\n writer.u16le(scancode);\n writer.u16le(0);\n });\n}\n\nexport function unicodeEvent(codeUnit, pressed: boolean) {\n return inputEvent(INPUT_EVENT.UNICODE, (writer: Writer) => {\n writer.u16le(pressed ? KEYBOARD_FLAG.DOWN : KEYBOARD_FLAG.RELEASE);\n writer.u16le(codeUnit);\n writer.u16le(0);\n });\n}\n\nexport function mouseEvent(flags: number, x: number, y: number) {\n return inputEvent(INPUT_EVENT.MOUSE, (writer: Writer) => {\n writer.u16le(flags);\n writer.u16le(Math.max(0, Math.min(0xffff, Math.round(x))));\n writer.u16le(Math.max(0, Math.min(0xffff, Math.round(y))));\n });\n}\n\nexport function extendedMouseEvent(flags: number, x: number, y: number) {\n return inputEvent(INPUT_EVENT.MOUSEX, (writer: Writer) => {\n writer.u16le(flags);\n writer.u16le(Math.max(0, Math.min(0xffff, Math.round(x))));\n writer.u16le(Math.max(0, Math.min(0xffff, Math.round(y))));\n });\n}\n\nexport function syncEvent(toggleFlags: number) {\n return inputEvent(INPUT_EVENT.SYNC, (writer: Writer) => {\n writer.u16le(0);\n writer.u32le(toggleFlags >>> 0);\n });\n}\n\nexport function refreshRectPdu(rects) {\n const writer = new Writer(4 + rects.length * 8);\n writer.u8(rects.length);\n writer.zeros(3); // pad\n for (const rect of rects) {\n writer.u16le(rect.left);\n writer.u16le(rect.top);\n writer.u16le(rect.right);\n writer.u16le(rect.bottom);\n }\n return writer.take();\n}\n\nexport function suppressOutputPdu(allowDisplayUpdates, rect) {\n const writer = new Writer(12);\n writer.u8(allowDisplayUpdates ? 1 : 0);\n writer.zeros(3); // pad\n if (allowDisplayUpdates && rect) {\n writer.u16le(rect.left);\n writer.u16le(rect.top);\n writer.u16le(rect.right);\n writer.u16le(rect.bottom);\n }\n return writer.take();\n}\n\n// --- Inbound PDUs -----------------------------------------------------------\n\nexport function parseShareControlHeader(bytes: Uint8Array) {\n const reader = new Reader(bytes);\n const totalLength = reader.u16le();\n const typeAndVersion = reader.u16le();\n const pduSource = reader.u16le();\n\n return {\n totalLength,\n pduType: typeAndVersion & 0x0f,\n pduSource,\n payload: reader.rest().subarray(0, Math.max(0, totalLength - 6)),\n };\n}\n\nexport function parseShareDataHeader(bytes: Uint8Array) {\n const reader = new Reader(bytes);\n const shareId = reader.u32le();\n reader.u8(); // pad\n reader.u8(); // streamId\n reader.u16le(); // uncompressedLength\n const pduType2 = reader.u8();\n const compressedType = reader.u8();\n const compressedLength = reader.u16le();\n\n return { shareId, pduType2, compressedType, compressedLength, payload: reader.rest() };\n}\n\nexport function parseDemandActive(bytes: Uint8Array) {\n const reader = new Reader(bytes);\n const shareId = reader.u32le();\n const lengthSourceDescriptor = reader.u16le();\n const lengthCombinedCapabilities = reader.u16le();\n reader.skip(lengthSourceDescriptor);\n\n const capabilities = reader.raw(Math.min(lengthCombinedCapabilities, reader.remaining));\n return { shareId, capabilities };\n}\n\nconst BITMAP_COMPRESSION = 0x0001;\nconst NO_BITMAP_COMPRESSION_HDR = 0x0400;\n\nexport function parseBitmapUpdate(reader: Reader) {\n const count = reader.u16le();\n const rects = [];\n\n for (let i = 0; i < count && reader.remaining >= 18; i++) {\n const left = reader.u16le();\n const top = reader.u16le();\n const right = reader.u16le();\n const bottom = reader.u16le();\n const width = reader.u16le();\n const height = reader.u16le();\n const bitsPerPixel = reader.u16le();\n const flags = reader.u16le();\n let bitmapLength = reader.u16le();\n\n const compressed = Boolean(flags & BITMAP_COMPRESSION);\n if (compressed && !(flags & NO_BITMAP_COMPRESSION_HDR)) {\n // TS_CD_HEADER: the main body size is authoritative, and the eight header\n // bytes are counted in bitmapLength.\n reader.u16le(); // cbCompFirstRowSize, always zero\n const mainBodySize = reader.u16le();\n reader.u16le(); // cbScanWidth\n reader.u16le(); // cbUncompressedSize\n bitmapLength = mainBodySize;\n }\n\n rects.push({\n left,\n top,\n right,\n bottom,\n width,\n height,\n bitsPerPixel,\n compressed,\n data: reader.raw(Math.min(bitmapLength, reader.remaining)),\n });\n }\n\n return rects;\n}\n\nexport function parsePaletteUpdate(reader: Reader) {\n reader.u16le(); // updateType, repeated\n reader.u16le(); // pad\n const count = reader.u32le();\n const palette = new Uint8Array(256 * 3);\n\n for (let i = 0; i < count && i < 256 && reader.remaining >= 3; i++) {\n palette[i * 3] = reader.u8();\n palette[i * 3 + 1] = reader.u8();\n palette[i * 3 + 2] = reader.u8();\n }\n return palette;\n}\n\nfunction parseColorPointer(reader: Reader, xorBpp) {\n const cacheIndex = reader.u16le();\n const hotSpotX = reader.u16le();\n const hotSpotY = reader.u16le();\n const width = reader.u16le();\n const height = reader.u16le();\n const andMaskLength = reader.u16le();\n const xorMaskLength = reader.u16le();\n const xorMask = reader.raw(Math.min(xorMaskLength, reader.remaining)).slice();\n const andMask = reader.raw(Math.min(andMaskLength, reader.remaining)).slice();\n\n return {\n kind: 'bitmap',\n cacheIndex,\n hotSpotX,\n hotSpotY,\n width,\n height,\n xorBpp: xorBpp || 24,\n xorMask,\n andMask,\n };\n}\n\nexport function parsePointerUpdate(reader: Reader) {\n const messageType = reader.u16le();\n reader.u16le(); // pad\n\n if (messageType === POINTER_MESSAGE.POSITION) {\n return { kind: 'position', x: reader.u16le(), y: reader.u16le() };\n }\n\n if (messageType === POINTER_MESSAGE.SYSTEM) {\n const systemPointerType = reader.u32le();\n return { kind: 'system', hidden: systemPointerType === 0x00000000 };\n }\n\n if (messageType === POINTER_MESSAGE.CACHED) {\n return { kind: 'cached', cacheIndex: reader.u16le() };\n }\n\n if (messageType === POINTER_MESSAGE.COLOR) {\n return parseColorPointer(reader, 24);\n }\n\n if (messageType === POINTER_MESSAGE.POINTER) {\n const xorBpp = reader.u16le();\n return parseColorPointer(reader, xorBpp);\n }\n\n if (messageType === POINTER_MESSAGE.LARGE) {\n // Large pointers are only sent when advertised; treat as unsupported.\n return { kind: 'unsupported', messageType };\n }\n\n return { kind: 'unsupported', messageType };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }