1
0
Эх сурвалжийг харах

Bug fixes
Make naming more conventional

painor 5 жил өмнө
parent
commit
2ce163dc34

+ 2 - 0
.gitignore

@@ -3,6 +3,7 @@
 /.idea/
 
 # Generated code
+/gramjs/
 /docs/
 /gramjs/tl/functions/
 /gramjs/tl/types/
@@ -20,3 +21,4 @@ example.js
 # dotenv
 .env
 
+/api/

+ 1 - 1
crypto/AES.js

@@ -82,4 +82,4 @@ class AES {
 
 }
 
-exports.AES = AES;
+module.exports = AES;

+ 6 - 6
crypto/AuthKey.js

@@ -1,13 +1,13 @@
-const {helpers} = require("../utils/Helpers");
+const Helpers = require("../utils/Helpers");
 
 class AuthKey {
     constructor(data) {
         this.data = data;
         let offset = 0;
-        let buffer = helpers.sha1(data);
-        this.auxHash = buffer.readBigUInt64LE(0);
+        let buffer = Helpers.sha1(data);
+        this.auxHash = buffer.readBigUInt64LE(offset);
         offset += 8 + 4;
-        this.keyId = buffer.readBigUInt64LE(8);
+        this.keyId = buffer.readBigUInt64LE(offset);
 
     }
 
@@ -24,9 +24,9 @@ class AuthKey {
         let secondBuffer = Buffer.alloc(8);
         secondBuffer.writeBigUInt64LE(this.auxHash, 0);
         let buffer = Buffer.concat([new_nonce, tempBuffer, secondBuffer]);
-        return helpers.calcMsgKey(buffer);
+        return Helpers.calcMsgKey(buffer);
     }
 
 }
 
-exports.AuthKey = AuthKey;
+module.exports = AuthKey;

+ 4 - 4
crypto/Factorizator.js

