diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index 5fea002..82ce570 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -14,21 +14,52 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v2 with: - java-version: 11 + java-version: 17 distribution: 'adopt' cache: gradle - - name: Build with Gradle - run: ./gradlew fatJar + - name: Build distribution with Gradle + run: ./gradlew distZip + + - name: Decompress web distribution file + uses: montudor/action-zip@v1 + with: + args: unzip -qq Havana-Web/build/distributions/Havana-Web.zip -d ./release + + - name: Decompress server distribution file + uses: montudor/action-zip@v1 + with: + args: unzip -qq Havana-Server/build/distributions/Havana-Server.zip -d ./release + + - name: File release preparation + run: | + sudo rm -rf ./release/Havana-Web/bin/* + sudo rm -rf ./release/Havana-Web/bin + sudo rm -rf ./release/Havana-Server/bin/* + sudo rm -rf ./release/Havana-Server/bin + sudo mkdir ./Havana + sudo mkdir ./Havana/lib + sudo mv ./release/Havana-Web/lib/Havana-Server.jar ./Havana/Havana-Server.jar + sudo mv ./release/Havana-Web/lib/Havana-Web.jar ./Havana/Havana-Web.jar + sudo mv ./release/Havana-Web/lib/* ./Havana/lib + sudo mv ./release/Havana-Server/lib/* ./Havana/lib + sudo cp tools/scripts/run_server.bat ./Havana/ + sudo cp tools/scripts/run_server.sh ./Havana/ + sudo cp tools/scripts/run_web.bat ./Havana/ + sudo cp tools/scripts/run_web.sh ./Havana/ + sudo cp tools/scripts/README.txt ./Havana/ + - id: sha-short name: Get short SHA run: echo "::set-output name=sha-short::$(git rev-parse --short HEAD)" - - name: Rename server jar file - run: cp Havana-Server/build/libs/Havana-Server-all.jar Havana-Server-${{ steps.sha-short.outputs.sha-short }}.jar - - name: Rename web jar file - run: cp Havana-Web/build/libs/Havana-Web-all.jar Havana-Web-${{ steps.sha-short.outputs.sha-short }}.jar + + - name: Compress release files + uses: montudor/action-zip@v1 + with: + args: zip -qq -r ./Havana-${{ steps.sha-short.outputs.sha-short }}.zip ./Havana + - uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" @@ -36,5 +67,4 @@ jobs: prerelease: true title: "Development Build ${{ steps.sha-short.outputs.sha-short }}" files: | - Havana-Server-${{ steps.sha-short.outputs.sha-short }}.jar - Havana-Web-${{ steps.sha-short.outputs.sha-short }}.jar \ No newline at end of file + Havana-${{ steps.sha-short.outputs.sha-short }}.zip \ No newline at end of file diff --git a/Havana-Server/build.gradle b/Havana-Server/build.gradle index f81c004..695d796 100644 --- a/Havana-Server/build.gradle +++ b/Havana-Server/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' java { - sourceCompatibility = JavaVersion.toVersion("1.11") - targetCompatibility = JavaVersion.toVersion("1.11") + sourceCompatibility = JavaVersion.toVersion("1.17") + targetCompatibility = JavaVersion.toVersion("1.17") } mainClassName = 'org.alexdev.havana.Havana' @@ -14,9 +14,6 @@ repositories { } dependencies { - // https://mvnrepository.com/artifact/net.dv8tion/JDA - implementation 'net.dv8tion:JDA:5.0.0-alpha.12' - // https://mvnrepository.com/artifact/com.zaxxer/HikariCP implementation group: 'com.zaxxer', name: 'HikariCP', version: '3.4.1' @@ -50,10 +47,14 @@ dependencies { // https://mvnrepository.com/artifact/com.google.code.gson/gson implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.0' + // https://mvnrepository.com/artifact/org.springframework.security/spring-security-crypto + implementation group: 'org.springframework.security', name: 'spring-security-crypto', version: '5.7.3' + + // https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on + implementation group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.70' + implementation 'com.maxmind.geoip2:geoip2:2.12.0' implementation 'com.github.bhlangonijr:chesslib:1.1.1' - implementation 'com.goterl:lazysodium-java:5.0.1' - implementation "net.java.dev.jna:jna:5.8.0" } // Create fat jar with libraries inside of it. diff --git a/Havana-Server/src/main/java/org/alexdev/havana/Havana.java b/Havana-Server/src/main/java/org/alexdev/havana/Havana.java index cc0f133..d7b41c9 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/Havana.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/Havana.java @@ -39,6 +39,7 @@ import org.alexdev.havana.util.config.writer.DefaultConfigWriter; import org.alexdev.havana.util.config.writer.GameConfigWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.security.crypto.argon2.Argon2PasswordEncoder; import java.io.IOException; import java.net.UnknownHostException; @@ -353,4 +354,14 @@ public class Havana { public static Gson getGson() { return gson; } + + /** + * Get the Argon2 password encoder instance. + * + * @return + */ + public static Argon2PasswordEncoder getPasswordEncoder() { + var encoder =new Argon2PasswordEncoder(16, 32, 1, 65536, 2); + return encoder; + } } \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PlayerDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PlayerDao.java index 1444ae8..47f06e1 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PlayerDao.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PlayerDao.java @@ -1,11 +1,9 @@ package org.alexdev.havana.dao.mysql; -import com.goterl.lazysodium.LazySodiumJava; -import com.goterl.lazysodium.SodiumJava; -import com.goterl.lazysodium.interfaces.PwHash; import org.alexdev.havana.dao.Storage; import org.alexdev.havana.game.player.Player; import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; import org.alexdev.havana.util.DateUtil; import java.nio.charset.StandardCharsets; @@ -15,7 +13,6 @@ import java.util.List; import java.util.concurrent.TimeUnit; public class PlayerDao { - public static final LazySodiumJava LIB_SODIUM = new LazySodiumJava(new SodiumJava()); private static String figureBlacklist1 = "hd-180-1.hr-100-61.ch-210-66.lg-270-82.sh-290-80"; public static void resetOnline() { @@ -353,13 +350,10 @@ public class PlayerDao { resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { - byte[] hashedPassword = (resultSet.getString("password") + '\0').getBytes(StandardCharsets.UTF_8); - byte[] pass = password.getBytes(StandardCharsets.UTF_8); + String databasePassword = resultSet.getString("password"); - success = ((PwHash.Native) LIB_SODIUM).cryptoPwHashStrVerify(hashedPassword, pass, pass.length); - - if (success) { - fill(playerDetails, resultSet); + if (PlayerManager.getInstance().passwordMatches(databasePassword, password)) { + success = true; } } @@ -1010,23 +1004,4 @@ public class PlayerDao { row.getLong("totem_effect_expiry"), row.getLong("trade_ban_expiration"), row.getInt("favourite_group"), row.getString("created_at")); } - - public static String createPassword(String password) throws Exception { - byte[] pw = password.getBytes(); - byte[] outputHash = new byte[PwHash.STR_BYTES]; - PwHash.Native pwHash = (PwHash.Native) PlayerDao.LIB_SODIUM; - boolean success = pwHash.cryptoPwHashStr( - outputHash, - pw, - pw.length, - PwHash.OPSLIMIT_INTERACTIVE, - PwHash.MEMLIMIT_INTERACTIVE - ); - - if (!success) { - throw new Exception("Password creation was a failure!"); - } - - return new String(outputHash).replace((char)0 + "", ""); - } } diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/RecoverAccountCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/RecoverAccountCommand.java index f49db8a..6acbe32 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/RecoverAccountCommand.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/RecoverAccountCommand.java @@ -6,6 +6,7 @@ import org.alexdev.havana.game.entity.Entity; import org.alexdev.havana.game.entity.EntityType; import org.alexdev.havana.game.player.Player; import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; import org.alexdev.havana.game.player.PlayerRank; import org.alexdev.havana.messages.outgoing.alerts.ALERT; @@ -40,7 +41,7 @@ public class RecoverAccountCommand extends Command { } player.send(new ALERT(targetUser.getName() + "'s password has been reset to: changeme123")); - PlayerDao.setPassword(targetUser.getId(), PlayerDao.createPassword("changeme123")); + PlayerDao.setPassword(targetUser.getId(), PlayerManager.getInstance().createPassword("changeme123")); } @Override diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerManager.java index be06e2a..6a1ab03 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerManager.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerManager.java @@ -1,5 +1,6 @@ package org.alexdev.havana.game.player; +import org.alexdev.havana.Havana; import org.alexdev.havana.dao.mysql.PlayerDao; import org.alexdev.havana.game.GameScheduler; import org.alexdev.havana.game.player.statistics.PlayerStatistic; @@ -283,6 +284,26 @@ public class PlayerManager { return activePlayers; } + /** + * Create password hash + * + * @param password password to hash + * @return hashed password + * @throws Exception + */ + public String createPassword(String password) { + return Havana.getPasswordEncoder().encode(password); + } + + /** + * Get whether the hash matches the entered password. + * + * @return true, if success + */ + public boolean passwordMatches(String databasePassword, String enteredPassword) { + return Havana.getPasswordEncoder().matches(enteredPassword, databasePassword); + } + /** * Get daily player peak * diff --git a/Havana-Web/build.gradle b/Havana-Web/build.gradle index d649a54..36e2030 100644 --- a/Havana-Web/build.gradle +++ b/Havana-Web/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' java { - sourceCompatibility = JavaVersion.toVersion("1.11") - targetCompatibility = JavaVersion.toVersion("1.11") + sourceCompatibility = JavaVersion.toVersion("1.17") + targetCompatibility = JavaVersion.toVersion("1.17") } mainClassName = 'org.alexdev.http.HavanaWeb' diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ProfileController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ProfileController.java index 0219fe6..8ef9142 100644 --- a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ProfileController.java +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ProfileController.java @@ -9,6 +9,7 @@ import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; import org.alexdev.havana.dao.mysql.WardrobeDao; import org.alexdev.havana.game.misc.figure.FigureManager; import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; import org.alexdev.havana.game.player.Wardrobe; import org.alexdev.havana.game.player.statistics.PlayerStatistic; import org.alexdev.havana.game.player.statistics.PlayerStatisticManager; @@ -229,7 +230,7 @@ public class ProfileController { webConnection.session().set("alertMessage", "Your password has been changed successfully. You will need to login again."); webConnection.session().set("alertColour", "green"); - PlayerDao.setPassword(playerDetails.getId(), PlayerDao.createPassword(newPassword)); + PlayerDao.setPassword(playerDetails.getId(), PlayerManager.getInstance().createPassword(newPassword)); logout = true; } } diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RecoveryController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RecoveryController.java index 0b434d7..9f198b5 100644 --- a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RecoveryController.java +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RecoveryController.java @@ -4,6 +4,7 @@ import org.alexdev.duckhttpd.server.connection.WebConnection; import org.alexdev.havana.dao.mysql.PlayerDao; import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; import org.alexdev.havana.game.player.statistics.PlayerStatistic; import org.alexdev.havana.util.DateUtil; import org.alexdev.havana.util.config.GameConfiguration; @@ -137,7 +138,7 @@ public class RecoveryController { webConnection.session().set("alertMessage", "Your password has been changed successfully."); webConnection.session().set("alertColour", "green"); - PlayerDao.setPassword(userId, PlayerDao.createPassword(newPassword)); + PlayerDao.setPassword(userId, PlayerManager.getInstance().createPassword(newPassword)); EmailDao.removeRecoveryCode(userId); } } diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RegisterController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RegisterController.java index a67f3b9..7d5a648 100644 --- a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RegisterController.java +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RegisterController.java @@ -9,6 +9,7 @@ import org.alexdev.havana.dao.mysql.PlayerDao; import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; import org.alexdev.havana.dao.mysql.ReferredDao; import org.alexdev.havana.game.misc.figure.FigureManager; +import org.alexdev.havana.game.player.PlayerManager; import org.alexdev.havana.util.DateUtil; import org.alexdev.havana.util.FigureUtil; import org.alexdev.havana.util.config.GameConfiguration; @@ -158,7 +159,7 @@ public class RegisterController { return; } - String hashedPassword = PlayerDao.createPassword(webConnection.session().getString("registerPassword")); + String hashedPassword = PlayerManager.getInstance().createPassword(webConnection.session().getString("registerPassword")); int userId = RegisterDao.newUser( webConnection.session().getString("registerUsername"), hashedPassword, diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180..41d9927 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 69a9715..41dfb87 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 744e882..1b6c787 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MSYS* | MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/tools/crontab-scripts.txt b/tools/crontab-scripts.txt new file mode 100644 index 0000000..27243d5 --- /dev/null +++ b/tools/crontab-scripts.txt @@ -0,0 +1,2 @@ +@reboot screen -dmS web sh -c 'cd /root/hotel/; sh start_web.sh; exec bash' +@reboot screen -dmS server sh -c 'cd /root/hotel/; sh start_server.sh; exec bash' \ No newline at end of file diff --git a/tools/scripts/README.txt b/tools/scripts/README.txt new file mode 100644 index 0000000..fe1632b --- /dev/null +++ b/tools/scripts/README.txt @@ -0,0 +1,9 @@ +The run_*.sh files are for Linux operating systems. + +The run_*.bat files are for Windows operating systems. + +Both of them execute the project for either the web/server. + +Thank you for using Havana. + +-Quackster \ No newline at end of file diff --git a/tools/scripts/run_server.bat b/tools/scripts/run_server.bat new file mode 100644 index 0000000..e145c32 --- /dev/null +++ b/tools/scripts/run_server.bat @@ -0,0 +1,8 @@ +@echo off +title Havana Server - Habbo Hotel Emulation + +set CLASSPATH=Havana-Server.jar;lib/HikariCP-3.4.1.jar;lib/mariadb-java-client-2.3.0.jar;lib/netty-all-4.1.33.Final.jar;lib/slf4j-log4j12-1.7.25.jar;lib/slf4j-api-1.7.25.jar;lib/log4j-1.2.17.jar;lib/commons-configuration2-2.2.jar;lib/commons-lang3-3.9.jar;lib/commons-lang-2.6.jar;lib/commons-validator-1.6.jar;lib/gson-2.8.0.jar;lib/spring-security-crypto-5.7.3.jar;lib/bcprov-jdk15on-1.70.jar;lib/geoip2-2.12.0.jar;lib/chesslib-1.1.1.jar;lib/commons-beanutils-1.9.2.jar;lib/httpclient-4.5.5.jar;lib/commons-logging-1.2.jar;lib/commons-digester-1.8.1.jar;lib/commons-collections-3.2.2.jar;lib/maxmind-db-1.2.2.jar;lib/jackson-databind-2.9.5.jar;lib/jackson-core-2.9.5.jar;lib/jackson-annotations-2.9.5.jar;lib/httpcore-4.4.9.jar;lib/commons-codec-1.10.jar + + +java -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -classpath "%CLASSPATH%" org.alexdev.havana.Havana +pause \ No newline at end of file diff --git a/tools/scripts/run_server.sh b/tools/scripts/run_server.sh new file mode 100644 index 0000000..782329f --- /dev/null +++ b/tools/scripts/run_server.sh @@ -0,0 +1,5 @@ +#!/usr/bin/sh + +CLASSPATH=lib/Havana-Server.jar:lib/HikariCP-3.4.1.jar:lib/mariadb-java-client-2.3.0.jar:lib/netty-all-4.1.33.Final.jar:lib/slf4j-log4j12-1.7.25.jar:lib/slf4j-api-1.7.25.jar:lib/log4j-1.2.17.jar:lib/commons-configuration2-2.2.jar:lib/commons-lang3-3.9.jar:lib/commons-lang-2.6.jar:lib/commons-validator-1.6.jar:lib/gson-2.8.0.jar:lib/spring-security-crypto-5.7.3.jar:lib/bcprov-jdk15on-1.70.jar:lib/geoip2-2.12.0.jar:lib/chesslib-1.1.1.jar:lib/commons-beanutils-1.9.2.jar:lib/httpclient-4.5.5.jar:lib/commons-logging-1.2.jar:lib/commons-digester-1.8.1.jar:lib/commons-collections-3.2.2.jar:lib/maxmind-db-1.2.2.jar:lib/jackson-databind-2.9.5.jar:lib/jackson-core-2.9.5.jar:lib/jackson-annotations-2.9.5.jar:lib/httpcore-4.4.9.jar:lib/commons-codec-1.10.jar + +java -classpath $CLASSPATH org.alexdev.havana.Havana \ No newline at end of file diff --git a/tools/scripts/run_web.bat b/tools/scripts/run_web.bat new file mode 100644 index 0000000..0da006d --- /dev/null +++ b/tools/scripts/run_web.bat @@ -0,0 +1,8 @@ +@echo off +title Havana Server - Habbo Hotel Emulation + +set CLASSPATH=Havana-Web.jar;lib/ini4j-0.5.4.jar;lib/pebble-3.1.5.jar;lib/Havana-Server.jar;lib/HikariCP-3.4.1.jar;lib/mariadb-java-client-2.3.0.jar;lib/commons-configuration2-2.2.jar;lib/commons-text-1.5.jar;lib/htmlcompressor-maven-plugin-1.3.jar;lib/commons-io-2.5.jar;lib/velocity-tools-2.0.jar;lib/struts-taglib-1.3.8.jar;lib/struts-tiles-1.3.8.jar;lib/struts-core-1.3.8.jar;lib/commons-validator-1.6.jar;lib/geoip2-2.12.0.jar;lib/httpclient-4.5.5.jar;lib/duckHTTPD-all.jar;lib/jsoup-1.13.1.jar;lib/slf4j-log4j12-1.7.25.jar;lib/gson-2.8.0.jar;lib/mail-1.4.7.jar;lib/lazysodium-java-5.0.1.jar;lib/resource-loader-2.0.1.jar;lib/jna-5.8.0.jar;lib/unbescape-1.1.6.RELEASE.jar;lib/slf4j-api-1.7.30.jar;lib/commons-lang3-3.9.jar;lib/commons-chain-1.1.jar;lib/commons-digester-1.8.1.jar;lib/commons-beanutils-1.9.2.jar;lib/commons-logging-1.2.jar;lib/velocity-1.6.2.jar;lib/commons-collections-3.2.2.jar;lib/httpcore-4.4.9.jar;lib/commons-codec-1.10.jar;lib/netty-all-4.1.33.Final.jar;lib/log4j-1.2.17.jar;lib/commons-lang-2.6.jar;lib/spring-security-crypto-5.7.3.jar;lib/bcprov-jdk15on-1.70.jar;lib/chesslib-1.1.1.jar;lib/htmlcompressor-1.5.2.jar;lib/yuicompressor-2.4.6.jar;lib/jsp-api-2.1.jar;lib/json-20090211.jar;lib/maven-plugin-api-3.0.3.jar;lib/activation-1.1.jar;lib/maxmind-db-1.2.2.jar;lib/jackson-databind-2.9.5.jar;lib/jackson-core-2.9.5.jar;lib/jackson-annotations-2.9.5.jar;lib/js-1.6R7.jar;lib/dom4j-1.1.jar;lib/oro-2.0.8.jar;lib/sslext-1.2-0.jar;lib/maven-model-3.0.3.jar;lib/maven-artifact-3.0.3.jar;lib/sisu-inject-plexus-2.1.1.jar;lib/antlr-2.7.2.jar;lib/plexus-utils-2.0.6.jar;lib/plexus-component-annotations-1.5.5.jar;lib/plexus-classworlds-2.4.jar;lib/sisu-inject-bean-2.1.1.jar;lib/sisu-guice-2.9.4-no_aop.jar + + +java -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -classpath "%CLASSPATH%" org.alexdev.http.HavanaWeb +pause \ No newline at end of file diff --git a/tools/scripts/run_web.sh b/tools/scripts/run_web.sh new file mode 100644 index 0000000..de225c2 --- /dev/null +++ b/tools/scripts/run_web.sh @@ -0,0 +1,5 @@ +#!/usr/bin/sh + +CLASSPATH=Havana-Web.jar:lib/ini4j-0.5.4.jar:lib/pebble-3.1.5.jar:lib/Havana-Server.jar:lib/HikariCP-3.4.1.jar:lib/mariadb-java-client-2.3.0.jar:lib/commons-configuration2-2.2.jar:lib/commons-text-1.5.jar:lib/htmlcompressor-maven-plugin-1.3.jar:lib/commons-io-2.5.jar:lib/velocity-tools-2.0.jar:lib/struts-taglib-1.3.8.jar:lib/struts-tiles-1.3.8.jar:lib/struts-core-1.3.8.jar:lib/commons-validator-1.6.jar:lib/geoip2-2.12.0.jar:lib/httpclient-4.5.5.jar:lib/duckHTTPD-all.jar:lib/jsoup-1.13.1.jar:lib/slf4j-log4j12-1.7.25.jar:lib/gson-2.8.0.jar:lib/mail-1.4.7.jar:lib/lazysodium-java-5.0.1.jar:lib/resource-loader-2.0.1.jar:lib/jna-5.8.0.jar:lib/unbescape-1.1.6.RELEASE.jar:lib/slf4j-api-1.7.30.jar:lib/commons-lang3-3.9.jar:lib/commons-chain-1.1.jar:lib/commons-digester-1.8.1.jar:lib/commons-beanutils-1.9.2.jar:lib/commons-logging-1.2.jar:lib/velocity-1.6.2.jar:lib/commons-collections-3.2.2.jar:lib/httpcore-4.4.9.jar:lib/commons-codec-1.10.jar:lib/netty-all-4.1.33.Final.jar:lib/log4j-1.2.17.jar:lib/commons-lang-2.6.jar:lib/spring-security-crypto-5.7.3.jar:lib/bcprov-jdk15on-1.70.jar:lib/chesslib-1.1.1.jar:lib/htmlcompressor-1.5.2.jar:lib/yuicompressor-2.4.6.jar:lib/jsp-api-2.1.jar:lib/json-20090211.jar:lib/maven-plugin-api-3.0.3.jar:lib/activation-1.1.jar:lib/maxmind-db-1.2.2.jar:lib/jackson-databind-2.9.5.jar:lib/jackson-core-2.9.5.jar:lib/jackson-annotations-2.9.5.jar:lib/js-1.6R7.jar:lib/dom4j-1.1.jar:lib/oro-2.0.8.jar:lib/sslext-1.2-0.jar:lib/maven-model-3.0.3.jar:lib/maven-artifact-3.0.3.jar:lib/sisu-inject-plexus-2.1.1.jar:lib/antlr-2.7.2.jar:lib/plexus-utils-2.0.6.jar:lib/plexus-component-annotations-1.5.5.jar:lib/plexus-classworlds-2.4.jar:lib/sisu-inject-bean-2.1.1.jar:lib/sisu-guice-2.9.4-no_aop.jar + +java -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -classpath $CLASSPATH org.alexdev.havana.Havana \ No newline at end of file