registration.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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(
  46. oadrQueryRegistration,
  47. clientCertificateCn,
  48. clientCertificateFingerprint,
  49. ) {
  50. logger.info(
  51. 'query',
  52. oadrQueryRegistration,
  53. clientCertificateCn,
  54. clientCertificateFingerprint,
  55. );
  56. const requestVenId = clientCertificateFingerprint;
  57. let nantumRegistration = await nantum.fetchRegistration(requestVenId);
  58. if (nantumRegistration) {
  59. if (nantumRegistration.common_name !== clientCertificateCn) {
  60. const error = new Error('Client certificate CN mismatch');
  61. error.responseCode = 452;
  62. throw error;
  63. }
  64. } else {
  65. // response payload should not contain ven_id or registration_id
  66. nantumRegistration = {};
  67. }
  68. return nantumRegistrationToOadrRegistrationCreated(
  69. oadrQueryRegistration.requestId,
  70. nantumRegistration,
  71. );
  72. }
  73. async function cancelParty(
  74. oadrCancelPartyRegistration,
  75. clientCertificateCn,
  76. clientCertificateFingerprint,
  77. ) {
  78. logger.info(
  79. 'cancelParty',
  80. oadrCancelPartyRegistration,
  81. clientCertificateCn,
  82. clientCertificateFingerprint,
  83. );
  84. const requestVenId = oadrCancelPartyRegistration.venId;
  85. validateVenId(requestVenId, clientCertificateFingerprint, false);
  86. const venId = clientCertificateFingerprint;
  87. let nantumRegistration = await nantum.fetchRegistration(requestVenId);
  88. let cancelledRegistrationId;
  89. if (nantumRegistration) {
  90. if (nantumRegistration.common_name !== clientCertificateCn) {
  91. const error = new Error('Client certificate CN mismatch');
  92. error.responseCode = 452;
  93. throw error;
  94. }
  95. cancelledRegistrationId = nantumRegistration.registration_id;
  96. // clear all registration data
  97. nantumRegistration = {
  98. ven_id: requestVenId,
  99. common_name: clientCertificateCn,
  100. };
  101. await nantum.updateRegistration(nantumRegistration);
  102. }
  103. if (cancelledRegistrationId == null) {
  104. const error = new Error('No current registration for VenID');
  105. error.responseCode = 452;
  106. throw error;
  107. }
  108. return {
  109. responseRequestId: oadrCancelPartyRegistration.requestId || '',
  110. responseCode: '200',
  111. responseDescription: 'OK',
  112. venId: venId,
  113. registrationId: cancelledRegistrationId,
  114. };
  115. }
  116. function nantumRegistrationToOadrRegistrationCreated(
  117. requestId,
  118. nantumRegistration,
  119. ) {
  120. return {
  121. responseRequestId: requestId || '',
  122. responseCode: '200',
  123. responseDescription: 'OK',
  124. registrationId: nantumRegistration.registration_id,
  125. venId: nantumRegistration.ven_id,
  126. vtnId: vtnId,
  127. pollFreqDuration: 'PT10S',
  128. };
  129. }
  130. function validateVenId(requestVenId, clientCertificateFingerprint, required) {
  131. if (requestVenId === clientCertificateFingerprint) {
  132. return;
  133. }
  134. if (!required && requestVenId == null) {
  135. return;
  136. }
  137. if (required && requestVenId == null) {
  138. const error = new Error('VenID is missing');
  139. error.responseCode = 452;
  140. throw error;
  141. }
  142. const error = new Error('VenID does not match certificate');
  143. error.responseCode = 452;
  144. throw error;
  145. }
  146. module.exports = {
  147. cancelParty,
  148. query,
  149. registerParty,
  150. };