Add token validity and endpoint columns

This commit is contained in:
mpabi
2026-04-26 20:52:44 +02:00
parent 2885d3a4fa
commit 6e065dbd08
4 changed files with 30 additions and 8 deletions
+1
View File
@@ -161,6 +161,7 @@ Podstawowe komendy tokenow:
remote i `tokens.json` sa zgodne oraz uprawnienia zostaly wczytane, `R` oznacza remote i `tokens.json` sa zgodne oraz uprawnienia zostaly wczytane, `R` oznacza
token tylko w remote, a `S` token tylko w `tokens.json`. Kolumny `scope`, `org` token tylko w remote, a `S` token tylko w `tokens.json`. Kolumny `scope`, `org`
i `repo` sa maskami uprawnien; bez `*` maja wartosc `?????` albo `????`. i `repo` sa maskami uprawnien; bez `*` maja wartosc `?????` albo `????`.
Kolumna `valid` oznacza, czy token zostal zaakceptowany przez API teraz.
## Fetch i switch ## Fetch i switch
+7 -6
View File
@@ -304,9 +304,9 @@ Typowy wynik:
```text ```text
tokens tokens
item server host org repo user remote token_ref token scope org repo item server proto host port org repo user remote token_ref token valid scope org repo
---- ------ ------------- --------- ----------- ---- ------ --------- ------------ ------ ------ ------ ---- ------ ----- ------------- ----- --------- ----------- ---- ------ --------- ------------ ----- awrop- oawrc- oawr--
1 gitea 77.90.8.171 edu-tools rv-launcher u1 r1 t1 * e59cc...13be +---+ +++++ ++++ 1 gitea http 77.90.8.171 3001 edu-tools rv-launcher u1 r1 t1 * e59cc...13be + +---+ +++++ ++++
``` ```
`token_ref` jest komorka stalej szerokosci: nazwa tokena jest po lewej, a marker `token_ref` jest komorka stalej szerokosci: nazwa tokena jest po lewej, a marker
@@ -320,6 +320,7 @@ Maski uprawnien:
- `org` ma pozycje `oawrc`: owner, admin, write, read, create repo - `org` ma pozycje `oawrc`: owner, admin, write, read, create repo
- `repo` ma pozycje `oawr`: owner, admin, write, read - `repo` ma pozycje `oawr`: owner, admin, write, read
- `+` oznacza wlaczone, `-` wylaczone, `?` nie wczytano, `!` blad wczytania - `+` oznacza wlaczone, `-` wylaczone, `?` nie wczytano, `!` blad wczytania
- `valid` oznacza wynik sprawdzenia tokena przez API: `+` dziala, `-` odrzucony, `?` nie sprawdzono, `!` blad
Przyklad: Przyklad:
@@ -382,9 +383,9 @@ repo_root<TAB>...
token_path<TAB>... token_path<TAB>...
tokens tokens
item server host org repo user remote token_ref token scope org repo item server proto host port org repo user remote token_ref token valid scope org repo
---- ------ ------------- --------- ----------- ---- ------ --------- ------------ ------ ------ ------ ---- ------ ----- ------------- ----- --------- ----------- ---- ------ --------- ------------ ----- awrop- oawrc- oawr--
1 gitea 77.90.8.171 edu-tools rv-launcher u1 r1 t1 * e59cc...13be +---+ +++++ ++++ 1 gitea http 77.90.8.171 3001 edu-tools rv-launcher u1 r1 t1 * e59cc...13be + +---+ +++++ ++++
status status
item<TAB>value item<TAB>value
+3
View File
@@ -104,13 +104,16 @@ Kolumny w tabeli `tokens`:
- `item` - numer wiersza tokena - `item` - numer wiersza tokena
- `server` - typ serwera, na przyklad `gitea` - `server` - typ serwera, na przyklad `gitea`
- `proto` - protokol endpointu, na przyklad `http`
- `host` - host endpointu, na przyklad `77.90.8.171` - `host` - host endpointu, na przyklad `77.90.8.171`
- `port` - port endpointu, na przyklad `3001`
- `org` - organizacja z remote URL - `org` - organizacja z remote URL
- `repo` - repo z remote URL - `repo` - repo z remote URL
- `user` - login wlasciciela tokena - `user` - login wlasciciela tokena
- `remote` - nazwa remota, na przyklad `r1` - `remote` - nazwa remota, na przyklad `r1`
- `token_ref` - nazwa tokena z markerem po prawej stronie - `token_ref` - nazwa tokena z markerem po prawej stronie
- `token` - zamaskowana wartosc tokena - `token` - zamaskowana wartosc tokena
- `valid` - wynik sprawdzenia tokena przez API: `+` dziala, `-` odrzucony, `?` nie sprawdzono, `!` blad
- `scope` - maska scope tokena `awrop` - `scope` - maska scope tokena `awrop`
- `org` - maska praw w organizacji `oawrc` - `org` - maska praw w organizacji `oawrc`
- `repo` - maska praw w repo `oawr` - `repo` - maska praw w repo `oawr`
+19 -2
View File
@@ -716,18 +716,27 @@ TOKEN_REF_WIDTH = 9
TOKEN_COLUMNS = [ TOKEN_COLUMNS = [
("item", "item", 4), ("item", "item", 4),
("server", "server", 6), ("server", "server", 6),
("proto", "proto", 5),
("host", "host", 13), ("host", "host", 13),
("port", "port", 5),
("owner", "org", 9), ("owner", "org", 9),
("repo_name", "repo", 11), ("repo_name", "repo", 11),
("user", "user", 4), ("user", "user", 4),
("remote", "remote", 6), ("remote", "remote", 6),
("token_ref", "token_ref", TOKEN_REF_WIDTH), ("token_ref", "token_ref", TOKEN_REF_WIDTH),
("token", "token", 12), ("token", "token", 12),
("valid", "valid", 5),
("scope_mask", "scope", 6), ("scope_mask", "scope", 6),
("org_mask", "org", 6), ("org_mask", "org", 6),
("repo_mask", "repo", 6), ("repo_mask", "repo", 6),
] ]
TOKEN_SEPARATOR_OVERRIDES = {
"scope_mask": "awrop-",
"org_mask": "oawrc-",
"repo_mask": "oawr--",
}
def fit_cell(value: str, width: int) -> str: def fit_cell(value: str, width: int) -> str:
if len(value) <= width: if len(value) <= width:
@@ -740,7 +749,7 @@ def fit_cell(value: str, width: int) -> str:
def print_fixed_table(title: str, columns: list[tuple[str, str, int]], rows: list[dict[str, str]]) -> None: def print_fixed_table(title: str, columns: list[tuple[str, str, int]], rows: list[dict[str, str]]) -> None:
print(title) print(title)
print(" ".join(fit_cell(label, width) for _, label, width in columns).rstrip()) print(" ".join(fit_cell(label, width) for _, label, width in columns).rstrip())
print(" ".join("-" * width for _, _, width in columns).rstrip()) print(" ".join(fit_cell(TOKEN_SEPARATOR_OVERRIDES.get(name, "-" * width), width) for name, _, width in columns).rstrip())
for row in rows: for row in rows:
print(" ".join(fit_cell(row.get(name, ""), width) for name, _, width in columns).rstrip()) print(" ".join(fit_cell(row.get(name, ""), width) for name, _, width in columns).rstrip())
@@ -928,6 +937,7 @@ def load_gitea_authz(endpoint: str, user_name: str, token_name: str, token_value
api_base = endpoint.rstrip("/") + "/api/v1" api_base = endpoint.rstrip("/") + "/api/v1"
result = { result = {
"ok": False, "ok": False,
"valid": "!",
"scope_mask": "!!!!!", "scope_mask": "!!!!!",
"org_mask": "!!!!!", "org_mask": "!!!!!",
"repo_mask": "!!!!", "repo_mask": "!!!!",
@@ -936,6 +946,7 @@ def load_gitea_authz(endpoint: str, user_name: str, token_name: str, token_value
try: try:
tokens_url = f"{api_base}/users/{quote(user_name, safe='')}/tokens" tokens_url = f"{api_base}/users/{quote(user_name, safe='')}/tokens"
token_list = api_get_json(tokens_url, token_value, user_name=user_name, basic=True) token_list = api_get_json(tokens_url, token_value, user_name=user_name, basic=True)
result["valid"] = "+"
token_last8 = token_value[-8:] token_last8 = token_value[-8:]
token_entry = next( token_entry = next(
( (
@@ -967,7 +978,10 @@ def load_gitea_authz(endpoint: str, user_name: str, token_name: str, token_value
result["ok"] = True result["ok"] = True
return result return result
except (OSError, ValueError, urlerror.URLError, urlerror.HTTPError): except urlerror.HTTPError as error:
result["valid"] = "-" if error.code in {401, 403} else "!"
return result
except (OSError, ValueError, urlerror.URLError):
return result return result
@@ -1016,13 +1030,16 @@ def print_token_item_rows(
{ {
"item": str(len(token_rows) + 1), "item": str(len(token_rows) + 1),
"server": endpoint_values["server"], "server": endpoint_values["server"],
"proto": endpoint_values["scheme"],
"host": endpoint_values["host"], "host": endpoint_values["host"],
"port": endpoint_values["port"],
"owner": owner, "owner": owner,
"repo_name": repo_name, "repo_name": repo_name,
"user": user_name, "user": user_name,
"remote": remote_name, "remote": remote_name,
"token_ref": format_token_ref(token_name, marker), "token_ref": format_token_ref(token_name, marker),
"token": short_secret(token_value), "token": short_secret(token_value),
"valid": authz.get("valid", "?") if authz else "?",
"scope_mask": authz.get("scope_mask", "?????") if authz else "?????", "scope_mask": authz.get("scope_mask", "?????") if authz else "?????",
"org_mask": authz.get("org_mask", "?????") if authz else "?????", "org_mask": authz.get("org_mask", "?????") if authz else "?????",
"repo_mask": authz.get("repo_mask", "????") if authz else "????", "repo_mask": authz.get("repo_mask", "????") if authz else "????",