teleproto 1.214.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.
- package/CryptoFile.d.ts +2 -0
- package/CryptoFile.js +37 -0
- package/Helpers.d.ts +150 -0
- package/Helpers.js +477 -0
- package/LICENSE +23 -0
- package/Password.d.ts +14 -0
- package/Password.js +270 -0
- package/README.md +98 -0
- package/Utils.d.ts +227 -0
- package/Utils.js +1247 -0
- package/Version.d.ts +1 -0
- package/Version.js +4 -0
- package/client/2fa.d.ts +48 -0
- package/client/2fa.js +108 -0
- package/client/TelegramClient.d.ts +1043 -0
- package/client/TelegramClient.js +1181 -0
- package/client/account.d.ts +0 -0
- package/client/account.js +1 -0
- package/client/auth.d.ts +92 -0
- package/client/auth.js +388 -0
- package/client/bots.d.ts +6 -0
- package/client/bots.js +23 -0
- package/client/buttons.d.ts +4 -0
- package/client/buttons.js +86 -0
- package/client/chats.d.ts +45 -0
- package/client/chats.js +350 -0
- package/client/dialogs.d.ts +52 -0
- package/client/dialogs.js +174 -0
- package/client/downloads.d.ts +156 -0
- package/client/downloads.js +614 -0
- package/client/fs.d.ts +1 -0
- package/client/fs.js +17 -0
- package/client/index.d.ts +15 -0
- package/client/index.js +64 -0
- package/client/messageParse.d.ts +17 -0
- package/client/messageParse.js +191 -0
- package/client/messages.d.ts +263 -0
- package/client/messages.js +813 -0
- package/client/os.d.ts +2 -0
- package/client/os.js +37 -0
- package/client/path.d.ts +2 -0
- package/client/path.js +7 -0
- package/client/telegramBaseClient.d.ts +237 -0
- package/client/telegramBaseClient.js +368 -0
- package/client/updates.d.ts +33 -0
- package/client/updates.js +260 -0
- package/client/uploads.d.ts +136 -0
- package/client/uploads.js +514 -0
- package/client/users.d.ts +29 -0
- package/client/users.js +490 -0
- package/crypto/AuthKey.d.ts +19 -0
- package/crypto/AuthKey.js +76 -0
- package/crypto/CTR.d.ts +5 -0
- package/crypto/CTR.js +16 -0
- package/crypto/Factorizator.d.ts +19 -0
- package/crypto/Factorizator.js +74 -0
- package/crypto/IGE.d.ts +11 -0
- package/crypto/IGE.js +115 -0
- package/crypto/RSA.d.ts +14 -0
- package/crypto/RSA.js +70 -0
- package/crypto/converters.d.ts +19 -0
- package/crypto/converters.js +52 -0
- package/crypto/crypto.d.ts +19 -0
- package/crypto/crypto.js +58 -0
- package/crypto/words.d.ts +6 -0
- package/crypto/words.js +47 -0
- package/define.d.ts +77 -0
- package/entityCache.d.ts +7 -0
- package/entityCache.js +79 -0
- package/errors/Common.d.ts +71 -0
- package/errors/Common.js +122 -0
- package/errors/RPCBaseErrors.d.ts +84 -0
- package/errors/RPCBaseErrors.js +134 -0
- package/errors/RPCErrorList.d.ts +37 -0
- package/errors/RPCErrorList.js +117 -0
- package/errors/index.d.ts +11 -0
- package/errors/index.js +32 -0
- package/events/Album.d.ts +36 -0
- package/events/Album.js +104 -0
- package/events/CallbackQuery.d.ts +73 -0
- package/events/CallbackQuery.js +193 -0
- package/events/DeletedMessage.d.ts +45 -0
- package/events/DeletedMessage.js +63 -0
- package/events/EditedMessage.d.ts +30 -0
- package/events/EditedMessage.js +41 -0
- package/events/NewMessage.d.ts +89 -0
- package/events/NewMessage.js +182 -0
- package/events/Raw.d.ts +29 -0
- package/events/Raw.js +43 -0
- package/events/common.d.ts +66 -0
- package/events/common.js +141 -0
- package/events/index.d.ts +2 -0
- package/events/index.js +8 -0
- package/extensions/AsyncQueue.d.ts +10 -0
- package/extensions/AsyncQueue.js +32 -0
- package/extensions/BinaryReader.d.ts +99 -0
- package/extensions/BinaryReader.js +242 -0
- package/extensions/BinaryWriter.d.ts +6 -0
- package/extensions/BinaryWriter.js +15 -0
- package/extensions/Deferred.d.ts +8 -0
- package/extensions/Deferred.js +16 -0
- package/extensions/Logger.d.ts +54 -0
- package/extensions/Logger.js +128 -0
- package/extensions/MessagePacker.d.ts +21 -0
- package/extensions/MessagePacker.js +154 -0
- package/extensions/PendingState.d.ts +12 -0
- package/extensions/PendingState.js +29 -0
- package/extensions/PromisedNetSockets.d.ts +24 -0
- package/extensions/PromisedNetSockets.js +192 -0
- package/extensions/PromisedWebSockets.d.ts +18 -0
- package/extensions/PromisedWebSockets.js +124 -0
- package/extensions/html.d.ts +5 -0
- package/extensions/html.js +228 -0
- package/extensions/index.d.ts +7 -0
- package/extensions/index.js +17 -0
- package/extensions/markdown.d.ts +5 -0
- package/extensions/markdown.js +76 -0
- package/extensions/markdownv2.d.ts +5 -0
- package/extensions/markdownv2.js +51 -0
- package/extensions/net.d.ts +1 -0
- package/extensions/net.js +17 -0
- package/extensions/socks.d.ts +1 -0
- package/extensions/socks.js +17 -0
- package/index.d.ts +14 -0
- package/index.js +62 -0
- package/inspect.d.ts +1 -0
- package/inspect.js +5 -0
- package/network/Authenticator.d.ts +12 -0
- package/network/Authenticator.js +192 -0
- package/network/MTProtoPlainSender.d.ts +19 -0
- package/network/MTProtoPlainSender.js +74 -0
- package/network/MTProtoSender.d.ts +290 -0
- package/network/MTProtoSender.js +873 -0
- package/network/MTProtoState.d.ts +102 -0
- package/network/MTProtoState.js +267 -0
- package/network/RequestState.d.ts +18 -0
- package/network/RequestState.js +35 -0
- package/network/connection/Connection.d.ts +69 -0
- package/network/connection/Connection.js +162 -0
- package/network/connection/TCPAbridged.d.ts +19 -0
- package/network/connection/TCPAbridged.js +58 -0
- package/network/connection/TCPFull.d.ts +16 -0
- package/network/connection/TCPFull.js +61 -0
- package/network/connection/TCPMTProxy.d.ts +49 -0
- package/network/connection/TCPMTProxy.js +121 -0
- package/network/connection/TCPObfuscated.d.ts +18 -0
- package/network/connection/TCPObfuscated.js +78 -0
- package/network/connection/index.d.ts +4 -0
- package/network/connection/index.js +11 -0
- package/network/index.d.ts +11 -0
- package/network/index.js +23 -0
- package/package.json +50 -0
- package/requestIter.d.ts +24 -0
- package/requestIter.js +109 -0
- package/sessions/Abstract.d.ts +103 -0
- package/sessions/Abstract.js +6 -0
- package/sessions/Memory.d.ts +38 -0
- package/sessions/Memory.js +272 -0
- package/sessions/StoreSession.d.ts +14 -0
- package/sessions/StoreSession.js +77 -0
- package/sessions/StringSession.d.ts +32 -0
- package/sessions/StringSession.js +116 -0
- package/sessions/index.d.ts +4 -0
- package/sessions/index.js +11 -0
- package/sessions/localStorage.d.ts +1 -0
- package/sessions/localStorage.js +4 -0
- package/tl/AllTLObjects.d.ts +3 -0
- package/tl/AllTLObjects.js +17 -0
- package/tl/MTProtoRequest.d.ts +18 -0
- package/tl/MTProtoRequest.js +38 -0
- package/tl/api.d.ts +32488 -0
- package/tl/api.js +507 -0
- package/tl/apiTl.d.ts +2 -0
- package/tl/apiTl.js +2209 -0
- package/tl/core/GZIPPacked.d.ts +15 -0
- package/tl/core/GZIPPacked.js +51 -0
- package/tl/core/MessageContainer.d.ts +12 -0
- package/tl/core/MessageContainer.js +42 -0
- package/tl/core/RPCResult.d.ts +14 -0
- package/tl/core/RPCResult.js +32 -0
- package/tl/core/TLMessage.d.ts +10 -0
- package/tl/core/TLMessage.js +14 -0
- package/tl/core/index.d.ts +6 -0
- package/tl/core/index.js +16 -0
- package/tl/custom/button.d.ts +24 -0
- package/tl/custom/button.js +78 -0
- package/tl/custom/chatGetter.d.ts +29 -0
- package/tl/custom/chatGetter.js +116 -0
- package/tl/custom/dialog.d.ts +30 -0
- package/tl/custom/dialog.js +40 -0
- package/tl/custom/draft.d.ts +21 -0
- package/tl/custom/draft.js +48 -0
- package/tl/custom/file.d.ts +21 -0
- package/tl/custom/file.js +68 -0
- package/tl/custom/forward.d.ts +15 -0
- package/tl/custom/forward.js +47 -0
- package/tl/custom/index.d.ts +1 -0
- package/tl/custom/index.js +5 -0
- package/tl/custom/inlineResult.d.ts +32 -0
- package/tl/custom/inlineResult.js +87 -0
- package/tl/custom/inlineResults.d.ts +20 -0
- package/tl/custom/inlineResults.js +26 -0
- package/tl/custom/message.d.ts +427 -0
- package/tl/custom/message.js +716 -0
- package/tl/custom/messageButton.d.ts +54 -0
- package/tl/custom/messageButton.js +152 -0
- package/tl/custom/senderGetter.d.ts +28 -0
- package/tl/custom/senderGetter.js +55 -0
- package/tl/generateModule.d.ts +1 -0
- package/tl/generateModule.js +17 -0
- package/tl/generationHelpers.d.ts +11 -0
- package/tl/generationHelpers.js +289 -0
- package/tl/index.d.ts +3 -0
- package/tl/index.js +10 -0
- package/tl/patched/index.d.ts +2 -0
- package/tl/patched/index.js +76 -0
- package/tl/schemaTl.d.ts +2 -0
- package/tl/schemaTl.js +64 -0
- package/tl/types-generator/generate.d.ts +1 -0
- package/tl/types-generator/generate.js +84 -0
- package/tl/types-generator/template.d.ts +6 -0
- package/tl/types-generator/template.js +257 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MarkdownParser = void 0;
|
|
4
|
+
const messageParse_1 = require("../client/messageParse");
|
|
5
|
+
class MarkdownParser {
|
|
6
|
+
// TODO maybe there is a better way :shrug:
|
|
7
|
+
static parse(message) {
|
|
8
|
+
let i = 0;
|
|
9
|
+
const keys = {};
|
|
10
|
+
for (const k in messageParse_1.DEFAULT_DELIMITERS) {
|
|
11
|
+
keys[k] = false;
|
|
12
|
+
}
|
|
13
|
+
const entities = [];
|
|
14
|
+
const tempEntities = {};
|
|
15
|
+
while (i < message.length) {
|
|
16
|
+
let foundIndex = -1;
|
|
17
|
+
let foundDelim = undefined;
|
|
18
|
+
for (const key of Object.keys(messageParse_1.DEFAULT_DELIMITERS)) {
|
|
19
|
+
const index = message.indexOf(key, i);
|
|
20
|
+
if (index > -1 && (foundIndex === -1 || index < foundIndex)) {
|
|
21
|
+
foundIndex = index;
|
|
22
|
+
foundDelim = key;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (foundIndex === -1 || foundDelim == undefined) {
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
if (!keys[foundDelim]) {
|
|
29
|
+
tempEntities[foundDelim] = new messageParse_1.DEFAULT_DELIMITERS[foundDelim]({
|
|
30
|
+
offset: foundIndex,
|
|
31
|
+
length: -1,
|
|
32
|
+
language: "",
|
|
33
|
+
});
|
|
34
|
+
keys[foundDelim] = true;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
keys[foundDelim] = false;
|
|
38
|
+
tempEntities[foundDelim].length =
|
|
39
|
+
foundIndex - tempEntities[foundDelim].offset;
|
|
40
|
+
entities.push(tempEntities[foundDelim]);
|
|
41
|
+
}
|
|
42
|
+
message = message.toString().replace(foundDelim, "");
|
|
43
|
+
i = foundIndex;
|
|
44
|
+
}
|
|
45
|
+
return [message, entities];
|
|
46
|
+
}
|
|
47
|
+
static unparse(text, entities) {
|
|
48
|
+
const delimiters = messageParse_1.DEFAULT_DELIMITERS;
|
|
49
|
+
if (!text || !entities) {
|
|
50
|
+
return text;
|
|
51
|
+
}
|
|
52
|
+
let insertAt = [];
|
|
53
|
+
const tempDelimiters = new Map();
|
|
54
|
+
Object.keys(delimiters).forEach((key) => {
|
|
55
|
+
tempDelimiters.set(delimiters[key].className, key);
|
|
56
|
+
});
|
|
57
|
+
for (const entity of entities) {
|
|
58
|
+
const s = entity.offset;
|
|
59
|
+
const e = entity.offset + entity.length;
|
|
60
|
+
const delimiter = tempDelimiters.get(entity.className);
|
|
61
|
+
if (delimiter) {
|
|
62
|
+
insertAt.push([s, delimiter]);
|
|
63
|
+
insertAt.push([e, delimiter]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
insertAt = insertAt.sort((a, b) => {
|
|
67
|
+
return a[0] - b[0];
|
|
68
|
+
});
|
|
69
|
+
while (insertAt.length) {
|
|
70
|
+
const [at, what] = insertAt.pop();
|
|
71
|
+
text = text.slice(0, at) + what + text.slice(at);
|
|
72
|
+
}
|
|
73
|
+
return text;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.MarkdownParser = MarkdownParser;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MarkdownV2Parser = void 0;
|
|
4
|
+
const html_1 = require("./html");
|
|
5
|
+
class MarkdownV2Parser {
|
|
6
|
+
static parse(message) {
|
|
7
|
+
// Bold
|
|
8
|
+
message = message.replace(/\*(.*?)\*/g, "<b>$1</b>");
|
|
9
|
+
// underline
|
|
10
|
+
message = message.replace(/__(.*?)__/g, "<u>$1</u>");
|
|
11
|
+
// strikethrough
|
|
12
|
+
message = message.replace(/~(.*?)~/g, "<s>$1</s>");
|
|
13
|
+
// italic
|
|
14
|
+
message = message.replace(/-(.*?)-/g, "<i>$1</i>");
|
|
15
|
+
// pre
|
|
16
|
+
message = message.replace(/```([\s\S]*?)```/g, "<pre>$1</pre>");
|
|
17
|
+
// code
|
|
18
|
+
message = message.replace(/`(.*?)`/g, "<code>$1</code>");
|
|
19
|
+
// Spoiler
|
|
20
|
+
message = message.replace(/\|\|(.*?)\|\|/g, "<spoiler>$1</spoiler>");
|
|
21
|
+
// Inline URL
|
|
22
|
+
message = message.replace(/(?<!\!)\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
|
|
23
|
+
// Emoji
|
|
24
|
+
message = message.replace(/!\[([^\]]+)\]\(tg:\/\/emoji\?id=(\d+)\)/g, '<tg-emoji emoji-id="$2">$1</tg-emoji>');
|
|
25
|
+
//
|
|
26
|
+
return html_1.HTMLParser.parse(message);
|
|
27
|
+
}
|
|
28
|
+
static unparse(text, entities) {
|
|
29
|
+
text = html_1.HTMLParser.unparse(text, entities);
|
|
30
|
+
// Bold
|
|
31
|
+
text = text.replace(/<b>(.*?)<\/b>/g, "*$1*");
|
|
32
|
+
// Underline
|
|
33
|
+
text = text.replace(/<u>(.*?)<\/u>/g, "__$1__");
|
|
34
|
+
// Code
|
|
35
|
+
text = text.replace(/<code>(.*?)<\/code>/g, "`$1`");
|
|
36
|
+
// Pre
|
|
37
|
+
text = text.replace(/<pre>(.*?)<\/pre>/g, "```$1```");
|
|
38
|
+
// strikethrough
|
|
39
|
+
text = text.replace(/<s>(.*?)<\/s>/g, "~$1~");
|
|
40
|
+
// Italic
|
|
41
|
+
text = text.replace(/<i>(.*?)<\/i>/g, "-$1-");
|
|
42
|
+
// Spoiler
|
|
43
|
+
text = text.replace(/<spoiler>(.*?)<\/spoiler>/g, "||$1||");
|
|
44
|
+
// Inline URL
|
|
45
|
+
text = text.replace(/<a href="([^"]+)">([^<]+)<\/a>/g, "[$2]($1)");
|
|
46
|
+
// Emoji
|
|
47
|
+
text = text.replace(/<tg-emoji emoji-id="(\d+)">([^<]+)<\/tg-emoji>/g, "");
|
|
48
|
+
return text;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.MarkdownV2Parser = MarkdownV2Parser;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "net";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("net"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "socks";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("socks"), exports);
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { Api } from "./tl";
|
|
2
|
+
import * as tl from "./tl";
|
|
3
|
+
export { TelegramClient } from "./client/TelegramClient";
|
|
4
|
+
export { Connection } from "./network";
|
|
5
|
+
export { version } from "./Version";
|
|
6
|
+
export { Logger } from "./extensions/Logger";
|
|
7
|
+
import * as utils from "./Utils";
|
|
8
|
+
import * as errors from "./errors";
|
|
9
|
+
import * as sessions from "./sessions";
|
|
10
|
+
import * as extensions from "./extensions";
|
|
11
|
+
import * as helpers from "./Helpers";
|
|
12
|
+
import * as client from "./client";
|
|
13
|
+
import * as password from "./Password";
|
|
14
|
+
export { utils, errors, sessions, extensions, helpers, tl, password, client };
|
package/index.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.client = exports.password = exports.tl = exports.helpers = exports.extensions = exports.sessions = exports.errors = exports.utils = exports.Logger = exports.version = exports.Connection = exports.TelegramClient = exports.Api = void 0;
|
|
37
|
+
var tl_1 = require("./tl");
|
|
38
|
+
Object.defineProperty(exports, "Api", { enumerable: true, get: function () { return tl_1.Api; } });
|
|
39
|
+
const tl = __importStar(require("./tl"));
|
|
40
|
+
exports.tl = tl;
|
|
41
|
+
var TelegramClient_1 = require("./client/TelegramClient");
|
|
42
|
+
Object.defineProperty(exports, "TelegramClient", { enumerable: true, get: function () { return TelegramClient_1.TelegramClient; } });
|
|
43
|
+
var network_1 = require("./network");
|
|
44
|
+
Object.defineProperty(exports, "Connection", { enumerable: true, get: function () { return network_1.Connection; } });
|
|
45
|
+
var Version_1 = require("./Version");
|
|
46
|
+
Object.defineProperty(exports, "version", { enumerable: true, get: function () { return Version_1.version; } });
|
|
47
|
+
var Logger_1 = require("./extensions/Logger");
|
|
48
|
+
Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return Logger_1.Logger; } });
|
|
49
|
+
const utils = __importStar(require("./Utils"));
|
|
50
|
+
exports.utils = utils;
|
|
51
|
+
const errors = __importStar(require("./errors"));
|
|
52
|
+
exports.errors = errors;
|
|
53
|
+
const sessions = __importStar(require("./sessions"));
|
|
54
|
+
exports.sessions = sessions;
|
|
55
|
+
const extensions = __importStar(require("./extensions"));
|
|
56
|
+
exports.extensions = extensions;
|
|
57
|
+
const helpers = __importStar(require("./Helpers"));
|
|
58
|
+
exports.helpers = helpers;
|
|
59
|
+
const client = __importStar(require("./client"));
|
|
60
|
+
exports.client = client;
|
|
61
|
+
const password = __importStar(require("./Password"));
|
|
62
|
+
exports.password = password;
|
package/inspect.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { inspect } from "util";
|
package/inspect.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executes the authentication process with the Telegram servers.
|
|
3
|
+
* @param sender a connected {MTProtoPlainSender}.
|
|
4
|
+
* @param log
|
|
5
|
+
* @returns {Promise<{authKey: *, timeOffset: *}>}
|
|
6
|
+
*/
|
|
7
|
+
import { MTProtoPlainSender } from "./MTProtoPlainSender";
|
|
8
|
+
import { AuthKey } from "../crypto/AuthKey";
|
|
9
|
+
export declare function doAuthentication(sender: MTProtoPlainSender, log: any): Promise<{
|
|
10
|
+
authKey: AuthKey;
|
|
11
|
+
timeOffset: number;
|
|
12
|
+
}>;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.doAuthentication = doAuthentication;
|
|
7
|
+
const Helpers_1 = require("../Helpers");
|
|
8
|
+
const tl_1 = require("../tl");
|
|
9
|
+
const errors_1 = require("../errors");
|
|
10
|
+
const Factorizator_1 = require("../crypto/Factorizator");
|
|
11
|
+
const RSA_1 = require("../crypto/RSA");
|
|
12
|
+
const IGE_1 = require("../crypto/IGE");
|
|
13
|
+
const big_integer_1 = __importDefault(require("big-integer"));
|
|
14
|
+
const extensions_1 = require("../extensions");
|
|
15
|
+
const AuthKey_1 = require("../crypto/AuthKey");
|
|
16
|
+
const RETRIES = 20;
|
|
17
|
+
async function doAuthentication(sender, log) {
|
|
18
|
+
// Step 1 sending: PQ Request, endianness doesn't matter since it's random
|
|
19
|
+
let bytes = (0, Helpers_1.generateRandomBytes)(16);
|
|
20
|
+
const nonce = (0, Helpers_1.readBigIntFromBuffer)(bytes, false, true);
|
|
21
|
+
const resPQ = await sender.send(new tl_1.Api.ReqPqMulti({ nonce }));
|
|
22
|
+
log.debug("Starting authKey generation step 1");
|
|
23
|
+
if (!(resPQ instanceof tl_1.Api.ResPQ)) {
|
|
24
|
+
throw new errors_1.SecurityError(`Step 1 answer was ${resPQ}`);
|
|
25
|
+
}
|
|
26
|
+
if (resPQ.nonce.neq(nonce)) {
|
|
27
|
+
throw new errors_1.SecurityError("Step 1 invalid nonce from server");
|
|
28
|
+
}
|
|
29
|
+
const pq = (0, Helpers_1.readBigIntFromBuffer)(resPQ.pq, false, true);
|
|
30
|
+
log.debug("Finished authKey generation step 1");
|
|
31
|
+
// Step 2 sending: DH Exchange
|
|
32
|
+
const { p, q } = Factorizator_1.Factorizator.factorize(pq);
|
|
33
|
+
const pBuffer = (0, Helpers_1.getByteArray)(p);
|
|
34
|
+
const qBuffer = (0, Helpers_1.getByteArray)(q);
|
|
35
|
+
bytes = (0, Helpers_1.generateRandomBytes)(32);
|
|
36
|
+
const newNonce = (0, Helpers_1.readBigIntFromBuffer)(bytes, true, true);
|
|
37
|
+
const pqInnerData = new tl_1.Api.PQInnerData({
|
|
38
|
+
pq: (0, Helpers_1.getByteArray)(pq), // unsigned
|
|
39
|
+
p: pBuffer,
|
|
40
|
+
q: qBuffer,
|
|
41
|
+
nonce: resPQ.nonce,
|
|
42
|
+
serverNonce: resPQ.serverNonce,
|
|
43
|
+
newNonce,
|
|
44
|
+
}).getBytes();
|
|
45
|
+
if (pqInnerData.length > 144) {
|
|
46
|
+
throw new errors_1.SecurityError("Step 1 invalid nonce from server");
|
|
47
|
+
}
|
|
48
|
+
let targetFingerprint;
|
|
49
|
+
let targetKey;
|
|
50
|
+
for (const fingerprint of resPQ.serverPublicKeyFingerprints) {
|
|
51
|
+
targetKey = RSA_1._serverKeys.get(fingerprint.toString());
|
|
52
|
+
if (targetKey !== undefined) {
|
|
53
|
+
targetFingerprint = fingerprint;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (targetFingerprint === undefined || targetKey === undefined) {
|
|
58
|
+
throw new errors_1.SecurityError("Step 2 could not find a valid key for fingerprints");
|
|
59
|
+
}
|
|
60
|
+
// Value should be padded to be made 192 exactly
|
|
61
|
+
const padding = (0, Helpers_1.generateRandomBytes)(192 - pqInnerData.length);
|
|
62
|
+
const dataWithPadding = Buffer.concat([pqInnerData, padding]);
|
|
63
|
+
const dataPadReversed = Buffer.from(dataWithPadding).reverse();
|
|
64
|
+
let encryptedData;
|
|
65
|
+
for (let i = 0; i < RETRIES; i++) {
|
|
66
|
+
const tempKey = (0, Helpers_1.generateRandomBytes)(32);
|
|
67
|
+
const shaDigestKeyWithData = await (0, Helpers_1.sha256)(Buffer.concat([tempKey, dataWithPadding]));
|
|
68
|
+
const dataWithHash = Buffer.concat([
|
|
69
|
+
dataPadReversed,
|
|
70
|
+
shaDigestKeyWithData,
|
|
71
|
+
]);
|
|
72
|
+
const ige = new IGE_1.IGE(tempKey, Buffer.alloc(32));
|
|
73
|
+
const aesEncrypted = ige.encryptIge(dataWithHash);
|
|
74
|
+
const tempKeyXor = (0, Helpers_1.bufferXor)(tempKey, await (0, Helpers_1.sha256)(aesEncrypted));
|
|
75
|
+
const keyAesEncrypted = Buffer.concat([tempKeyXor, aesEncrypted]);
|
|
76
|
+
const keyAesEncryptedInt = (0, Helpers_1.readBigIntFromBuffer)(keyAesEncrypted, false, false);
|
|
77
|
+
if (keyAesEncryptedInt.greaterOrEquals(targetKey.n)) {
|
|
78
|
+
log.debug("Aes key greater than RSA. retrying");
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const encryptedDataBuffer = (0, Helpers_1.modExp)(keyAesEncryptedInt, (0, big_integer_1.default)(targetKey.e), targetKey.n);
|
|
82
|
+
encryptedData = (0, Helpers_1.readBufferFromBigInt)(encryptedDataBuffer, 256, false, false);
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
if (encryptedData === undefined) {
|
|
86
|
+
throw new errors_1.SecurityError("Step 2 could create a secure encrypted key");
|
|
87
|
+
}
|
|
88
|
+
log.debug("Step 2 : Generated a secure aes encrypted data");
|
|
89
|
+
const serverDhParams = await sender.send(new tl_1.Api.ReqDHParams({
|
|
90
|
+
nonce: resPQ.nonce,
|
|
91
|
+
serverNonce: resPQ.serverNonce,
|
|
92
|
+
p: pBuffer,
|
|
93
|
+
q: qBuffer,
|
|
94
|
+
publicKeyFingerprint: targetFingerprint,
|
|
95
|
+
encryptedData,
|
|
96
|
+
}));
|
|
97
|
+
if (!(serverDhParams instanceof tl_1.Api.ServerDHParamsOk ||
|
|
98
|
+
serverDhParams instanceof tl_1.Api.ServerDHParamsFail)) {
|
|
99
|
+
throw new Error(`Step 2.1 answer was ${serverDhParams}`);
|
|
100
|
+
}
|
|
101
|
+
if (serverDhParams.nonce.neq(resPQ.nonce)) {
|
|
102
|
+
throw new errors_1.SecurityError("Step 2 invalid nonce from server");
|
|
103
|
+
}
|
|
104
|
+
if (serverDhParams.serverNonce.neq(resPQ.serverNonce)) {
|
|
105
|
+
throw new errors_1.SecurityError("Step 2 invalid server nonce from server");
|
|
106
|
+
}
|
|
107
|
+
if (serverDhParams instanceof tl_1.Api.ServerDHParamsFail) {
|
|
108
|
+
const sh = await (0, Helpers_1.sha1)((0, Helpers_1.toSignedLittleBuffer)(newNonce, 32).slice(4, 20));
|
|
109
|
+
const nnh = (0, Helpers_1.readBigIntFromBuffer)(sh, true, true);
|
|
110
|
+
if (serverDhParams.newNonceHash.neq(nnh)) {
|
|
111
|
+
throw new errors_1.SecurityError("Step 2 invalid DH fail nonce from server");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!(serverDhParams instanceof tl_1.Api.ServerDHParamsOk)) {
|
|
115
|
+
throw new Error(`Step 2.2 answer was ${serverDhParams}`);
|
|
116
|
+
}
|
|
117
|
+
log.debug("Finished authKey generation step 2");
|
|
118
|
+
log.debug("Starting authKey generation step 3");
|
|
119
|
+
// Step 3 sending: Complete DH Exchange
|
|
120
|
+
const { key, iv } = await (0, Helpers_1.generateKeyDataFromNonce)(resPQ.serverNonce, newNonce);
|
|
121
|
+
if (serverDhParams.encryptedAnswer.length % 16 !== 0) {
|
|
122
|
+
// See PR#453
|
|
123
|
+
throw new errors_1.SecurityError("Step 3 AES block size mismatch");
|
|
124
|
+
}
|
|
125
|
+
const ige = new IGE_1.IGE(key, iv);
|
|
126
|
+
const plainTextAnswer = ige.decryptIge(serverDhParams.encryptedAnswer);
|
|
127
|
+
const reader = new extensions_1.BinaryReader(plainTextAnswer);
|
|
128
|
+
reader.read(20); // hash sum
|
|
129
|
+
const serverDhInner = reader.tgReadObject();
|
|
130
|
+
if (!(serverDhInner instanceof tl_1.Api.ServerDHInnerData)) {
|
|
131
|
+
throw new Error(`Step 3 answer was ${serverDhInner}`);
|
|
132
|
+
}
|
|
133
|
+
if (serverDhInner.nonce.neq(resPQ.nonce)) {
|
|
134
|
+
throw new errors_1.SecurityError("Step 3 Invalid nonce in encrypted answer");
|
|
135
|
+
}
|
|
136
|
+
if (serverDhInner.serverNonce.neq(resPQ.serverNonce)) {
|
|
137
|
+
throw new errors_1.SecurityError("Step 3 Invalid server nonce in encrypted answer");
|
|
138
|
+
}
|
|
139
|
+
const dhPrime = (0, Helpers_1.readBigIntFromBuffer)(serverDhInner.dhPrime, false, false);
|
|
140
|
+
const ga = (0, Helpers_1.readBigIntFromBuffer)(serverDhInner.gA, false, false);
|
|
141
|
+
const timeOffset = serverDhInner.serverTime - Math.floor(new Date().getTime() / 1000);
|
|
142
|
+
const b = (0, Helpers_1.readBigIntFromBuffer)((0, Helpers_1.generateRandomBytes)(256), false, false);
|
|
143
|
+
const gb = (0, Helpers_1.modExp)((0, big_integer_1.default)(serverDhInner.g), b, dhPrime);
|
|
144
|
+
const gab = (0, Helpers_1.modExp)(ga, b, dhPrime);
|
|
145
|
+
// Prepare client DH Inner Data
|
|
146
|
+
const clientDhInner = new tl_1.Api.ClientDHInnerData({
|
|
147
|
+
nonce: resPQ.nonce,
|
|
148
|
+
serverNonce: resPQ.serverNonce,
|
|
149
|
+
retryId: big_integer_1.default.zero, // TODO Actual retry ID
|
|
150
|
+
gB: (0, Helpers_1.getByteArray)(gb, false),
|
|
151
|
+
}).getBytes();
|
|
152
|
+
const clientDdhInnerHashed = Buffer.concat([
|
|
153
|
+
await (0, Helpers_1.sha1)(clientDhInner),
|
|
154
|
+
clientDhInner,
|
|
155
|
+
]);
|
|
156
|
+
// Encryption
|
|
157
|
+
const clientDhEncrypted = ige.encryptIge(clientDdhInnerHashed);
|
|
158
|
+
const dhGen = await sender.send(new tl_1.Api.SetClientDHParams({
|
|
159
|
+
nonce: resPQ.nonce,
|
|
160
|
+
serverNonce: resPQ.serverNonce,
|
|
161
|
+
encryptedData: clientDhEncrypted,
|
|
162
|
+
}));
|
|
163
|
+
const nonceTypes = [tl_1.Api.DhGenOk, tl_1.Api.DhGenRetry, tl_1.Api.DhGenFail];
|
|
164
|
+
// TS being weird again.
|
|
165
|
+
const nonceTypesString = ["DhGenOk", "DhGenRetry", "DhGenFail"];
|
|
166
|
+
if (!(dhGen instanceof nonceTypes[0] ||
|
|
167
|
+
dhGen instanceof nonceTypes[1] ||
|
|
168
|
+
dhGen instanceof nonceTypes[2])) {
|
|
169
|
+
throw new Error(`Step 3.1 answer was ${dhGen}`);
|
|
170
|
+
}
|
|
171
|
+
const { name } = dhGen.constructor;
|
|
172
|
+
if (dhGen.nonce.neq(resPQ.nonce)) {
|
|
173
|
+
throw new errors_1.SecurityError(`Step 3 invalid ${name} nonce from server`);
|
|
174
|
+
}
|
|
175
|
+
if (dhGen.serverNonce.neq(resPQ.serverNonce)) {
|
|
176
|
+
throw new errors_1.SecurityError(`Step 3 invalid ${name} server nonce from server`);
|
|
177
|
+
}
|
|
178
|
+
const authKey = new AuthKey_1.AuthKey();
|
|
179
|
+
await authKey.setKey((0, Helpers_1.getByteArray)(gab));
|
|
180
|
+
const nonceNumber = 1 + nonceTypesString.indexOf(dhGen.className);
|
|
181
|
+
const newNonceHash = await authKey.calcNewNonceHash(newNonce, nonceNumber);
|
|
182
|
+
// @ts-ignore
|
|
183
|
+
const dhHash = dhGen[`newNonceHash${nonceNumber}`];
|
|
184
|
+
if (dhHash.neq(newNonceHash)) {
|
|
185
|
+
throw new errors_1.SecurityError("Step 3 invalid new nonce hash");
|
|
186
|
+
}
|
|
187
|
+
if (!(dhGen instanceof tl_1.Api.DhGenOk)) {
|
|
188
|
+
throw new Error(`Step 3.2 answer was ${dhGen}`);
|
|
189
|
+
}
|
|
190
|
+
log.debug("Finished authKey generation step 3");
|
|
191
|
+
return { authKey, timeOffset };
|
|
192
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Api } from "../tl";
|
|
2
|
+
/**
|
|
3
|
+
* MTProto Mobile Protocol plain sender (https://core.telegram.org/mtproto/description#unencrypted-messages)
|
|
4
|
+
*/
|
|
5
|
+
export declare class MTProtoPlainSender {
|
|
6
|
+
private _state;
|
|
7
|
+
private _connection;
|
|
8
|
+
/**
|
|
9
|
+
* Initializes the MTProto plain sender.
|
|
10
|
+
* @param connection connection: the Connection to be used.
|
|
11
|
+
* @param loggers
|
|
12
|
+
*/
|
|
13
|
+
constructor(connection: any, loggers: any);
|
|
14
|
+
/**
|
|
15
|
+
* Sends and receives the result for the given request.
|
|
16
|
+
* @param request
|
|
17
|
+
*/
|
|
18
|
+
send(request: Api.AnyRequest): Promise<any>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MTProtoPlainSender = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* This module contains the class used to communicate with Telegram's servers
|
|
9
|
+
* in plain text, when no authorization key has been created yet.
|
|
10
|
+
*/
|
|
11
|
+
const big_integer_1 = __importDefault(require("big-integer"));
|
|
12
|
+
const MTProtoState_1 = require("./MTProtoState");
|
|
13
|
+
const Helpers_1 = require("../Helpers");
|
|
14
|
+
const errors_1 = require("../errors");
|
|
15
|
+
const extensions_1 = require("../extensions");
|
|
16
|
+
/**
|
|
17
|
+
* MTProto Mobile Protocol plain sender (https://core.telegram.org/mtproto/description#unencrypted-messages)
|
|
18
|
+
*/
|
|
19
|
+
class MTProtoPlainSender {
|
|
20
|
+
/**
|
|
21
|
+
* Initializes the MTProto plain sender.
|
|
22
|
+
* @param connection connection: the Connection to be used.
|
|
23
|
+
* @param loggers
|
|
24
|
+
*/
|
|
25
|
+
constructor(connection, loggers) {
|
|
26
|
+
this._state = new MTProtoState_1.MTProtoState(undefined, loggers);
|
|
27
|
+
this._connection = connection;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Sends and receives the result for the given request.
|
|
31
|
+
* @param request
|
|
32
|
+
*/
|
|
33
|
+
async send(request) {
|
|
34
|
+
let body = request.getBytes();
|
|
35
|
+
let msgId = this._state._getNewMsgId();
|
|
36
|
+
const m = (0, Helpers_1.toSignedLittleBuffer)(msgId, 8);
|
|
37
|
+
const b = Buffer.alloc(4);
|
|
38
|
+
b.writeInt32LE(body.length, 0);
|
|
39
|
+
const res = Buffer.concat([
|
|
40
|
+
Buffer.concat([Buffer.alloc(8), m, b]),
|
|
41
|
+
body,
|
|
42
|
+
]);
|
|
43
|
+
await this._connection.send(res);
|
|
44
|
+
body = await this._connection.recv();
|
|
45
|
+
if (body.length < 8) {
|
|
46
|
+
throw new errors_1.InvalidBufferError(body);
|
|
47
|
+
}
|
|
48
|
+
const reader = new extensions_1.BinaryReader(body);
|
|
49
|
+
const authKeyId = reader.readLong();
|
|
50
|
+
if (authKeyId.neq((0, big_integer_1.default)(0))) {
|
|
51
|
+
throw new Error("Bad authKeyId");
|
|
52
|
+
}
|
|
53
|
+
msgId = reader.readLong();
|
|
54
|
+
if (msgId.eq((0, big_integer_1.default)(0))) {
|
|
55
|
+
throw new Error("Bad msgId");
|
|
56
|
+
}
|
|
57
|
+
/** ^ We should make sure that the read ``msg_id`` is greater
|
|
58
|
+
* than our own ``msg_id``. However, under some circumstances
|
|
59
|
+
* (bad system clock/working behind proxies) this seems to not
|
|
60
|
+
* be the case, which would cause endless assertion errors.
|
|
61
|
+
*/
|
|
62
|
+
const length = reader.readInt();
|
|
63
|
+
if (length <= 0) {
|
|
64
|
+
throw new Error("Bad length");
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* We could read length bytes and use those in a new reader to read
|
|
68
|
+
* the next TLObject without including the padding, but since the
|
|
69
|
+
* reader isn't used for anything else after this, it's unnecessary.
|
|
70
|
+
*/
|
|
71
|
+
return reader.tgReadObject();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.MTProtoPlainSender = MTProtoPlainSender;
|