clickhouse-users-cli 0.1.2__tar.gz → 0.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (18) hide show
  1. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/PKG-INFO +2 -1
  2. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/README.md +1 -0
  3. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/__init__.py +1 -1
  4. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/app.py +49 -1
  5. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/sql_builder.py +13 -0
  6. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/PKG-INFO +2 -1
  7. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/LICENSE +0 -0
  8. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/db.py +0 -0
  9. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/session.py +0 -0
  10. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/style.py +0 -0
  11. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli/validators.py +0 -0
  12. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/SOURCES.txt +0 -0
  13. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/dependency_links.txt +0 -0
  14. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/entry_points.txt +0 -0
  15. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/requires.txt +0 -0
  16. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/clickhouse_users_cli.egg-info/top_level.txt +0 -0
  17. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/pyproject.toml +0 -0
  18. {clickhouse_users_cli-0.1.2 → clickhouse_users_cli-0.1.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clickhouse-users-cli
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: CLI interativa para criar usuarios ClickHouse com privilegio minimo (least privilege)
5
5
  License-Expression: MIT
6
6
  Keywords: clickhouse,cli,users,access-control,least-privilege
@@ -76,6 +76,7 @@ GRANT SHOW, SELECT ON `vendas`.`clientes` TO `analyst_julho`;
76
76
 
77
77
  - **Listar** — `SHOW USERS` em tabela + opção de ver `SHOW CREATE USER` e `SHOW GRANTS FOR` de um usuário.
78
78
  - **Gerenciar** — escolhe 1 usuário, vê status (`HOST NONE` = inativo) + grants, depois:
79
+ - **Editar permissões** → pergunta perfil (tipo de acesso) + bancos/tabelas e aplica `REVOKE ALL ON *.*` + novos `GRANTs` (com preview e confirmação);
79
80
  - **Desativar** → `ALTER USER \`nome\` HOST NONE` (reversível, bloqueia login);
80
81
  - **Reativar** → `ALTER USER \`nome\` HOST ANY`;
81
82
  - **Excluir** → `DROP USER IF EXISTS \`nome\`` (definitivo).
@@ -52,6 +52,7 @@ GRANT SHOW, SELECT ON `vendas`.`clientes` TO `analyst_julho`;
52
52
 
53
53
  - **Listar** — `SHOW USERS` em tabela + opção de ver `SHOW CREATE USER` e `SHOW GRANTS FOR` de um usuário.
54
54
  - **Gerenciar** — escolhe 1 usuário, vê status (`HOST NONE` = inativo) + grants, depois:
55
+ - **Editar permissões** → pergunta perfil (tipo de acesso) + bancos/tabelas e aplica `REVOKE ALL ON *.*` + novos `GRANTs` (com preview e confirmação);
55
56
  - **Desativar** → `ALTER USER \`nome\` HOST NONE` (reversível, bloqueia login);
56
57
  - **Reativar** → `ALTER USER \`nome\` HOST ANY`;
57
58
  - **Excluir** → `DROP USER IF EXISTS \`nome\`` (definitivo).
@@ -1,5 +1,5 @@
1
1
  """ClickHouse Users CLI — crie usuários com escopo mínimo (least privilege)."""
2
2
 
3
- __version__ = "0.1.2"
3
+ __version__ = "0.1.3"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -17,6 +17,7 @@ from clickhouse_users_cli.sql_builder import (
17
17
  build_all_statements,
18
18
  build_deactivate_user_sql,
19
19
  build_drop_user_sql,
20
+ build_edit_grants_statements,
20
21
  )
21
22
  from clickhouse_users_cli.style import APP_STYLE, banner, console, error, info, make_table, step, success, warn
22
23
  from clickhouse_users_cli.session import SESSION_FILE
@@ -418,7 +419,7 @@ def ask_main_action(show_forget: bool = False) -> str:
418
419
  choices = [
419
420
  Q.Choice("Criar usuário — com privilégio mínimo", value="create"),
420
421
  Q.Choice("Listar usuários — SHOW USERS + grants", value="list"),
421
- Q.Choice("Gerenciar usuário — desativar / reativar / excluir", value="manage"),
422
+ Q.Choice("Gerenciar usuário — acessos, desativar / reativar / excluir", value="manage"),
422
423
  ]
423
424
  if show_forget:
424
425
  choices.append(Q.Choice("Esquecer sessão — apagar YAML salvo", value="forget"))
@@ -504,6 +505,49 @@ def flow_list_users(admin: ClickHouseAdmin) -> None:
504
505
  show_user_details(admin, target)
505
506
 
506
507
 
508
+ def flow_edit_grants(admin: ClickHouseAdmin, username: str) -> None:
509
+ """Redefine os acessos: REVOKE ALL + GRANTs novos (perfil + escopo + hosts intactos)."""
510
+ step("Usuários · Editar permissões", "Os acessos atuais serão zerados e reaplicados. Nada muda sem confirmação.")
511
+ if username == admin.conn.username:
512
+ warn(f"'{username}' é o usuário conectado agora. Zerar os próprios acessos pode te derrubar.")
513
+
514
+ profile = ask_profile()
515
+ privileges, grant_option = ask_privileges(profile)
516
+ if profile == "admin":
517
+ grant_option = True
518
+ databases = ask_databases(admin)
519
+ scopes = ask_tables(admin, databases)
520
+
521
+ statements = build_edit_grants_statements(username, privileges, scopes, grant_option)
522
+ table = make_table(f"Novos acessos de '{username}'")
523
+ table.add_column("Privilégios", style="bold")
524
+ table.add_column("Escopo", style="bold")
525
+ table.add_column("Grant option", style="dim")
526
+ for s in scopes:
527
+ table.add_row(", ".join(privileges), s.on_clause(), "sim" if grant_option else "não")
528
+ console.print(table)
529
+
530
+ console.print("[dim]SQL a executar (ordem importa: primeiro zera, depois concede):[/]")
531
+ from rich.panel import Panel as RichPanel
532
+
533
+ for sql in statements:
534
+ console.print(RichPanel(Syntax(sql + ";", "sql", theme="monokai"), border_style="dim"))
535
+
536
+ go = _ask_or_abort(Q.confirm(f"Aplicar novos acessos a '{username}' agora?", default=False, style=APP_STYLE, qmark="›"))
537
+ if not go:
538
+ console.print("[dim]Nada foi executado.[/]")
539
+ return
540
+
541
+ with console.status("[cyan]Aplicando acessos…[/]", spinner="dots"):
542
+ try:
543
+ admin.execute_statements(statements)
544
+ except Exception as e:
545
+ error(f"Falha ao editar acessos: {e}")
546
+ info("Dica: a conta precisa de GRANT/REVOKE nos escopos envolvidos. Os acessos antigos podem ter sido zerados — confira com Listar.")
547
+ return
548
+ success(f"Acessos de '{username}' atualizados ({len(statements)} comando(s)).")
549
+
550
+
507
551
  def flow_manage_users(admin: ClickHouseAdmin) -> None:
508
552
  step("Usuários · Gerenciar", "Desativar = HOST NONE (reversível). Excluir = DROP USER (definitivo).")
509
553
  with console.status("[cyan]Listando usuários…[/]", spinner="dots"):
@@ -537,6 +581,7 @@ def flow_manage_users(admin: ClickHouseAdmin) -> None:
537
581
  else:
538
582
  options.append(Q.Choice("Desativar — ALTER USER … HOST NONE (reversível)", value="deactivate"))
539
583
  options += [
584
+ Q.Choice("Editar permissões — bancos/tabelas + tipo de acesso", value="edit"),
540
585
  Q.Choice("Excluir — DROP USER (definitivo!)", value="drop"),
541
586
  Q.Choice("Voltar ao menu", value="back"),
542
587
  ]
@@ -545,6 +590,9 @@ def flow_manage_users(admin: ClickHouseAdmin) -> None:
545
590
  )
