<%= gettext "An error occurred" %>
3 | 4 |<%= @error_message %>
5 |├── test
├── test_helper.exs
├── fixtures
│ ├── test_content_sri_no_scripts.html
│ ├── test_content_sri_sameorigin1.html
│ ├── test_content_sri_sameorigin3.html
│ ├── test_content_sri_sameorigin2.html
│ ├── test_content_sri_notimpl_external_http.html
│ ├── test_content_sri_notimpl_external_https.html
│ ├── test_content_sri_notimpl_external_noproto.html
│ ├── test_parse_http_equiv_headers_referrer1.html
│ ├── test_parse_http_equiv_headers_case_insensitivity.html
│ ├── test_parse_http_equiv_headers_csp1.html
│ ├── test_content_sri_impl_external_noproto.html
│ ├── test_content_sri_impl_sameorigin.html
│ ├── test_content_sri_impl_external_https1.html
│ ├── test_content_sri_impl_external_https2.html
│ ├── test_content_sri_impl_external_http.html
│ ├── test_parse_http_equiv_headers_csp_multiple_http_equiv1.html
│ ├── referrer_header.json
│ ├── csp_referrer.json
│ ├── header_csp.json
│ ├── meta_csp.json
│ ├── csp_and_referrer_header.json
│ ├── csp_and_meta_referrer.json
│ └── header_csp_and_meta_csp.json
└── support
│ ├── factory.ex
│ ├── model_case.ex
│ └── conn_case.ex
├── assets
├── static
│ ├── favicon.ico
│ ├── images
│ │ ├── iis.png
│ │ ├── phoenix.png
│ │ ├── sort_asc.png
│ │ ├── sort_both.png
│ │ ├── sort_desc.png
│ │ ├── ajax-loader.gif
│ │ ├── mstile-70x70.png
│ │ ├── dataskydd_eye2.png
│ │ ├── favicon-160x160.png
│ │ ├── favicon-16x16.png
│ │ ├── favicon-192x192.png
│ │ ├── favicon-32x32.png
│ │ ├── favicon-96x96.png
│ │ ├── internetfonden.png
│ │ ├── mstile-144x144.png
│ │ ├── mstile-150x150.png
│ │ ├── mstile-310x150.png
│ │ ├── mstile-310x310.png
│ │ ├── apple-touch-icon.png
│ │ ├── sort_asc_disabled.png
│ │ ├── sort_desc_disabled.png
│ │ ├── apple-touch-icon-57x57.png
│ │ ├── apple-touch-icon-60x60.png
│ │ ├── apple-touch-icon-72x72.png
│ │ ├── apple-touch-icon-76x76.png
│ │ ├── apple-touch-icon-114x114.png
│ │ ├── apple-touch-icon-120x120.png
│ │ ├── apple-touch-icon-144x144.png
│ │ ├── apple-touch-icon-152x152.png
│ │ ├── apple-touch-icon-180x180.png
│ │ └── apple-touch-icon-precomposed.png
│ ├── fonts
│ │ ├── icomoon.ttf
│ │ └── icomoon.woff
│ ├── robots.txt
│ └── js
│ │ ├── webbkoll-30-app.js
│ │ ├── webbkoll-20-a11y-toggle.min.js
│ │ ├── html5shiv.min.js
│ │ └── webbkoll-10-tablesort.min.js
└── scss
│ ├── base
│ ├── _media.scss
│ ├── _lists.scss
│ ├── _layout.scss
│ ├── _base.scss
│ ├── _tables.scss
│ ├── _variables.scss
│ ├── _buttons.scss
│ ├── _typography.scss
│ └── _forms.scss
│ ├── .sass-cache
│ ├── 3ce5d73f8c8748aaab73244e13ce3309008dfaff
│ │ ├── _shade.scssc
│ │ ├── _tint.scssc
│ │ ├── _contains.scssc
│ │ ├── _is-light.scssc
│ │ ├── _is-size.scssc
│ │ ├── _px-to-em.scssc
│ │ ├── _unpack.scssc
│ │ ├── _is-length.scssc
│ │ ├── _is-number.scssc
│ │ ├── _px-to-rem.scssc
│ │ ├── _assign-inputs.scssc
│ │ ├── _modular-scale.scssc
│ │ ├── _strip-units.scssc
│ │ ├── _contains-falsy.scssc
│ │ └── _transition-property-name.scssc
│ ├── 7bc181db2811153f2eda76ec20c365d05dee6ca9
│ │ ├── _size.scssc
│ │ ├── _buttons.scssc
│ │ ├── _clearfix.scssc
│ │ ├── _ellipsis.scssc
│ │ ├── _margin.scssc
│ │ ├── _padding.scssc
│ │ ├── _position.scssc
│ │ ├── _prefixer.scssc
│ │ ├── _triangle.scssc
│ │ ├── _hide-text.scssc
│ │ ├── _word-wrap.scssc
│ │ ├── _border-color.scssc
│ │ ├── _border-radius.scssc
│ │ ├── _border-style.scssc
│ │ ├── _border-width.scssc
│ │ ├── _font-stacks.scssc
│ │ ├── _retina-image.scssc
│ │ ├── _text-inputs.scssc
│ │ └── _timing-functions.scssc
│ ├── 72dda0c11013fc7994d6c543544dc280a238d0cf
│ │ ├── _columns.scssc
│ │ ├── _filter.scssc
│ │ ├── _flex-box.scssc
│ │ ├── _hyphens.scssc
│ │ ├── _animation.scssc
│ │ ├── _background.scssc
│ │ ├── _font-face.scssc
│ │ ├── _keyframes.scssc
│ │ ├── _transform.scssc
│ │ ├── _transition.scssc
│ │ ├── _border-image.scssc
│ │ ├── _perspective.scssc
│ │ ├── _placeholder.scssc
│ │ ├── _image-rendering.scssc
│ │ ├── _linear-gradient.scssc
│ │ ├── _radial-gradient.scssc
│ │ ├── _background-image.scssc
│ │ ├── _hidpi-media-query.scssc
│ │ ├── _font-feature-settings.scssc
│ │ ├── _backface-visibility.scssc
│ │ ├── _appearance.scssc
│ │ ├── _user-select.scssc
│ │ └── _calc.scssc
│ ├── de6a90186ec01c55797e67b1b16ce7162a29f933
│ │ ├── _bourbon.scssc
│ │ └── _bourbon-deprecated-upcoming.scssc
│ ├── b30e70bc19d73593335073523afe52a547588227
│ │ ├── _str-to-num.scssc
│ │ ├── _convert-units.scssc
│ │ ├── _directional-values.scssc
│ │ ├── _radial-arg-parser.scssc
│ │ ├── _render-gradients.scssc
│ │ ├── _linear-angle-parser.scssc
│ │ ├── _font-source-declaration.scssc
│ │ ├── _linear-gradient-parser.scssc
│ │ ├── _linear-positions-parser.scssc
│ │ ├── _radial-gradient-parser.scssc
│ │ ├── _radial-positions-parser.scssc
│ │ ├── _gradient-positions-parser.scssc
│ │ └── _linear-side-corner-parser.scssc
│ ├── 74571de3e827f0001966c84f665e8974ed75748e
│ │ ├── _asset-pipeline.scssc
│ │ ├── _px-to-em.scssc
│ │ └── _prefixer.scssc
│ └── c5b9bd97b08c64c7fb937eb29bc46d18ccdc9322
│ │ └── style.scssc
│ ├── neat
│ ├── _neat-helpers.scss
│ ├── grid
│ │ ├── _box-sizing.scss
│ │ ├── _reset-display.scss
│ │ ├── _fill-parent.scss
│ │ ├── _pad.scss
│ │ ├── _display-context.scss
│ │ ├── _direction-context.scss
│ │ ├── _outer-container.scss
│ │ ├── _private.scss
│ │ ├── _visual-grid.scss
│ │ ├── _row.scss
│ │ └── _shift.scss
│ ├── settings
│ │ ├── _disable-warnings.scss
│ │ ├── _visual-grid.scss
│ │ └── _grid.scss
│ ├── mixins
│ │ └── _clearfix.scss
│ ├── _neat.scss
│ └── functions
│ │ └── _new-breakpoint.scss
│ ├── bourbon
│ ├── bourbon
│ │ ├── helpers
│ │ │ ├── _buttons-list.scss
│ │ │ ├── _text-inputs-list.scss
│ │ │ └── _scales.scss
│ │ ├── validators
│ │ │ ├── _is-color.scss
│ │ │ ├── _is-number.scss
│ │ │ ├── _contains-falsy.scss
│ │ │ ├── _is-length.scss
│ │ │ ├── _is-size.scss
│ │ │ └── _contains.scss
│ │ ├── library
│ │ │ ├── _strip-unit.scss
│ │ │ ├── _clearfix.scss
│ │ │ ├── _hide-text.scss
│ │ │ ├── _overflow-wrap.scss
│ │ │ ├── _border-width.scss
│ │ │ ├── _border-style.scss
│ │ │ ├── _tint.scss
│ │ │ ├── _shade.scss
│ │ │ ├── _border-color.scss
│ │ │ ├── _prefixer.scss
│ │ │ ├── _value-prefixer.scss
│ │ │ ├── _ellipsis.scss
│ │ │ ├── _padding.scss
│ │ │ ├── _margin.scss
│ │ │ ├── _size.scss
│ │ │ ├── _position.scss
│ │ │ ├── _timing-functions.scss
│ │ │ ├── _hide-visually.scss
│ │ │ ├── _font-face.scss
│ │ │ ├── _border-radius.scss
│ │ │ ├── _buttons.scss
│ │ │ └── _triangle.scss
│ │ └── utilities
│ │ │ ├── _fetch-bourbon-setting.scss
│ │ │ ├── _gamma.scss
│ │ │ ├── _assign-inputs.scss
│ │ │ ├── _lightness.scss
│ │ │ ├── _contrast-ratio.scss
│ │ │ ├── _unpack-shorthand.scss
│ │ │ ├── _compact-shorthand.scss
│ │ │ ├── _font-source-declaration.scss
│ │ │ └── _directional-property.scss
│ └── _bourbon.scss
│ ├── _grid-settings.scss
│ ├── _tablesort.scss
│ ├── _compatibility.scss
│ ├── _icons.scss
│ └── _tooltip.scss
├── lib
├── webbkoll
│ ├── scheduler.ex
│ ├── sites
│ │ ├── site.ex
│ │ └── sites.ex
│ ├── cronjobs.ex
│ ├── application.ex
│ ├── helpers.ex
│ └── trackers.ex
├── webbkoll_web
│ ├── views
│ │ ├── page_view.ex
│ │ ├── api
│ │ │ └── site_view.ex
│ │ ├── error_view.ex
│ │ ├── layout_view.ex
│ │ └── error_helpers.ex
│ ├── templates
│ │ ├── error
│ │ │ └── error.html.heex
│ │ ├── site
│ │ │ ├── status.html.heex
│ │ │ ├── _raw_headers.html.heex
│ │ │ ├── results.html.heex
│ │ │ ├── _what.html.heex
│ │ │ ├── _cookie_table.html.heex
│ │ │ ├── _hsts_host.html.heex
│ │ │ ├── _request_table.html.heex
│ │ │ ├── _localstorage.html.heex
│ │ │ ├── _requests.html.heex
│ │ │ └── _geolocation.html.heex
│ │ └── page
│ │ │ ├── donate.html.heex
│ │ │ └── index.html.heex
│ ├── plugs
│ │ └── more_secure_headers.ex
│ ├── gettext.ex
│ ├── controllers
│ │ ├── controller_helpers.ex
│ │ ├── page_controller.ex
│ │ └── api
│ │ │ └── site_controller.ex
│ ├── endpoint.ex
│ └── router.ex
└── webbkoll_web.ex
├── README.md
├── .formatter.exs
├── ansible
├── files
│ └── webbkoll-backend.service
├── vars.yml
├── templates
│ ├── webbkoll.service.j2
│ └── Caddyfile.j2
└── README
├── TRANSLATIONS.md
├── config
├── prod.exs
├── test.exs
├── dev.exs
├── runtime.exs
└── config.exs
├── .gitignore
├── LICENSE
└── mix.exs
/test/test_helper.exs:
--------------------------------------------------------------------------------
1 | {:ok, _} = Application.ensure_all_started(:ex_machina)
2 | ExUnit.start()
3 |
--------------------------------------------------------------------------------
/assets/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/favicon.ico
--------------------------------------------------------------------------------
/lib/webbkoll/scheduler.ex:
--------------------------------------------------------------------------------
1 | defmodule Webbkoll.Scheduler do
2 | use Quantum, otp_app: :webbkoll
3 | end
4 |
--------------------------------------------------------------------------------
/assets/static/images/iis.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/iis.png
--------------------------------------------------------------------------------
/lib/webbkoll_web/views/page_view.ex:
--------------------------------------------------------------------------------
1 | defmodule WebbkollWeb.PageView do
2 | use WebbkollWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ⚠️ This repository has moved to Codeberg
2 |
3 | See https://codeberg.org/dataskydd.net/webbkoll
4 |
--------------------------------------------------------------------------------
/assets/static/fonts/icomoon.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/fonts/icomoon.ttf
--------------------------------------------------------------------------------
/assets/static/fonts/icomoon.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/fonts/icomoon.woff
--------------------------------------------------------------------------------
/assets/static/images/phoenix.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/phoenix.png
--------------------------------------------------------------------------------
/assets/static/images/sort_asc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/sort_asc.png
--------------------------------------------------------------------------------
/assets/static/images/sort_both.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/sort_both.png
--------------------------------------------------------------------------------
/assets/static/images/sort_desc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/sort_desc.png
--------------------------------------------------------------------------------
/.formatter.exs:
--------------------------------------------------------------------------------
1 | [
2 | import_deps: [:phoenix],
3 | inputs: ["*.{ex,exs}", "{config,lib,priv,test}/**/*.{ex,exs}"]
4 | ]
5 |
--------------------------------------------------------------------------------
/assets/static/images/ajax-loader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/ajax-loader.gif
--------------------------------------------------------------------------------
/assets/static/images/mstile-70x70.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/mstile-70x70.png
--------------------------------------------------------------------------------
/assets/static/images/dataskydd_eye2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/dataskydd_eye2.png
--------------------------------------------------------------------------------
/assets/static/images/favicon-160x160.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/favicon-160x160.png
--------------------------------------------------------------------------------
/assets/static/images/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/favicon-16x16.png
--------------------------------------------------------------------------------
/assets/static/images/favicon-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/favicon-192x192.png
--------------------------------------------------------------------------------
/assets/static/images/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/favicon-32x32.png
--------------------------------------------------------------------------------
/assets/static/images/favicon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/favicon-96x96.png
--------------------------------------------------------------------------------
/assets/static/images/internetfonden.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/internetfonden.png
--------------------------------------------------------------------------------
/assets/static/images/mstile-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/mstile-144x144.png
--------------------------------------------------------------------------------
/assets/static/images/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/mstile-150x150.png
--------------------------------------------------------------------------------
/assets/static/images/mstile-310x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/mstile-310x150.png
--------------------------------------------------------------------------------
/assets/static/images/mstile-310x310.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/mstile-310x310.png
--------------------------------------------------------------------------------
/assets/static/images/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/apple-touch-icon.png
--------------------------------------------------------------------------------
/assets/static/images/sort_asc_disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/sort_asc_disabled.png
--------------------------------------------------------------------------------
/assets/static/images/sort_desc_disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/sort_desc_disabled.png
--------------------------------------------------------------------------------
/assets/scss/base/_media.scss:
--------------------------------------------------------------------------------
1 | figure {
2 | margin: 0;
3 | }
4 |
5 | img,
6 | picture {
7 | margin: 0;
8 | max-width: 100%;
9 | }
10 |
--------------------------------------------------------------------------------
/assets/static/images/apple-touch-icon-57x57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/apple-touch-icon-57x57.png
--------------------------------------------------------------------------------
/assets/static/images/apple-touch-icon-60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/apple-touch-icon-60x60.png
--------------------------------------------------------------------------------
/assets/static/images/apple-touch-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/apple-touch-icon-72x72.png
--------------------------------------------------------------------------------
/assets/static/images/apple-touch-icon-76x76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/apple-touch-icon-76x76.png
--------------------------------------------------------------------------------
/assets/static/images/apple-touch-icon-114x114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/apple-touch-icon-114x114.png
--------------------------------------------------------------------------------
/assets/static/images/apple-touch-icon-120x120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/apple-touch-icon-120x120.png
--------------------------------------------------------------------------------
/assets/static/images/apple-touch-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/apple-touch-icon-144x144.png
--------------------------------------------------------------------------------
/assets/static/images/apple-touch-icon-152x152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/apple-touch-icon-152x152.png
--------------------------------------------------------------------------------
/assets/static/images/apple-touch-icon-180x180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/apple-touch-icon-180x180.png
--------------------------------------------------------------------------------
/assets/static/images/apple-touch-icon-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andersju/webbkoll/HEAD/assets/static/images/apple-touch-icon-precomposed.png
--------------------------------------------------------------------------------
/lib/webbkoll_web/templates/error/error.html.heex:
--------------------------------------------------------------------------------
1 | <%= @error_message %><%= gettext "An error occurred" %>
3 |
4 |

