diff --git a/.github/workflows/uptime.yml b/.github/workflows/uptime.yml
index 0820b59..3779892 100644
--- a/.github/workflows/uptime.yml
+++ b/.github/workflows/uptime.yml
@@ -4,8 +4,6 @@ on:
push:
branches:
- master
- schedule:
- - cron: "*/15 * * * *"
workflow_dispatch:
permissions:
diff --git a/Petabit.Tests/ApplicationTests.cs b/Petabit.Tests/ApplicationTests.cs
index 17565c5..b1d75d4 100644
--- a/Petabit.Tests/ApplicationTests.cs
+++ b/Petabit.Tests/ApplicationTests.cs
@@ -96,6 +96,34 @@ public async Task PrivacyPageLoadsGlobalReadableContentStyles()
Assert.Contains("body.dark-mode .table", styles);
}
+ [Theory]
+ [InlineData("en", "Cookie policy", "Manage analytics cookies")]
+ [InlineData("hr", "Politika kolačića", "Upravljaj analitičkim kolačićima")]
+ [InlineData("de", "Cookie-Richtlinie", "Analyse-Cookies verwalten")]
+ public async Task PrivacyCookieDetailsUseRequestedLanguage(string culture, string heading, string manageText)
+ {
+ using var request = new HttpRequestMessage(HttpMethod.Get, "/Home/Privacy");
+ request.Headers.AcceptLanguage.ParseAdd(culture);
+
+ var response = await _client.SendAsync(request);
+ var body = await response.Content.ReadAsStringAsync();
+
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.Contains($"", body);
+ Assert.Contains(heading, body);
+ Assert.Contains(manageText, body);
+ }
+
+ [Fact]
+ public async Task BooksPageUsesRealPublisherLinks()
+ {
+ var body = await _client.GetStringAsync("/Home/Books");
+
+ Assert.DoesNotContain("example.com", body);
+ Assert.Contains("informit.com/store/clean-code", body);
+ Assert.Contains("store.pragprog.com/titles/tpp20", body);
+ }
+
[Fact]
public async Task ContentSecurityPolicyMatchesEveryInlineScriptNonce()
{
diff --git a/Petabit/Resources/Views.Home.Privacy.de.resx b/Petabit/Resources/Views.Home.Privacy.de.resx
index 42ea295..3694eb5 100644
--- a/Petabit/Resources/Views.Home.Privacy.de.resx
+++ b/Petabit/Resources/Views.Home.Privacy.de.resx
@@ -171,4 +171,24 @@
Petabit koristi samo nužne funkcionalne tehnologije i, uz vašu privolu, analitičke kolačiće. Analitika nije potrebna za korištenje stranice.
+@Localizer["CookiePolicyIntro"]
-| Naziv | Svrha | Trajanje |
|---|---|---|
| @Localizer["Name"] | @Localizer["Purpose"] | @Localizer["Duration"] |
| .AspNetCore.Culture | Pamti odabrani jezik stranice. | 1 godina |
| petabit-analytics-consent | Lokalna pohrana odluke o analitičkim kolačićima u pregledniku. | Dok ne promijenite odluku ili ne obrišete podatke preglednika |
| .AspNetCore.Culture | @Localizer["CulturePurpose"] | @Localizer["OneYear"] |
| petabit-analytics-consent | @Localizer["ConsentPurpose"] | @Localizer["ConsentDuration"] |
Google Analytics učitava se samo nakon odabira Prihvaćam. Prikuplja zbirne podatke kao što su broj korisnika i sesija, približna lokacija, preglednik, uređaj i izvor dolaska. Ne koristimo ga za izravno utvrđivanje identiteta posjetitelja.
+@Localizer["AnalyticsDescription"]
| Naziv | Svrha | Trajanje |
|---|---|---|
| @Localizer["Name"] | @Localizer["Purpose"] | @Localizer["Duration"] |
| _ga | Razlikuje jedinstvene korisnike. | Do 2 godine |
| _ga_W5Z2EDHVY4 | Čuva stanje sesije za Google Analytics 4. | Do 2 godine |
| _ga | @Localizer["GaPurpose"] | @Localizer["UpToTwoYears"] |
| _ga_W5Z2EDHVY4 | @Localizer["GaSessionPurpose"] | @Localizer["UpToTwoYears"] |
Više o GA4 kolačićima: Google Analytics dokumentacija.
+@Localizer["GaMoreInfo"] @Localizer["GaDocumentation"].
-Analitičke kolačiće možete prihvatiti ili odbiti pri prvom posjetu. Svoju odluku možete promijeniti u bilo kojem trenutku.
- +@Localizer["ConsentManagementText"]
+@Localizer["DataSecurityText"]
diff --git a/README.md b/README.md index 0b4ad3e..3e62ed3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,9 @@ [](https://github.com/ChevCellios/Petabit/actions/workflows/ci.yml) [](https://github.com/ChevCellios/Petabit/actions/workflows/security.yml) -[](https://github.com/ChevCellios/Petabit/actions/workflows/uptime.yml) +[](https://github.com/ChevCellios/Petabit/actions/workflows/uptime.yml) +[](https://github.com/ChevCellios/Petabit/actions/workflows/station-status-freshness.yml) +[](https://betterstack.com/uptime)    @@ -64,7 +66,7 @@ Izvori podataka: - timeout, retry i circuit breaker za vanjski ISS servis - `/health/live` provjera procesa i `/health/ready` provjera dostupnosti ISS servisa - post-deployment smoke test nakon svakog pusha u `master` -- uptime provjera produkcije svakih 15 minuta +- Better Stack provjera produkcijskih liveness, readiness i ISS API endpointova svake 3 minute - tjedna provjera starosti kuriranih podataka o ISS posadi i letjelicama - smoke test početne stranice, readiness endpointa i ISS trackera - strukturirani JSON logovi u produkciji