#
# Macros
#

{%- macro bind_ip_tls(bind_ips, port, tls_cert) -%}
{%- for ip in bind_ips %}
    bind {{ ip }}:{{ port }} ssl crt {{ tls_cert }}
{%- endfor %}
{%- endmacro %}

{%- macro bind_ip_tcp(bind_ips, port) -%}
{%- for ip in bind_ips %}
    bind {{ ip }}:{{ port }}
{%- endfor %}
{%- endmacro %}


{%- macro web_security_options(list) -%}
{%- for this in list %}
{%- if this == 'no_frames' %}
    # Do not allow rendering the site within an frame, which prevents clickjacking.
    http-response set-header X-Frame-Options "DENY"

{% endif %}
{%- if this == 'block_xss' %}
    # Enable browser supplied XSS-protection, even if has been turned off.
    # If XSS is detected by the browser, block it instead of trying to sanitize it.
    http-response set-header X-XSS-Protection "1; mode=block"

{% endif %}
{%- if this == 'hsts' %}
    # 20 years in seconds is 630720000 (86400 * 365 * 20)
    http-response set-header Strict-Transport-Security "max-age=630720000"

{% endif %}
{%- if this == 'no_sniff' %}
    # Prevent MIME-confusion attacks that can lead to e.g. XSS
    http-response set-header X-Content-Type-Options "nosniff"

{% endif %}
{%- if this == 'no_cache' %}
    # The information is intended for a single user and must not
    # be cached by a shared cache and should always be revalidated.
    http-response set-header Cache-Control "no-cache, no-store, must-revalidate"
    http-response set-header Pragma "no-cache"
    http-response set-header Expires "0"

{% endif %}
{%- endfor %}
{%- endmacro %}


{%- macro acme_challenge(letsencrypt_server) -%}
{%- if letsencrypt_server is defined %}
    use_backend letsencrypt_{{ letsencrypt_server }} if { path_beg /.well-known/acme-challenge/ }
{%- else %}
    # No letsencrypt_server specified
{%- endif %}
{%- endmacro %}

{%- macro csp(data) -%}
    # Content Security Policy
    http-response set-header Content-Security-Policy "{{ data|join('; ') }}"
{%- endmacro %}

{%- macro output_backends(backends, config=[], server_args='') -%}
{% if backends is defined %}
{%- for this in backends %}
backend {{ this.name }}
  {{ config|join('\n  ') }}
  {%- for server in this.servers %}
  {%- if server.server_args is defined %}
  {%-   set server_args = server.server_args %}
  {%- endif %}
  {% if server is defined %}
  server {{ server.server }}_{{ server.address_family }} {{ server.ip }}:{{ server.port }} {{ server_args }}
  {%- endif %}
  {%- endfor %}
{%- endfor %}
{% else %}
# No backends found in context
{% endif %}
{%- endmacro %}