@@ -1,4 +1,4 @@
-const helper = require("../utils/Helpers").helpers;
+const Helpers = require("../utils/Helpers");
 
 class Factorizator {
 
@@ -10,8 +10,8 @@ class Factorizator {
     static findSmallMultiplierLopatin(what) {
         let g = 0n;
         for (let i = 0n; i < 3n; i++) {
-            let q = 30n || (helper.getRandomInt(0, 127) & 15) + 17;
-            let x = 40n || helper.getRandomInt(0, 1000000000) + 1;
+            let q = 30n || (Helpers.getRandomInt(0, 127) & 15) + 17;
+            let x = 40n || Helpers.getRandomInt(0, 1000000000) + 1;
 
 
             let y = x;
@@ -93,4 +93,4 @@ class Factorizator {
     }
 }
 
-exports.Factorizator = Factorizator;
+module.exports = Factorizator;

+ 40 - 38
crypto/RSA.js

@@ -1,4 +1,42 @@
-const helpers = require("../utils/Helpers").helpers;
+const Helpers = require("../utils/Helpers");
+
+
+class RSAServerKey {
+    constructor(fingerprint, m, e) {
+        this.fingerprint = fingerprint;
+        this.m = m;
+        this.e = e;
+
+    }
+
+    /**
+     * Encrypts the given data with the current key
+     * @param data
+     * @param offset
+     * @param length
+     */
+    encrypt(data, offset, length) {
+        if (offset === undefined) {
+            offset = 0;
+        }
+        if (length === undefined) {
+            length = data.length;
+        }
+        let dataToWrite = data.split(offset, offset + length);
+        let sha1Data = helpers.sha1(dataToWrite);
+        let writer = Buffer.concat([sha1Data, dataToWrite]);
+
+        if (length < 235) {
+            writer = Buffer.concat([writer, Helpers.generateRandomBytes(235 - length)]);
+
+        }
+        let result = writer.readIntBE(0, writer.byteLength);
+        result = (result ** this.e) % this.m;
+        let buffer = Buffer.alloc(256);
+        buffer.writeUIntBE(result, 0, 256);
+        return buffer;
+    }
+}
 
 
 class RSA {
@@ -209,41 +247,5 @@ class RSA {
     }
 }
 
-class RSAServerKey {
-    constructor(fingerprint, m, e) {
-        this.fingerprint = fingerprint;
-        this.m = m;
-        this.e = e;
-
-    }
-
-    /**
-     * Encrypts the given data with the current key
-     * @param data
-     * @param offset
-     * @param length
-     */
-    encrypt(data, offset, length) {
-        if (offset === undefined) {
-            offset = 0;
-        }
-        if (length === undefined) {
-            length = data.length;
-        }
-        let dataToWrite = data.split(offset, offset + length);
-        let sha1Data = helpers.sha1(dataToWrite);
-        let writer = Buffer.concat([sha1Data, dataToWrite]);
-
-        if (length < 235) {
-            writer = Buffer.concat([writer, helpers.generateRandomBytes(235 - length)]);
-
-        }
-        let result = writer.readIntBE(0, writer.byteLength);
-        result = (result ** this.e) % this.m;
-        let buffer = Buffer.alloc(256);
-        buffer.writeUIntBE(result, 0, 256);
-        return buffer;
-    }
-}
 
-exports.RSA = RSA;
+module.exports = RSA;

+ 13 - 2
errors.js

@@ -161,6 +161,7 @@ class RPCError extends Error {
         // 420 FLOOD
         'FLOOD_WAIT_(\\d+)': 'A wait of {} seconds is required.'
     };
+
     constructor(code, message) {
         let codeMeaning = RPCError.CodeMessages[code];
         let mustResend = code === 303; // ERROR_SEE_OTHER, "The request must be repeated"
@@ -174,7 +175,7 @@ class RPCError extends Error {
             let match = message.match(key);
 
             if (match) {
-            console.log(match[1]);
+                console.log(match[1]);
                 // Get additionalData if any
                 if (match.length === 2) {
                     console.log(errorMsg);
@@ -202,7 +203,6 @@ class RPCError extends Error {
     }
 }
 
-
 /**
  * Occurs when handling a badMessageNotification
  */
@@ -248,3 +248,14 @@ class BadMessageError extends Error {
 
 }
 
+
+module.exports = {
+    ReadCancelledError,
+    TLGeneratorNotRan,
+    InvalidParameterError,
+    TypeNotFoundError,
+    InvalidDCError,
+    InvalidChecksumError,
+    RPCError,
+    BadMessageError
+};

+ 1 - 1
main.js

@@ -4,7 +4,7 @@ const {TelegramClient} = require("./tl/TelegramClient");
 (async function () {
     console.log("Loading interactive example...");
     let settings = Helpers.loadSettings();
-    let client = TelegramClient(settings["session_name"], 55, settings["api_id"], settings["api_hash"]);
+    let client = TelegramClient(settings["session_name"], 105, settings["api_id"], settings["api_hash"]);
     await client.connect();
     console.log("You should now be connected.");
 })();

+ 12 - 13
network/authenticator.js

@@ -1,9 +1,9 @@
-const AES = require("../crypto/AES").AES;
-const AuthKey = require("../crypto/AuthKey").AuthKey;
-const Factorizator = require("../crypto/Factorizator").Factorizator;
-const RSA = require("../crypto/RSA").RSA;
-const MtProtoPlainSender = require("./mtprotoPlainSender").MtProtoPlainSender;
-const Helpers = require("../utils/Helpers").helpers;
+const AES = require("../crypto/AES");
+const AuthKey = require("../crypto/AuthKey");
+const Factorizator = require("../crypto/Factorizator");
+const RSA = require("../crypto/RSA");
+const MtProtoPlainSender = require("./MTProtoPlainSender");
+const Helpers = require("../utils/Helpers");
 
 function doAuthentication(transport) {
     let sender = MtProtoPlainSender(transport);
@@ -194,16 +194,14 @@ function doAuthentication(transport) {
         if (newNonceHash1 !== newNonceHashCalculated) {
             throw Error("Invalid new nonce hash");
         }
-        return {authKey,timeOffset};
-    }
-    else if (code===0x46dc1fb9){
+        return {authKey, timeOffset};
+    } else if (code === 0x46dc1fb9) {
         throw Error("dh_gen_retry");
 
-    }
-    else if (code===0x46dc1fb9){
+    } else if (code === 0x46dc1fb9) {
         throw Error("dh_gen_fail");
 
-    }else{
+    } else {
         throw Error("DH Gen unknown");
 
     }
@@ -248,4 +246,5 @@ function getByteArray(integer, signed) {
         return buffer.readUIntLE(0, byteLength);
 
     }
-}
+}
+module.exports = doAuthentication;

+ 4 - 4
network/mtprotoPlainSender.js

@@ -1,9 +1,9 @@
-const helpers = require("../utils/Helpers").helpers;
+const Helpers = require("../utils/Helpers");
 
 /**
  * MTProto Mobile Protocol plain sender (https://core.telegram.org/mtproto/description#unencrypted-messages)
  */
-class MtProtoPlainSender {
+class MTProtoPlainSender {
     constructor(transport) {
         this._sequence = 0;
         this._timeOffset = 0;
@@ -43,7 +43,7 @@ class MtProtoPlainSender {
         let msTime = Date.now();
         let newMsgId = ((BigInt(Math.floor(msTime / 1000)) << BigInt(32)) | // "must approximately equal unixtime*2^32"
             (BigInt(msTime % 1000) << BigInt(32)) | // "approximate moment in time the message was created"
-            BigInt(helpers.getRandomInt(0, 524288)) << BigInt(2));// "message identifiers are divisible by 4"
+            BigInt(Helpers.getRandomInt(0, 524288)) << BigInt(2));// "message identifiers are divisible by 4"
         //Ensure that we always return a message ID which is higher than the previous one
         if (this._lastMsgId >= newMsgId) {
             newMsgId = this._lastMsgId + 4
@@ -55,4 +55,4 @@ class MtProtoPlainSender {
 
 }
 
-exports.MtProtoPlainSender = MtProtoPlainSender;
+module.exports = MTProtoPlainSender;

+ 5 - 3
network/mtprotoSender.js

@@ -1,10 +1,10 @@
-const MtProtoPlainSender = require("./mtprotoPlainSender").MtProtoPlainSender;
+const MtProtoPlainSender = require("./MTProtoPlainSender");
 const Helpers = require("../utils/Helpers");
 
 /**
  * MTProto Mobile Protocol sender (https://core.telegram.org/mtproto/description)
  */
-class MtProtoSender {
+class MTProtoSender {
     constructor(transport, session) {
         this.transport = transport;
         this.session = session;
@@ -312,4 +312,6 @@ class MtProtoSender {
 
         }
     }
-}
+}
+
+module.exports = MTProtoSender;

+ 2 - 3
network/tcpClient.js

@@ -1,6 +1,5 @@
 const Socket = require("net").Socket;
-const TextEncoder = require("util").TextEncoder;
-const sleep = require("../utils/Helpers").helpers.sleep;
+const sleep = require("../utils/Helpers").sleep;
 
 class TcpClient {
     constructor() {
@@ -71,4 +70,4 @@ class TcpClient {
 
 }
 
-exports.TcpClient = TcpClient;
+module.exports = TcpClient;

+ 2 - 1
network/tcpTransport.js

@@ -1,4 +1,4 @@
-const TcpClient = require("./tcpClient").TcpClient;
+const TcpClient = require("./TcpClient");
 const crc = require('crc');
 
 class TcpTransport {
@@ -81,3 +81,4 @@ class TcpTransport {
 
 
 }
+module.exports = TcpTransport;

+ 5 - 0
package-lock.json

@@ -47,6 +47,11 @@
       "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz",
       "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw=="
     },
+    "aes-js": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz",
+      "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ=="
+    },
     "ajv": {
       "version": "6.10.2",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",

+ 3 - 1
tl/mtprotoRequest.js

@@ -42,4 +42,6 @@ class MTProtoRequest {
     onException(exception){
 
     }
-}
+}
+
+module.exports = MTProtoRequest;

+ 1 - 0
tl/session.js

@@ -50,3 +50,4 @@ class Session {
     }
 }
 
+module.exports = Session;

+ 12 - 5
tl/telegramClient.js

@@ -1,8 +1,13 @@
-const Session = require("./Session");
+const {Session} = require("./Session");
+const {doAuthentication} = require("../network/authenticator");
+const {MtProtoSender} = require("../network/mtprotoSender");
+const {TcpTransport} = require("../network/tcpTransport");
+const {InvokeWithLayerRequest, InitConnectionRequest} = require("../gramjs/tl/functions/index");
+const {GetConfigRequest} = require("../gramjs/tl/functions/help");
 
 class TelegramClient {
 
-    async constructor(sessionUserId, layer, apiId, apiHash) {
+    constructor(sessionUserId, layer, apiId, apiHash) {
         if (apiId === undefined || apiHash === undefined) {
             throw Error("Your API ID or Hash are invalid. Please read \"Requirements\" on README.md");
         }
@@ -31,7 +36,7 @@ class TelegramClient {
     async connect(reconnect = false) {
         try {
             if (!this.session.authKey || reconnect) {
-                let res = network.authenticator.doAuthentication(this.transport);
+                let res = doAuthentication(this.transport);
                 this.session.authKey = res.authKey;
                 this.session.timeOffset = res.timeOffset;
                 this.session.save();
@@ -41,7 +46,7 @@ class TelegramClient {
             // Now it's time to send an InitConnectionRequest
             // This must always be invoked with the layer we'll be using
             let query = InitConnectionRequest({
-                apiId: apiId,
+                apiId: this.apiId,
                 deviceModel: "PlaceHolder",
                 systemVersion: "PlaceHolder",
                 appVersion: "0.0.1",
@@ -109,4 +114,6 @@ class TelegramClient {
         await this.sender.receive(request);
         return request.result;
     }
-}
+}
+
+module.exports = TelegramClient;

+ 1 - 0
utils/Helpers.js

@@ -194,3 +194,4 @@ class Helpers {
 
 }
 
+module.exports = Helpers;