const CryptoJS = require('crypto-js');
const { URLSearchParams } = require('url');
const dns = require('dns').promises;
const hostIP = "https://app.ecourts.gov.in/ecourt_mobile_DC/";
let jwttoken = "";
let regenerateWebserviceCallFlag = false;
let globaliv = "4B6250655368566D";
let globalIndex = 0;
function showErrorMessage(message) {
console.error("Error:", message);
}
function genRanHex(size) {
return [...Array(size)].map(() => Math.floor(Math.random() * 16).toString(16)).join('');
}
function generateGlobalIv() {
const ivOptions = [
"556A586E32723575", "34743777217A2543", "413F4428472B4B62",
"48404D635166546A", "614E645267556B58", "655368566D597133"
];
const indices = [0, 1, 2, 3, 4, 5];
for (let i = indices.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[indices[i], indices[j]] = [indices[j], indices[i]];
}
globaliv = ivOptions[indices[0]];
globalIndex = indices[0];
return globaliv;
}
function encryptData(data) {
const dataEncoded = JSON.stringify(data);
generateGlobalIv();
const randomiv = genRanHex(16);
const key = CryptoJS.enc.Hex.parse('4D6251655468576D5A7134743677397A');
const iv = CryptoJS.enc.Hex.parse(globaliv + randomiv);
const encrypted = CryptoJS.AES.encrypt(dataEncoded, key, { iv });
let encrypted_data = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
encrypted_data = randomiv + globalIndex + encrypted_data;
return encrypted_data;
}
function decodeResponse(result) {
const key = CryptoJS.enc.Hex.parse('3273357638782F413F4428472B4B6250');
const iv_random = CryptoJS.enc.Hex.parse(result.trim().slice(0, 32));
const result_split = result.trim().slice(32);
const bytes = CryptoJS.AES.decrypt(result_split, key, { iv: iv_random });
let plaintext = bytes.toString(CryptoJS.enc.Utf8);
plaintext = plaintext.replace(/[\u0000-\u0019]+/g, "");
return plaintext;
}
async function callToWebService(url, data, callback) {
try {
const encryptedData = encryptData(data);
const headers = {
'Content-Type': 'application/json',
'user-agent': 'eCourtsServices/2.0.1 (iPhone; iOS 18.4; Scale/3.00)'
};
headers['Authorization'] = 'Bearer ' + encryptData(jwttoken);
const fullUrl = url;
console.log(data);
console.log(fullUrl);
const res = await fetch(fullUrl, {
method: 'GET',
headers
});
const responseText = await res.text();
console.log(`responseText:\n${responseText}\n`)
const decodedResponse = JSON.parse(decodeResponse(responseText));
if (decodedResponse.token) {
jwttoken = decodedResponse.token;
}
console.log(decodedResponse)
if (decodedResponse.status === 'N') {
if (decodedResponse.status_code === '401') {
if (!regenerateWebserviceCallFlag) {
regenerateWebserviceCallFlag = true;
const packageName = "com.eCourts.mobile";
const uidObj = { uid: "324456:" + packageName };
const newData = { ...data, ...uidObj };
return await callToWebService(url, newData, callback);
} else {
showErrorMessage("Session expired!");
}
}
if (decodedResponse.msg) {
showErrorMessage(decodedResponse.msg);
}
return;
}
callback(decodedResponse);
regenerateWebserviceCallFlag = false;
} catch (error) {
console.error('Error calling web service:', error.message);
showErrorMessage("An error occurred while processing your request.");
regenerateWebserviceCallFlag = false;
}
}
async function getCourtComplexes(state_code, dist_code, callback) {
const url = hostIP + "appReleaseWebService.php";
let data = 'fillState';
await callToWebService(url, data, callback);
}
getCourtComplexes("1", "101", (res) => {
console.log("Court Complexes:", res.courtComplex);
});
console.log(decodeResponse('POaJ42M9nP6pkEJim6CFmQ=='));