403Webshell
Server IP : 167.235.67.158  /  Your IP : 216.73.216.95
Web Server : Apache
System : Linux ubuntu-8gb-nbg1-1 6.8.0-111-generic #111-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 11 23:16:02 UTC 2026 x86_64
User : upstairsbar.co.uk ( 982)
PHP Version : 8.3.6
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/api.pda.the-word.com/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/api.pda.the-word.com/index.js
require('dotenv').config();

const { ensureApiTables } = require('./common/sqlDB');
const helpers = require('./common/helpers');
const logger = require('./common/logger');
const authHelpers = require('./common/auth');

const authHandler = require('./auth/handler');
const userHandler = require('./user/handler');
const studentsHandler = require('./students/handler');
const lessonsHandler = require('./lessons/handler');
const trackRecordHandler = require('./trackRecord/handler');
const messagesHandler = require('./messages/handler');
const skillsHandler = require('./skills/handler');
const invoicesHandler = require('./invoices/handler');
const opsHandler = require('./ops/handler');

const PUBLIC_PATHS = new Set([
  '/auth/login'
]);

function getHandler(path) {
  if (path.startsWith('/auth')) return authHandler;
  if (path.startsWith('/user')) return userHandler;
  if (path.startsWith('/students') && /\/messages$/.test(path)) return messagesHandler;
  if (path.startsWith('/students') && /\/gdpr-send$/.test(path)) return opsHandler;
  if (path.startsWith('/students')) return studentsHandler;
  if (path.startsWith('/lessons')) return lessonsHandler;
  if (path.startsWith('/track-record')) return trackRecordHandler;
  if (path.startsWith('/skills')) return skillsHandler;
  if (path.startsWith('/invoices')) return invoicesHandler;
  if (path.startsWith('/summary-email') || path.startsWith('/client-errors')) return opsHandler;
  return null;
}

async function handler(event) {
  const path = helpers.normalizePath(event);
  const method = helpers.getMethod(event);
  const apiKey = helpers.getHeader(event.headers, 'x-api-token');

  logger.info('request', { method, path });

  if (!process.env.API_KEY) {
    return helpers.formatResponse({ statusCode: 500, body: { message: 'API_KEY is not configured.' } });
  }

  if (apiKey !== process.env.API_KEY) {
    return helpers.formatResponse({ statusCode: 403, body: { message: 'Forbidden' } });
  }

  try {
    await ensureApiTables();
  } catch (error) {
    logger.error('ensureApiTables failed', error);
    return helpers.formatResponse({ statusCode: 500, body: { message: 'Database bootstrap failed.' } });
  }

  if (!PUBLIC_PATHS.has(path)) {
    const token = helpers.extractBearerToken(event.headers);
    if (!token) {
      return helpers.formatResponse({ statusCode: 401, body: { message: 'Unauthorized' } });
    }

    try {
      const user = await authHelpers.verifySessionToken(token);
      if (!user) {
        return helpers.formatResponse({ statusCode: 401, body: { message: 'Unauthorized' } });
      }

      event.user = user;
      event.sessionToken = token;
    } catch (error) {
      return helpers.formatResponse({ statusCode: 401, body: { message: 'Unauthorized' } });
    }
  }

  const routeHandler = getHandler(path);
  if (!routeHandler) {
    return helpers.formatResponse({ statusCode: 404, body: { message: 'Not Found' } });
  }

  try {
    return await routeHandler.handle(event);
  } catch (error) {
    logger.error('unhandled route error', error);
    return helpers.formatResponse({ statusCode: error.statusCode || 500, body: { message: error.message || 'Internal Server Error' } });
  }
}

module.exports = {
  handler
};

Youez - 2016 - github.com/yon3zu
LinuXploit