9.4 KiB
Tokens
rvctl obsługuje tokeny Gitea w dwóch miejscach:
tokens.json- lokalny store sekretów i metadanych tokenów.git/config- git remotes w konkretnym repo
Rekord w tokens.json zawiera token, endpoint serwera, login oraz docelowe
org/repo. Git remote służy tylko do operacji Git (fetch, push) albo do
pierwszego wczytania tokena do store.
Bez --repo komendy tokenów działają na repo rv-launcher. Dla kart pracy albo
innych repo podaj --repo PATH.
Szybki przepływ
Startujemy od git remota z tokenem w URL-u:
git remote add r1 http://u1:TOKEN@77.90.8.171:3001/edu-tools/rv-launcher.git
Sprawdzamy, co jest zapisane w remote i store:
./rvctl tokens list remote
./rvctl tokens list store
./rvctl tokens list both
Kopiujemy token z remota do tokens.json:
./rvctl tokens sync remote r1
Pobieramy z API metadane tokena:
./rvctl tokens update r1
Sprawdzamy zgodność remote i store:
./rvctl tokens cmp
Po poprawnej synchronizacji compare/cmp powinien pokazać * przy r1.
Jeśli chcesz sprawdzić, czy store da się odtworzyć z remota, usuń tylko rekord ze store i wczytaj go ponownie z git remota:
./rvctl tokens rm store r1
./rvctl tokens sync remote r1
./rvctl tokens update r1
./rvctl tokens cmp
Po sync remote metadane API są ustawiane na ?, dlatego update jest zawsze
kolejnym krokiem.
Dwa Źródła
rvctl rozróżnia dwa miejsca:
- git remote w repo, np.
http://u1:SECRET@host/org/repo.git - lokalny store
~/dev/workspace/rv/tokens/tokens.json
Komendy zapisujące store same tworzą katalog nadrzędny, jeżeli go nie ma.
Katalog tokens dostaje prawa 700, a plik tokens.json prawa 600.
Kierunki są jawne:
sync remote r1czyta git remote i zapisuje rekord dotokens.jsonsync store r1czytatokens.jsoni zapisuje auth do git remotaupdate r1nie synchronizuje sekretu, tylko odświeża metadane z APIremove remote r1alborm remote r1usuwa git remoteremove store r1alborm store r1usuwa rekord ztokens.json
Listowanie
list pokazuje źródła bez porównywania:
./rvctl tokens list store
./rvctl tokens list remote
./rvctl tokens list both
Znaczenie:
store- rekordy zapisane wtokens.jsonremote- git remotes zapisane w.git/configboth- oba źródła jako osobne wiersze
Dla innego repo podaj --repo:
./rvctl tokens list remote --repo ~/dev/workspace/rv/series/inf/03
Synchronizacja
Remote -> Store
Użyj, gdy token jest w git remote i chcesz go zapisać w store:
./rvctl tokens sync remote r1
Ta komenda kopiuje sekret, usera, endpoint, org i repo z URL-a remota do
tokens.json. Nie pyta API o uprawnienia, więc zawsze zeruje metadane API:
valid ustawia na ?, maski scope, org_perm i repo_perm ustawia na ?,
a expires_at usuwa. Realne uprawnienia wpisuje dopiero:
./rvctl tokens update r1
Store -> Remote
Użyj, gdy token jest już w tokens.json, a chcesz utworzyć albo odświeżyć git
remote:
./rvctl tokens sync store r1
Jeśli remote r1 nie istnieje, rvctl buduje URL z pól server.endpoint,
org i repo w tokens.json, na przykład:
http://77.90.8.171:3001/edu-tools/rv-launcher.git
Opcjonalnie można podać URL ręcznie:
./rvctl tokens sync store r1 --url http://77.90.8.171:3001/edu-tools/rv-launcher.git
Jeśli remote ma już inne credentials, użyj:
./rvctl tokens sync store r1 --replace
Aktualizacja Metadanych
Po zapisaniu tokena w store odśwież jego metadane z API:
./rvctl tokens update r1
update zapisuje w tokens.json:
validscopeorg_permrepo_perm
Ta komenda nie zmienia git remota i nie kopiuje sekretu.
Porównanie
compare sprawdza zgodność store i remote. Skrót: cmp.
./rvctl tokens compare
./rvctl tokens cmp
Marker w kolumnie token_ref:
*- store i remote są zgodneS- token jest tylko w storeR- token jest tylko w remote!- wpis jest sparowany, ale token jestinvalidalbo wystąpił błąd API
Gdy marker to S, token nie jest błędny. To znaczy tylko, że nie ma
odpowiadającego git remota.
Store-only
Po pierwszej konfiguracji wygodny tryb pracy to trzymanie tokena tylko w
tokens.json.
./rvctl tokens rm remote r1
./rvctl tokens list store
./rvctl tokens cmp
Wtedy compare/cmp pokazuje S, a list store nadal pokazuje znane metadane
tokenu. Gdy trzeba wykonać operacje git przez remote, odtwórz remote:
./rvctl tokens sync store r1
Po operacji można go znowu usunąć:
./rvctl tokens rm remote r1
Usuwanie
Usuwaj tylko to miejsce, które naprawdę chcesz wyczyścić:
./rvctl tokens rm remote r1
./rvctl tokens rm store r1
./rvctl tokens rm both r1
Znaczenie:
remove remote/rm remoteusuwa git remote i sekret z.git/config, ale zostawia storeremove store/rm storeusuwa rekord ztokens.json, ale nie dotyka git remotaremove both/rm bothusuwa oba miejsca
Inne Repo
Domyślnie komendy tokenów pracują na repo zawierającym rvctl. Dla kart pracy
albo innych repo podaj --repo.
./rvctl tokens list remote --repo ~/dev/workspace/rv/series/inf/03
./rvctl tokens compare --repo ~/dev/workspace/rv/series/inf/03
./rvctl tokens sync store r1 --repo ~/dev/workspace/rv/series/inf/03
Store tokenów nadal pozostaje jeden:
~/dev/workspace/rv/tokens/tokens.json
Pozostałe Komendy
tokens read
Pokazuje zawartość tokens.json.
./rvctl tokens read
./rvctl tokens read --server http://77.90.8.171:3001
./rvctl tokens read --show-secrets
tokens add
Dodaje szkielet rekordu do tokens.json. REMOTE_ID musi odpowiadać nazwie
git remote. Przełączniki są opcjonalne; jeśli ich nie podasz, rvctl zapisuje
puste wartości do późniejszego uzupełnienia. Wyjątkiem jest server, który
domyślnie pochodzi z workspace.json.
./rvctl tokens add r1
./rvctl tokens add r1 --server http://77.90.8.171:3001 --user u1 --org edu-tools --repo rv-launcher
Najczęściej pusty szkielet ma sens wtedy, gdy chcesz ręcznie wpisać token w
tokens.json. sync store r1 nie użyje pustego tokena. Najpierw trzeba
uzupełnić co najmniej value i user. Jeśli remote ma być tworzony bez --url,
potrzebne są też org i repo.
tokens stats
Pokazuje kontekst, tabelę tokens i podsumowanie statusów endpointów.
./rvctl tokens stats
./rvctl tokens stats --repo ~/dev/workspace/rv/tools/rv-launcher
Uprawnienia
W tokens.json uprawnienia są zapisane jako mapy klucz-wartość. W tabelach CLI
są pokazywane jako zwarte maski.
Nagłówki masek:
scope:aAimnopruorg:oawrc-repo:oawr--
Kategorie scope:
a- activitypubA- admini- issuem- miscn- notificationo- organizationp- packager- repositoryu- user
Wartości w scope:
w- read/writer- read-- no access?- nie wczytano!- błąd wczytania
Gitea może zwrócić globalny scope all zamiast listy write:*. Launcher
rozwija wtedy all do pełnej maski wwwwwwwww. Scope public-only jest
flagą ograniczenia widoczności API i nie zmienia kategorii w tej masce.
Kategorie org_perm:
o- ownera- adminw- writer- readc- create repository
Kategorie repo_perm:
o- ownera- adminw- writer- read
Wartości w org_perm i repo_perm:
+- flaga włączona-- flaga wyłączona?- nie wczytano!- błąd wczytania
Model Danych
tokens.json ma format version: 3. Głównym rekordem jest jeden remote-token.
Pole id jest obowiązkowe i musi być takie samo jak nazwa git remote, np.
r1 albo r1a.
Pola synchronizowane z git remote:
id- nazwa git remote, np.r1server.endpoint- endpoint serwera, np.http://77.90.8.171:3001server.type- typ serwera, np.gitea,github,gitlab,unknownuser- login z URL-a, czyli lewa stronahttp://u1:SECRET@...value- sekret tokenaorg- organizacja z URL-arepo- repo z URL-a
Pola pobierane z API przez tokens update r1:
valid-forever, data wygaśnięcia,invalid,?albo!scope- mapa scope tokenaorg_perm- mapa praw użytkownika w organizacjirepo_perm- mapa praw użytkownika w repo
tokens sync remote r1 nadpisuje pola z git remota i oznacza te metadane jako
nieznane. To celowe: po zmianie sekretu, usera albo repo stare metadane API nie
są już wiarygodne.
Minimalny przykład:
{
"version": 3,
"tokens": [
{
"id": "r1",
"value": "SECRET",
"server": {
"type": "gitea",
"endpoint": "http://77.90.8.171:3001",
"scheme": "http",
"host": "77.90.8.171",
"port": 3001
},
"user": "u1",
"org": "edu-tools",
"repo": "rv-launcher"
}
]
}
Przykład po tokens update r1 może dodatkowo zawierać:
{
"valid": "forever",
"scope": {
"a": "w",
"A": "w",
"i": "w",
"m": "w",
"n": "w",
"o": "w",
"p": "w",
"r": "w",
"u": "w"
},
"org_perm": {
"o": "+",
"a": "+",
"w": "+",
"r": "+",
"c": "+"
},
"repo_perm": {
"o": "+",
"a": "+",
"w": "+",
"r": "+"
}
}
Pełny schemat pliku jest w doc/tokens.schema.json.