Browse Source

PROD-1221: Document supported OpenADR features

* Reject VEN registrations with unsupported features
Blake Schneider 5 năm trước cách đây
mục cha
commit
f6c362dba4

+ 26 - 1
README.md

@@ -106,4 +106,29 @@ Root Certificate and Intermediate Certificate from a trusted CA. These two certi
 VEN-provided client certificate is issued by that trusted CA.
 3) HTTP headers to NodeJS: `ssl_client_s_dn_cn` contains the CN from the VEN client certificate. `ssl_client_certificate`
 contains the entire URI-encoded PEM-encoded X.509 client certificate. These headers are consumed by the `certificate-parser`
-ExpressJS middleware.
+ExpressJS middleware.
+
+## Supported OpenADR VTN functionality
+
+### EiRegisterParty service
+* [x] `oadrCreatePartyRegistration`, `oadrCancelPartyRegistration`, `oadrQueryRegistration` messages
+* [x] `simpleHttp` transport
+* [x] `2.0b` profile
+* [ ] `xmpp` transport
+* [ ] `2.0a` profile
+* [ ] `ReportOnly` VEN feature
+* [ ] `XML Signature` VEN feature
+* [x] `simpleHttp` pull model
+* [ ] `simpleHttp` push model
+
+### EiEvent service
+* [x] `oadrRequestEvent`, `oadrCreatedEvent` messages
+
+### OadrPoll service
+* [x] `oadrPoll` message
+
+### EiOpt service
+* [ ] Not implemented
+
+### EiReport service
+* [ ] Not implemented

+ 69 - 5
__tests__/unit/processes/registration.spec.js

