Files
sharepoint-browser/README.md
Martin Tranberg 2d34b6bcfe docs: update README with production hardening changes (tasks 7-10)
- Add network robustness bullet to features list
- Add new "Produktionssikkerhed" section covering timeouts, retry,
  thread safety, exception handling, logging and path sanitization
- Expand test section with table of all 9 test classes and their scope
- Add remaining Retry-After defensive parsing to backlog

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 10:46:39 +02:00

117 lines
6.8 KiB
Markdown

# SharePoint Browser
En moderne Python-baseret fil-browser til Microsoft SharePoint, specielt designet til at omgå Windows' `MAX_PATH` (260 karakterer) begrænsning. Det opnås ved at integrere direkte med Microsoft Graph API ved hjælp af unikke ID'er og downloade/udtjekke filer til redigering via korte, midlertidige stier lokalt.
## 🚀 Funktioner
- **Ingen Sti-begrænsning (MAX_PATH):** Problemfri og pålidelig redigering uanset mappedybde i SharePoint.
- **Sikker Redigering & Kollision-beskyttelse:** Automatisk Check-out/Check-in og intelligent overvågning af fil-låse lokalt.
- **Professionel Brugerflade:** Bygget med `wxPython` (Native Windows UI) inklusiv indfødte OS-ikoner, data-drevet brødkrummesti (breadcrumbs) og lazy-loading af hierarkisk træstruktur for markant hurtigere navigation.
- **Paginering & Stor-tenant understøttelse:** Alle Graph API-kald følger `@odata.nextLink` automatisk, så mapper og sites med hundredvis af elementer indlæses korrekt uden tab.
- **Statuslinje med fremgangsmåler:** En integreret statusmåler (gauge) i statuslinjen giver visuelt feedback under alle netværksoperationer.
- **First-Run Setup Wizard:** Automatisk konfigurationsguide ved første opstart, der opsamler Client ID og Tenant ID (kræver ingen forudgående manuel `settings.json`).
- **Avanceret Søgning:** Hurtig global søgefunktion der bygger på et lokalt, trinvist opdateret indeks, samt understøttelse af "OG"-logik (AND logic).
- **Fuld Fil- og Mappestyring:** Understøtter upload, sletning og omdøbning, samt visning af udvidet fil-metadata (filstørrelse, redigeringsdato).
- **Multisprog:** Indbygget og brugerstyret understøttelse af både Dansk og Engelsk-grænseflade.
- **Multi-File Editing:** Robust understøttelse for lokalt at redigere flere forskellige filer uafhængigt af hinanden i baggrunden uden at interface fryser.
- **Netværkssikkerhed & Robusthed:** Automatisk retry med eksponentiel backoff ved HTTP 429 (rate limiting) og 503 (midlertidigt utilgængelig) samt timeout på alle netværkskald, så programmet aldrig hænger ved netværksproblemer.
## ⚙️ Indstillinger
Indstillingsdialogen er organiseret i faner:
| Fane | Indhold |
|------|---------|
| **Konto** | Azure Client ID og Tenant ID |
| **Stier** | Midlertidig downloadmappe og app-placering |
| **Licens** | Licensnøgle og aktiveringsstatus |
| **System** | Sprog og log-output til fejlfinding |
| **Om** | Versionsinformation og kontaktoplysninger |
## 🔒 Produktionssikkerhed
Programmet er gennemgået og hærdet til produktionsbrug:
| Område | Forbedring |
|--------|-----------|
| **Netværkstimeouts** | Alle `requests`-kald har `timeout=30 s` (API) / `timeout=120 s` (filuploads) — programmet hænger aldrig ved netværksproblemer |
| **Automatisk retry** | `_graph_request`-hjælper håndterer HTTP 429 og 503 med op til 3 forsøg og eksponentiel backoff (maks. 60 s), respekterer `Retry-After`-header |
| **Trådsikkerhed** | `threading.Lock` beskytter alle sammensatte operationer på `active_edits` (som tilgås fra både UI-tråd og baggrundstråde) |
| **Fejlhåndtering** | Alle `except:`-blokke er erstattet med `except Exception:``SystemExit` og `KeyboardInterrupt` ikke sluges |
| **Logging** | MSAL-initfejl og token-opdateringsfejl logges via `logger.error()` i stedet for `print()` |
| **Stisikkerhed** | `os.path.basename()` anvendes på server-kontrollerede filnavne ved mappedownload |
## 🛠️ Teknologier
- **Sprog:** Python 3.x
- **GUI Framework:** wxPython
- **Godkendelse:** MSAL (Microsoft Authentication Library)
- **API Integration:** Microsoft Graph API via `requests`
- **Fil-overvågning:** Polling via låse på lokalt filsystem
## 📦 Installation & Opstart
### Forudsætninger
Sørg for, at du har Python installeret sammen med afhængighederne. Det anbefales at have en Microsoft 365-licens klar.
```bash
pip install wxPython msal requests
```
### Kør applikationen
Start op med:
```bash
python sharepoint_browser.py
```
Ved første kørsel uden en konfiguration vil applikationen præsentere en Setup Wizard, hvor man nemt kan indtaste Microsoft-loginoplysningerne. Indtastningerne gemmes i en lokal `settings.json` fil.
## 🏗️ Byg til EXE (Valgfrit)
For at pakke programmet til en uafhængig, kørbar `.exe` fil til Windows bruges den medfølgende PyInstaller spec-fil:
```bash
pip install pyinstaller
python -m PyInstaller "SharePoint Explorer.spec" --noconfirm
```
Den færdige fil placeres i `dist/SharePoint Explorer.exe` med ikon indlejret.
## 🧩 Arkitektur & Workflow
1. **Godkendelse:** Autentificerer brugeren via MSAL & MS Graph API.
2. **Navigation:** Data hentes asynkront (lazy-loading) og chunked — de første resultater vises straks mens resten streames ind. Alt håndteres med ID'er i stedet for filstier, hvilket sikrer MAX_PATH-modstandsdygtighed.
3. **Navigationskontekst:** Brødkrummestien er data-drevet; hvert segment gemmer det fulde navigationsobjekt, så klik på en forælder altid navigerer korrekt uden at gennemsøge træet.
4. **Stale-result beskyttelse:** En navigations-tæller (`_nav_gen`) sikrer, at svar fra afbrudte netværkskald aldrig overskriver den aktive mappevisning.
5. **Baggrundshåndtering af redigering:**
- Filer tjekkes ud (`Checkout`) direkte i SharePoint.
- Hentes ned til det lokale drev under korte stier, eks. `C:\Temp_SP\[MD5-Hash].[ext]`.
- Et baggrunds-thread overvåger det lokale program (fx Word) kontinuerligt via `os.rename()` tricket.
- Når filen lukkes, uploades ændringerne til SharePoint og modtager et `Checkin`.
## 🧪 Tests
En unit-test suite dækker de kritiske logik-komponenter:
```bash
python -m unittest tests.test_review_fixes -v
```
Testene kører uden skærm/display (**45 tests**) og dækker:
| Testklasse | Hvad der testes |
|------------|----------------|
| `TestStrings` | Oversættelses-nøgler og formatering |
| `TestNavGenGuard` | Navigations-tæller og stale-result beskyttelse |
| `TestUrlInitialization` | URL-initialisering i baggrundstråd |
| `TestDeadSiteBranch` | Fjernede dead-code grene |
| `TestIsBreakcrumbRemoved` | Ryddet signatur for `_navigate_to_item_data` |
| `TestTask7BareExcept` | `except Exception`, `logger.error`, `os.path.basename` |
| `TestNetworkTimeouts` | Alle `requests.*`-kald har `timeout=` |
| `TestGraphRequest` | Retry-logik: 429/503, `Retry-After`, max-forsøg, timeout-injektion |
| `TestActiveEditsLock` | `threading.Lock` på alle sammensatte `active_edits`-operationer |
## 💡 Backlog / Kommende muligheder
1. Integration for håndtering af flere tenants (lejemål)
2. Et yderligere detaljeret log-system specielt til debugging af baggrundstråden.
3. Udvidet aktivitetslog til sporing af handlinger for de seneste 14 dage.
4. Styring af licenser til specifikke kunders varigheder (fx 1 år, 3 år, Lifetime).
5. Defensiv `try/except ValueError` i `_graph_request` ved parsing af `Retry-After`-header (for fremtidssikring mod HTTP-dato-format).