Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

54 lignes
1.9 KiB

  1. import http from 'node:http'
  2. import type { AddressInfo } from 'node:net'
  3. import { expect, test } from '@playwright/test'
  4. import { openContentControlPlane, resolveContentControlPlaneBaseUrl } from './content-control-plane'
  5. const listen = (server: http.Server): Promise<number> => new Promise((resolve, reject) => {
  6. server.once('error', reject)
  7. server.listen(0, '127.0.0.1', () => resolve((server.address() as AddressInfo).port))
  8. })
  9. const close = (server: http.Server): Promise<void> => new Promise((resolve, reject) => {
  10. server.close((error) => (error ? reject(error) : resolve()))
  11. })
  12. test('content control plane never forwards login bodies across redirects', async () => {
  13. let redirectedRequests = 0
  14. const redirectTarget = http.createServer((_request, response) => {
  15. redirectedRequests += 1
  16. response.writeHead(204).end()
  17. })
  18. const targetPort = await listen(redirectTarget)
  19. const gateway = http.createServer((_request, response) => {
  20. response.writeHead(307, { Location: `http://127.0.0.1:${targetPort}/captured` }).end()
  21. })
  22. const gatewayPort = await listen(gateway)
  23. const request = await openContentControlPlane(`http://127.0.0.1:${gatewayPort}`)
  24. try {
  25. const response = await request.post('/login', {
  26. data: { username: 'redirect-sentinel', password: 'must-not-be-forwarded' },
  27. })
  28. expect(response.status()).toBe(307)
  29. expect(redirectedRequests).toBe(0)
  30. } finally {
  31. await request.dispose()
  32. await close(gateway)
  33. await close(redirectTarget)
  34. }
  35. })
  36. test('content control plane rejects local/remote drift and cleartext remote UI', () => {
  37. expect(() => resolveContentControlPlaneBaseUrl({
  38. BASE_URL: 'https://ui.example.test',
  39. E2E_API_BASE_URL: 'http://127.0.0.1:6100',
  40. })).toThrow(/cross the local\/remote boundary/)
  41. expect(() => resolveContentControlPlaneBaseUrl({
  42. BASE_URL: 'http://ui.example.test',
  43. E2E_API_BASE_URL: 'https://api.example.test',
  44. })).toThrow(/Remote BASE_URL must use HTTPS/)
  45. })