| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- '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,
- };
|