three issues fixed just backing up

This commit is contained in:
Aaditya Jaiswal 2026-03-31 19:31:33 +05:30
parent d7f44057cc
commit 2b2a1bc6ce
3 changed files with 30 additions and 10 deletions

View File

@ -4,7 +4,8 @@ import { SSOConfig, SSOUserData } from '../types/auth.types';
// This ensures values are read after secrets are loaded from Google Secret Manager
const ssoConfig: SSOConfig = {
get jwtSecret() { return process.env.JWT_SECRET || ''; },
get jwtExpiry() { return process.env.JWT_EXPIRY || '24h'; },
// VAPT: reduce access token lifetime to 30 minutes by default
get jwtExpiry() { return process.env.JWT_EXPIRY || '30m'; },
get refreshTokenExpiry() { return process.env.REFRESH_TOKEN_EXPIRY || '7d'; },
get sessionSecret() { return process.env.SESSION_SECRET || ''; },
// Use only FRONTEND_URL from environment - no fallbacks

View File

@ -23,6 +23,26 @@ import { Dealer } from '@models/Dealer';
*/
export class Form16Controller {
// Minimal PII masking for 26AS APIs mask PAN in all responses
private maskPan(pan: unknown): string | undefined {
if (pan == null) return undefined;
const s = String(pan).trim();
if (!s) return undefined;
const last4 = s.slice(-4);
if (s.length <= 4) return 'XXXX';
return `XXXXXXX${last4}`;
}
private mask26asEntry(entry: any): any {
if (!entry) return entry;
const plain = typeof entry.toJSON === 'function' ? entry.toJSON() : entry;
const masked = { ...plain };
if (masked.panNumber) {
masked.panNumber = this.maskPan(masked.panNumber);
}
return masked;
}
private toSapCsv(sap: {
trnsUniqNo?: string | null;
tdsTransId?: string | null;
@ -257,11 +277,8 @@ export class Form16Controller {
limit,
offset,
});
return ResponseHandler.success(
res,
{ entries: result.rows, total: result.total, summary: result.summary },
'26AS entries fetched'
);
const entries = (result.rows || []).map((row: any) => this.mask26asEntry(row));
return ResponseHandler.success(res, { entries, total: result.total, summary: result.summary }, '26AS entries fetched');
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
logger.error('[Form16Controller] list26as error:', error);
@ -300,7 +317,8 @@ export class Form16Controller {
statusOltas: (body.statusOltas as string) || undefined,
remarks: (body.remarks as string) || undefined,
});
return ResponseHandler.success(res, { entry }, '26AS entry created');
const masked = this.mask26asEntry(entry);
return ResponseHandler.success(res, { entry: masked }, '26AS entry created');
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
logger.error('[Form16Controller] create26as error:', error);
@ -339,7 +357,8 @@ export class Form16Controller {
if (!entry) {
return ResponseHandler.error(res, '26AS entry not found', 404);
}
return ResponseHandler.success(res, { entry }, '26AS entry updated');
const masked = this.mask26asEntry(entry);
return ResponseHandler.success(res, { entry: masked }, '26AS entry updated');
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
logger.error('[Form16Controller] update26as error:', error);

View File

@ -45,10 +45,10 @@ const upload = multer({
limits: { fileSize: 15 * 1024 * 1024 },
});
// 26AS upload: .txt only, 5MB, memory storage (parse then bulk insert)
// 26AS upload: .txt only, 40MB, memory storage (parse then bulk insert)
const upload26asTxt = multer({
storage: multer.memoryStorage(),
limits: { fileSize: 5 * 1024 * 1024 },
limits: { fileSize: 40 * 1024 * 1024 },
fileFilter: (_req, file, cb) => {
const ext = path.extname(file.originalname || '').toLowerCase();
const isTxt = ext === '.txt' || (file.mimetype && (file.mimetype === 'text/plain' || file.mimetype === 'application/octet-stream'));