|
|
@@ -29,11 +29,13 @@ doen.
|
|
|
| **G0.6** | Play-screenshots | ✅ Nieuwe set van 10 klaar (2026-09-19 avond). Alleen `tel-04-horeca.png` moet over zodra *Show Test Ads* uit staat |
|
|
|
| **nameten** | Na het services-script op productie | `node/<nid>.json` moet 403/404 geven i.p.v. 200 met 46 velden |
|
|
|
|
|
|
+| **110** | `MijnProfiel` ombouwen naar 3 tabs | **Eigenaar: Claude — bezig (2026-09-20).** Tab 1 *Mijn evenementen* (komende horeca-evenementen + horecakaarten met knop "+ Evenement aanmaken"), tab 2 *Stadseditor* (komende activiteiten + gemeenten met knop "+ Activiteit aanmaken"), tab 3 *Account*. Opzet zoals `Favorieten`. Drupal-kant (Bob): `mijn_aanmeldingen.json` krijgt `?type=` en `?komend=1`. Bijvangst: "Uitloggen" stond op `desktop: false` |
|
|
|
+
|
|
|
## 👤 BOB — OPEN, in volgorde van wat de livegang blokkeert
|
|
|
|
|
|
| # | Taak | Waarom nu |
|
|
|
|---|---|---|
|
|
|
-| **🔒 API dichtzetten** | `services-dicht.php` op **productie** | Eigen blok hieronder. Op devbob gedraaid en getest ✅ — dicht: user/geocoder/userestablishments/system; open en werkend: alle app-endpoints |
|
|
|
+| **🔒 API dichtzetten — FASE 2** | `node`, `file`, `taxonomy_term`, `taxonomy_vocabulary` | Fase 1 staat **op productie** en is nagemeten ✅. Fase 2 is een bewuste afweging — zie het blok |
|
|
|
| **G** | Google Play-checklist G0–G4 | Volledige checklist hieronder |
|
|
|
| **65** | De **ingelogde** doorloop | Kernfuncties zijn nooit op een release-build getest. Claude kan dit niet (geen wachtwoorden) |
|
|
|
| **AdMob** | `Show Test Ads` uit | App Settings → AdMob. Wacht op de Google-registratie |
|
|
|
@@ -266,106 +268,65 @@ taak 100 zette de padding op 40; opnieuw bekijken bij de volgende release-build)
|
|
|
drawer én de data-deletion-URL voor Play) en `/nl/support/privacybeleid`.
|
|
|
- **`devbob` staat niet meer in de levende app-code** (alleen in dode kopieën).
|
|
|
|
|
|
-## 🔒 LIVEGANG-BLOK: API-oppervlak dichtzetten · Eigenaar: Bob
|
|
|
-### Besluit Bob 2026-09-19: 156 + 156b worden ÉÉN taak, en die nemen we serieus.
|
|
|
-
|
|
|
-**Volgorde:**
|
|
|
-1. **156b eerst** (views-beperking) — dat is alleen lezen, de app vraagt
|
|
|
- aantoonbaar niet meer dan vijf views op, en Drupal waarschuwt er zelf 11x over.
|
|
|
-2. **156 daarna** via het drush-script (`services-dicht.php`): eerst droogdraai,
|
|
|
- dan `$DOE_HET = TRUE`, eerst devbob, dan productie.
|
|
|
- 📍 **Stand 2026-09-19: op devbob gedraaid en door Claude nagemeten — het doet
|
|
|
- precies wat het moet.**
|
|
|
-
|
|
|
- | moet dicht zijn | devbob |
|
|
|
- |---|---|
|
|
|
- | `user/1.json` · `user.json` · `geocoder.json` · `userestablishments.json` | **404** |
|
|
|
- | `POST system/connect.json` | **404** |
|
|
|
-
|
|
|
- | moet blijven werken | devbob |
|
|
|
- |---|---|
|
|
|
- | `plaatsen.json` · `plaatsen_bij_gemeente.json` · `horecacategorieen.json` | **200** |
|
|
|
- | alle vijf de views-endpoints | **200** |
|
|
|
- | `POST user/login.json` | **401** (bestaat, wijst alleen af) |
|
|
|
-
|
|
|
- `node/222338.json` geeft daar nog 200 — klopt, `node` staat in het script nog
|
|
|
- uitgecommentarieerd. **Productie volgt.*** Bijvangst: `system` bleek al dicht te staan — de vinkjes waren uit
|
|
|
- de geplakte HTML niet af te lezen ("Enabled" is daar een kolomlabel).
|
|
|
-3. **Fase 2** (`node`, `file`, `taxonomy_term`, `taxonomy_vocabulary`) stond
|
|
|
- gepland ná een accesslog-check. **Bob 2026-09-19: die check doen we niet.**
|
|
|
- Beslis dus zelf of je die vier aandurft; `node/retrieve` is de enige waarvan
|
|
|
- *bewezen* is dat hij lekt (zie hieronder), en een importer gebruikt Services
|
|
|
- vrijwel zeker niet — Feeds werkt via de interne Drupal-API.
|
|
|
-4. **Daarna meet Claude na:** `node/222338.json` moet 403/404 geven in plaats van
|
|
|
- 200 met 46 velden.
|
|
|
+## 🔒 API-oppervlak dichtzetten — FASE 1 AF OP PRODUCTIE (2026-09-20)
|
|
|
|
|
|
----
|
|
|
+**Bob draaide `services-dicht.php` op productie; Claude heeft nagemeten.**
|
|
|
+
|
|
|
+| moet dicht | productie |
|
|
|
+|---|---|
|
|
|
+| `user/1.json` · `geocoder.json` · `userestablishments.json` | **404** ✅ |
|
|
|
+| `POST system/connect.json` | **404** ✅ |
|
|
|
|
|
|
-### 🔴 156 · Services-endpoint `flutterdrup` staat veel te wijd open · Eigenaar: Bob
|
|
|
+| moet blijven werken | productie |
|
|
|
+|---|---|
|
|
|
+| `plaatsen` · `plaatsen_bij_gemeente` · `horecacategorieen` | **200** ✅ |
|
|
|
+| alle vijf views-endpoints | **200** ✅ |
|
|
|
+| `POST user/login.json` | **401** ✅ (bestaat, wijst af op onzin-inloggegevens) |
|
|
|
|
|
|
-**Gemeten 2026-09-19 op de resourcelijst die Bob plakte, plus live getest tegen
|
|
|
-productie.** De app gebruikt **24** methodes; er staan er tientallen aan die zij
|
|
|
-niet aanroept, waaronder schrijfoperaties.
|
|
|
+12 methodes uitgezet, gelogd in watchdog.
|
|
|
|
|
|
-**Hard aangetoond, anoniem, zonder enige login:**
|
|
|
-- `GET /nl/flutterdrup/node/222338.json` -> **200**, **46 velden**, inclusief
|
|
|
- `uid`, `revision_uid`, `uuid`, `log`, `status` en — het vervelendst —
|
|
|
- **`name: bob`**, de inlognaam van de auteur. De app gebruikt `node/*` nergens.
|
|
|
-- `POST /nl/flutterdrup/system/connect.json` -> 200 (geeft alleen een anonieme
|
|
|
- sessie terug; standaard Services-gedrag, geen lek, maar ook niet nodig).
|
|
|
-- `GET /nl/flutterdrup/user/1.json` -> 403 ✅ en
|
|
|
- `taxonomy_vocabulary/getTree.json` -> `[false]` ✅ — die twee lekken niets.
|
|
|
+### ⚠️ Correctie: het alarm was overtrokken — er stond nooit schrijftoegang open
|
|
|
|
|
|
-**Uitvinken (de app roept hier NIETS van aan):**
|
|
|
+De droogdraai gaf de **werkelijke** stand: **42 methodes**, niet "tientallen
|
|
|
+inclusief create/update/delete". Concreet stond er nooit aan:
|
|
|
+`node/create|update|delete` · `system/set_variable|del_variable` ·
|
|
|
+`taxonomy_term/create|update|delete` · `taxonomy_vocabulary/create|update|delete`.
|
|
|
|
|
|
-| resource | methodes die uit kunnen |
|
|
|
-|---|---|
|
|
|
-| `node` | **alle 7** — retrieve, create, update, delete, index, files, attach_file |
|
|
|
-| `system` | **alle 4** — connect, get_variable, **set_variable**, **del_variable** |
|
|
|
-| `taxonomy_term` | **alle 6** — incl. create/update/delete |
|
|
|
-| `taxonomy_vocabulary` | **alle 7** — incl. create/update/delete |
|
|
|
-| `file` | **alle 5** — de app gebruikt `bestand_upload/upload` |
|
|
|
-| `geocoder` | beide |
|
|
|
-| `userestablishments` | index — vervangen door `mijn_horecagelegenheden` |
|
|
|
-| `user` | **alles BEHALVE `login` en `request_new_password`**: retrieve, create, update, delete, index, logout, token, user_pass_reset, register, cancel, password_reset, resend_welcome_email |
|
|
|
-
|
|
|
-*Geverifieerd in de export: de app roept exact twee user-endpoints aan
|
|
|
-(`user/login`, `user/request_new_password`) en nergens `token` of `logout`.*
|
|
|
-
|
|
|
-**Aan laten staan — dit is de volledige lijst die de app gebruikt:**
|
|
|
-`aanmelding_kloonbron` · `accountdelete` · `bestand_upload` · `categorieen` ·
|
|
|
-`entreeopties` · `evenementen` · `favorieten` (flag/unflag/is_flagged) ·
|
|
|
-`favorieten_agenda` · `favorieten_gemeenten` · `favorieten_horeca` ·
|
|
|
-`horecacategorieen` · `mijn_aanmeldingen` · `mijn_horecagelegenheden` ·
|
|
|
-`mijn_stadsrechten` · `plaatsen` · `plaatsen_bij_gemeente` · `stadsactiviteiten` ·
|
|
|
-`user` (alleen login + request_new_password) · `views` (retrieve)
|
|
|
-
|
|
|
-**De rommel-resources** (`0`, `34edfas2r`, `adfasdf`, `asdffadadf`,
|
|
|
-`fafadfadasdfas`, `fasdfasdfasd`, `flutterplaatsen`, `homes548446`,
|
|
|
-`safasdfasdfasdf`, `userfavoritescalendar`, `userfavoritescalendar345345234`, …)
|
|
|
-staan **ingeklapt** in de lijst, wat betekent dat er geen methode van aanstaat —
|
|
|
-ze doen dus niets. Opruimen mag, is geen haast.
|
|
|
-
|
|
|
-### ✅ 156b · Views-resource — blijkt AL beperkt (nagemeten 2026-09-19)
|
|
|
-
|
|
|
-Drupal zet 11x een waarschuwing onder de `views`-resource over displays zonder
|
|
|
-access control. **Live getest, anoniem: dat risico is niet actueel.**
|
|
|
-
|
|
|
-| view | resultaat |
|
|
|
-|---|---|
|
|
|
-| de vijf app-views (`flutterflowmobiel1`, `flutterflow_events`, `..._establishments`, `..._establishment_info`, `..._establishment_events`) | **200** |
|
|
|
-| `user_contents` (block_1/2/4, page) · `places` · `_town_tree` · `thuis_bezorgen` · `front_block_go_ca` · `_for_search_page` · `establishment_calendar` · `flutterfavorietenagenda` · `_block_go_ca_for_town` · `block_more_go_out` · `latest_photobook` · `_search_ca_page` | **404** |
|
|
|
+**Oorzaak van de misser:** Claude leidde die lijst af uit de geplakte HTML van het
|
|
|
+resourcescherm, waar **"Enabled" een kolomlabel is en geen status**. Bob wees daar
|
|
|
+al op bij `system`. Les: die pagina-tekst is onbruikbaar om vinkjes uit af te
|
|
|
+lezen — gebruik de droogdraai van het script of een live HTTP-test.
|
|
|
+Wat wél hard bewezen was en blijft staan: `node/<nid>.json` geeft anoniem **200**
|
|
|
+met 46 velden, inclusief `name` (de inlognaam van de auteur).
|
|
|
|
|
|
-Alleen de vijf app-views komen door; de View Resource Settings zijn dus al
|
|
|
-beperkt.
|
|
|
+### 🔵 FASE 2 — nog open, vier resources
|
|
|
|
|
|
-⚠️ **Wat je op het verkeerde been zet:** de foutmelding luidt
|
|
|
-`["Display block_1 on view user_contents could not be found"]`, terwijl die view
|
|
|
-wél een `block_1` heeft. Die melding betekent hier "view staat niet op de
|
|
|
-toegestane lijst", niet "display bestaat niet".
|
|
|
+Staan nog uitgecommentarieerd in het script. Wat er nu nog aanstaat:
|
|
|
|
|
|
-**Rest:** één keer visueel bevestigen op het tabblad *View Resource Settings* dat
|
|
|
-er precies vijf aangevinkt staan — dan weet je dat het zo bedoeld is.
|
|
|
+| resource | methodes | oordeel |
|
|
|
+|---|---|---|
|
|
|
+| `node` | `operations/retrieve`, `relationships/files` | 🔴 **het bewezen lek** — `node/222338.json` geeft nog 200. De app gebruikt `node/*` nergens |
|
|
|
+| `file` | `operations/create`, `operations/retrieve` | ⚠️ `create` is **schrijftoegang** ("Create a file with base64 encoded data"). De app uploadt via `bestand_upload/upload` |
|
|
|
+| `taxonomy_term` | `operations/retrieve`, `actions/selectNodes` | alleen lezen |
|
|
|
+| `taxonomy_vocabulary` | `operations/retrieve`, `actions/retrieveByMachineName` | alleen lezen |
|
|
|
+
|
|
|
+**Afweging:** de app roept geen van vieren aan (geverifieerd op de export). Het
|
|
|
+enige risico van uitzetten is een ánder script dat ze gebruikt — Feeds niet, die
|
|
|
+werkt via de interne Drupal-API. Bob koos ervoor de accesslog niet te
|
|
|
+controleren, dus dit is een bewuste afweging: `node/retrieve` en `file/create`
|
|
|
+zijn de twee die het meest de moeite waard zijn.
|
|
|
+
|
|
|
+**Daarna nameten:** `node/222338.json` moet 403/404 geven in plaats van 200.
|
|
|
+
|
|
|
+### 📌 Views-resource: al beperkt, niets te doen
|
|
|
+
|
|
|
+Alleen de vijf app-views geven 200; `user_contents`, `places`, `_town_tree`,
|
|
|
+`thuis_bezorgen`, `front_block_go_ca`, `_for_search_page`, `establishment_calendar`,
|
|
|
+`flutterfavorietenagenda`, `_block_go_ca_for_town`, `block_more_go_out`,
|
|
|
+`latest_photobook` en `_search_ca_page` geven **404**.
|
|
|
+⚠️ De foutmelding luidt `["Display block_1 on view user_contents could not be
|
|
|
+found"]` terwijl die view wél een `block_1` heeft — dat betekent hier "view staat
|
|
|
+niet op de toegestane lijst", niet "display bestaat niet".
|
|
|
|
|
|
## 🚦 Bij livegang — schakelaars en opruimklussen · Eigenaar: Bob
|
|
|
|