瀏覽代碼

API-oppervlak fase 1 af op productie + correctie op het eerdere alarm

Nagemeten: user/1, geocoder, userestablishments en system/connect geven 404;
alle app-endpoints geven 200 (login 401 op onzin-gegevens). 12 methodes uit.

Correctie: de droogdraai toonde de werkelijke stand (42 methodes). Er stond
nooit schrijftoegang open - node/create|update|delete, system/set_variable en de
taxonomy-schrijfoperaties waren al uit. Claude had die lijst afgeleid uit de
geplakte HTML, waar "Enabled" een kolomlabel is en geen status. Wat wel bewezen
blijft: node/<nid>.json geeft anoniem 200 met de inlognaam van de auteur.

Fase 2 vastgelegd met de vier resterende resources en het oordeel per stuk.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 19 小時之前
父節點
當前提交
d458e10190
共有 1 個文件被更改,包括 53 次插入92 次删除
  1. 53 92
      TASKS.md

+ 53 - 92
TASKS.md

@@ -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