| <%= gettext("Header") %> | 11 |<%= gettext("Value") %> | 12 |
|---|---|
| <%= header %> | 18 |<%= value %> | 19 |
<%= gettext("This tool attempts to simulate what happens when a user visits a specified page with a typical browser. The browser has no addons/extensions installed, and Do Not Track (DNT) is not enabled, since this is the default setting in most browsers.") %>
8 | 9 |<%= gettext("External files such as images, scripts and CSS are loaded, but the tool performs no interactions with the page — no links are clicked, no forms are submitted.") %>
10 | 11 |<%= gettext("Disclaimer: The results presented here might not be 100% correct. Bugs happen. This tool is meant to be used by site owners as a starting point for improvements, not as a rigorous analysis.") %>
12 | 13 |<%= gettext(~s|Text about HTTPS partly adapted from the CIO Council's The HTTPS-Only Standard (public domain). See here for more information.|, about: Routes.page_path(@conn, :about, @conn.assigns.locale)) |> raw() %>
14 |<%= gettext(~s|Webbkoll is a project by Dataskydd.net Sverige, a Swedish non-governmental organization (organization number 802495-4797) working on making data protection easy in law and in practice. We are not affiliated with any political party.|) |> raw %>
5 | 6 |<%= gettext "We operate on a very small budget, and servers are usually our main expense; most work is done in our free time. Every euro (or krona) counts!" %>
7 | 8 |<%= gettext("If you would like to make a contribution to the general funds of Dataskydd.net (helping both Webbkoll as well as our other activities), you can transfer money to the following bank account:") |> raw() %>
9 | 10 |<%= gettext "Please write \"Donation\" in the message field. Any amount is much appreciated! (From a Swedish bank account, the number would be 52031057715.)" %>
17 | 18 |<%= gettext "Our address (if necessary):" %>
19 | 20 |
21 | Dataskydd.net Sverige
22 | c/o Jensen-Urstad
23 | Bondegatan 64
24 | 11633 Stockholm
25 | Sweden
26 |
<%= gettext "Our bank's address (if necessary):" %>
29 |
30 | SEB
31 | 106 40 Stockholm
32 | Sweden
33 |
<%= gettext "At the moment we cannot accept Bitcoin or any other cryptocurrency." %>
36 || <%= gettext "Domain" %> | 7 |<%= gettext "Name" %> | 8 |<%= gettext "Value" %> | 9 |<%= gettext "Expires on" %> | 10 |HttpOnly | 11 |Secure | 12 |SameSite | 13 |
|---|---|---|---|---|---|---|
| <%= cookie["domain"] %> | 19 |<%= truncate(cookie["name"], 20) %> | 20 |<%= truncate(cookie["value"], 20) %> | 21 |22 | <%= if cookie["session"] == true, do: "session", else: format_timestamp(cookie["expires"]) %> 23 | | 24 |<%= if cookie["httpOnly"], do: icon(:pass), else: icon(:fail) %> | 25 |<%= if cookie["secure"], do: icon(:pass), else: icon(:fail) %> | 26 |
27 | <%= if cookie["sameSite"] do %>
28 | <%= icon(:pass) %>
29 | (<%= cookie["sameSite"] %>)
30 | <% else %>
31 | <%= icon(:fail) %>
32 | <% end %>
33 | |
34 |
2 | <%= gettext(~s|HSTS policy for https://%{host}:|, host: @host) %>
3 | <%= safe_to_string(html_escape(@hsts.data)) %>
4 |
| <%= gettext "Pass" %> | 10 |<%= gettext "Test" %> | 11 |
|---|---|
| 16 | <%= if @hsts.pass do %> 17 | <%= icon(:pass) %> 18 | <% else %> 19 | <%= icon(:fail) %> 20 | <% end %> 21 | | 22 |
23 | <%= gettext(~s|max-age set to at least 6 months|) |> raw() %>
24 | |
25 |
| 28 | <%= if @hsts.includesubdomains do %> 29 | <%= icon(:pass) %> 30 | <% else %> 31 | <%= icon(:fail) %> 32 | <% end %> 33 | | 34 |
35 | <%= gettext(~s|includeSubDomains — policy also applies to subdomains|) |> raw() %>
36 | |
37 |
| 40 | <%= if @is_base do %> 41 | <%= if @hsts.preload do %> 42 | <%= icon(:pass) %> 43 | <% else %> 44 | <%= icon(:fail) %> 45 | <% end %> 46 | <% else %> 47 | <%= icon(:optional) %> 48 | <% end %> 49 | | 50 |
51 | <%= gettext(~s|preload — requests inclusion in preload lists|) |> raw() %>
52 | <%= if not @is_base do %>
53 | <%= gettext("[only relevant for base domain]") %>
54 | <% end %>
55 | |
56 |
| <%= gettext "Host" %> | 5 |<%= gettext "IP" %> | 6 |<%= gettext "Classification" %> | 7 |<%= gettext "URLs" %> | 8 |
|---|---|---|---|
15 | <%= host %>
16 |
17 |
|
30 | <%= host_info.ip %> | 31 |<%= Webbkoll.Trackers.check(PublicSuffix.registrable_domain(host, ignore_private: true)) %> | 32 |33 | |
<%= gettext(~s|We use Mozilla's version of Disconnect's open source list of trackers to classify hosts.|, url_mozilla: "https://github.com/mozilla-services/shavar-prod-lists", url_disconnect: "https://github.com/disconnectme/disconnect-tracking-protection") |> raw %>
39 | -------------------------------------------------------------------------------- /assets/scss/.sass-cache/72dda0c11013fc7994d6c543544dc280a238d0cf/_appearance.scssc: -------------------------------------------------------------------------------- 1 | 3.4.21 (Selective Steve) 2 | 3e3b77ca8717a4a8fb3d4309b1db9fd8a47d2dca 3 | o:Sass::Tree::RootNode:@children[o:Sass::Tree::MixinDefNode : 4 | @nameI"appearance:ET: 5 | @args[[o:!Sass::Script::Tree::Variable;I" 6 | value; T:@underscored_nameI" 7 | value; T: 8 | @linei:@source_rangeo:Sass::Source::Range :@start_poso:Sass::Source::Position; i:@offseti: @end_poso;; i;i: 9 | @fileI""bourbon/css3/_appearance.scss; T:@importero: Sass::Importers::Filesystem: 10 | @rootI"A/home/andersju/jobb/dataskydd/syzygy/bourbontest/stylesheets; T:@real_rootI"A/home/andersju/jobb/dataskydd/syzygy/bourbontest/stylesheets; T:@same_name_warningso:Set: 11 | @hash} F:@filename@: @options{ 0:@splat0;[o:Sass::Tree::MixinNode;I" prefixer; T; 12 | [o: Sass::Script::Tree::Literal :@valueo: Sass::Script::Value::String ;!I"appearance; T: 13 | @type:identifier:"@deprecated_interp_equivalent0;@; i;o; ;o;; i;i;o;; i;i$;@;@;@o;;I" 14 | value; T;I" 15 | value; T; i;o; ;o;; i;i&;o;; i;i,;@;@;@;@o:$Sass::Script::Tree::ListLiteral:@elements[ 16 | o; ;!o;" ;!I"webkit; T;#;$;%0;@; i;o; ;o;; i;i.;o;; i;i4;@;@;@o; ;!o;" ;!I"moz; T;#;$;%0;@; i;o; ;o;; i;i5;o;; i;i8;@;@;@o; ;!o;" ;!I"ms; T;#;$;%0;@; i;o; ;o;; i;i9;o;; i;i;;@;@;@o; ;!o;" ;!I"o; T;#;$;%0;@; i;o; ;o;; i;i<;o;; i;i=;@;@;@o; ;!o;" ;!I" spec; T;#;$;%0;@; i;o; ;o;; i;i>;o;; i;iB;@;@;@:@separator: 17 | space; i;o; ;o;; i;i-;o;; i;iB;@;@;@;@:@keywordso:Sass::Util::NormalizedMap:@key_strings{ : @map{ ;0:@kwarg_splat0;[ ; i;o; ;o;; i;i;o;; i;iC;@;@;@; i;o; ;o;; i;i;o;; i;i ;@;@:@has_childrenT;@:@templateI"b@mixin appearance($value) { 18 | @include prefixer(appearance, $value, webkit moz ms o spec); 19 | } 20 | ; T; i;o; ;o;; i;i;o;; i;i;@;@;/T;@ -------------------------------------------------------------------------------- /assets/scss/_icons.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'icomoon'; 3 | src: 4 | url('../fonts/icomoon.ttf?3whmfg') format('truetype'), 5 | url('../fonts/icomoon.woff?3whmfg') format('woff'), 6 | url('../fonts/icomoon.svg?3whmfg#icomoon') format('svg'); 7 | font-weight: normal; 8 | font-style: normal; 9 | } 10 | 11 | [class^="icon-"], [class*=" icon-"] { 12 | /* use !important to prevent issues with browser extensions that change fonts */ 13 | font-family: 'icomoon' !important; 14 | speak: none; 15 | font-style: normal; 16 | font-weight: normal; 17 | font-variant: normal; 18 | text-transform: none; 19 | line-height: 1; 20 | 21 | /* Better Font Rendering =========== */ 22 | -webkit-font-smoothing: antialiased; 23 | -moz-osx-font-smoothing: grayscale; 24 | } 25 | 26 | .icon-sort-down:before { 27 | content: "\f0dd"; 28 | } 29 | .icon-clock:before { 30 | content: "\e94e"; 31 | } 32 | .icon-search:before { 33 | content: "\e986"; 34 | } 35 | .icon-lock:before { 36 | content: "\e98f"; 37 | } 38 | .icon-unlock-alt:before { 39 | content: "\e990"; 40 | } 41 | .icon-gavel:before { 42 | content: "\e9a8"; 43 | } 44 | .icon-sphere:before { 45 | content: "\e9c9"; 46 | } 47 | .icon-link:before { 48 | content: "\e9cb"; 49 | } 50 | .icon-eye-slash:before { 51 | content: "\e9d1"; 52 | } 53 | .icon-notification:before { 54 | content: "\ea08"; 55 | } 56 | .icon-question-circle:before { 57 | content: "\ea09"; 58 | } 59 | .icon-plus:before { 60 | content: "\ea0a"; 61 | } 62 | .icon-minus:before { 63 | content: "\ea0b"; 64 | } 65 | .icon-info:before { 66 | content: "\ea0c"; 67 | } 68 | .icon-times:before { 69 | content: "\ea0f"; 70 | } 71 | .icon-check:before { 72 | content: "\ea10"; 73 | } 74 | .icon-redo:before { 75 | content: "\ea2e"; 76 | } 77 | .icon-circle-up:before { 78 | content: "\ea41"; 79 | } 80 | .icon-circle-down:before { 81 | content: "\ea43"; 82 | } 83 | .icon-check-square:before { 84 | content: "\ea52"; 85 | } 86 | .icon-new-tab:before { 87 | content: "\ea7e"; 88 | } 89 | -------------------------------------------------------------------------------- /assets/scss/.sass-cache/72dda0c11013fc7994d6c543544dc280a238d0cf/_user-select.scssc: -------------------------------------------------------------------------------- 1 | 3.4.21 (Selective Steve) 2 | 2d413db6645a8aefe9f2439edc11f4d207f44337 3 | o:Sass::Tree::RootNode:@children[o:Sass::Tree::MixinDefNode : 4 | @nameI"user-select:ET: 5 | @args[[o:!Sass::Script::Tree::Variable;I" 6 | value; T:@underscored_nameI" 7 | value; T: 8 | @linei:@source_rangeo:Sass::Source::Range :@start_poso:Sass::Source::Position; i:@offseti: @end_poso;; i;i: 9 | @fileI"#bourbon/css3/_user-select.scss; T:@importero: Sass::Importers::Filesystem: 10 | @rootI"A/home/andersju/jobb/dataskydd/syzygy/bourbontest/stylesheets; T:@real_rootI"A/home/andersju/jobb/dataskydd/syzygy/bourbontest/stylesheets; T:@same_name_warningso:Set: 11 | @hash} F:@filename@: @options{ o: Sass::Script::Tree::Literal :@valueo: Sass::Script::Value::String ;I" none; T: 12 | @type:identifier:"@deprecated_interp_equivalent0;@; i;o; ;o;; i;i!;o;; i;i%;@;@;@:@splat0;[o:Sass::Tree::MixinNode;I" prefixer; T; 13 | [o; ;o; ;I"user-select; T;!;";#0;@; i;o; ;o;; i;i;o;; i;i%;@;@;@o;;I" 14 | value; T;I" 15 | value; T; i;o; ;o;; i;i';o;; i;i-;@;@;@;@o:$Sass::Script::Tree::ListLiteral:@elements[ o; ;o; ;I"webkit; T;!;";#0;@; i;o; ;o;; i;i/;o;; i;i5;@;@;@o; ;o; ;I"moz; T;!;";#0;@; i;o; ;o;; i;i6;o;; i;i9;@;@;@o; ;o; ;I"ms; T;!;";#0;@; i;o; ;o;; i;i:;o;; i;i<;@;@;@o; ;o; ;I" spec; T;!;";#0;@; i;o; ;o;; i;i=;o;; i;iA;@;@;@:@separator: 16 | space; i;o; ;o;; i;i.;o;; i;iA;@;@;@;@:@keywordso:Sass::Util::NormalizedMap:@key_strings{ : @map{ ;$0:@kwarg_splat0;[ ; i;o; ;o;; i;i;o;; i;iB;@;@;@; i;o; ;o;; i;i;o;; i;i';@;@:@has_childrenT;@:@templateI"h@mixin user-select($value: none) { 17 | @include prefixer(user-select, $value, webkit moz ms spec); 18 | } 19 | ; T; i;o; ;o;; i;i;o;; i;i;@;@;/T;@ -------------------------------------------------------------------------------- /assets/scss/_tooltip.scss: -------------------------------------------------------------------------------- 1 | .tooltip-item { 2 | $base-border-color: gainsboro !default; 3 | $base-border-radius: 3px !default; 4 | $base-line-height: 1.5em !default; 5 | $dark-gray: #333 !default; 6 | $base-font-color: $dark-gray !default; 7 | $tooltip-background: white; 8 | $tooltip-color: $base-font-color; 9 | $tooltip-max-width: 16em; 10 | $tooltip-arrow-width: 8px; 11 | $tooltip-shadow: 0 2px 2px silver; 12 | $tooltip-distance-from-item: 3em; 13 | $tooltip-arrow-distance-from-box: -1.3em; 14 | 15 | background: $tooltip-background; 16 | border: 1px solid $base-border-color; 17 | border-radius: $base-border-radius; 18 | display: inline-block; 19 | padding: 0.5em 1em; 20 | position: relative; 21 | text-align: center; 22 | 23 | &:focus, 24 | &:hover .tooltip { 25 | opacity: 1; 26 | visibility: visible; 27 | } 28 | 29 | .tooltip { 30 | @include position(absolute, null 0 $tooltip-distance-from-item 0); 31 | background-color: $tooltip-background; 32 | background: #fff; 33 | border-radius: $base-border-radius; 34 | box-shadow: $tooltip-shadow; 35 | color: $tooltip-color; 36 | font-size: 0.9em; // Make sure you use -webkit-backface-visibility: hidden; on the body element to prevent 1px nudging bugs. 37 | line-height: 1.5em; 38 | margin: 0 auto; 39 | max-width: $tooltip-max-width; 40 | opacity: 0; 41 | padding: 1em; 42 | text-align: center; 43 | transition: all 0.2s ease-in-out; 44 | visibility: hidden; 45 | z-index: 10; 46 | 47 | p { 48 | color: $base-font-color; 49 | line-height: $base-line-height; 50 | margin: 0; 51 | } 52 | 53 | &::after { 54 | @include position(absolute, null 0); 55 | border: $tooltip-arrow-width solid transparent; 56 | bottom: $tooltip-arrow-distance-from-box; 57 | color: $tooltip-background; 58 | content: "▼"; 59 | font-size: 1.4em; 60 | margin-left: -$tooltip-arrow-width; 61 | text-align: center; 62 | text-shadow: $tooltip-shadow; 63 | } 64 | } 65 | } -------------------------------------------------------------------------------- /assets/scss/neat/settings/_grid.scss: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | /// Sets the relative width of a single grid column. The unit used should be the same one used to define `$gutter`. To learn more about `modular-scale()` see [Bourbon docs](http://bourbon.io/docs/#modular-scale). Set with a `!global` flag. 4 | /// 5 | /// @type Number (Unit) 6 | 7 | $column: modular-scale(3, 1em, $golden) !default; 8 | 9 | /// Sets the relative width of a single grid gutter. The unit used should be the same one used to define `$column`. To learn more about `modular-scale()` see [Bourbon docs](http://bourbon.io/docs/#modular-scale). Set with the `!global` flag. 10 | /// 11 | /// @type Number (Unit) 12 | 13 | $gutter: modular-scale(1, 1em, $golden) !default; 14 | 15 | /// Sets the total number of columns in the grid. Its value can be overridden inside a media query using the `media()` mixin. Set with the `!global` flag. 16 | /// 17 | /// @type Number (Unitless) 18 | 19 | $grid-columns: 12 !default; 20 | 21 | /// Sets the max-width property of the element that includes `outer-container()`. Set with the `!global` flag. 22 | /// 23 | /// @type Number (Unit) 24 | /// 25 | $max-width: 1300px !default; 26 | 27 | /// When set to true, it sets the box-sizing property of all elements to `border-box`. Set with a `!global` flag. 28 | /// 29 | /// @type Bool 30 | /// 31 | /// @example css - CSS Output 32 | /// html { 33 | /// box-sizing: border-box; } 34 | /// 35 | /// *, *::after, *::before { 36 | /// box-sizing: inherit; 37 | /// } 38 | 39 | $border-box-sizing: true !default; 40 | 41 | /// Sets the default [media feature](http://www.w3.org/TR/css3-mediaqueries/#media) that `media()` and `new-breakpoint()` revert to when only a breakpoint value is passed. Set with a `!global` flag. 42 | /// 43 | /// @type String 44 | 45 | $default-feature: min-width; // Default @media feature for the breakpoint() mixin 46 | 47 | ///Sets the default layout direction of the grid. Can be `LTR` or `RTL`. Set with a `!global` flag. 48 | /// 49 | ///@type String 50 | 51 | $default-layout-direction: LTR !default; 52 | -------------------------------------------------------------------------------- /assets/scss/neat/functions/_new-breakpoint.scss: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | /// Returns a media context (media query / grid context) that can be stored in a variable and passed to `media()` as a single-keyword argument. Media contexts defined using `new-breakpoint` are used by the visual grid, as long as they are defined before importing Neat. 4 | /// 5 | /// @param {List} $query 6 | /// A list of media query features and values. Each `$feature` should have a corresponding `$value`. 7 | /// 8 | /// If there is only a single `$value` in `$query`, `$default-feature` is going to be used. 9 | /// 10 | /// The number of total columns in the grid can be set by passing `$columns` at the end of the list (overrides `$total-columns`). For a list of valid values for `$feature`, click [here](http://www.w3.org/TR/css3-mediaqueries/#media1). 11 | /// 12 | /// @param {Number (unitless)} $total-columns [$grid-columns] 13 | /// - Number of columns to use in the new grid context. Can be set as a shorthand in the first parameter. 14 | /// 15 | /// @example scss - Usage 16 | /// $mobile: new-breakpoint(max-width 480px 4); 17 | /// 18 | /// .element { 19 | /// @include media($mobile) { 20 | /// @include span-columns(4); 21 | /// } 22 | /// } 23 | /// 24 | /// @example css - CSS Output 25 | /// @media screen and (max-width: 480px) { 26 | /// .element { 27 | /// display: block; 28 | /// float: left; 29 | /// margin-right: 7.42297%; 30 | /// width: 100%; 31 | /// } 32 | /// .element:last-child { 33 | /// margin-right: 0; 34 | /// } 35 | /// } 36 | 37 | @function new-breakpoint($query: $feature $value $columns, $total-columns: $grid-columns) { 38 | @if length($query) == 1 { 39 | $query: $default-feature nth($query, 1) $total-columns; 40 | } @else if is-even(length($query)) { 41 | $query: append($query, $total-columns); 42 | } 43 | 44 | @if is-not(belongs-to($query, $visual-grid-breakpoints)) { 45 | $visual-grid-breakpoints: append($visual-grid-breakpoints, $query, comma) !global; 46 | } 47 | 48 | @return $query; 49 | } 50 | -------------------------------------------------------------------------------- /assets/scss/bourbon/bourbon/library/_hide-visually.scss: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | /// Hides an element visually while still allowing the content to be accessible 4 | /// to assistive technology, e.g. screen readers. Passing `unhide` will reverse 5 | /// the affects of the hiding, which is handy for showing the element on focus, 6 | /// for example. 7 | /// 8 | /// @link https://goo.gl/Vf1TGn 9 | /// 10 | /// @argument {string} $toggle [hide] 11 | /// Accepts `hide` or `unhide`. `unhide` reverses the affects of `hide`. 12 | /// 13 | /// @example scss 14 | /// .element { 15 | /// @include hide-visually; 16 | /// 17 | /// &:active, 18 | /// &:focus { 19 | /// @include hide-visually("unhide"); 20 | /// } 21 | /// } 22 | /// 23 | /// // CSS Output 24 | /// .element { 25 | /// border: 0; 26 | /// clip: rect(1px, 1px, 1px, 1px); 27 | /// clip-path: inset(100%); 28 | /// height: 1px; 29 | /// overflow: hidden; 30 | /// padding: 0; 31 | /// position: absolute; 32 | /// width: 1px; 33 | /// } 34 | /// 35 | /// .hide-visually:active, 36 | /// .hide-visually:focus { 37 | /// clip: auto; 38 | /// clip-path: none; 39 | /// height: auto; 40 | /// overflow: visible; 41 | /// position: static; 42 | /// width: auto; 43 | /// } 44 | /// 45 | /// @since 5.0.0 46 | 47 | @mixin hide-visually($toggle: "hide") { 48 | @if not index("hide" "unhide", $toggle) { 49 | @error "`#{$toggle}` is not a valid value for the `$toggle` argument in " + 50 | "the `hide-visually` mixin. Must be either `hide` or `unhide`."; 51 | } @else if $toggle == "hide" { 52 | border: 0; 53 | clip: rect(1px, 1px, 1px, 1px); 54 | clip-path: inset(100%); 55 | height: 1px; 56 | overflow: hidden; 57 | padding: 0; 58 | position: absolute; 59 | white-space: nowrap; 60 | width: 1px; 61 | } @else if $toggle == "unhide" { 62 | clip: auto; 63 | clip-path: none; 64 | height: auto; 65 | overflow: visible; 66 | position: static; 67 | white-space: inherit; 68 | width: auto; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /lib/webbkoll_web/templates/site/_localstorage.html.heex: -------------------------------------------------------------------------------- 1 |<%= gettext("localStorage not used.") %>
10 | <% else %> 11 |<%= gettext("localStorage used:") %>
12 | 13 || <%= gettext("Key") %> | 17 |<%= gettext("Value") %> | 18 |
|---|---|
| <%= truncate(key, 50) %> | 24 |<%= truncate(value, 50) %> | 25 |
7 | Webbkoll is also available in German (auf Deutsch), Norwegian (norsk), Swedish (svenska) and Italian (italiano)! 8 |
9 |20 | <%= gettext "This tool helps you check what data-protecting measures a site has taken to help you exercise control over your privacy." %> 21 |
22 | 23 | <%= gettext(~s|Due to abuse Webbkoll will, until further notice, throw away query parameters and path from the URL you enter; i.e., if you enter http://example.com/foo/?bar=42, http://example.com will be checked.|) |> raw() %>
<%= gettext(~s|Please note:|) %>
28 |<%= gettext "No third-party requests." %>
24 |<%= gettext("A third-party request is a request to a domain that's not %{domain} or one of its subdomains.", domain: @site.data.reg_domain) |> raw %>
31 | <%= @site.data.third_party_request_types.total %> <%= ngettext "request", "requests", @site.data.third_party_request_types.total %> (<%= ngettext "1 secure", "%{count} secure", @site.data.third_party_request_types.secure %>, <%= ngettext "%{count} insecure", "%{count} insecure", @site.data.third_party_request_types.insecure %>) <%= gettext "to" %> <%= @site.data.third_party_request_types.unique_hosts %> <%= ngettext "unique", "unique", @site.data.third_party_request_types.unique_hosts %> <%= ngettext "host", "hosts", @site.data.third_party_request_types.unique_hosts %>. 32 |
33 |<%= gettext("A third-party request is a request to a domain that's not %{domain} or one of its subdomains.", domain: @site.data.reg_domain) |> raw %>
<%= icon(:law) %> GDPR: <%= [~w|rec 69|, ~w|rec 70|, ~w|art 5 5.1.b-c|, ~w|art 25|] |> gdpr() |> raw() %>.
40 |<%= gettext(~s|The server %{domain} had the IP address %{host_ip} during our test.|, domain: @site.data.host, host_ip: @site.data.host_ip) |> raw %>
8 | 9 |<%= gettext(~s|You can find information about this IP address using third-party tools such as the following:|) %>
10 | 11 |<%= gettext(~s|When using tools that do geolocation, please note that the estimated country can be wrong, especially for websites that use CDNs.|) %>
18 |