init
This commit is contained in:
		
				
					committed by
					
						
						lukas-heiligenbrunner
					
				
			
			
				
	
			
			
			
						parent
						
							64af9a6466
						
					
				
				
					commit
					c3cae930ce
				
			
							
								
								
									
										67
									
								
								build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								build.gradle
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
import java.text.SimpleDateFormat
 | 
			
		||||
 | 
			
		||||
plugins {
 | 
			
		||||
    id 'java'
 | 
			
		||||
    id 'org.jetbrains.kotlin.jvm' version '1.3.61'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
group 'eu.heili.hometheater'
 | 
			
		||||
version '0.0.1-Beta'
 | 
			
		||||
 | 
			
		||||
sourceCompatibility = 1.8
 | 
			
		||||
 | 
			
		||||
repositories {
 | 
			
		||||
    mavenCentral()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jar {
 | 
			
		||||
    manifest {
 | 
			
		||||
        attributes 'Main-Class': 'eu.heili.hometheater.Main'
 | 
			
		||||
    }
 | 
			
		||||
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sourceSets {
 | 
			
		||||
    main.java.srcDirs = ['src/java']
 | 
			
		||||
    main.resources.srcDirs = ['src/resources']
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    compile group: 'org.eclipse.paho', name: 'org.eclipse.paho.client.mqttv3', version: '1.2.2'
 | 
			
		||||
    compile group: 'mysql',name:'mysql-connector-java',version: '8.0.18'
 | 
			
		||||
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
task run (type: JavaExec){
 | 
			
		||||
    description = "Secure algorythm testing"
 | 
			
		||||
    main = 'eu.heili.hometheater.Main'
 | 
			
		||||
    classpath = sourceSets.main.runtimeClasspath
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
task createProperties(dependsOn: processResources) {
 | 
			
		||||
    doLast {
 | 
			
		||||
        new File("$projectDir/src/resources/version.properties").withWriter { w ->
 | 
			
		||||
            Properties p = new Properties()
 | 
			
		||||
            p['version'] = project.version.toString()
 | 
			
		||||
            p['buildtime'] = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date())
 | 
			
		||||
            p.store w, null
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
task myJavadocs(type: Javadoc) {
 | 
			
		||||
    title = "JAVADOC hometheater"
 | 
			
		||||
    source = sourceSets.main.allJava
 | 
			
		||||
    classpath = sourceSets.main.runtimeClasspath
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
classes {
 | 
			
		||||
    dependsOn createProperties
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
compileKotlin {
 | 
			
		||||
    kotlinOptions.jvmTarget = "1.8"
 | 
			
		||||
}
 | 
			
		||||
compileTestKotlin {
 | 
			
		||||
    kotlinOptions.jvmTarget = "1.8"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								settings.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								settings.gradle
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
rootProject.name = 'Home-Theater'
 | 
			
		||||
							
								
								
									
										41
									
								
								src/java/eu/heili/hometheater/Main.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/java/eu/heili/hometheater/Main.kt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
@file:JvmName("Main")
 | 
			
		||||
package eu.heili.hometheater
 | 
			
		||||
 | 
			
		||||
import eu.heili.hometheater.basicutils.Info
 | 
			
		||||
import eu.heili.hometheater.basicutils.Log
 | 
			
		||||
import eu.heili.hometheater.db.JDBC
 | 
			
		||||
import eu.heili.hometheater.website.Webserver
 | 
			
		||||
import java.io.IOException
 | 
			
		||||
 | 
			
		||||
fun main() {
 | 
			
		||||
    Log.setLevel(Log.DEBUG)
 | 
			
		||||
    Info.init()
 | 
			
		||||
 | 
			
		||||
    Log.info("startup of Home-Theater")
 | 
			
		||||
 | 
			
		||||
    Runtime.getRuntime().addShutdownHook(Thread(Runnable {
 | 
			
		||||
        try {
 | 
			
		||||
            Thread.sleep(200)
 | 
			
		||||
            Log.warning("Shutting down ...")
 | 
			
		||||
            //shutdown routine
 | 
			
		||||
        } catch (e: InterruptedException) {
 | 
			
		||||
            e.printStackTrace()
 | 
			
		||||
        }
 | 
			
		||||
    }))
 | 
			
		||||
 | 
			
		||||
    Log.info("Server version: " + Info.getVersion())
 | 
			
		||||
    Log.debug("Build date: " + Info.getBuilddate())
 | 
			
		||||
 | 
			
		||||
    //initial connect to db
 | 
			
		||||
    Log.message("initial login to db")
 | 
			
		||||
    try {
 | 
			
		||||
        JDBC.init("todo", "todo", "todo", "todo.heili.eu", 3306)
 | 
			
		||||
    } catch (e: IOException) { //e.printStackTrace();
 | 
			
		||||
        Log.error("no connection to db")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //startup web server
 | 
			
		||||
    val mythread = Thread(Runnable { Webserver().startserver() })
 | 
			
		||||
    mythread.start()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										85
									
								
								src/java/eu/heili/hometheater/basicutils/Info.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								src/java/eu/heili/hometheater/basicutils/Info.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,85 @@
 | 
			
		||||
package eu.heili.hometheater.basicutils;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
import java.text.NumberFormat;
 | 
			
		||||
import java.text.SimpleDateFormat;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.Properties;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * get basic infos about Software
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lukas Heiligenbrunner
 | 
			
		||||
 */
 | 
			
		||||
public class Info {
 | 
			
		||||
    private static String version = "not init";
 | 
			
		||||
    private static String builddate = "not init";
 | 
			
		||||
    private static String starttime = "not init";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * get Software Version (defined in gradle build file)
 | 
			
		||||
     *
 | 
			
		||||
     * @return Version as string
 | 
			
		||||
     */
 | 
			
		||||
    public static String getVersion() {
 | 
			
		||||
        return version;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * get Software build date
 | 
			
		||||
     *
 | 
			
		||||
     * @return Date as string
 | 
			
		||||
     */
 | 
			
		||||
    public static String getBuilddate() {
 | 
			
		||||
        return builddate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * get Server start time
 | 
			
		||||
     *
 | 
			
		||||
     * @return start time
 | 
			
		||||
     */
 | 
			
		||||
    public static String getStarttime() {
 | 
			
		||||
        return starttime;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * initialize the version and builddate variables
 | 
			
		||||
     */
 | 
			
		||||
    public static void init() {
 | 
			
		||||
        starttime = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date());
 | 
			
		||||
        Properties prop = new Properties();
 | 
			
		||||
        try {
 | 
			
		||||
            URL url = Info.class.getResource("/version.properties");
 | 
			
		||||
 | 
			
		||||
            prop.load(url.openStream());
 | 
			
		||||
            version = (String) prop.get("version");
 | 
			
		||||
            builddate = (String) prop.get("buildtime");
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * print memory utilization
 | 
			
		||||
     * todo parse into website somehow
 | 
			
		||||
     */
 | 
			
		||||
    public static void getMemoryUsage() {
 | 
			
		||||
        Runtime runtime = Runtime.getRuntime();
 | 
			
		||||
 | 
			
		||||
        NumberFormat format = NumberFormat.getInstance();
 | 
			
		||||
 | 
			
		||||
        StringBuilder sb = new StringBuilder();
 | 
			
		||||
        long maxMemory = runtime.maxMemory();
 | 
			
		||||
        long allocatedMemory = runtime.totalMemory();
 | 
			
		||||
        long freeMemory = runtime.freeMemory();
 | 
			
		||||
 | 
			
		||||
        sb.append("free memory: " + format.format(freeMemory / 1024) + "\n");
 | 
			
		||||
        sb.append("allocated memory: " + format.format(allocatedMemory / 1024) + "\n");
 | 
			
		||||
        sb.append("max memory: " + format.format(maxMemory / 1024) + "\n");
 | 
			
		||||
        sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024) + "\n");
 | 
			
		||||
 | 
			
		||||
        System.out.println(sb.toString());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										139
									
								
								src/java/eu/heili/hometheater/basicutils/Log.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								src/java/eu/heili/hometheater/basicutils/Log.kt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,139 @@
 | 
			
		||||
package eu.heili.hometheater.basicutils
 | 
			
		||||
 | 
			
		||||
import java.text.SimpleDateFormat
 | 
			
		||||
import java.util.*
 | 
			
		||||
 | 
			
		||||
class Log {
 | 
			
		||||
    companion object Log{
 | 
			
		||||
        val CRITICAL_ERROR = 6
 | 
			
		||||
        val ERROR = 5
 | 
			
		||||
        val WARNING = 4
 | 
			
		||||
        val INFO = 3
 | 
			
		||||
        val MESSAGE = 2
 | 
			
		||||
        val DEBUG = 1
 | 
			
		||||
 | 
			
		||||
        private val ANSI_RESET = "\u001B[0m"
 | 
			
		||||
        private val ANSI_BLACK = "\u001B[30m"
 | 
			
		||||
        private val ANSI_RED = "\u001B[31m"
 | 
			
		||||
        private val ANSI_GREEN = "\u001B[32m"
 | 
			
		||||
        private val ANSI_YELLOW = "\u001B[33m"
 | 
			
		||||
        private val ANSI_BLUE = "\u001B[34m"
 | 
			
		||||
        private val ANSI_PURPLE = "\u001B[35m"
 | 
			
		||||
        private val ANSI_CYAN = "\u001B[36m"
 | 
			
		||||
        private val ANSI_WHITE = "\u001B[37m"
 | 
			
		||||
 | 
			
		||||
        private var Loglevel = 0
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Log critical Error
 | 
			
		||||
         *
 | 
			
		||||
         * @param msg message
 | 
			
		||||
         */
 | 
			
		||||
        fun criticalerror(msg: Any) {
 | 
			
		||||
            if (Loglevel <= CRITICAL_ERROR) log(msg, CRITICAL_ERROR)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Log basic Error
 | 
			
		||||
         *
 | 
			
		||||
         * @param msg message
 | 
			
		||||
         */
 | 
			
		||||
        fun error(msg: Any) {
 | 
			
		||||
            if (Loglevel <= ERROR) log(msg, ERROR)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Log warning
 | 
			
		||||
         *
 | 
			
		||||
         * @param msg message
 | 
			
		||||
         */
 | 
			
		||||
        fun warning(msg: Any) {
 | 
			
		||||
            if (Loglevel <= WARNING) log(msg, WARNING)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Log info
 | 
			
		||||
         *
 | 
			
		||||
         * @param msg message
 | 
			
		||||
         */
 | 
			
		||||
        fun info(msg: Any) {
 | 
			
		||||
            if (Loglevel <= INFO) log(msg, INFO)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Log basic message
 | 
			
		||||
         *
 | 
			
		||||
         * @param msg message
 | 
			
		||||
         */
 | 
			
		||||
        fun message(msg: Any) {
 | 
			
		||||
            if (Loglevel <= MESSAGE) log(msg, MESSAGE)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Log debug Message
 | 
			
		||||
         *
 | 
			
		||||
         * @param msg message
 | 
			
		||||
         */
 | 
			
		||||
        fun debug(msg: Any) {
 | 
			
		||||
            if (Loglevel <= DEBUG) log(msg, DEBUG)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Log as defined
 | 
			
		||||
         *
 | 
			
		||||
         * @param msg   message
 | 
			
		||||
         * @param level Loglevel --> static vals defined
 | 
			
		||||
         */
 | 
			
		||||
        fun log(msg: Any, level: Int) {
 | 
			
		||||
            val iswindows = System.getProperty("os.name").contains("Windows")
 | 
			
		||||
            val builder = StringBuilder()
 | 
			
		||||
            if (!iswindows) {
 | 
			
		||||
                when (level) {
 | 
			
		||||
                    INFO -> builder.append(ANSI_CYAN)
 | 
			
		||||
                    WARNING -> builder.append(ANSI_YELLOW)
 | 
			
		||||
                    ERROR -> builder.append(ANSI_RED)
 | 
			
		||||
                    CRITICAL_ERROR -> builder.append(ANSI_RED)
 | 
			
		||||
                    MESSAGE -> builder.append(ANSI_WHITE)
 | 
			
		||||
                    DEBUG -> builder.append(ANSI_BLUE)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            builder.append("[")
 | 
			
		||||
            builder.append(calcDate(System.currentTimeMillis()))
 | 
			
		||||
            builder.append("]")
 | 
			
		||||
            builder.append(" [")
 | 
			
		||||
            builder.append(Exception().stackTrace[2].className)
 | 
			
		||||
            builder.append("]")
 | 
			
		||||
            builder.append(" [")
 | 
			
		||||
            builder.append(colors[level])
 | 
			
		||||
            builder.append("]")
 | 
			
		||||
            if (!iswindows) {
 | 
			
		||||
                builder.append(ANSI_WHITE)
 | 
			
		||||
            }
 | 
			
		||||
            builder.append(" - ")
 | 
			
		||||
            builder.append(msg.toString())
 | 
			
		||||
            if (!iswindows) {
 | 
			
		||||
                builder.append(ANSI_RESET)
 | 
			
		||||
            }
 | 
			
		||||
            println(builder.toString())
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * define Loglevel call on startup or at runtime
 | 
			
		||||
         * default: 0[DEBUG] --> Max logging
 | 
			
		||||
         *
 | 
			
		||||
         * @param level Loglevel --> static vals defined
 | 
			
		||||
         */
 | 
			
		||||
        fun setLevel(level: Int) {
 | 
			
		||||
            Loglevel = level
 | 
			
		||||
        }
 | 
			
		||||
        private val colors = ArrayList(Arrays.asList("", "DEBUG", "MESSAGE", "INFO", "WARNING", "ERROR", "CRITICAL_ERROR"))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        private fun calcDate(millisecs: Long): String? {
 | 
			
		||||
            val date_format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
 | 
			
		||||
            val resultdate = Date(millisecs)
 | 
			
		||||
            return date_format.format(resultdate)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								src/java/eu/heili/hometheater/db/Database.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										25
									
								
								src/java/eu/heili/hometheater/db/Database.java
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
package eu.heili.hometheater.db;
 | 
			
		||||
 | 
			
		||||
import java.sql.Connection;
 | 
			
		||||
import java.sql.SQLException;
 | 
			
		||||
 | 
			
		||||
abstract class Database {
 | 
			
		||||
 | 
			
		||||
    protected String user;
 | 
			
		||||
    protected String password;
 | 
			
		||||
 | 
			
		||||
    protected String host;
 | 
			
		||||
    protected int port;
 | 
			
		||||
 | 
			
		||||
    protected String dbName;
 | 
			
		||||
 | 
			
		||||
    public Database(String user, String password, String host, int port, String dbName) {
 | 
			
		||||
        this.user = user;
 | 
			
		||||
        this.password = password;
 | 
			
		||||
        this.host = host;
 | 
			
		||||
        this.port = port;
 | 
			
		||||
        this.dbName = dbName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public abstract Connection getConnection() throws SQLException;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										111
									
								
								src/java/eu/heili/hometheater/db/JDBC.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								src/java/eu/heili/hometheater/db/JDBC.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,111 @@
 | 
			
		||||
package eu.heili.hometheater.db;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.sql.Connection;
 | 
			
		||||
import java.sql.PreparedStatement;
 | 
			
		||||
import java.sql.ResultSet;
 | 
			
		||||
import java.sql.SQLException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * basic connection class to a Database
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lukas Heiligenbrunner
 | 
			
		||||
 */
 | 
			
		||||
public class JDBC {
 | 
			
		||||
    private static Connection conn;
 | 
			
		||||
 | 
			
		||||
    private static JDBC JDBC;
 | 
			
		||||
    private static boolean loggedin = false;
 | 
			
		||||
 | 
			
		||||
    private static String usernamec;
 | 
			
		||||
    private static String passwordc;
 | 
			
		||||
    private static String dbnamec;
 | 
			
		||||
    private static String ipc;
 | 
			
		||||
    private static int portc;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * initialize database values
 | 
			
		||||
     * suggested on startup
 | 
			
		||||
     *
 | 
			
		||||
     * @param username db username
 | 
			
		||||
     * @param password db password
 | 
			
		||||
     * @param dbname   Database name
 | 
			
		||||
     * @param ip       Server ip or hostname
 | 
			
		||||
     * @param port     Server port
 | 
			
		||||
     * @throws IOException
 | 
			
		||||
     */
 | 
			
		||||
    public static void init(String username, String password, String dbname, String ip, int port) throws IOException {
 | 
			
		||||
        usernamec = username;
 | 
			
		||||
        passwordc = password;
 | 
			
		||||
        dbnamec = dbname;
 | 
			
		||||
        ipc = ip;
 | 
			
		||||
        portc = port;
 | 
			
		||||
        JDBC = new JDBC(username, password, dbname, ip, port);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private JDBC(String username, String password, String dbname, String ip, int port) throws IOException {
 | 
			
		||||
        logintodb(username, password, dbname, ip, port);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * get instance of db object
 | 
			
		||||
     * logindata has to be set before!
 | 
			
		||||
     *
 | 
			
		||||
     * @return JDBC object of this
 | 
			
		||||
     * @throws IOException
 | 
			
		||||
     */
 | 
			
		||||
    public static JDBC getInstance() throws IOException {
 | 
			
		||||
        if (loggedin) {
 | 
			
		||||
            return JDBC;
 | 
			
		||||
        } else {
 | 
			
		||||
            logintodb(usernamec, passwordc, dbnamec, ipc, portc);
 | 
			
		||||
            return JDBC;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void logintodb(String username, String password, String dbname, String ip, int port) throws IOException {
 | 
			
		||||
        Database db = new MySQLConnector(
 | 
			
		||||
                username,
 | 
			
		||||
                password,
 | 
			
		||||
                ip,
 | 
			
		||||
                port,
 | 
			
		||||
                dbname);
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            conn = db.getConnection();
 | 
			
		||||
            loggedin = true;
 | 
			
		||||
        } catch (SQLException e) {
 | 
			
		||||
            throw new IOException("No connection to database");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * execute basic query --> requests only
 | 
			
		||||
     *
 | 
			
		||||
     * @param sql query sql statement
 | 
			
		||||
     * @return ResultSet representating the table
 | 
			
		||||
     */
 | 
			
		||||
    public ResultSet executeQuery(String sql) {
 | 
			
		||||
        try {
 | 
			
		||||
            PreparedStatement stmt = conn.prepareStatement(sql);
 | 
			
		||||
            return stmt.executeQuery();
 | 
			
		||||
        } catch (SQLException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * update db in some way
 | 
			
		||||
     *
 | 
			
		||||
     * @param sql sql insert/update/delete statement
 | 
			
		||||
     * @return status
 | 
			
		||||
     * @throws SQLException
 | 
			
		||||
     */
 | 
			
		||||
    public int executeUpdate(String sql) throws SQLException {
 | 
			
		||||
        PreparedStatement stmt = conn.prepareStatement(sql);
 | 
			
		||||
 | 
			
		||||
        return stmt.executeUpdate();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								src/java/eu/heili/hometheater/db/MySQLConnector.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										29
									
								
								src/java/eu/heili/hometheater/db/MySQLConnector.java
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
package eu.heili.hometheater.db;
 | 
			
		||||
 | 
			
		||||
import java.sql.Connection;
 | 
			
		||||
import java.sql.DriverManager;
 | 
			
		||||
import java.sql.SQLException;
 | 
			
		||||
 | 
			
		||||
class MySQLConnector extends Database {
 | 
			
		||||
 | 
			
		||||
    static {
 | 
			
		||||
        try {
 | 
			
		||||
            Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance();
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public MySQLConnector(String user, String password, String host, int port, String dbName) {
 | 
			
		||||
        super(user, password, host, port, dbName);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Connection getConnection() throws SQLException {
 | 
			
		||||
        DriverManager.setLoginTimeout(1);
 | 
			
		||||
        return DriverManager.getConnection(
 | 
			
		||||
                "jdbc:mysql://" + host + ":" + port + "/" + dbName + "?useSSL=false",
 | 
			
		||||
                user,
 | 
			
		||||
                password);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										32
									
								
								src/java/eu/heili/hometheater/website/HttpTools.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/java/eu/heili/hometheater/website/HttpTools.kt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
package eu.heili.hometheater.website
 | 
			
		||||
 | 
			
		||||
import java.math.BigInteger
 | 
			
		||||
import java.security.MessageDigest
 | 
			
		||||
import java.security.NoSuchAlgorithmException
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * basic http tools
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lukas Heiligenbrunner
 | 
			
		||||
 */
 | 
			
		||||
class HttpTools {
 | 
			
		||||
    companion object{
 | 
			
		||||
        /**
 | 
			
		||||
         * create md5 hash of string
 | 
			
		||||
         *
 | 
			
		||||
         * @param value input string
 | 
			
		||||
         * @return md5 hash
 | 
			
		||||
         */
 | 
			
		||||
        fun StringToMD5(value: String): String {
 | 
			
		||||
            return try {
 | 
			
		||||
                val md = MessageDigest.getInstance("MD5")
 | 
			
		||||
                val messageDigest = md.digest(value.toByteArray())
 | 
			
		||||
                val no = BigInteger(1, messageDigest)
 | 
			
		||||
                no.toString(16)
 | 
			
		||||
            } catch (e: NoSuchAlgorithmException) {
 | 
			
		||||
                e.printStackTrace()
 | 
			
		||||
                ""
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								src/java/eu/heili/hometheater/website/MainPage.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/java/eu/heili/hometheater/website/MainPage.kt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
package eu.heili.hometheater.website
 | 
			
		||||
 | 
			
		||||
import com.sun.net.httpserver.HttpExchange
 | 
			
		||||
import com.sun.net.httpserver.HttpHandler
 | 
			
		||||
import eu.heili.hometheater.basicutils.Log.Log.debug
 | 
			
		||||
import eu.heili.hometheater.basicutils.Log.Log.warning
 | 
			
		||||
import eu.heili.hometheater.website.datarequests.login.LoginState
 | 
			
		||||
import java.io.IOException
 | 
			
		||||
 | 
			
		||||
class MainPage : HttpHandler {
 | 
			
		||||
    @Throws(IOException::class)
 | 
			
		||||
    override fun handle(t: HttpExchange) {
 | 
			
		||||
        var path = t.requestURI.path
 | 
			
		||||
        if (path == "/") {
 | 
			
		||||
            path += "index.html"
 | 
			
		||||
        }
 | 
			
		||||
        debug("looking for: $path")
 | 
			
		||||
        if (path.contains(".html")) {
 | 
			
		||||
            if (LoginState.getObject().isLoggedIn || path == "/register.html" || path == "/index.html") { //pass only register page
 | 
			
		||||
                sendPage(path, t)
 | 
			
		||||
            } else {
 | 
			
		||||
                warning("user not logged in --> redirecting to login page")
 | 
			
		||||
                sendPage("/index.html", t)
 | 
			
		||||
            }
 | 
			
		||||
        } else { //only detect login state on html pages
 | 
			
		||||
            sendPage(path, t)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Throws(IOException::class)
 | 
			
		||||
    private fun sendPage(path: String, t: HttpExchange) {
 | 
			
		||||
        val fs = javaClass.getResourceAsStream("/wwwroot$path")
 | 
			
		||||
        if (fs == null && path.contains(".html")) {
 | 
			
		||||
            warning("wrong page sending 404")
 | 
			
		||||
            sendPage("/404Error.html", t)
 | 
			
		||||
        } else if (fs == null) {
 | 
			
		||||
            warning("requested resource doesnt exist --> $path")
 | 
			
		||||
        } else { // Object exists and is a file: accept with response code 200.
 | 
			
		||||
            var mime = "text/html"
 | 
			
		||||
            val s = path.substring(path.length - 3)
 | 
			
		||||
            if (s == ".js") mime = "application/javascript"
 | 
			
		||||
            if (s == "css") mime = "text/css"
 | 
			
		||||
            val h = t.responseHeaders
 | 
			
		||||
            h["Content-Type"] = mime
 | 
			
		||||
            t.sendResponseHeaders(200, 0)
 | 
			
		||||
            val os = t.responseBody
 | 
			
		||||
            val buffer = ByteArray(0x10000)
 | 
			
		||||
            var count: Int
 | 
			
		||||
            while (fs.read(buffer).also { count = it } >= 0) {
 | 
			
		||||
                os.write(buffer, 0, count)
 | 
			
		||||
            }
 | 
			
		||||
            fs.close()
 | 
			
		||||
            os.close()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								src/java/eu/heili/hometheater/website/Webserver.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/java/eu/heili/hometheater/website/Webserver.kt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
package eu.heili.hometheater.website
 | 
			
		||||
 | 
			
		||||
import com.sun.net.httpserver.HttpServer
 | 
			
		||||
import eu.heili.hometheater.basicutils.Log.Log.criticalerror
 | 
			
		||||
import eu.heili.hometheater.basicutils.Log.Log.info
 | 
			
		||||
import java.io.IOException
 | 
			
		||||
import java.net.BindException
 | 
			
		||||
import java.net.InetSocketAddress
 | 
			
		||||
 | 
			
		||||
class Webserver {
 | 
			
		||||
    fun startserver() {
 | 
			
		||||
        info("starting Webserver")
 | 
			
		||||
        try {
 | 
			
		||||
            val server = HttpServer.create(InetSocketAddress(8080), 0)
 | 
			
		||||
            server.createContext("/", MainPage())
 | 
			
		||||
            // todo insert get and post request sites here!
 | 
			
		||||
            server.executor = null // creates a default executor
 | 
			
		||||
            server.start()
 | 
			
		||||
            info("Server available at http://127.0.0.1:8080 now")
 | 
			
		||||
        } catch (e: BindException) {
 | 
			
		||||
            criticalerror("The Port 8080 is already in use!")
 | 
			
		||||
            // todo option to choose other port
 | 
			
		||||
        } catch (e: IOException) {
 | 
			
		||||
            e.printStackTrace()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
package com.wasteinformationserver.website.basicrequest
 | 
			
		||||
 | 
			
		||||
import com.sun.net.httpserver.HttpExchange
 | 
			
		||||
import com.sun.net.httpserver.HttpHandler
 | 
			
		||||
import java.io.IOException
 | 
			
		||||
import java.util.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * basic GET request handler
 | 
			
		||||
 * reply function has to be implemented!
 | 
			
		||||
 */
 | 
			
		||||
abstract class GetRequest : HttpHandler {
 | 
			
		||||
    @Throws(IOException::class)
 | 
			
		||||
    override fun handle(httpExchange: HttpExchange) {
 | 
			
		||||
        if (httpExchange.requestMethod == "GET") {
 | 
			
		||||
            val query = httpExchange.requestURI.query
 | 
			
		||||
            val params = HashMap<String, String>()
 | 
			
		||||
            val res = query.split("&".toRegex()).toTypedArray()
 | 
			
		||||
            for (str in res) {
 | 
			
		||||
                val values = str.split("=".toRegex()).toTypedArray()
 | 
			
		||||
                params[values[0]] = values[1]
 | 
			
		||||
            }
 | 
			
		||||
            val response = myrequest(params)
 | 
			
		||||
            val h = httpExchange.responseHeaders
 | 
			
		||||
            h["Content-Type"] = "application/json"
 | 
			
		||||
            httpExchange.sendResponseHeaders(200, 0)
 | 
			
		||||
            val os = httpExchange.responseBody
 | 
			
		||||
            os.write(response.toByteArray())
 | 
			
		||||
            os.close()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param params received get params from com.wasteinformationserver.website
 | 
			
		||||
     * @return json reply to com.wasteinformationserver.website
 | 
			
		||||
     */
 | 
			
		||||
    abstract fun myrequest(params: HashMap<String, String>): String
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,44 @@
 | 
			
		||||
package com.wasteinformationserver.website.basicrequest
 | 
			
		||||
 | 
			
		||||
import com.sun.net.httpserver.HttpExchange
 | 
			
		||||
import com.sun.net.httpserver.HttpHandler
 | 
			
		||||
import java.io.IOException
 | 
			
		||||
import java.util.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * basic POST request handler
 | 
			
		||||
 * reply function has to be implemented!
 | 
			
		||||
 */
 | 
			
		||||
abstract class PostRequest : HttpHandler {
 | 
			
		||||
    @Throws(IOException::class)
 | 
			
		||||
    override fun handle(httpExchange: HttpExchange) {
 | 
			
		||||
        if (httpExchange.requestMethod == "POST") {
 | 
			
		||||
            val sb = StringBuilder()
 | 
			
		||||
            val ios = httpExchange.requestBody
 | 
			
		||||
            var i: Int
 | 
			
		||||
            while (ios.read().also { i = it } != -1) {
 | 
			
		||||
                sb.append(i.toChar())
 | 
			
		||||
            }
 | 
			
		||||
            val query = sb.toString()
 | 
			
		||||
            val params = HashMap<String, String>()
 | 
			
		||||
            val res = query.split("&".toRegex()).toTypedArray()
 | 
			
		||||
            for (str in res) {
 | 
			
		||||
                val values = str.split("=".toRegex()).toTypedArray()
 | 
			
		||||
                params[values[0]] = values[1]
 | 
			
		||||
            }
 | 
			
		||||
            val response = request(params)
 | 
			
		||||
            val h = httpExchange.responseHeaders
 | 
			
		||||
            h["Content-Type"] = "application/json"
 | 
			
		||||
            httpExchange.sendResponseHeaders(200, 0)
 | 
			
		||||
            val os = httpExchange.responseBody
 | 
			
		||||
            os.write(response.toByteArray())
 | 
			
		||||
            os.close()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param params received get params from com.wasteinformationserver.website
 | 
			
		||||
     * @return json reply to com.wasteinformationserver.website
 | 
			
		||||
     */
 | 
			
		||||
    abstract fun request(params: HashMap<String, String>): String
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,61 @@
 | 
			
		||||
package eu.heili.hometheater.website.datarequests.login;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Lukas Heiligenbrunner
 | 
			
		||||
 */
 | 
			
		||||
public class LoginState {
 | 
			
		||||
 | 
			
		||||
    private static LoginState mythis = new LoginState();
 | 
			
		||||
 | 
			
		||||
    public static LoginState getObject() {
 | 
			
		||||
        return mythis;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String username;
 | 
			
		||||
    private String firstname;
 | 
			
		||||
    private String lastname;
 | 
			
		||||
    private String email;
 | 
			
		||||
    private int permission;
 | 
			
		||||
 | 
			
		||||
    boolean loggedin = false;
 | 
			
		||||
 | 
			
		||||
    public void logIn() {
 | 
			
		||||
        loggedin = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void logOut() {
 | 
			
		||||
        loggedin = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAccountData(String username, String firstname, String lastname, String email, int permission) {
 | 
			
		||||
        this.username = username;
 | 
			
		||||
        this.firstname = firstname;
 | 
			
		||||
        this.lastname = lastname;
 | 
			
		||||
        this.email = email;
 | 
			
		||||
        this.permission = permission;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isLoggedIn() {
 | 
			
		||||
        return loggedin;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getUsername() {
 | 
			
		||||
        return username;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getFirstname() {
 | 
			
		||||
        return firstname;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getLastname() {
 | 
			
		||||
        return lastname;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getEmail() {
 | 
			
		||||
        return email;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getPermission() {
 | 
			
		||||
        return permission;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								src/resources/wwwroot/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/resources/wwwroot/index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="UTF-8">
 | 
			
		||||
    <title>Home-Theater</title>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
main body
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
		Reference in New Issue
	
	Block a user