← TRASENT

TRASENT API — proces dostawy

Klucz dotyczy jednego projektu. Tworzysz go w „Urządzenia i API”. Token pokazujemy tylko raz i przechowujemy jego hash. Klucze mają jawny zakres; decyzje wymagają review, zmiana specyfikacji specify, a utworzenie wydania release. Nie mogą tworzyć organizacji ani zarządzać dostępem.

Authorization: Bearer relay_...
Base URL: https://relay-drop-dawid.iwaniuk-dawid.chatgpt.site/api/relay
Metoda i ścieżkaZakresDziałanie
GET /projects/{id}readWymagania, materiały i historia
POST /projects/{id}/uploadsuploadNowa sesja multipart
GET /uploads/{id}uploadWysłane części i stan sesji
PUT /uploads/{id}/parts/{n}uploadBinarna część + X-Part-SHA256
POST /uploads/{id}/completeuploadScalenie i sprawdzenie pliku
DELETE /uploads/{id}uploadPrzerwanie otwartej sesji
GET/HEAD /assets/{id}/downloadreadZałącznik; HTTP Range i status 206
POST /projects/{id}/eventseventsZgłoszenie statusu aplikacji

Przykład odczytu

export RELAY_API_KEY='TWÓJ_KLUCZ'
curl -H "Authorization: Bearer $RELAY_API_KEY" \
  'https://relay-drop-dawid.iwaniuk-dawid.chatgpt.site/api/relay/projects/PROJECT_ID'

Wysyłanie

1. Utwórz sesję. fingerprint to SHA-256 wybranego identyfikatora pliku, służący do wskazania pliku przy wznowieniu; integralność części jest sprawdzana osobno.

POST /projects/PROJECT_ID/uploads
Content-Type: application/json
{
  "requirementId": "video",
  "name": "film.mp4",
  "size": 10485760,
  "mime": "video/mp4",
  "fingerprint": "64_znaki_sha256",
  "metadata": {},
  "supersedes": "OPCJONALNY_ASSET_ID_POPRZEDNIEJ_WERSJI"
}

2. Odczytaj id sesji i chunkBytes. Wysyłaj części numerowane od 1. Każda ma dokładnie 5 MiB, oprócz ostatniej. Każdy PUT wymaga nagłówka X-Part-SHA256 z SHA-256 surowych bajtów tej części. Ten sam numer części z tym samym hashem jest idempotentny; z innym hashem jest odrzucany.

3. Po przerwaniu wykonaj GET sesji, porównaj digest części i wyślij tylko brakujące. Następnie POST /uploads/SESSION_ID/complete z pustym JSON. Manifest pliku to SHA-256 tekstu zawierającego hashe części połączone dwukropkiem. Nie jest to hash SHA-256 całego pliku.

Statusy

POST /projects/PROJECT_ID/events
{
  "type": "device_received",
  "assetId": "ASSET_ID",
  "detail": {"device":"moja-aplikacja","bytes":10485760}
}

Dozwolone typy zgłoszeń: opened, download_started, device_received, shared_to_app. Są oznaczane jako client_reported — nie stanowią dowodu tożsamości ani niezależnego potwierdzenia zapisu na urządzeniu.

Uprawnienia i limity

read: podgląd projektu i pobieranie. upload: wyłącznie sesje i dodawanie materiałów. events: zgłaszanie statusów. Cofnięcie klucza blokuje nowe żądania. Projekty mogą być wyłączone; linki i klucze mają termin ważności. Standardowy projekt: do 250 MiB na plik, 40 transferów i 2 GiB sumarycznej deklarowanej wielkości. Demonstracja: do 5 MiB na plik, 5 transferów, 24 godziny. Sesja wysyłania wygasa po 24 godzinach.

Nie dodawaj kluczy do URL ani kodu strony publicznej. Klucz przechowuj po stronie serwera lub w prywatnym środowisku. Zewnętrzny interfejs może osadzić publiczny link projektu w iframe lub otworzyć go w karcie; klucz API nie jest potrzebny w przeglądarce odbiorcy.

Hasła, ZIP i opcje odbioru

Właściciel może ustawić hasło do linków, zmienić termin i wygląd strony oraz wyłączyć pobieranie lub podgląd. Klucze API pozostają odrębnym uprawnieniem właściciela; polityka pobierania dotyczy również kluczy. Linki publiczne odblokowuje się hasłem przez POST /projects/{id}/unlock. Zwrócony grant jest ważny godzinę i działa tylko dla danej roli linku.

GET /projects/{id}/zip zwraca strumieniową paczkę ZIP najnowszych wersji. Opcjonalnie ids=id1,id2 wybiera pliki. Limit paczki to 1 GiB. POST /projects/{id}/comments przyjmuje assetId i comment; wymaga zakresu events. Wyłączenie pobierania nie zapobiega zapisaniu wyświetlonego podglądu.

Odbiór do folderu

