#!/usr/bin/env bash

# Find directory for this script
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink -f "$SOURCE")"; done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

# OS specific support.
cygwin=false;
case "`uname`" in
  CYGWIN*) cygwin=true ;;
esac

# Check that JAVA_HOME is set
if [ ! -n "$JAVA_HOME" ]; then
    JAVACMD=`command -v java`
    if [ ! -n "$JAVACMD" ]
    then
        echo "You must set JAVA_HOME before running the SignServer cli."
        exit 1
    fi
else
    JAVACMD=$JAVA_HOME/bin/java
fi


class_name=org.signserver.client.cli.ClientCLI

if [ -n "${SIGNCLIENT_HOME}" ]; then
  SIGNSRV_HOME=$SIGNCLIENT_HOME
elif [ -n "${SIGNSERVER_HOME}" ]; then
  SIGNSRV_HOME=$SIGNSERVER_HOME
else
  if [ -f $DIR/signclient ]; then
    SIGNSRV_HOME=$DIR/..
  fi
  if [ -f /etc/signserver/signservermgmt.env ]; then
     . /etc/signserver/signservermgmt.env
  fi
  if [ -f /etc/mailsigner/mailsignermgmt.env ]; then
     . /etc/mailsigner/mailsignermgmt.env
  fi
  if [ -f /usr/share/signserver/bin/signclient ]; then
     SIGNSRV_HOME=/usr/share/signserver
  fi
  if [ -f /opt/signserver/bin/signclient ]; then
     SIGNSRV_HOME=/opt/signserver
  fi
  if [ -f /usr/local/signserver/bin/signclient ]; then
     SIGNSRV_HOME=/usr/local/signserver
  fi
  if [ -f ./signclient ]; then
     SIGNSRV_HOME=..
  fi
  if [ -f bin/signclient ]; then
     SIGNSRV_HOME=.
  fi
fi 

# Check if SIGNSRV_HOME points to valid path
if [ ! -f ${SIGNSRV_HOME}/bin/signclient ]; then
    echo "You must run signclient from ONE of following directories: $SIGNSERVER_HOME, $SIGNSERVER_HOME/bin, OR set ONE of following environment variables: SIGNCLIENT_HOME, SIGNSERVER_HOME"
    exit 1
fi

MAIN_JAR=`find "${SIGNSRV_HOME}/lib" -name "SignServer-Client-CLI*.jar"`

# Check that classes exist
if [ ! -f "${MAIN_JAR}" ]
then
	echo "You must build SignServer Client CLI first."
        exit 1
fi

# Optional JARs
VALIDATIONCLI_JAR=`find "${SIGNSRV_HOME}/lib" -name "SignServer-Client-ValidationCLI-*.jar"`
ENTERPRISE_JAR=`find "${SIGNSRV_HOME}/lib" -name "SignServer-ClientCLI-Enterprise-*.jar"`
OPTIONAL_CLASSPATH=${VALIDATIONCLI_JAR}:${ENTERPRISE_JAR}:${EXTRA_CLASSPATH}

# Construct the classpath
CP="${MAIN_JAR}"
CP="${SIGNSRV_HOME}/conf":"$CP"
CP="$CP:$SIGNSRV_HOME/res/deploytools/cesecore"
CP="$CP":${OPTIONAL_CLASSPATH}

# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
  CP=`cygpath --path --windows "$CP"`
fi

# Enable Java network debug logs
#JAVA_OPTS="$JAVA_OPTS -Djavax.net.debug=all"
#JAVA_OPTS="$JAVA_OPTS -Djavax.net.debug=ssl"

# Enable Java PKCS#11 debug logs
#JAVA_OPTS="$JAVA_OPTS -Djava.security.debug=sunpkcs11"

# In some cases, running SignClient authenticating with a P11 token
# (e.g. a smartcard reader) could give cipher-suit errors,
# In these cases, a workaround is to force the use of TLS version 1.1
#JAVA_OPTS="$JAVA_OPTS  -Djdk.tls.client.protocols=TLSv1.1 -Dhttps.protocols=TLSv1.1"

# Enable Java debugging
#JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=8788,server=y,suspend=n"
#JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=8788,server=y,suspend=y"
#JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=*:8788,server=y,suspend=y"

# Execute the command
exec "$JAVACMD" $JAVA_OPTS -cp "${CP}" $class_name "$@"
