🏡 index : github.com/compromyse/enfold.git

const CryptoJS = require('crypto-js');
const { URLSearchParams } = require('url');
const dns = require('dns').promises;

// Configuration and state
const hostIP = "https://app.ecourts.gov.in/ecourt_mobile_DC/";
let jwttoken = "";
let regenerateWebserviceCallFlag = false;
let globaliv = "4B6250655368566D";
let globalIndex = 0;

// Show error message (replace alert with console)
function showErrorMessage(message) {
  console.error("Error:", message);
}

// Generate random hex
function genRanHex(size) {
  return [...Array(size)].map(() => Math.floor(Math.random() * 16).toString(16)).join('');
}

// Generate global IV
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;
}

// Encrypt data
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;
}

// Decrypt response
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;
}

// API call wrapper
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 params = new URLSearchParams({ action_code: encryptedData });
    // const fullUrl = `${url}?${params.toString()}`;
    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;
  }
}

// Fetch Court Complexes
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=='));