Pobierz pomocnika Python. Podaj projekt i docelowy folder. Klucz wklej w ukrytym polu terminala lub ustaw RELAY_API_KEY. Pomocnik pobiera tylko zaakceptowane, najnowsze wersje i porównuje manifest części przed zatwierdzeniem zapisu.

python3 relay-companion.py --project PROJECT_ID --folder ./TRASENT
# Jednorazowy odbiór:
python3 relay-companion.py --project PROJECT_ID --folder ./TRASENT --once

To wersja testowa: bez gwarancji SLA, audytu bezpieczeństwa, E2EE i automatycznej analizy treści AI. Serwer odczytuje ograniczony zakres nagłówków obrazów, WAV i kontenerów MP4/MOV. Nie jest to pełne dekodowanie ani skanowanie antywirusowe. Retencja usuwa faktyczne obiekty po przetworzeniu kolejki. Harmonogram w tle wymaga aktywnego połączenia; ręczne uruchomienie jest dostępne w Operacjach.

Jednorazowe kody dostępu

Właściciel włącza codeRequired przez PATCH projektu. Kody dotyczą linków projektu, nie kluczy API. Klucz API nie może generować kodów ani zmieniać polityki dostępu.

PATCH /api/relay/projects/PROJECT_ID
{"codeRequired": true}

POST /api/relay/projects/PROJECT_ID/codes
{"role":"collect","ttl":120,"purpose":"link_unlock"}

GET /api/relay/projects/PROJECT_ID/codes
DELETE /api/relay/projects/PROJECT_ID/codes
{"challengeId":"CHALLENGE_ID"}

Te operacje wymagają sesji właściciela i poprawnego Origin. Tworzenie zwraca kod tylko raz. GET zwraca wyłącznie metadane i stany. Dostępne role: collect/review; czas kodu: 120 lub 300 sekund.

POST /api/relay/projects/PROJECT_ID/redeem-code
X-Relay-Link: LINK_TOKEN
{"code":"123456","purpose":"link_unlock"}

// Odpowiedź zawiera grant i expires. Kolejne żądania:
X-Trasent-Code-Grant: GRANT

Przykładowy kod powyżej nie jest aktywnym kodem. Grant otwiera do 600 sekund dostępu, najwyżej do wygaśnięcia projektu. Dla pobierania dostępny jest parametr codeGrant obok access i grant (hasło). Jeśli hasło jest włączone, wymagany jest również osobny grant hasła. Kod i grant nie mogą służyć do tworzenia kluczy, zarządzania projektem ani nadawania innych uprawnień.

Weryfikacja: 5 prób na kod, 10 prób na projekt/IP i 30 prób na projekt w 15-minutowych oknach. Generowanie: do 10 operacji na projekt w takim oknie. Nowy kod cofa poprzedni oczekujący kod dla tej samej roli. Zmiana hasła, rotacja linku, archiwizacja i zmiana polityki kodów unieważniają dotychczasowe sesje kodów. Wygaśnięcie jest egzekwowane na serwerze.

Proces dostawy V2

ŚcieżkaZakresZnaczenie
GET /projects/{id}/workflowreadLista braków, formularze, kompletność i bieżąca specyfikacja
POST /projects/{id}/answersupload{revision, answers}; wymagane i warunkowe pola są egzekwowane na serwerze
POST /projects/{id}/specificationsspecify{expectedRevision, brief, requirements, fields}; aktualizacja z kontrolą wersji
POST /projects/{id}/reviewreview{assetId, decision, comment}; approved lub changes_requested
POST /projects/{id}/releasesrelease{purpose, requestKey}; kampania, montaz, produkty, druk lub archiwum; wyłącznie kompletna aktualna dostawa
GET /releases/{id}readKanoniczny manifest, SHA-256 i podpis ECDSA P-256; publiczny klucz
GET /releases/{id}/zipreadDokładne wersje wydania i manifest

Nowe skrzynki uczestników są prywatne. Właściciel przydziela wymagania oraz tworzy i cofa linki w zakładce Uczestnicy. Udostępniony link jest uprawnieniem posiadacza, nie identyfikacją człowieka. Starsze wspólne linki zachowują dawną wspólną widoczność.

Urządzenie i zgoda na konkretne wydanie

Nowy pomocnik TRASENT rejestruje skrót wybranego folderu i używa klucza wyłącznie deliveries. Właściciel wybiera wydanie i urządzenie oraz potwierdza operację kodem ważnym 120 sekund. Zmiana folderu lub cofnięcie urządzenia/wydań blokuje odbiór. Helper weryfikuje podpis i manifest części, a po zapisie zgłasza client_reported. Jest to skrypt Python, nie instalator aplikacji desktopowej.

python3 trasent-device.py --device DEVICE_ID --folder ./TRASENT

Wklej klucz w ukrytym polu terminala lub ustaw TRASENT_DEVICE_KEY w prywatnym środowisku. Nie dodawaj go do polecenia ani URL. Starszy relay-companion.py pozostaje dostępny dla wcześniejszych integracji.