@@ -33,7 +33,7 @@ describe('VEN registration', function() {
         requestId: requestId,
         venId: venId,
         oadrProfileName: '2.0b',
-        oadrTransportName: 'simplehttp',
+        oadrTransportName: 'simpleHttp',
         oadrReportOnly: false,
         oadrXmlSignature: false,
         oadrVenName: `VEN ${commonName}`,
@@ -61,7 +61,7 @@ describe('VEN registration', function() {
         requestId: requestId,
         venId: venId,
         oadrProfileName: '2.0b',
-        oadrTransportName: 'simplehttp',
+        oadrTransportName: 'simpleHttp',
         oadrReportOnly: false,
         oadrXmlSignature: false,
         oadrVenName: `VEN ${commonName}`,
@@ -88,7 +88,7 @@ describe('VEN registration', function() {
         requestId: requestId,
         venId: venId,
         oadrProfileName: '2.0b',
-        oadrTransportName: 'simplehttp',
+        oadrTransportName: 'simpleHttp',
         oadrReportOnly: false,
         oadrXmlSignature: false,
         oadrVenName: `VEN ${commonName}`,
@@ -147,7 +147,7 @@ describe('VEN registration', function() {
         requestId: requestId,
         venId: venId,
         oadrProfileName: '2.0b',
-        oadrTransportName: 'simplehttp',
+        oadrTransportName: 'simpleHttp',
         oadrReportOnly: false,
         oadrXmlSignature: false,
         oadrVenName: `VEN ${commonName}`,
@@ -167,6 +167,70 @@ describe('VEN registration', function() {
       expect(queryResponse.registrationId).to.eql(initialRegistrationId);
       expect(queryResponse.venId).to.eql(venId);
     });
+
+    it('rejects XMPP client', async () => {
+      venId = v4()
+        .replace(/-/g, '')
+        .substring(0, 20)
+        .toUpperCase()
+        .match(/.{2}/g)
+        .join(':');
+      const requestId = v4().replace(/-/g, '');
+      commonName = v4()
+        .replace(/-/g, '')
+        .substring(0, 12);
+      const registerRequest = {
+        requestId: requestId,
+        venId: venId,
+        oadrProfileName: '2.0b',
+        oadrTransportName: 'xmpp',
+        oadrReportOnly: false,
+        oadrXmlSignature: false,
+        oadrVenName: `VEN ${commonName}`,
+        oadrHttpPullModel: true,
+      };
+
+      let lastError;
+      try {
+        await registerParty(registerRequest, commonName, venId);
+      } catch (e) {
+        lastError = e;
+      }
+      expect(lastError).to.be.an('error');
+      expect(lastError.message).to.eql('Transport name must be simpleHttp');
+    });
+
+    it('rejects 2.0a client', async () => {
+      venId = v4()
+        .replace(/-/g, '')
+        .substring(0, 20)
+        .toUpperCase()
+        .match(/.{2}/g)
+        .join(':');
+      const requestId = v4().replace(/-/g, '');
+      commonName = v4()
+        .replace(/-/g, '')
+        .substring(0, 12);
+      const registerRequest = {
+        requestId: requestId,
+        venId: venId,
+        oadrProfileName: '2.0a',
+        oadrTransportName: 'simpleHttp',
+        oadrReportOnly: false,
+        oadrXmlSignature: false,
+        oadrVenName: `VEN ${commonName}`,
+        oadrHttpPullModel: true,
+      };
+
+      let lastError;
+      try {
+        await registerParty(registerRequest, commonName, venId);
+      } catch (e) {
+        lastError = e;
+      }
+      expect(lastError).to.be.an('error');
+      expect(lastError.message).to.eql('Profile name must be 2.0b');
+    });
   });
 
   describe('cancelParty', function() {
@@ -187,7 +251,7 @@ describe('VEN registration', function() {
         requestId: requestId,
         venId: venId,
         oadrProfileName: '2.0b',
-        oadrTransportName: 'simplehttp',
+        oadrTransportName: 'simpleHttp',
         oadrReportOnly: false,
         oadrXmlSignature: false,
         oadrVenName: `VEN ${commonName}`,

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 1
__tests__/unit/xml/register-party/create-party-registration.spec.js


+ 1 - 1
__tests__/unit/xml/register-party/js-requests.js

@@ -6,7 +6,7 @@ const createPartyRegistration1 = {
   registrationId: '3bd3c02dc6965c8b9240',
   venId: '3f59d85fbdf3997dbeb1',
   oadrProfileName: '2.0b',
-  oadrTransportName: 'simplehttp',
+  oadrTransportName: 'simpleHttp',
   oadrReportOnly: false,
   oadrXmlSignature: false,
   oadrVenName: 'venName',

+ 1 - 1
client/ven.js

@@ -101,7 +101,7 @@ class Ven {
       registrationId: this.registrationId,
       venId: this.venId,
       oadrProfileName: '2.0b',
-      oadrTransportName: 'simplehttp',
+      oadrTransportName: 'simpleHttp',
       oadrReportOnly: false,
       oadrXmlSignature: false,
       oadrVenName: this.venName,

+ 42 - 0
processes/registration.js

@@ -19,6 +19,7 @@ async function registerParty(
 
   const requestVenId = oadrCreatePartyRegistration.venId;
   validateVenId(requestVenId, clientCertificateFingerprint, true);
+  validateCreatePartyRegistration(oadrCreatePartyRegistration);
 
   let nantumRegistration = await nantum.fetchRegistration(requestVenId);
 
@@ -49,6 +50,47 @@ async function registerParty(
   );
 }
 
+function validateCreatePartyRegistration(oadrCreatePartyRegistration) {
+  if (oadrCreatePartyRegistration.oadrTransportName !== 'simpleHttp') {
+    const error = new Error('Transport name must be simpleHttp');
+    error.responseCode = 459;
+    throw error;
+  }
+
+  if (oadrCreatePartyRegistration.oadrProfileName !== '2.0b') {
+    const error = new Error('Profile name must be 2.0b');
+    error.responseCode = 459;
+    throw error;
+  }
+
+  if (oadrCreatePartyRegistration.oadrReportOnly) {
+    const error = new Error('Report-only mode is not supported');
+    error.responseCode = 459;
+    throw error;
+  }
+
+  if (oadrCreatePartyRegistration.oadrXmlSignature) {
+    const error = new Error('XML signature mode is not supported');
+    error.responseCode = 459;
+    throw error;
+  }
+
+  if (
+    oadrCreatePartyRegistration.oadrHttpPullModel != null &&
+    !oadrCreatePartyRegistration.oadrHttpPullModel
+  ) {
+    const error = new Error('simpleHttp push mode is not supported');
+    error.responseCode = 459;
+    throw error;
+  }
+
+  if (oadrCreatePartyRegistration.oadrTransportAddress) {
+    const error = new Error('oadrTransportAddress is not supported');
+    error.responseCode = 459;
+    throw error;
+  }
+}
+
 async function query(
   oadrQueryRegistration,
   clientCertificateCn,