fix(rewriter): prevent mixing of cached rule engines (#44) #45

Merged
wpetit merged 3 commits from issue-44 into develop 2024-10-21 14:07:54 +02:00
Owner

Description

Avant les modifications apportées part cette PR, Bouncer pouvait mélanger l'usage des moteurs de règles entre 2 instances d'un même layer rewriter ce qui amenait à des comportements erratiques, en fonction de quel moteur de règles avaient été instancié en premier (voir #44).

Cette PR corrige ce bug en créant un cache par couple proxy/layer, excluant ainsi le risque d'apparition de ce comportement.

Comment tester ?

  1. Supprimer les données du Redis local
sudo rm -rf data/redis
  1. Créer les 3 fichiers suivants dans data/bootstrap.d:
# Fichier data/bootstrap.d/add-cookie.yml

from: ["*/add-cookie*"]
to: http://localhost:8082
enabled: true
weight: 0
recreate: true
layers:
  rewriter:
    type: rewriter
    enabled: true
    weight: 100
    options:
      rules:
        response:
          - 'add_cookie(ctx, {"name": "byredirect", "value": "bar"})'

# Fichier data/bootstrap.d/should-not-redirect.yml

from: ["*/should-not-redirect*"]
to: http://localhost:8082
enabled: true
weight: 200
recreate: true
layers:
  rewriter:
    type: rewriter
    enabled: true
    weight: 100
    options:
      rules:
        request:
          - set_host(ctx, vars.request.url.host)
          - set_url(ctx, vars.request.raw_url)

# Fichier data/bootstrap.d/should-redirect.yml

from: ["*/should-redirect*"]
to: http://localhost:8082
enabled: true
weight: 200
recreate: true
layers:
  rewriter:
    type: rewriter
    enabled: true
    weight: 100
    options:
      rules:
        request:
          - |
            let cook = get_cookie(ctx, "byredirect");
            cook == nil ? redirect(ctx, 302, "http://localhost:8080/add-cookie") : nil            
  1. Démarrer Bouncer
make watch

Comportement attendu

Sans les modifications de la PR

  1. En navigant une première fois sur la page http://localhost:8080/should-redirect, le navigateur devrait être redirigé vers http://localhost:8080/add-cookie. Le cookie byredirect devrait être ajouté au navigateur. Ensuite, en accédant à http://localhost:8080/should-redirect le navigateur devrait afficher la page dummy (tant que le cookie n'est pas supprimé).

  2. En supprimant le cookie byredirect puis en navigant sur http://localhost:8080/should-not-redirect, le navigateur devrait être redirigé vers http://localhost:8080/add-cookie (le bug identifié par #44).

N.B. Le bug se produit si vous êtes passé préalablement par l'URL http://localhost:8080/should-redirect en premier lieu (initialisation de cette instance du moteur de règles qui prenait ensuite le pas sur l'autre). Ce lien d'interdépendance expliquait l'aspect semi-aléatoire de l'apparition du bug.

Avec les modifications de la PR

  1. En navigant sur http://localhost:8080/should-not-redirect, le navigateur devrait afficher la page dummy
  2. En navigant une première fois sur la page http://localhost:8080/should-redirect, le navigateur devrait être redirigé vers http://localhost:8080/add-cookie. Le cookie byredirect devrait être ajouté au navigateur. Ensuite, en accédant à http://localhost:8080/should-redirect le navigateur devrait afficher la page dummy (tant que le cookie n'est pas supprimé).
## Description Avant les modifications apportées part cette PR, Bouncer pouvait mélanger l'usage des moteurs de règles entre 2 instances d'un même layer `rewriter` ce qui amenait à des comportements erratiques, en fonction de quel moteur de règles avaient été instancié en premier (voir #44). Cette PR corrige ce bug en créant un cache par couple proxy/layer, excluant ainsi le risque d'apparition de ce comportement. ## Comment tester ? 1. Supprimer les données du Redis local ``` sudo rm -rf data/redis ``` 2. Créer les 3 fichiers suivants dans `data/bootstrap.d`: ```yaml # Fichier data/bootstrap.d/add-cookie.yml from: ["*/add-cookie*"] to: http://localhost:8082 enabled: true weight: 0 recreate: true layers: rewriter: type: rewriter enabled: true weight: 100 options: rules: response: - 'add_cookie(ctx, {"name": "byredirect", "value": "bar"})' ``` ```yaml # Fichier data/bootstrap.d/should-not-redirect.yml from: ["*/should-not-redirect*"] to: http://localhost:8082 enabled: true weight: 200 recreate: true layers: rewriter: type: rewriter enabled: true weight: 100 options: rules: request: - set_host(ctx, vars.request.url.host) - set_url(ctx, vars.request.raw_url) ``` ```yaml # Fichier data/bootstrap.d/should-redirect.yml from: ["*/should-redirect*"] to: http://localhost:8082 enabled: true weight: 200 recreate: true layers: rewriter: type: rewriter enabled: true weight: 100 options: rules: request: - | let cook = get_cookie(ctx, "byredirect"); cook == nil ? redirect(ctx, 302, "http://localhost:8080/add-cookie") : nil ``` 3. Démarrer Bouncer ``` make watch ``` ## Comportement attendu ### Sans les modifications de la PR 1. En navigant **une première fois** sur la page `http://localhost:8080/should-redirect`, le navigateur devrait être redirigé vers `http://localhost:8080/add-cookie`. Le cookie `byredirect` devrait être ajouté au navigateur. Ensuite, en accédant à `http://localhost:8080/should-redirect` le navigateur devrait afficher la page `dummy` (tant que le cookie n'est pas supprimé). 1. En supprimant le cookie `byredirect` puis en navigant sur `http://localhost:8080/should-not-redirect`, le navigateur devrait être redirigé vers `http://localhost:8080/add-cookie` (le bug identifié par #44). > **N.B.** Le bug se produit si vous êtes passé préalablement par l'URL `http://localhost:8080/should-redirect` en premier lieu (initialisation de cette instance du moteur de règles qui prenait ensuite le pas sur l'autre). Ce lien d'interdépendance expliquait l'aspect semi-aléatoire de l'apparition du bug. ### Avec les modifications de la PR 1. En navigant sur `http://localhost:8080/should-not-redirect`, le navigateur devrait afficher la page `dummy` 2. En navigant **une première fois** sur la page `http://localhost:8080/should-redirect`, le navigateur devrait être redirigé vers `http://localhost:8080/add-cookie`. Le cookie `byredirect` devrait être ajouté au navigateur. Ensuite, en accédant à `http://localhost:8080/should-redirect` le navigateur devrait afficher la page `dummy` (tant que le cookie n'est pas supprimé).
wpetit added 3 commits 2024-10-21 14:02:21 +02:00
wpetit merged commit a686c52aed into develop 2024-10-21 14:07:53 +02:00
mlamalle approved these changes 2024-10-21 14:08:05 +02:00
wpetit deleted branch issue-44 2024-10-21 14:08:06 +02:00
Sign in to join this conversation.
No reviewers
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Cadoles/bouncer#45
No description provided.