Webhooki i zadania

Właściciel konfiguruje publiczny adres HTTPS w Operacjach. Sekret trwh_ jest pokazywany raz i szyfrowany w bazie. Żądania mają X-Trasent-Event, X-Trasent-Timestamp oraz X-Trasent-Signature: sha256=HEX. Sprawdź HMAC-SHA256(timestamp + "." + surowe body), okno czasowe i deduplikuj identyfikator zdarzenia. Obsługiwane są ponowienia do 5 prób z rosnącym opóźnieniem; HTTP 2xx potwierdza przyjęcie webhooka, nie pliku. Nie podążamy za przekierowaniami; domena przechodzi publiczną kontrolę DNS. Pełna ochrona przed DNS rebinding wymaga również kontroli sieci docelowego wdrożenia.

Kosz: 7 dni odzyskania; przypięty plik wymaga cofnięcia wydania przed usunięciem. Retencja całego projektu obejmuje także wydania. Eksport metadanych nie stanowi kompletnej kopii magazynu plików. Przypomnienia działają w aplikacji; e-mail, SMS, skaner AV i semantyczne AI nie są podłączone.

Szyfrowane transfery TRASENT v1

Wybór szyfrowania w szybkim transferze uruchamia AES-256-GCM w przeglądarce. Losowy kod ma 128 bitów entropii (22 znaki base64url); HKDF-SHA256 wyprowadza klucz AES-256 oddzielnie dla każdego pliku. Losowa sól i prefiks nonce są osobne dla pliku, a indeks 32-bitowy rozróżnia metadane i bloki 1 MiB. AAD wiąże nagłówek, indeks i kolejność. Oryginalne nazwy i MIME znajdują się w zaszyfrowanych metadanych. Rozmiar, liczba plików, daty i sam fakt transferu pozostają widoczne dla serwera.

To szyfrowanie treści plików, nie tylko hasło do linku. Kod nie trafia do API ani URL; może pozostać w pamięci przeglądarki nadawcy, co interfejs jawnie komunikuje. Przycisk „Kopiuj razem” umieszcza link i kod w jednej wiadomości — odbiorca obu może otworzyć pliki. Serwer nie może odzyskać kodu. Zaszyfrowanej zawartości nie analizujemy ani nie zatwierdzamy technicznie. W tym trybie nie tworzymy serwerowych wydań ani nie odszyfrowujemy plików pomocnikiem Python.

Format pliku: TRASENC1, długość nagłówka uint32 big-endian, JSON nagłówka, kolejne bloki AES-GCM z tagiem 16 bajtów. Dokumentacja formatu i testy są w lib/relay/encryption.ts oraz tests/encryption-library.mjs. Przeglądarka skanuje plik i szyfruje go w ograniczonych blokach; wznowienie jest powiązane z kodem i pełnym odciskiem pliku wyliczonym przez HMAC. Zmiana zawartości wymaga nowego kontenera. Pobieranie w przeglądarkach bez wyboru strumieniowego pliku wymaga pamięci na odszyfrowany plik.

Dysk

Biblioteka zbiera dostępne pliki projektów oraz własne tablice, notatki i linki. Są widoki kart/listy, filtry typów, wyszukiwanie nazw/notatek/tagów, ulubione i operacje na wielu elementach. Wyszukiwanie nie odczytuje zaszyfrowanej treści. Linki są zapisywane jako adresy; nie pobieramy ich treści, nie generujemy transkrypcji ani nie uruchamiamy AI. Nowy upload rozpoczęty z dysku zachowuje pliki do ręcznego usunięcia; publiczny link ma własny termin. Dotychczasowe pliki zachowują politykę retencji swojej dostawy. Biblioteka pokazuje do 1000 elementów; API sesji przeglądarkowej wymaga zalogowania.

V12 — prywatny dysk i paczki

Prywatny zapis używa privateStorage:true dla transferu; tokeny projektu nie otwierają wtedy dostępu publicznego. POST /api/relay/shares tworzy paczkę z wybranych identyfikatorów assetów właściciela, tokenem 64-hex generowanym w przeglądarce i requestKey UUID. Zwraca id, token i expires. Kod szyfrowania nie jest częścią tego żądania.

GET /shares/:id, /files/:assetId i /zip wymagają X-Relay-Link lub access. DELETE /shares/:id wymaga konta właściciela. Prywatny GET /library/zip?ids=uuid,uuid pobiera zaznaczenie bez publikowania. ZIP nie odszyfrowuje plików. Ochrona pierwotnego projektu nie może zostać ominięta przez nowe udostępnienie.

/library/views zapisuje osobiste widoki. Status, properties oraz config tablicy są walidowane przez schematy w lib/relay/library-model.ts. Limit dysku: 100 prywatnych paczek, 2 GiB rezerwacji; lista do 1000 elementów. Nie są to nowe uprawnienia kluczy API: operacje dysku wymagają zalogowanego konta przeglądarki.