289 lines
19 KiB
Markdown
289 lines
19 KiB
Markdown
# Zimbabwe Cyber & Data Protection Act — Compliance Brief
|
||
|
||
**NFR7** — Data Sovereignty for the Next Gen Learning school management system.
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Document version** | 1.0 — 2026-07-28 |
|
||
| **Status** | Draft — pending client (Lesticom) sign-off |
|
||
| **Owner** | Lesticom Development Team (fchin — review/merge owner) |
|
||
| **Statute** | [Cyber and Data Protection Act, 2021 (Zimbabwe)](https://www.veritaszim.net/node/2547) (Chapter 12:07) |
|
||
| **Regulator** | Postal and Telecommunications Regulatory Authority of Zimbabwe (POTRAZ), Data Protection Authority (DPA) once constituted |
|
||
| **Source artefacts** | `Next Gen Learning SRS.pdf` §3.2 NFR7; `evidence/audit-2026-07-28.md` §4.2 NFR7 row |
|
||
| **Related docs** | `docs/spec-deviations.md` (NFR1, NFR5); `docs/SYNC.md` (offline-first data flow) |
|
||
|
||
---
|
||
|
||
## 1. Executive summary
|
||
|
||
The Next Gen Learning system processes personal data of minors (students), their parents/guardians, and school staff. As a Zimbabwe-deployed service handling this data, it is subject to the **Cyber and Data Protection Act, 2021** (CDPA), which:
|
||
|
||
- Establishes a lawful basis requirement for processing personal data (§4);
|
||
- Mandates specific consent for processing data of minors (§4(3));
|
||
- Imposes data minimisation, accuracy, storage limitation, and integrity/confidentiality duties (§5–§9);
|
||
- Requires breach notification to the Authority and affected data subjects (§26);
|
||
- Imposes cross-border transfer restrictions for personal data leaving Zimbabwe (§24);
|
||
- Provides data subjects with rights of access, correction, and erasure (§12–§17).
|
||
|
||
This brief documents how the system's design **satisfies** each of these obligations, and explicitly calls out the **deviations and remaining gaps** that need either client acceptance or future remediation.
|
||
|
||
> **Posture:** the system is designed for an **on-premise / in-country** deployment by default. The cloud sync target (Supabase / `api.next_gen.techarvest.co.zw`) is hosted in Zimbabwe. No data is intended to leave the country. Where this differs from the SRS, the deviation is documented in §6.
|
||
|
||
---
|
||
|
||
## 2. Data inventory
|
||
|
||
A complete inventory of personal-data fields processed by the system. All PII is in the `users` table plus a handful of supporting tables.
|
||
|
||
### 2.1 Data subjects
|
||
|
||
| Category | Approx. count per school | Source |
|
||
|---|---|---|
|
||
| Students | 500–2,000 | Seeded by `init.js` + admin onboarding |
|
||
| Parents/guardians | 500–2,000 | Linked via `parent_students` |
|
||
| Teachers | 30–100 | Seeded by `init.js` |
|
||
| School admins / support staff | 5–20 | Seeded by `init.js` |
|
||
| Applicants / alumni (data subject erasure) | variable | `offboarding` table |
|
||
|
||
### 2.2 Personal data fields
|
||
|
||
| Field | Table | Sensitive? | Lawful basis |
|
||
|---|---|---|---|
|
||
| `first_name`, `last_name` | `users` | PII | Contract (enrolment / employment) |
|
||
| `email` | `users` | PII | Contract; explicit consent (optional) |
|
||
| `phone` | `users` | PII | Explicit consent (optional) |
|
||
| `id_number` (national ID) | `users` | **Sensitive PII** | Contract + explicit consent |
|
||
| `date_of_birth` | `users` | Sensitive PII (minor status) | Contract + explicit consent |
|
||
| `address` (line 1/2/city) | `users` | PII | Contract |
|
||
| `gender` | `users` | Sensitive (SADC region) | Optional; explicit consent |
|
||
| `blood_type`, `allergies`, `medical_conditions` | `medical_documents` | **Special category** (health) | Explicit consent required |
|
||
| `emergency_contact` | `users` | PII (third party) | Explicit consent (the third party must be informed) |
|
||
| `academic_year`, `grades`, `attendance` | `grades`, `attendance` | Behavioural | Contract |
|
||
| `disciplinary_records` | `disciplinary_records` | Sensitive | Contract + safeguarding obligation |
|
||
| `payment_method`, `paynow_reference` | `payments` | Financial | Contract |
|
||
| `salary`, `bank_account` | `payroll` | Financial | Contract |
|
||
|
||
> **Special category data** (health, biometrics) is processed only with **explicit consent** under CDPA §4(3) and only for the duration required to provide the service. The system does not collect biometric data today.
|
||
|
||
### 2.3 Children's data (CDPA §4(3))
|
||
|
||
The system processes the personal data of minors (students). The system implements:
|
||
|
||
- **Parental consent capture** at registration (`parent_students` linkage + consent workflow in `transfers.controller.js` — `POST /api/xfer/consent`).
|
||
- **No direct marketing to minors** — the system has no marketing surface.
|
||
- **Limited third-party disclosure** — third parties (e.g. receiving schools during a transfer) only receive a record package with explicit, signed consent (`signature_hash` on `transfer_consents`).
|
||
|
||
---
|
||
|
||
## 3. Lawful basis
|
||
|
||
CDPA §4(1) requires a lawful basis for every processing activity. The mapping:
|
||
|
||
| Processing activity | Lawful basis | Notes |
|
||
|---|---|---|
|
||
| Operating the school's academic record (grades, attendance, behaviour) | **Contract** with the parent / adult student | Implied by enrolment; no separate consent needed. |
|
||
| Maintaining contact details for emergency & school communications | **Contract** + **legitimate interest** (school safety) | Phone & email are required for school operations. |
|
||
| Medical information (allergies, blood type) | **Explicit consent** | Required at registration; can be withdrawn but doing so means the school cannot safely admit the child. |
|
||
| Transfer of records to another institution (Form 1 placement, university) | **Explicit consent** | `POST /api/xfer/consent` workflow with SHA-256 signature hash; immutable audit trail. |
|
||
| Financial transactions (Paynow integration) | **Contract** | Necessary to perform the fee payment service. |
|
||
| Backup & disaster recovery | **Legitimate interest** (continuity of service) | Backups are encrypted and stored in the same legal jurisdiction. |
|
||
| Aggregate, anonymised reporting to the Ministry | **Legal obligation** | Required by the Education Act; data is anonymised before transmission. |
|
||
| Marketing, third-party advertising | **N/A — system does no marketing** | — |
|
||
|
||
---
|
||
|
||
## 4. Data subject rights
|
||
|
||
CDPA §12–§17 grants data subjects the right to access, correct, and erase their personal data. The system's current support:
|
||
|
||
| Right | Status | Endpoint / workflow |
|
||
|---|---|---|
|
||
| Right of access (§12) | ✅ | `GET /api/users/me` returns the data subject's own profile. Admins can pull a record for a parent/teacher on request. |
|
||
| Right to correction (§13) | ✅ | `PATCH /api/users/:id` (admin) or self-service profile edit in the client. |
|
||
| Right to erasure / "right to be forgotten" (§14) | ⚠️ | Partial — see §6.2. The `offboarding` service anonymises a user (`is_deleted = 1` + cleared PII), but linked records (grades, attendance, payments) are preserved in aggregated form. |
|
||
| Right to data portability (§15) | ✅ | `POST /api/xfer/graduation` exports a self-contained JSON package (academic + attendance + disciplinary + financial clearance) for the receiving institution. |
|
||
| Right to object (§16) | ⚠️ | Documented but not yet a self-service UI flow. Admin-mediated. |
|
||
| Right not to be subject to automated decision-making (§17) | ✅ | The system performs no automated decision-making that produces legal or similarly significant effects on the data subject. |
|
||
|
||
### 4.1 Erasure workflow (current state)
|
||
|
||
The system implements a **soft-delete + anonymise** pattern rather than a hard delete, to preserve the integrity of historical academic and financial records (which the school is legally required to retain — see §5). When a data subject invokes the right to erasure:
|
||
|
||
1. Admin or HR marks the user for offboarding in the **Offboarding** workflow (`/api/offboarding`).
|
||
2. The `OffboardingService` (see `server/src/services/OffboardingService.js`) runs:
|
||
- Sets `users.is_deleted = 1` and clears PII fields (`first_name`, `last_name`, `email`, `phone`, `address`).
|
||
- Replaces PII with `[REDACTED-<uid>]` so historical references stay consistent.
|
||
- Preserves `users.uid` so the audit trail remains intact.
|
||
- Logs the erasure in `audit_logs` with the requesting user + timestamp.
|
||
3. The data subject receives a confirmation record via the on-file email (if it was retained) or via the school admin.
|
||
|
||
---
|
||
|
||
## 5. Retention schedule
|
||
|
||
CDPA §5(2)(c) requires that personal data be kept "no longer than is necessary for the purposes for which it is being processed." The system enforces the following retention schedule:
|
||
|
||
| Data category | Retention | Justification |
|
||
|---|---|---|
|
||
| Academic records (grades, reports) | **7 years after the student leaves the school** | Education Act + ZIMSEC audit window |
|
||
| Attendance records | **7 years** | Education Act |
|
||
| Disciplinary records | **5 years after the student turns 18** | Safeguarding + Education Act |
|
||
| Financial / payment records | **7 years** | Zimbabwe Revenue Authority (ZIMRA) tax retention obligation |
|
||
| Payroll records (staff) | **7 years after the staff member leaves** | ZIMRA + Labour Act |
|
||
| Medical records | **2 years after the student leaves** (or until consent is withdrawn) | Practical minimum; not legally mandated for longer |
|
||
| User authentication data (passwords) | Until account is closed | Operational requirement |
|
||
| Audit logs | **Permanent** (immutable) | Required for compliance demonstration and dispute resolution |
|
||
| Sync queue / failure logs | 90 days | Operational; not personal data |
|
||
| Backups | **1 year rolling** | Disaster recovery |
|
||
|
||
> **Note:** "deleted" users are retained as anonymised records to preserve referential integrity in audit logs. True hard-deletion is **not** performed because it would break the chain of evidence for academic and financial audits.
|
||
|
||
---
|
||
|
||
## 6. Cross-border data transfer (CDPA §24)
|
||
|
||
CDPA §24 restricts the transfer of personal data to a country outside Zimbabwe unless that country has adequate data-protection laws or the data subject has given explicit consent.
|
||
|
||
### 6.1 Current state
|
||
|
||
- **Sync target:** `https://api.next_gen.techarvest.co.zw` — hosted in Zimbabwe. ✅ Adequate; no cross-border issue.
|
||
- **Payments:** Paynow (Zimbabwean payment processor) — hosted in Zimbabwe. ✅
|
||
- **Email / SMS providers:** SMS and email are routed via providers selected by the deploying school. **Deviation:** the system does not currently enforce that the provider be Zimbabwe-hosted. This is a deployment-time decision, not a code-time one. The deployment manifest in `docker-compose.yml` should be configured to use a ZW-hosted SMTP and SMS provider. **See §6.3 (action item).**
|
||
- **Cloud backups:** the system supports both local (same-host) and remote (S3-compatible) backup targets. Remote backups are an **explicit opt-in** by the deploying school; the default is local. When remote backups are enabled, the school must configure a ZW-hosted S3-compatible store (or accept the §24 risk via the school's own DPA filing).
|
||
|
||
### 6.2 No third-party sharing
|
||
|
||
The system does not sell or share personal data with third parties for marketing or any other commercial purpose. The only third-party data flows are:
|
||
|
||
- **Receiving institutions** during a record transfer (with explicit consent — see `transfers.controller.js`).
|
||
- **Payment processors** (Paynow) for fee collection.
|
||
- **Ministry reporting** (anonymised aggregates, not personal data).
|
||
|
||
### 6.3 Action items
|
||
|
||
| # | Item | Owner | Status |
|
||
|---|---|---|---|
|
||
| 6.3.1 | Document the recommended ZW-hosted SMTP/SMS providers in `docs/DEPLOY.md` | Lesticom | ⏳ open |
|
||
| 6.3.2 | Add a startup-time check that the configured SMTP/SMS endpoints are in-country (or at minimum: log a warning if the resolved IP geolocates outside ZW) | Lesticom | ⏳ open |
|
||
| 6.3.3 | Add a deployment-time "data sovereignty" flag that disables remote backups unless explicitly enabled | Lesticom | ⏳ open |
|
||
|
||
---
|
||
|
||
## 7. Security controls
|
||
|
||
The system implements the following technical and organisational measures (CDPA §9 — security safeguards):
|
||
|
||
| Control | Implementation | Evidence |
|
||
|---|---|---|
|
||
| Password hashing | bcrypt, 10 rounds (configurable) | `server/src/utils/password.js` |
|
||
| Authentication | JWT (HS256), 7-day expiry | `server/src/config/index.js` — `jwtSecret` |
|
||
| Authorisation (RBAC) | Per-route role gates; full RBAC matrix sweep on every change | `server/src/middleware/requireRole.js` + `client/e2e/rbac-sweep.spec.ts` (Phase 3, 152/152 passing) |
|
||
| Transport security | TLS terminated at the reverse proxy (Nginx / Caddy) | Out of scope of the app; deployment-time concern |
|
||
| Audit logging | `audit_logs` table is append-only; every state change is recorded | `server/src/services/AuditService.js` |
|
||
| Database encryption at rest | Not enabled by default. **Deviation** — see §6.4 | — |
|
||
| Backup encryption | Backups are plaintext SQLite. **Deviation** — see §6.4 | — |
|
||
| Rate limiting | Express rate limit on `/api/auth/login` and `/api/auth/register` | `server/src/middleware/rateLimit.js` |
|
||
| CSRF | CORS is wide-open in dev (see AGENTS.md); production deployments must set `ALLOWED_ORIGINS` to the school domain | `server/src/config/index.js` — `allowedOrigins` |
|
||
| Input validation | JSON body limit 50 MB (configurable); multer file uploads capped at 5 MB | `server/src/index.js` |
|
||
| Dependency hygiene | No automated SCA today; manual review at PR time | Open follow-up |
|
||
|
||
### 7.1 Action items
|
||
|
||
| # | Item | Owner | Status |
|
||
|---|---|---|---|
|
||
| 7.1.1 | Add **automated dependency scanning** (npm audit + Dependabot or Renovate) | Lesticom | ⏳ open |
|
||
| 7.1.2 | Add **database encryption at rest** via SQLCipher or filesystem-level encryption (LUKS / eCryptfs) | Lesticom | ⏳ open |
|
||
| 7.1.3 | Add **backup encryption** (gpg / age) to the backup script | Lesticom | ⏳ open |
|
||
|
||
---
|
||
|
||
## 8. Breach notification (CDPA §26)
|
||
|
||
CDPA §26 requires notification to the Authority **and** to affected data subjects "as soon as reasonably possible" after discovery of a breach that is likely to result in significant harm.
|
||
|
||
### 8.1 Current incident response
|
||
|
||
1. Detection: an anomaly in the audit log or a user report.
|
||
2. Containment: the admin disables the affected account via `PATCH /api/users/:id` with `is_active = 0`.
|
||
3. Investigation: the `audit_logs` table is reviewed (append-only).
|
||
4. Notification: the school admin (acting as the data controller) is responsible for notifying the Authority and the data subjects. The system does not yet automate the external notification step.
|
||
5. Post-mortem: documented in the project's `evidence/` folder.
|
||
|
||
### 8.2 Action items
|
||
|
||
| # | Item | Owner | Status |
|
||
|---|---|---|---|
|
||
| 8.2.1 | Add a **breach notification workflow** to the admin dashboard that pre-fills the Authority's notification template with the affected user IDs, dates, and types of data | Lesticom | ⏳ open |
|
||
| 8.2.2 | Document the **incident response runbook** in `docs/RUNBOOK.md` (who to call, what to capture, what to preserve) | Lesticom | ⏳ open |
|
||
|
||
---
|
||
|
||
## 9. Lawful basis register (record of processing)
|
||
|
||
CDPA §6 requires a record of processing activities. The full register is maintained by the school (data controller); the system supports it via the `audit_logs` table.
|
||
|
||
| # | Processing activity | Categories of data | Data subjects | Recipients | Retention | Cross-border? |
|
||
|---|---|---|---|---|---|---|
|
||
| 1 | Enrolment & academic record | Identity, academic, behavioural | Students | School staff, parents (self-access) | 7 years post-departure | No |
|
||
| 2 | Attendance tracking | Identity, attendance | Students, teachers | School staff, parents (self-access) | 7 years | No |
|
||
| 3 | Behavioural & disciplinary | Identity, behavioural | Students | School staff, parents (on request) | 5 years post-18th birthday | No |
|
||
| 4 | Fee collection (Paynow) | Identity, financial | Parents | Paynow (payment processor) | 7 years | No (ZW) |
|
||
| 5 | Payroll | Identity, financial | Staff | School admin, ZIMRA (on audit) | 7 years post-employment | No |
|
||
| 6 | Medical & safeguarding | Health, identity | Students | School nurse, parents (on request) | 2 years post-departure | No |
|
||
| 7 | Record transfer to next institution | Academic, attendance, disciplinary, financial | Students | Receiving institution (with consent) | One-time | No (within ZW) |
|
||
| 8 | Ministry reporting | Anonymised aggregates | N/A (anonymised) | Ministry of Education | Permanent (immutable) | No |
|
||
| 9 | Backup & disaster recovery | All above | All | Same-host (default) or school-configured S3 | 1 year rolling | Depends on backup target |
|
||
| 10 | Authentication & session management | Authentication tokens | All | None (local) | Until account closure | No |
|
||
|
||
---
|
||
|
||
## 10. Data Protection Impact Assessment (DPIA)
|
||
|
||
CDPA §8 requires a DPIA for processing that is likely to result in significant harm. The following activities warrant a DPIA:
|
||
|
||
| Activity | DPIA required? | Status |
|
||
|---|---|---|
|
||
| Routine academic record | No (low risk; standard school operations) | — |
|
||
| **Cross-school record transfer** | **Yes** (data leaves the school, even with consent) | DPIA template drafted, sign-off pending |
|
||
| Ministry aggregate reporting | No (anonymised) | — |
|
||
| **Disciplinary records** (special category) | **Yes** (could affect child's future) | DPIA template drafted, sign-off pending |
|
||
| Offboarding / right to erasure | No (low risk; data subject's own request) | — |
|
||
| Medical records (special category) | **Yes** | DPIA template drafted, sign-off pending |
|
||
| Remote backup to S3-compatible store | **Conditional** (depends on whether S3 endpoint is in ZW) | Open |
|
||
|
||
---
|
||
|
||
## 11. Deviations from the strict reading of the CDPA
|
||
|
||
The following items are technically deviations from the strict reading of the CDPA. Each is documented so the client can either accept the deviation or fund remediation.
|
||
|
||
| # | Deviation | Reason | Acceptance by |
|
||
|---|---|---|---|
|
||
| 6.3.x | SMTP / SMS providers are not enforced to be ZW-hosted at the application layer | Provider choice is a deployment-time decision by the school | School / Lesticom |
|
||
| 7.1.2 | Database encryption at rest is not enabled by default | SQLite + SQLCipher integration is a follow-on engineering task | School / Lesticom |
|
||
| 7.1.3 | Backups are not encrypted at rest | Same reason as 7.1.2 | School / Lesticom |
|
||
| 7.1.1 | No automated dependency scanning | Engineering bandwidth; the team reviews deps manually at PR time | Lesticom |
|
||
| 8.2.x | Breach notification is admin-mediated, not automated | Requires integration with the Authority's notification API when published | Lesticom |
|
||
| §10 | DPIAs for cross-school transfer, disciplinary, and medical processing are drafted but not signed | Requires Lesticom legal review + sign-off | Lesticom + school |
|
||
|
||
---
|
||
|
||
## 12. Acceptance & sign-off
|
||
|
||
This brief is intended to be reviewed and signed by:
|
||
|
||
- **Lesticom Development Lead** (technical owner) — `_________________________` Date: `__________`
|
||
- **Lesticom Delivery Manager** (commercial owner) — `_________________________` Date: `__________`
|
||
- **School Principal** (data controller's representative) — `_________________________` Date: `__________`
|
||
- **School IT Lead** (operational owner) — `_________________________` Date: `__________`
|
||
|
||
Sign-off indicates the school has reviewed the data flows, accepted the documented deviations, and agreed to the retention schedule. Material changes to the data flows (e.g. switching to a non-ZW sync target, adding a new third-party processor) require a re-issue of this brief.
|
||
|
||
---
|
||
|
||
## 13. Change log
|
||
|
||
| Date | Version | Author | Change |
|
||
|---|---|---|---|
|
||
| 2026-07-28 | 1.0 | Mavis (on behalf of fchin) | Initial draft. Closes NFR7 from the SRS audit (`evidence/audit-2026-07-28.md`). |
|