feat: Security CSRF Fix, Logout optimierung, Footer Anpassung, Rechtstexteanpassung
Docker Image bauen und veroeffentlichen / build-and-push (push) Failing after 1m33s

This commit is contained in:
Nick Szaunig committed 2026-09-03 13:51:50 +02:00
1 parent 0753a3bc8a
commit 4d3100e9ba
28 files changed
+802 -121

No files matched your search

+121 -21
View File
@@ -32,12 +32,11 @@ export const en: Dictionary = {
columnShopping: "Shopping",
columnLegal: "Legal",
aboutUs: "About us",
shipping: "Shipping",
pickup: "Pickup",
businessCustomers: "Business customers",
trackOrder: "Track order",
tagline: "Honey from the Western Woods.",
bottomLine: "Harvested · bottled · shipped from our own apiary in Altenmünster",
socialAriaLabel: (platform) => `Wabenhain on ${platform}`,
},
legalTitles: {
impressum: "Legal Notice",
@@ -167,12 +166,42 @@ export const en: Dictionary = {
emailLabel: "Email",
sections: [
{
heading: "Information pursuant to § 5 TMG",
paragraphs: ["[PLACEHOLDER] Owner: First and last name"],
heading: "Information pursuant to § 5 TMG (German Telemedia Act)",
paragraphs: [
"[PLACEHOLDER — enter the name of the owner / managing director]",
"[PLACEHOLDER — enter the legal form, e.g. sole proprietorship/GmbH. If registered in the commercial register: add the register court and registration number.]",
],
},
{
heading: "VAT ID",
paragraphs: ["[PLACEHOLDER] VAT identification number pursuant to §27a of the German VAT Act (UStG)."],
paragraphs: [
"[PLACEHOLDER] VAT identification number pursuant to § 27a of the German VAT Act (UStG).",
"If the small business regulation under § 19 UStG applies instead, no VAT ID is required — this should be noted here instead (e.g. \"No VAT is charged pursuant to § 19 UStG.\").",
],
},
{
heading: "Editorially Responsible",
paragraphs: [
"Responsible for editorial content pursuant to § 18(2) MStV (German Interstate Media Treaty), including the articles in our \"Honey Knowledge\" section: [name as above].",
],
},
{
heading: "Liability for Content",
paragraphs: [
"As a service provider, we are responsible for our own content on these pages under the general laws pursuant to § 7(1) TMG. However, pursuant to §§ 8 to 10 TMG, we as a service provider are not obligated to monitor transmitted or stored third-party information or to investigate circumstances that indicate unlawful activity. Obligations to remove or block the use of information under general law remain unaffected. However, liability in this regard is only possible from the point in time at which we become aware of a specific infringement. Upon becoming aware of any such infringements, we will remove the relevant content immediately.",
],
},
{
heading: "Liability for Links",
paragraphs: [
"Our site contains links to external third-party websites over whose content we have no influence. We therefore cannot accept any liability for this third-party content. The respective provider or operator of the linked pages is always responsible for their content. The linked pages were checked for possible legal violations at the time of linking. No unlawful content was recognizable at that time. However, permanent monitoring of the content of linked pages is not reasonable without concrete evidence of a legal violation. We will remove such links immediately upon becoming aware of any legal violations.",
],
},
{
heading: "Copyright",
paragraphs: [
"The content and works created by the site operators on these pages are subject to German copyright law. Reproduction, editing, distribution, and any kind of use outside the limits of copyright law require the written consent of the respective author or creator. Downloads and copies of this site are only permitted for private, non-commercial use.",
],
},
{
heading: "Dispute Resolution",
@@ -187,53 +216,61 @@ export const en: Dictionary = {
sections: [
{
heading: "1. Data Controller",
paragraphs: ["[PLACEHOLDER] Data protection officer (if legally required): name, contact details."],
paragraphs: [
"If legally required (e.g. for extensive processing of special categories of data, or where more than 20 people are constantly involved in the automated processing of personal data, § 38 BDSG), we name a data protection officer here: [PLACEHOLDER — name and contact details, if applicable].",
],
},
{
heading: "2. Server Log Files When Visiting the Website",
heading: "2. Hosting",
paragraphs: [
"Our website is hosted by an external hosting provider: [PLACEHOLDER — enter the hosting provider's name and address]. We have a data processing agreement with this provider pursuant to Art. 28 GDPR. On our behalf, the hosting provider processes in particular the data collected in the server log files (see item 3) as well as all data entered via this website.",
],
},
{
heading: "3. Server Log Files When Visiting the Website",
paragraphs: [
"When you access our website, our hosting provider automatically collects technical access data (e.g. IP address, date and time of access, page accessed, browser type, referrer URL) in what are known as server log files. This processing is technically necessary to provide the website (Art. 6(1)(f) GDPR) and is deleted automatically after a short time.",
],
},
{
heading: "3. Order and Contract Processing",
heading: "4. Order and Contract Processing",
paragraphs: [
"When you place an order, we collect the data necessary for contract, payment, and shipping processing (name, address, email, phone number if provided, and the items ordered). The legal basis is Art. 6(1)(b) GDPR (contract performance).",
"Payments are processed by our payment provider, Stripe Payments Europe, Ltd. The data necessary for payment processing is transmitted to Stripe for this purpose. Stripe's privacy policy also applies (stripe.com/privacy).",
"Payments are processed by our payment provider, Stripe Payments Europe, Ltd. The data necessary for payment processing is transmitted to Stripe for this purpose. Stripe's privacy policy also applies (stripe.com/privacy). Where this involves transferring data to Stripe-affiliated companies outside the EU/EEA (in particular Stripe, Inc. in the USA), this is done on the basis of EU Standard Contractual Clauses pursuant to Art. 46 GDPR.",
"Order and invoice data is retained for the legally required period due to commercial and tax record-keeping obligations (§ 257 HGB, § 147 AO of German law).",
],
},
{
heading: "4. Customer Account",
heading: "5. Customer Account",
paragraphs: [
"If you create a customer account, we store the data you provide (name, email, password encrypted as a hash) as well as any delivery addresses you optionally save, to give you access to your order history, invoices, and a faster checkout. The legal basis is Art. 6(1)(b) GDPR. You can have your account and associated data deleted at any time via an informal request to us.",
"A technically necessary cookie is set for login — see our Cookie Policy.",
],
},
{
heading: "5. Newsletter (Harvest Mail)",
heading: "6. Newsletter (Harvest Mail)",
paragraphs: [
"If you sign up for our harvest mail, we use your email address exclusively to send information about new harvests. The legal basis is your consent (Art. 6(1)(a) GDPR). You can unsubscribe at any time via the link in every email or through your customer account.",
],
},
{
heading: "6. Contact and Business Customer Form",
heading: "7. Contact and Business Customer Form",
paragraphs: [
"If you contact us via a form (e.g. a business customer inquiry), we process the data you provide to handle your request. The legal basis is Art. 6(1)(b) or (f) GDPR.",
],
},
{
heading: "7. Google Reviews",
heading: "8. Google Reviews",
paragraphs: [
"On our homepage, we display reviews from our Google Business Profile. The review text is retrieved server-side via the Google Places API for this purpose; your browser does not establish its own connection to Google. Provider: Google Ireland Limited. Google's privacy policy applies (policies.google.com/privacy).",
"On our homepage, we display reviews from our Google Business Profile. The review text is retrieved server-side via the Google Places API for this purpose; your browser does not establish its own connection to Google. Provider: Google Ireland Limited, though a transfer to Google LLC (USA) cannot be ruled out. Google's privacy policy applies (policies.google.com/privacy).",
],
},
{
heading: "8. Cookies",
heading: "9. Cookies",
paragraphs: ["Details on the cookies used on this website can be found in our Cookie Policy."],
},
{
heading: "9. Your Rights",
heading: "10. Your Rights",
paragraphs: [
"You have the right to access (Art. 15 GDPR), rectification (Art. 16 GDPR), erasure (Art. 17 GDPR), restriction of processing (Art. 18 GDPR), data portability (Art. 20 GDPR), and objection to processing (Art. 21 GDPR) of your personal data.",
"You also have the right to lodge a complaint with a data protection supervisory authority, e.g. the Bavarian State Office for Data Protection Supervision.",
@@ -246,22 +283,61 @@ export const en: Dictionary = {
sections: [
{
heading: "1. Scope",
paragraphs: ["These Terms & Conditions apply to all orders placed via wabenhain.com between Wabenhain and its customers."],
paragraphs: [
"These Terms & Conditions apply to all orders placed via wabenhain.com between Wabenhain and its customers, both consumers within the meaning of § 13 BGB and businesses within the meaning of § 14 BGB.",
],
},
{
heading: "2. Formation of Contract",
paragraphs: [
"The presentation of products in the shop does not constitute a binding offer. By completing an order, you submit a binding offer to purchase, which we accept by confirming it.",
"The presentation of products in the shop does not constitute a binding offer, but rather a non-binding invitation for you to place an order. By completing an order, you submit a binding offer to purchase, which we accept by confirming it via email or by delivering the goods.",
],
},
{
heading: "3. Prices and Shipping Costs",
paragraphs: ["All prices include statutory VAT. Shipping costs are shown transparently at checkout."],
paragraphs: ["All prices include statutory VAT. Shipping costs are shown transparently at checkout — see also our \"Shipping & Payment\" page."],
},
{
heading: "4. Delivery and Pickup",
heading: "4. Payment Methods",
paragraphs: [
"We offer PayPal, credit card, Apple Pay, and Google Pay via our payment provider Stripe. Payment by bank transfer is available on request. See our \"Shipping & Payment\" page and our Privacy Policy for details on Stripe.",
"The purchase price is generally due immediately upon ordering (prepayment via the chosen payment method), unless otherwise agreed.",
],
},
{
heading: "5. Delivery and Pickup",
paragraphs: ["We deliver within Germany. Alternatively, goods can be picked up directly from us in Altenmünster by arrangement."],
},
{
heading: "6. Right of Withdrawal",
paragraphs: [
"Consumers generally have a statutory right of withdrawal. For details, in particular exceptions for perishable goods such as honey, please see our separate Right of Withdrawal page.",
],
},
{
heading: "7. Warranty",
paragraphs: [
"Statutory warranty rights apply (§§ 434 et seq. BGB). For consumers, the limitation period for defect claims is two years from delivery of the goods.",
"For food products such as honey, the printed best-before date (BBD) indicates the date until which the product retains its specific properties when stored properly — it is not an expiry date and does not, by itself, constitute a defect.",
],
},
{
heading: "8. Retention of Title",
paragraphs: ["The delivered goods remain our property until paid for in full."],
},
{
heading: "9. Dispute Resolution",
paragraphs: [
"The European Commission provides a platform for online dispute resolution (ODR): https://ec.europa.eu/consumers/odr. We are not obligated, and not willing, to participate in dispute resolution proceedings before a consumer arbitration board.",
],
},
{
heading: "10. Final Provisions",
paragraphs: [
"The law of the Federal Republic of Germany applies, excluding the UN Convention on Contracts for the International Sale of Goods. For consumers, this only applies to the extent that it does not deprive them of the protection granted by mandatory provisions of the law of their country of habitual residence.",
"Should any provision of these Terms & Conditions be or become invalid, the validity of the remaining provisions shall remain unaffected.",
],
},
],
},
widerrufPage: {
@@ -790,6 +866,11 @@ export const en: Dictionary = {
colLocation: "Location",
colBatches: "Batches",
colProducts: "Products",
colStatus: "Status",
statusPublished: "Published",
statusDraft: "Draft",
publish: "Publish",
unpublish: "Unpublish",
edit: "Edit",
noHarvestsYet: "No harvests created yet.",
newHarvestHeading: "Create new harvest",
@@ -798,7 +879,15 @@ export const en: Dictionary = {
harvestDateLabel: "Harvest date",
locationLabel: "Location",
descriptionLabel: "Description",
isPublishedLabel: "Publish immediately",
create: "Create",
syncHeading: "ApiCore sync",
syncIntro:
"Imports harvests from ApiCore as drafts (not publicly visible). Previously synced harvests that are already published are left untouched — only new or still-unpublished drafts are updated.",
syncButton: "Sync now",
syncResult: (created, updated, skipped, failed) =>
`Sync complete: ${created} created, ${updated} updated, ${skipped} skipped (already published)${failed > 0 ? `, ${failed} failed` : ""}.`,
syncError: "Sync with ApiCore failed.",
},
adminHarvestEditPage: {
backToHarvests: "Back to harvests",
@@ -808,6 +897,10 @@ export const en: Dictionary = {
harvestDateLabel: "Harvest date",
locationLabel: "Location",
descriptionLabel: "Description",
isPublishedLabel: "Publicly visible",
isPublishedHint: "Controls whether this harvest shows up on the website (shop, /ernten).",
draftNotice: "This harvest is currently only visible in the admin area (e.g. imported from ApiCore). Please review the details, then publish it.",
publishNow: "Publish now",
save: "Save",
},
adminProductsPage: {
@@ -945,6 +1038,10 @@ export const en: Dictionary = {
carrierPlaceholder: "e.g. DHL, DPD, Hermes",
trackingNumberLabel: "Tracking number",
saveTracking: "Save",
dhlHeading: "DHL shipping label",
dhlCreateButton: "Create shipping label",
dhlAlreadyCreated: (trackingNumber) => `DHL shipping label already created — tracking number ${trackingNumber}`,
dhlNotConfigured: "DHL isn't configured yet, see .env (DHL_API_KEY, DHL_API_SECRET, DHL_GKP_USERNAME, DHL_GKP_PASSWORD, DHL_ACCOUNT_NUMBER).",
},
adminOrdersPage: {
backToDashboard: "Back to dashboard",
@@ -998,6 +1095,7 @@ export const en: Dictionary = {
groupCompany: "Company details",
groupHome: "Homepage",
groupLegal: "Legal pages",
groupSocial: "Social media",
deLabel: "German",
enLabel: "English",
save: "Save",
@@ -1071,6 +1169,8 @@ export const en: Dictionary = {
firstNameLabel: "First name",
lastNameLabel: "Last name",
forgotPassword: "Forgot your password?",
ssoDivider: "or",
ssoButton: "Sign in with Microsoft",
greeting: (name) => `Hello, ${name}`,
verifyEmailPrompt: "Please confirm your email address — you can't place orders with this account until you do.",
resendVerification: "Resend link",
@@ -1090,7 +1190,7 @@ export const en: Dictionary = {
subscribe: "Subscribe",
unsubscribe: "Unsubscribe",
logoutAllDevicesHeading: "Log out all devices",
logoutAllDevicesDescription: "Ends all active sessions on other devices.",
logoutAllDevicesDescription: "Ends all active sessions, including this device. You'll need to sign in again.",
logout: "Log out",
privacy: {
heading: "Privacy",