Streams.cy.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /// <reference types="cypress" />
  2. describe('Streams', () => {
  3. let token;
  4. before(() => {
  5. cy.resetUsers();
  6. cy.getToken().then((tok) => {
  7. token = tok;
  8. // Set default site content
  9. cy.task('backendApiPut', {
  10. token: token,
  11. path: '/api/settings/default-site',
  12. data: {
  13. value: 'html',
  14. meta: {
  15. html: '<p>yay it works</p>'
  16. },
  17. },
  18. }).then((data) => {
  19. cy.validateSwaggerSchema('put', 200, '/settings/{settingID}', data);
  20. });
  21. });
  22. // Create a custom cert pair
  23. cy.exec('mkcert -cert-file=/test/cypress/fixtures/website1.pem -key-file=/test/cypress/fixtures/website1.key.pem website1.example.com').then((result) => {
  24. expect(result.code).to.eq(0);
  25. // Install CA
  26. cy.exec('mkcert -install').then((result) => {
  27. expect(result.code).to.eq(0);
  28. });
  29. });
  30. cy.exec('rm -f /test/results/testssl.json');
  31. });
  32. it('Should be able to create TCP Stream', () => {
  33. cy.task('backendApiPost', {
  34. token: token,
  35. path: '/api/nginx/streams',
  36. data: {
  37. incoming_port: 1500,
  38. forwarding_host: '127.0.0.1',
  39. forwarding_port: 80,
  40. certificate_id: 0,
  41. meta: {},
  42. tcp_forwarding: true,
  43. udp_forwarding: false
  44. }
  45. }).then((data) => {
  46. cy.validateSwaggerSchema('post', 201, '/nginx/streams', data);
  47. expect(data).to.have.property('id');
  48. expect(data.id).to.be.greaterThan(0);
  49. expect(data).to.have.property('enabled', true);
  50. expect(data).to.have.property('tcp_forwarding', true);
  51. expect(data).to.have.property('udp_forwarding', false);
  52. cy.exec('curl --noproxy -- http://website1.example.com:1500').then((result) => {
  53. expect(result.code).to.eq(0);
  54. expect(result.stdout).to.contain('yay it works');
  55. });
  56. });
  57. });
  58. it('Should be able to create UDP Stream', () => {
  59. cy.task('backendApiPost', {
  60. token: token,
  61. path: '/api/nginx/streams',
  62. data: {
  63. incoming_port: 1501,
  64. forwarding_host: '127.0.0.1',
  65. forwarding_port: 80,
  66. certificate_id: 0,
  67. meta: {},
  68. tcp_forwarding: false,
  69. udp_forwarding: true
  70. }
  71. }).then((data) => {
  72. cy.validateSwaggerSchema('post', 201, '/nginx/streams', data);
  73. expect(data).to.have.property('id');
  74. expect(data.id).to.be.greaterThan(0);
  75. expect(data).to.have.property('enabled', true);
  76. expect(data).to.have.property('tcp_forwarding', false);
  77. expect(data).to.have.property('udp_forwarding', true);
  78. });
  79. });
  80. it('Should be able to create TCP/UDP Stream', () => {
  81. cy.task('backendApiPost', {
  82. token: token,
  83. path: '/api/nginx/streams',
  84. data: {
  85. incoming_port: 1502,
  86. forwarding_host: '127.0.0.1',
  87. forwarding_port: 80,
  88. certificate_id: 0,
  89. meta: {},
  90. tcp_forwarding: true,
  91. udp_forwarding: true
  92. }
  93. }).then((data) => {
  94. cy.validateSwaggerSchema('post', 201, '/nginx/streams', data);
  95. expect(data).to.have.property('id');
  96. expect(data.id).to.be.greaterThan(0);
  97. expect(data).to.have.property('enabled', true);
  98. expect(data).to.have.property('tcp_forwarding', true);
  99. expect(data).to.have.property('udp_forwarding', true);
  100. cy.exec('curl --noproxy -- http://website1.example.com:1502').then((result) => {
  101. expect(result.code).to.eq(0);
  102. expect(result.stdout).to.contain('yay it works');
  103. });
  104. });
  105. });
  106. it('Should be able to create SSL TCP Stream', () => {
  107. let certID = 0;
  108. // Create custom cert
  109. cy.task('backendApiPost', {
  110. token: token,
  111. path: '/api/nginx/certificates',
  112. data: {
  113. provider: "other",
  114. nice_name: "Custom Certificate for SSL Stream",
  115. },
  116. }).then((data) => {
  117. cy.validateSwaggerSchema('post', 201, '/nginx/certificates', data);
  118. expect(data).to.have.property('id');
  119. certID = data.id;
  120. // Upload files
  121. cy.task('backendApiPostFiles', {
  122. token: token,
  123. path: `/api/nginx/certificates/${certID}/upload`,
  124. files: {
  125. certificate: 'website1.pem',
  126. certificate_key: 'website1.key.pem',
  127. },
  128. }).then((data) => {
  129. cy.validateSwaggerSchema('post', 200, '/nginx/certificates/{certID}/upload', data);
  130. expect(data).to.have.property('certificate');
  131. expect(data).to.have.property('certificate_key');
  132. // Create the stream
  133. cy.task('backendApiPost', {
  134. token: token,
  135. path: '/api/nginx/streams',
  136. data: {
  137. incoming_port: 1503,
  138. forwarding_host: '127.0.0.1',
  139. forwarding_port: 80,
  140. certificate_id: certID,
  141. meta: {},
  142. tcp_forwarding: true,
  143. udp_forwarding: false
  144. }
  145. }).then((data) => {
  146. cy.validateSwaggerSchema('post', 201, '/nginx/streams', data);
  147. expect(data).to.have.property('id');
  148. expect(data.id).to.be.greaterThan(0);
  149. expect(data).to.have.property("enabled", true);
  150. expect(data).to.have.property('tcp_forwarding', true);
  151. expect(data).to.have.property('udp_forwarding', false);
  152. expect(data).to.have.property('certificate_id', certID);
  153. // Check the ssl termination
  154. cy.task('log', '[testssl.sh] Running ...');
  155. cy.exec('/testssl/testssl.sh --quiet --add-ca="$(/bin/mkcert -CAROOT)/rootCA.pem" --jsonfile=/test/results/testssl.json website1.example.com:1503', {
  156. timeout: 120000, // 2 minutes
  157. }).then((result) => {
  158. cy.task('log', `[testssl.sh] ${result.stdout}`);
  159. const allowedSeverities = ["INFO", "OK", "LOW", "MEDIUM"];
  160. const ignoredIDs = [
  161. 'cert_chain_of_trust',
  162. 'cert_extlifeSpan',
  163. 'cert_revocation',
  164. 'overall_grade',
  165. ];
  166. cy.readFile('/test/results/testssl.json').then((data) => {
  167. // Parse each array item
  168. for (let i = 0; i < data.length; i++) {
  169. const item = data[i];
  170. if (ignoredIDs.includes(item.id)) {
  171. continue;
  172. }
  173. expect(item.severity).to.be.oneOf(allowedSeverities);
  174. }
  175. });
  176. });
  177. });
  178. });
  179. });
  180. });
  181. it('Should be able to List Streams', () => {
  182. cy.task('backendApiGet', {
  183. token: token,
  184. path: '/api/nginx/streams?expand=owner,certificate',
  185. }).then((data) => {
  186. cy.validateSwaggerSchema('get', 200, '/nginx/streams', data);
  187. expect(data.length).to.be.greaterThan(0);
  188. expect(data[0]).to.have.property('id');
  189. expect(data[0]).to.have.property('enabled');
  190. });
  191. });
  192. });