'use strict'; const { Ven } = require('../db'); const { v4 } = require('uuid'); const { vtnId } = require('../config'); const logger = require('../logger'); async function registerParty( obj, clientCertificateCn, clientCertificateFingerprint, ) { logger.info( 'registerParty', obj, clientCertificateCn, clientCertificateFingerprint, ); const requestVenId = obj.venId; if (!requestVenId) { const error = new Error('No VenID in request'); error.responseCode = 452; throw error; } if (requestVenId !== clientCertificateFingerprint) { // as per certification item #512, venId MUST be case-sensitive const error = new Error('VenID does not match certificate'); error.responseCode = 452; throw error; } if (!clientCertificateCn) { const error = new Error('Could not determine CN from client certificate'); error.responseCode = 452; throw error; } let registrationId, venId; const existingDbRecordByVenId = await Ven.findOne({ where: { ven_id: requestVenId }, }); const existingDbRecordByCommonName = await Ven.findOne({ where: { common_name: clientCertificateCn }, }); if (existingDbRecordByVenId) { if (existingDbRecordByVenId.common_name !== clientCertificateCn) { const error = new Error('Client certificate CN mismatch'); error.responseCode = 452; throw error; } registrationId = existingDbRecordByVenId.data.registrationId; venId = existingDbRecordByVenId.ven_id; } else if (existingDbRecordByCommonName) { const error = new Error('Ven already exists with that CN'); error.responseCode = 452; throw error; } else { registrationId = v4().replace(/-/g, ''); venId = requestVenId; const newVen = new Ven(); newVen.common_name = clientCertificateCn; newVen.ven_id = requestVenId; newVen.data = { registrationId: registrationId, }; await newVen.save(); } return { responseRequestId: obj.requestId || '', responseCode: '200', responseDescription: 'OK', registrationId: registrationId, venId: venId, vtnId: vtnId, pollFreqDuration: 'PT10S', }; } async function query(obj, clientCertificateCn, clientCertificateFingerprint) { logger.info('query', obj, clientCertificateCn, clientCertificateFingerprint); let registrationId, venId; const existingDbRecordByVenId = await Ven.findOne({ where: { ven_id: clientCertificateFingerprint }, }); const existingDbRecordByCommonName = await Ven.findOne({ where: { common_name: clientCertificateCn }, }); if (existingDbRecordByVenId) { if (existingDbRecordByVenId.common_name !== clientCertificateCn) { const error = new Error('Client certificate CN mismatch'); error.responseCode = 452; throw error; } registrationId = existingDbRecordByVenId.data.registrationId; venId = existingDbRecordByVenId.ven_id; } else if (existingDbRecordByCommonName) { const error = new Error('Ven already exists with that CN'); error.responseCode = 452; throw error; } return { responseRequestId: obj.requestId || '', responseCode: '200', responseDescription: 'OK', registrationId: registrationId, venId: venId, vtnId: vtnId, pollFreqDuration: 'PT10S', }; } async function cancelParty( obj, clientCertificateCn, clientCertificateFingerprint, ) { logger.info( 'cancelParty', obj, clientCertificateCn, clientCertificateFingerprint, ); const registrationId = obj.registrationId; if (!registrationId) { const error = new Error('No registrationID in request'); error.responseCode = 452; throw error; } const requestVenId = obj.venId; if (requestVenId && requestVenId !== clientCertificateFingerprint) { // as per certification item #512, venId MUST be case-sensitive const error = new Error('VenID does not match certificate'); error.responseCode = 452; throw error; } const venId = clientCertificateFingerprint; if (!clientCertificateCn) { const error = new Error('Could not determine CN from client certificate'); error.responseCode = 452; throw error; } const existingDbRecordByVenId = await Ven.findOne({ where: { ven_id: venId }, }); if (existingDbRecordByVenId == null) { const error = new Error('No current registration for VenID'); error.responseCode = 452; throw error; } if (existingDbRecordByVenId.data.registrationId !== registrationId) { const error = new Error('Incorrect registrationID for VenID'); error.responseCode = 452; throw error; } await existingDbRecordByVenId.destroy(); return { responseRequestId: obj.requestId || '', responseCode: '200', responseDescription: 'OK', registrationId: registrationId, venId: venId, }; } module.exports = { cancelParty, query, registerParty, };