|
| 1 | +#!/bin/bash |
| 2 | +# info: generate access key |
| 3 | +# options: USER [PERMISSIONS] [COMMENT] [FORMAT] |
| 4 | +# |
| 5 | +# example: v-add-access-key admin v-purge-nginx-cache,v-list-mail-accounts comment json |
| 6 | +# |
| 7 | +# The "PERMISSIONS" argument is optional for the admin user only. |
| 8 | +# This function creates a key file in $HESTIA/data/access-keys/ |
| 9 | + |
| 10 | +#----------------------------------------------------------# |
| 11 | +# Variables & Functions # |
| 12 | +#----------------------------------------------------------# |
| 13 | + |
| 14 | +# Argument definition |
| 15 | +user=$1 |
| 16 | +permissions=$2 |
| 17 | +comment=$3 |
| 18 | +format=${4-shell} |
| 19 | + |
| 20 | +# Includes |
| 21 | +# shellcheck source=/etc/hestiacp/hestia.conf |
| 22 | +source /etc/hestiacp/hestia.conf |
| 23 | +# shellcheck source=/usr/local/hestia/func/main.sh |
| 24 | +source $HESTIA/func/main.sh |
| 25 | +# load config file |
| 26 | +source_conf "$HESTIA/conf/hestia.conf" |
| 27 | + |
| 28 | +keygen() { |
| 29 | + local LENGTH=${1:-20} |
| 30 | + local USE_SPECIAL_CHARACTERS="${2:-no}" |
| 31 | + |
| 32 | + local MATRIX='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' |
| 33 | + if [[ "$USE_SPECIAL_CHARACTERS" == "yes" ]]; then |
| 34 | + MATRIX+='_-+^~=%' |
| 35 | + fi |
| 36 | + |
| 37 | + local PASS N |
| 38 | + while [ ${N:=1} -le $LENGTH ]; do |
| 39 | + PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}" |
| 40 | + let N+=1 |
| 41 | + done |
| 42 | + |
| 43 | + echo "$PASS" |
| 44 | +} |
| 45 | + |
| 46 | +access_key_id="$(keygen)" |
| 47 | +secret_access_key="$(keygen 40 yes)" |
| 48 | + |
| 49 | +# Perform verification if read-only mode is enabled |
| 50 | +check_hestia_demo_mode |
| 51 | + |
| 52 | +# Remove whitespace and bin path from permissions |
| 53 | +permissions="$(cleanup_key_permissions "$permissions")" |
| 54 | + |
| 55 | +time_n_date=$(date +'%T %F') |
| 56 | +time=$(echo "$time_n_date" |cut -f 1 -d \ ) |
| 57 | +date=$(echo "$time_n_date" |cut -f 2 -d \ ) |
| 58 | + |
| 59 | +#----------------------------------------------------------# |
| 60 | +# Verifications # |
| 61 | +#----------------------------------------------------------# |
| 62 | + |
| 63 | +check_args '1' "$#" 'USER [PERMISSIONS] [COMMENT] [FORMAT]' |
| 64 | +is_format_valid 'user' |
| 65 | +is_object_valid 'user' 'USER' "$user" |
| 66 | +is_key_permissions_format_valid "$permissions" "$user" |
| 67 | +if [ -n "$comment" ]; then |
| 68 | + is_format_valid 'comment' |
| 69 | +fi |
| 70 | + |
| 71 | +#----------------------------------------------------------# |
| 72 | +# Action # |
| 73 | +#----------------------------------------------------------# |
| 74 | + |
| 75 | +if [ ! -d "$HESTIA/data/access-keys/" ]; then |
| 76 | + mkdir -p $HESTIA/data/access-keys/ |
| 77 | + chown root:root $HESTIA/data/access-keys/ |
| 78 | + chmod 750 $HESTIA/data/access-keys/ |
| 79 | +fi |
| 80 | + |
| 81 | +if [[ -e "$HESTIA/data/access-keys/${access_key_id}" ]]; then |
| 82 | + while [[ -e "$HESTIA/data/access-keys/${access_key_id}" ]]; do |
| 83 | + access_key_id=$(keygen) |
| 84 | + done |
| 85 | +fi |
| 86 | + |
| 87 | +echo "SECRET_ACCESS_KEY='$secret_access_key'" >"$HESTIA/data/access-keys/${access_key_id}" |
| 88 | +echo "USER='$user'" >>"$HESTIA/data/access-keys/${access_key_id}" |
| 89 | +echo "PERMISSIONS='$permissions'" >>"$HESTIA/data/access-keys/${access_key_id}" |
| 90 | +echo "COMMENT='$comment'" >>"$HESTIA/data/access-keys/${access_key_id}" |
| 91 | +echo "TIME='$time'" >>"$HESTIA/data/access-keys/${access_key_id}" |
| 92 | +echo "DATE='$date'" >>"$HESTIA/data/access-keys/${access_key_id}" |
| 93 | +# TODO Index reserved for future implementation |
| 94 | +echo "EXPIRES_IN=''" >>"$HESTIA/data/access-keys/${access_key_id}" |
| 95 | +echo "IP=''" >>"$HESTIA/data/access-keys/${access_key_id}" |
| 96 | + |
| 97 | +chmod 640 "$HESTIA/data/access-keys/${access_key_id}" |
| 98 | + |
| 99 | +$BIN/v-list-access-key "$access_key_id" "$format" |
| 100 | + |
| 101 | +#----------------------------------------------------------# |
| 102 | +# Hestia # |
| 103 | +#----------------------------------------------------------# |
| 104 | + |
| 105 | +# Logging |
| 106 | +log_history "Access key $access_key_id generated" "Warning" "$user" "API" |
| 107 | +log_event "$OK" "$ARGUMENTS" |
| 108 | + |
| 109 | +exit |
0 commit comments