#!/usr/bin/env bash
# ====================================================================
# 第 15 章 · 安全与多租户
# scram_user_setup.sh - 创建 / 修改 / 删除 SCRAM-SHA-256 用户
# --------------------------------------------------------------------
# 前提：
#   1. Broker 已开启 SASL_SSL + SCRAM-SHA-256（参见 server.properties）
#   2. 当前 shell 有一个有 SuperUser 权限的客户端配置 admin.properties
#
# 用法：
#   ./scram_user_setup.sh add    alice  alice-secret
#   ./scram_user_setup.sh update bob    new-secret
#   ./scram_user_setup.sh list   alice
#   ./scram_user_setup.sh delete bob
# ====================================================================
set -euo pipefail

BOOTSTRAP=${BOOTSTRAP:-localhost:9092}
COMMAND_CONFIG=${COMMAND_CONFIG:-/etc/kafka/admin.properties}

# admin.properties 示例（SuperUser 凭证）：
# bootstrap.servers=localhost:9092
# security.protocol=SASL_SSL
# sasl.mechanism=SCRAM-SHA-256
# sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
#   username="admin" password="admin-secret";
# ssl.truststore.location=/etc/kafka/ssl/client.truststore.jks
# ssl.truststore.password=changeit

action=${1:-help}
user=${2:-}
pass=${3:-}

usage() {
  cat <<EOF
Usage:
  $0 add    <user> <password>   # 创建用户（SCRAM-SHA-256, iterations=4096）
  $0 update <user> <password>   # 修改密码
  $0 list   [user]              # 列出（指定用户或全部）
  $0 delete <user>              # 删除
EOF
  exit 1
}

case "$action" in
  add|update)
    [[ -z "$user" || -z "$pass" ]] && usage
    echo "🔧 ${action} SCRAM-SHA-256 user: $user"
    kafka-configs.sh --bootstrap-server "$BOOTSTRAP" --command-config "$COMMAND_CONFIG" \
      --alter --add-config "SCRAM-SHA-256=[iterations=4096,password=${pass}]" \
      --entity-type users --entity-name "$user"
    echo "✅ done"
    ;;

  list)
    if [[ -z "$user" ]]; then
      echo "📋 列出全部 SCRAM 用户"
      kafka-configs.sh --bootstrap-server "$BOOTSTRAP" --command-config "$COMMAND_CONFIG" \
        --describe --entity-type users
    else
      echo "📋 用户 $user 的 SCRAM 配置"
      kafka-configs.sh --bootstrap-server "$BOOTSTRAP" --command-config "$COMMAND_CONFIG" \
        --describe --entity-type users --entity-name "$user"
    fi
    ;;

  delete)
    [[ -z "$user" ]] && usage
    echo "❌ 删除 SCRAM-SHA-256 user: $user"
    kafka-configs.sh --bootstrap-server "$BOOTSTRAP" --command-config "$COMMAND_CONFIG" \
      --alter --delete-config 'SCRAM-SHA-256' \
      --entity-type users --entity-name "$user"
    echo "✅ done"
    ;;

  *)
    usage
    ;;
esac

# ====================================================================
# 一些常用片段（生产中常组合使用）
# --------------------------------------------------------------------
#
# 1) 创建一个团队主账号 + 一组 client-id
#    ./scram_user_setup.sh add team-order $(openssl rand -base64 18)
#
# 2) 配套 PREFIXED ACL（参见 acl_examples.sh）
#    kafka-acls.sh ... --add --allow-principal User:team-order \
#      --operation Read --operation Write --operation Describe --operation Create \
#      --topic 'prod.team-order.' --resource-pattern-type PREFIXED
#
# 3) 配套 Quota（参见 acl_examples.sh）
#    kafka-configs.sh ... --alter \
#      --add-config 'producer_byte_rate=10485760,consumer_byte_rate=20971520' \
#      --entity-type users --entity-name team-order
# ====================================================================