546
591
  if action == "back":
547
592
  return
593
+ if action == "edit":
594
+ flow_edit_grants(admin, target)
595
+ return
548
596
 
549
597
  preview = {
550
598
  "deactivate": build_deactivate_user_sql(target),
@@ -114,3 +114,16 @@ def build_drop_user_sql(username: str, if_exists: bool = True) -> str:
114
114
  """Exclui o usuário em definitivo."""
115
115
  ine = "IF EXISTS " if if_exists else ""
116
116
  return f"DROP USER {ine}{escape_ident(username)}"
117
+
118
+
119
+ def build_revoke_all_sql(username: str) -> str:
120
+ """Remove todos os privilégios em todos os escopos (zera antes de reaplicar)."""
121
+ return f"REVOKE ALL ON *.* FROM {escape_ident(username)}"
122
+
123
+
124
+ def build_edit_grants_statements(
125
+ username: str, privileges: list[str], scopes: list[GrantScope], grant_option: bool = False
126
+ ) -> list[str]:
127
+ """Edição de acessos: REVOKE ALL + GRANTs novos (com preview + confirmação no CLI)."""
128
+ spec = UserSpec(username=username, password="", privileges=privileges, scopes=scopes, grant_option=grant_option)
129
+ return [build_revoke_all_sql(username), *build_grant_sql(spec)]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clickhouse-users-cli
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: CLI interativa para criar usuarios ClickHouse com privilegio minimo (least privilege)
5
5
  License-Expression: MIT
6
6
  Keywords: clickhouse,cli,users,access-control,least-privilege
@@ -76,6 +76,7 @@ GRANT SHOW, SELECT ON `vendas`.`clientes` TO `analyst_julho`;
76
76
 
77
77
  - **Listar** — `SHOW USERS` em tabela + opção de ver `SHOW CREATE USER` e `SHOW GRANTS FOR` de um usuário.
78
78
  - **Gerenciar** — escolhe 1 usuário, vê status (`HOST NONE` = inativo) + grants, depois:
79
+ - **Editar permissões** → pergunta perfil (tipo de acesso) + bancos/tabelas e aplica `REVOKE ALL ON *.*` + novos `GRANTs` (com preview e confirmação);
79
80
  - **Desativar** → `ALTER USER \`nome\` HOST NONE` (reversível, bloqueia login);
80
81
  - **Reativar** → `ALTER USER \`nome\` HOST ANY`;
81
82
  - **Excluir** → `DROP USER IF EXISTS \`nome\`` (definitivo).