#!/bin/bash
##
## ユーザー情報によって使用/予約されていない名前かどうかをチェック
## (新規作成するメーリングリストの名前に使用できるかチェックするために利用)
##
## NOTE: LDAP DIT に含まれない情報が必要なため、ユーザー DB を参照する必要がある。
##

set -e
set -u
set -o pipefail

pdie() {
  echo "$0: ERROR: $*" 1>&2
  exit "${2-1}"
}

mysql_path="${MYSQL_PATH:-/usr/bin/mysql}"
my_cnf_path="/var/www/tufs-mail/etc/accountdb.my.cnf"

## $name is lowercased
name="${1,,}"; shift

if [[ ! $name =~ ^[_a-zA-Z0-9][-_a-zA-Z0-9]*(\.[-_a-zA-Z0-9]+)*$ ]]; then
  pdie "Invalid name format: $name"
fi

## ローカルユーザー名に一致する名前は不可
if getent passwd "$name" >/dev/null 2>&1; then
  pdie "Name already exists as a local user: $name"
fi

## DB のユーザーレコードの UNAME, TUFS_Mail, PersistentUNAME に一致する名前は不可
db_q="\
SELECT COUNT(*)
  FROM Accounts
  WHERE UNAME='$name' OR TUFS_Mail='$name' OR PersistentUNAME='$name'
;"
db_out=$(
  "$mysql_path" \
    --defaults-file="$my_cnf_path" \
    --execute="$db_q" \
  |tail -n1 \
  ;
)
db_rc="$?"
if [[ $db_rc -ne 0 ]]; then
  pdie "DB command failure: mysql exit code: $db_rc" "$db_rc"
fi
if [[ $db_out -gt 0 ]]; then
  pdie "Name already exists as an username and/or an e-mail address in database: $name"
fi

exit 0

