registration.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. 'use strict';
  2. const { v4 } = require('uuid');
  3. const { vtnId } = require('../config');
  4. const logger = require('../logger');
  5. const nantum = require('../modules/nantum');
  6. async function registerParty(
  7. oadrCreatePartyRegistration,
  8. clientCertificateCn,
  9. clientCertificateFingerprint,
  10. ) {
  11. logger.info(
  12. 'registerParty',
  13. oadrCreatePartyRegistration,
  14. clientCertificateCn,
  15. clientCertificateFingerprint,
  16. );
  17. const requestVenId = oadrCreatePartyRegistration.venId;
  18. validateVenId(requestVenId, clientCertificateFingerprint, true);
  19. let nantumRegistration = await nantum.fetchRegistration(requestVenId);
  20. if (nantumRegistration) {
  21. if (nantumRegistration.common_name !== clientCertificateCn) {
  22. const error = new Error('Client certificate CN mismatch');
  23. error.responseCode = 452;
  24. throw error;
  25. }
  26. if (nantumRegistration.registration_id == null) {
  27. const registrationId = v4().replace(/-/g, '');
  28. nantumRegistration.registration_id = registrationId;
  29. await nantum.updateRegistration(nantumRegistration);
  30. }
  31. } else {
  32. const registrationId = v4().replace(/-/g, '');
  33. nantumRegistration = {
  34. common_name: clientCertificateCn,
  35. ven_id: requestVenId,
  36. registration_id: registrationId,
  37. };
  38. await nantum.updateRegistration(nantumRegistration);
  39. }
  40. return nantumRegistrationToOadrRegistrationCreated(
  41. oadrCreatePartyRegistration.requestId,
  42. nantumRegistration,
  43. );
  44. }
  45. async function query(oadrQueryRegistration, clientCertificateCn, clientCertificateFingerprint) {
  46. logger.info('query', oadrQueryRegistration, clientCertificateCn, clientCertificateFingerprint);
  47. const requestVenId = clientCertificateFingerprint;
  48. let nantumRegistration = await nantum.fetchRegistration(requestVenId);
  49. if (nantumRegistration) {
  50. if (nantumRegistration.common_name !== clientCertificateCn) {
  51. const error = new Error('Client certificate CN mismatch');
  52. error.responseCode = 452;
  53. throw error;
  54. }
  55. } else {
  56. // response payload should not contain ven_id or registration_id
  57. nantumRegistration = {};
  58. }
  59. return nantumRegistrationToOadrRegistrationCreated(
  60. oadrQueryRegistration.requestId,
  61. nantumRegistration,
  62. );
  63. }
  64. async function cancelParty(
  65. oadrCancelPartyRegistration,
  66. clientCertificateCn,
  67. clientCertificateFingerprint,
  68. ) {
  69. logger.info(
  70. 'cancelParty',
  71. oadrCancelPartyRegistration,
  72. clientCertificateCn,
  73. clientCertificateFingerprint,
  74. );
  75. const requestVenId = oadrCancelPartyRegistration.venId;
  76. validateVenId(requestVenId, clientCertificateFingerprint, false);
  77. const venId = clientCertificateFingerprint;
  78. let nantumRegistration = await nantum.fetchRegistration(requestVenId);
  79. let cancelledRegistrationId;
  80. if (nantumRegistration) {
  81. if (nantumRegistration.common_name !== clientCertificateCn) {
  82. const error = new Error('Client certificate CN mismatch');
  83. error.responseCode = 452;
  84. throw error;
  85. }
  86. cancelledRegistrationId = nantumRegistration.registration_id;
  87. // clear all registration data
  88. nantumRegistration = {
  89. ven_id: requestVenId,
  90. common_name: clientCertificateCn,
  91. };
  92. await nantum.updateRegistration(nantumRegistration);
  93. }
  94. if (cancelledRegistrationId == null) {
  95. const error = new Error('No current registration for VenID');
  96. error.responseCode = 452;
  97. throw error;
  98. }
  99. return {
  100. responseRequestId: oadrCancelPartyRegistration.requestId || '',
  101. responseCode: '200',
  102. responseDescription: 'OK',
  103. venId: venId,
  104. registrationId: cancelledRegistrationId,
  105. };
  106. }
  107. function nantumRegistrationToOadrRegistrationCreated(
  108. requestId,
  109. nantumRegistration,
  110. ) {
  111. return {
  112. responseRequestId: requestId || '',
  113. responseCode: '200',
  114. responseDescription: 'OK',
  115. registrationId: nantumRegistration.registration_id,
  116. venId: nantumRegistration.ven_id,
  117. vtnId: vtnId,
  118. pollFreqDuration: 'PT10S',
  119. };
  120. }
  121. function validateVenId(requestVenId, clientCertificateFingerprint, required) {
  122. if (requestVenId === clientCertificateFingerprint) {
  123. return;
  124. }
  125. if (!required && requestVenId == null) {
  126. return;
  127. }
  128. if (required && requestVenId == null) {
  129. const error = new Error('VenID is missing');
  130. error.responseCode = 452;
  131. throw error;
  132. }
  133. const error = new Error('VenID is invalid');
  134. error.responseCode = 452;
  135. throw error;
  136. }
  137. module.exports = {
  138. cancelParty,
  139. query,
  140. registerParty,
  141. };