UNPKG

@whiskeysockets/baileys

Version:
167 lines (166 loc) 7.16 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.mobileRegisterFetch = exports.mobileRegisterEncrypt = exports.mobileRegister = exports.mobileRegisterExists = exports.mobileRegisterCode = exports.registrationParams = exports.makeRegistrationSocket = void 0; /* eslint-disable camelcase */ const axios_1 = __importDefault(require("axios")); const Defaults_1 = require("../Defaults"); const crypto_1 = require("../Utils/crypto"); const WABinary_1 = require("../WABinary"); const business_1 = require("./business"); function urlencode(str) { return str.replace(/-/g, '%2d').replace(/_/g, '%5f').replace(/~/g, '%7e'); } const validRegistrationOptions = (config) => (config === null || config === void 0 ? void 0 : config.phoneNumberCountryCode) && config.phoneNumberNationalNumber && config.phoneNumberMobileCountryCode; const makeRegistrationSocket = (config) => { const sock = (0, business_1.makeBusinessSocket)(config); const register = async (code) => { if (!validRegistrationOptions(config.auth.creds.registration)) { throw new Error('please specify the registration options'); } const result = await mobileRegister({ ...sock.authState.creds, ...sock.authState.creds.registration, code }, config.options); sock.authState.creds.me = { id: (0, WABinary_1.jidEncode)(result.login, 's.whatsapp.net'), name: '~' }; sock.authState.creds.registered = true; sock.ev.emit('creds.update', sock.authState.creds); return result; }; const requestRegistrationCode = async (registrationOptions) => { registrationOptions = registrationOptions || config.auth.creds.registration; if (!validRegistrationOptions(registrationOptions)) { throw new Error('Invalid registration options'); } sock.authState.creds.registration = registrationOptions; sock.ev.emit('creds.update', sock.authState.creds); return mobileRegisterCode({ ...config.auth.creds, ...registrationOptions }, config.options); }; return { ...sock, register, requestRegistrationCode, }; }; exports.makeRegistrationSocket = makeRegistrationSocket; function convertBufferToUrlHex(buffer) { var id = ''; buffer.forEach((x) => { // encode random identity_id buffer as percentage url encoding id += `%${x.toString(16).padStart(2, '0').toLowerCase()}`; }); return id; } function registrationParams(params) { const e_regid = Buffer.alloc(4); e_regid.writeInt32BE(params.registrationId); const e_skey_id = Buffer.alloc(3); e_skey_id.writeInt16BE(params.signedPreKey.keyId); params.phoneNumberCountryCode = params.phoneNumberCountryCode.replace('+', '').trim(); params.phoneNumberNationalNumber = params.phoneNumberNationalNumber.replace(/[/-\s)(]/g, '').trim(); return { cc: params.phoneNumberCountryCode, in: params.phoneNumberNationalNumber, Rc: '0', lg: 'en', lc: 'GB', mistyped: '6', authkey: Buffer.from(params.noiseKey.public).toString('base64url'), e_regid: e_regid.toString('base64url'), e_keytype: 'BQ', e_ident: Buffer.from(params.signedIdentityKey.public).toString('base64url'), // e_skey_id: e_skey_id.toString('base64url'), e_skey_id: 'AAAA', e_skey_val: Buffer.from(params.signedPreKey.keyPair.public).toString('base64url'), e_skey_sig: Buffer.from(params.signedPreKey.signature).toString('base64url'), fdid: params.phoneId, network_ratio_type: '1', expid: params.deviceId, simnum: '1', hasinrc: '1', pid: Math.floor(Math.random() * 1000).toString(), id: convertBufferToUrlHex(params.identityId), backup_token: convertBufferToUrlHex(params.backupToken), token: (0, crypto_1.md5)(Buffer.concat([Defaults_1.MOBILE_TOKEN, Buffer.from(params.phoneNumberNationalNumber)])).toString('hex'), fraud_checkpoint_code: params.captcha, }; } exports.registrationParams = registrationParams; /** * Requests a registration code for the given phone number. */ function mobileRegisterCode(params, fetchOptions) { return mobileRegisterFetch('/code', { params: { ...registrationParams(params), mcc: `${params.phoneNumberMobileCountryCode}`.padStart(3, '0'), mnc: `${params.phoneNumberMobileNetworkCode || '001'}`.padStart(3, '0'), sim_mcc: '000', sim_mnc: '000', method: (params === null || params === void 0 ? void 0 : params.method) || 'sms', reason: '', hasav: '1' }, ...fetchOptions, }); } exports.mobileRegisterCode = mobileRegisterCode; function mobileRegisterExists(params, fetchOptions) { return mobileRegisterFetch('/exist', { params: registrationParams(params), ...fetchOptions }); } exports.mobileRegisterExists = mobileRegisterExists; /** * Registers the phone number on whatsapp with the received OTP code. */ async function mobileRegister(params, fetchOptions) { //const result = await mobileRegisterFetch(`/reg_onboard_abprop?cc=${params.phoneNumberCountryCode}&in=${params.phoneNumberNationalNumber}&rc=0`) return mobileRegisterFetch('/register', { params: { ...registrationParams(params), code: params.code.replace('-', '') }, ...fetchOptions, }); } exports.mobileRegister = mobileRegister; /** * Encrypts the given string as AEAD aes-256-gcm with the public whatsapp key and a random keypair. */ function mobileRegisterEncrypt(data) { const keypair = crypto_1.Curve.generateKeyPair(); const key = crypto_1.Curve.sharedKey(keypair.private, Defaults_1.REGISTRATION_PUBLIC_KEY); const buffer = (0, crypto_1.aesEncryptGCM)(Buffer.from(data), new Uint8Array(key), Buffer.alloc(12), Buffer.alloc(0)); return Buffer.concat([Buffer.from(keypair.public), buffer]).toString('base64url'); } exports.mobileRegisterEncrypt = mobileRegisterEncrypt; async function mobileRegisterFetch(path, opts = {}) { let url = `${Defaults_1.MOBILE_REGISTRATION_ENDPOINT}${path}`; if (opts.params) { const parameter = []; for (const param in opts.params) { if (opts.params[param] !== null && opts.params[param] !== undefined) { parameter.push(param + '=' + urlencode(opts.params[param])); } } url += `?${parameter.join('&')}`; delete opts.params; } if (!opts.headers) { opts.headers = {}; } opts.headers['User-Agent'] = Defaults_1.MOBILE_USERAGENT; const response = await (0, axios_1.default)(url, opts); var json = response.data; if (response.status > 300 || json.reason) { throw json; } if (json.status && !['ok', 'sent'].includes(json.status)) { throw json; } return json; } exports.mobileRegisterFetch = mobileRegisterFetch;