/*_x000D_
 * To change this license header, choose License Headers in Project Properties._x000D_
 * To change this template file, choose Tools | Templates_x000D_
 * and open the template in the editor._x000D_
 */_x000D_
package de.qreator.vertx.VertxDatabase;_x000D_
_x000D_
import io.vertx.core.AbstractVerticle;_x000D_
import io.vertx.core.Future;_x000D_
import io.vertx.core.eventbus.DeliveryOptions;_x000D_
import io.vertx.core.http.HttpServer;_x000D_
import io.vertx.core.http.HttpServerResponse;_x000D_
import io.vertx.core.json.Json;_x000D_
import io.vertx.core.json.JsonObject;_x000D_
import io.vertx.ext.web.Router;_x000D_
import io.vertx.ext.web.RoutingContext;_x000D_
import io.vertx.ext.web.Session;_x000D_
import io.vertx.ext.web.handler.BodyHandler;_x000D_
import io.vertx.ext.web.handler.CookieHandler;_x000D_
import io.vertx.ext.web.handler.SessionHandler;_x000D_
import io.vertx.ext.web.handler.StaticHandler;_x000D_
import io.vertx.ext.web.sstore.LocalSessionStore;_x000D_
import org.slf4j.Logger;_x000D_
import org.slf4j.LoggerFactory;_x000D_
_x000D_
/**_x000D_
 *_x000D_
 * @author menze_x000D_
 */_x000D_
public class HttpVerticle extends AbstractVerticle {_x000D_
_x000D_
    private int port = 8080;_x000D_
    private static final Logger LOGGER = LoggerFactory.getLogger("de.qreator.vertx.VertxDatabase.HttpServer");_x000D_
    private static final String EB_ADRESSE = "vertxdatabase.eventbus";_x000D_
_x000D_
    public void start(Future<Void> startFuture) throws Exception {_x000D_
_x000D_
        HttpServer server = vertx.createHttpServer();_x000D_
_x000D_
        LocalSessionStore store = LocalSessionStore.create(vertx);_x000D_
        SessionHandler sessionHandler = SessionHandler.create(store);_x000D_
_x000D_
        Router router = Router.router(vertx);_x000D_
_x000D_
        router.route().handler(CookieHandler.create());_x000D_
        router.route().handler(sessionHandler);_x000D_
        router.post().handler(BodyHandler.create());_x000D_
        router.post("/anfrage").handler(this::anfragenHandler);_x000D_
        router.route("/static/geheim/*").handler(this::geheimeSeiten);_x000D_
        router.route("/static/*").handler(StaticHandler.create().setDefaultContentEncoding("UTF-8").setCachingEnabled(false));_x000D_
_x000D_
        server.requestHandler(router::accept).listen(port, "0.0.0.0", listener -> {_x000D_
            if (listener.succeeded()) {_x000D_
                LOGGER.info("Http-Server auf Port " + port + " gestartet");_x000D_
                startFuture.complete();_x000D_
            } else {_x000D_
                startFuture.fail(listener.cause());_x000D_
            }_x000D_
        });_x000D_
    }_x000D_
_x000D_
    private void geheimeSeiten(RoutingContext routingContext) {_x000D_
        LOGGER.info("Router für geheime Seiten");_x000D_
        Session session = routingContext.session();_x000D_
        if (session.get("angemeldet") == null) { // wenn nicht angemeldet, dann Passwort verlangen_x000D_
            routingContext.response().setStatusCode(303);_x000D_
            routingContext.response().putHeader("Location", "/static/passwort.html");_x000D_
            routingContext.response().end();_x000D_
        } else {_x000D_
            LOGGER.info("Weiterleitung zum nächsten Router");_x000D_
            routingContext.next(); // sonst weiter zum nächsten Router_x000D_
        }_x000D_
    }_x000D_
_x000D_
    private void anfragenHandler(RoutingContext routingContext) {_x000D_
        LOGGER.info("Router für Anfragen");_x000D_
        String typ = routingContext.request().getParam("typ");_x000D_
        HttpServerResponse response = routingContext.response();_x000D_
        response.putHeader("content-type", "application/json");_x000D_
        JsonObject jo = new JsonObject();_x000D_
        Session session = routingContext.session();_x000D_
_x000D_
        if (typ.equals("angemeldet")) {_x000D_
            LOGGER.info("Anfrage, ob User angemeldet ist.");_x000D_
            String angemeldet = session.get("angemeldet");_x000D_
            jo.put("typ", "angemeldet");_x000D_
            if (angemeldet != null && angemeldet.equals("ja")) {_x000D_
                LOGGER.info("User ist angemeldet.");_x000D_
                jo.put("text", "ja");_x000D_
            } else {_x000D_
                LOGGER.info("User ist NICHT angemeldet. Somit Passworteingabe erforderlich");_x000D_
                jo.put("text", "nein");_x000D_
            }_x000D_
            response.end(Json.encodePrettily(jo));_x000D_
        } else if (typ.equals("anmeldedaten")) {_x000D_
            String name = routingContext.request().getParam("anmeldename");_x000D_
            String passwort = routingContext.request().getParam("passwort");_x000D_
            LOGGER.info("Anmeldeanfrage von User " + name + " mit dem Passwort " + passwort);_x000D_
_x000D_
            JsonObject request = new JsonObject().put("name", name).put("passwort", passwort);_x000D_
_x000D_
            DeliveryOptions options = new DeliveryOptions().addHeader("action", "ueberpruefe-passwort");_x000D_
            vertx.eventBus().send(EB_ADRESSE, request, options, reply -> {_x000D_
                if (reply.succeeded()) {_x000D_
                    JsonObject body = (JsonObject) reply.result().body();_x000D_
                    if (body.getBoolean("passwortStimmt") == true) {_x000D_
                        session.put("angemeldet", "ja");_x000D_
                        jo.put("typ", "überprüfung").put("text", "ok");_x000D_
                    } else {_x000D_
                        jo.put("typ", "überprüfung").put("text", "nein");_x000D_
                    }_x000D_
                    response.end(Json.encodePrettily(jo));_x000D_
                } else {_x000D_
                    jo.put("typ", "überprüfung").put("text", "nein");_x000D_
                    response.end(Json.encodePrettily(jo));_x000D_
                }_x000D_
            });_x000D_
_x000D_
        } else if (typ.equals("logout")) {_x000D_
            LOGGER.info("Logout-Anfrage");_x000D_
            session.put("angemeldet", null);_x000D_
            jo.put("typ", "logout");_x000D_
            response.end(Json.encodePrettily(jo));_x000D_
        }_x000D_
    }_x000D_
}_x000D_

// wenn nicht angemeldet, dann Passwort verlangen_x000D_
/*_x000D_
 * To change this license header, choose License Headers in Project Properties._x000D_
 * To change this template file, choose Tools | Templates_x000D_
 * and open the template in the editor._x000D_
 */_x000D_
package de.qreator.vertx.VertxDatabase;_x000D_
_x000D_
import io.vertx.core.AbstractVerticle;_x000D_
import io.vertx.core.Future;_x000D_
import io.vertx.core.eventbus.DeliveryOptions;_x000D_
import io.vertx.core.http.HttpServer;_x000D_
import io.vertx.core.http.HttpServerResponse;_x000D_
import io.vertx.core.json.Json;_x000D_
import io.vertx.core.json.JsonObject;_x000D_
import io.vertx.ext.web.Router;_x000D_
import io.vertx.ext.web.RoutingContext;_x000D_
import io.vertx.ext.web.Session;_x000D_
import io.vertx.ext.web.handler.BodyHandler;_x000D_
import io.vertx.ext.web.handler.CookieHandler;_x000D_
import io.vertx.ext.web.handler.SessionHandler;_x000D_
import io.vertx.ext.web.handler.StaticHandler;_x000D_
import io.vertx.ext.web.sstore.LocalSessionStore;_x000D_
import org.slf4j.Logger;_x000D_
import org.slf4j.LoggerFactory;_x000D_
_x000D_
/**_x000D_
 *_x000D_
 * @author menze_x000D_
 */_x000D_
public class HttpVerticle extends AbstractVerticle {_x000D_
_x000D_
    private int port = 8080;_x000D_
    private static final Logger LOGGER = LoggerFactory.getLogger("de.qreator.vertx.VertxDatabase.HttpServer");_x000D_
    private static final String EB_ADRESSE = "vertxdatabase.eventbus";_x000D_
_x000D_
    public void start(Future<Void> startFuture) throws Exception {_x000D_
_x000D_
        HttpServer server = vertx.createHttpServer();_x000D_
_x000D_
        LocalSessionStore store = LocalSessionStore.create(vertx);_x000D_
        SessionHandler sessionHandler = SessionHandler.create(store);_x000D_
_x000D_
        Router router = Router.router(vertx);_x000D_
_x000D_
        router.route().handler(CookieHandler.create());_x000D_
        router.route().handler(sessionHandler);_x000D_
        router.post().handler(BodyHandler.create());_x000D_
        router.post("/anfrage").handler(this::anfragenHandler);_x000D_
        router.route("/static/geheim/*").handler(this::geheimeSeiten);_x000D_
        router.route("/static/*").handler(StaticHandler.create().setDefaultContentEncoding("UTF-8").setCachingEnabled(false));_x000D_
_x000D_
        server.requestHandler(router::accept).listen(port, "0.0.0.0", listener -> {_x000D_
            if (listener.succeeded()) {_x000D_
                LOGGER.info("Http-Server auf Port " + port + " gestartet");_x000D_
                startFuture.complete();_x000D_
            } else {_x000D_
                startFuture.fail(listener.cause());_x000D_
            }_x000D_
        });_x000D_
    }_x000D_
_x000D_
    private void geheimeSeiten(RoutingContext routingContext) {_x000D_
        LOGGER.info("Router für geheime Seiten");_x000D_
        Session session = routingContext.session();_x000D_
        if (session.get("angemeldet") == null) { // wenn nicht<SUF>
            routingContext.response().setStatusCode(303);_x000D_
            routingContext.response().putHeader("Location", "/static/passwort.html");_x000D_
            routingContext.response().end();_x000D_
        } else {_x000D_
            LOGGER.info("Weiterleitung zum nächsten Router");_x000D_
            routingContext.next(); // sonst weiter zum nächsten Router_x000D_
        }_x000D_
    }_x000D_
_x000D_
    private void anfragenHandler(RoutingContext routingContext) {_x000D_
        LOGGER.info("Router für Anfragen");_x000D_
        String typ = routingContext.request().getParam("typ");_x000D_
        HttpServerResponse response = routingContext.response();_x000D_
        response.putHeader("content-type", "application/json");_x000D_
        JsonObject jo = new JsonObject();_x000D_
        Session session = routingContext.session();_x000D_
_x000D_
        if (typ.equals("angemeldet")) {_x000D_
            LOGGER.info("Anfrage, ob User angemeldet ist.");_x000D_
            String angemeldet = session.get("angemeldet");_x000D_
            jo.put("typ", "angemeldet");_x000D_
            if (angemeldet != null && angemeldet.equals("ja")) {_x000D_
                LOGGER.info("User ist angemeldet.");_x000D_
                jo.put("text", "ja");_x000D_
            } else {_x000D_
                LOGGER.info("User ist NICHT angemeldet. Somit Passworteingabe erforderlich");_x000D_
                jo.put("text", "nein");_x000D_
            }_x000D_
            response.end(Json.encodePrettily(jo));_x000D_
        } else if (typ.equals("anmeldedaten")) {_x000D_
            String name = routingContext.request().getParam("anmeldename");_x000D_
            String passwort = routingContext.request().getParam("passwort");_x000D_
            LOGGER.info("Anmeldeanfrage von User " + name + " mit dem Passwort " + passwort);_x000D_
_x000D_
            JsonObject request = new JsonObject().put("name", name).put("passwort", passwort);_x000D_
_x000D_
            DeliveryOptions options = new DeliveryOptions().addHeader("action", "ueberpruefe-passwort");_x000D_
            vertx.eventBus().send(EB_ADRESSE, request, options, reply -> {_x000D_
                if (reply.succeeded()) {_x000D_
                    JsonObject body = (JsonObject) reply.result().body();_x000D_
                    if (body.getBoolean("passwortStimmt") == true) {_x000D_
                        session.put("angemeldet", "ja");_x000D_
                        jo.put("typ", "überprüfung").put("text", "ok");_x000D_
                    } else {_x000D_
                        jo.put("typ", "überprüfung").put("text", "nein");_x000D_
                    }_x000D_
                    response.end(Json.encodePrettily(jo));_x000D_
                } else {_x000D_
                    jo.put("typ", "überprüfung").put("text", "nein");_x000D_
                    response.end(Json.encodePrettily(jo));_x000D_
                }_x000D_
            });_x000D_
_x000D_
        } else if (typ.equals("logout")) {_x000D_
            LOGGER.info("Logout-Anfrage");_x000D_
            session.put("angemeldet", null);_x000D_
            jo.put("typ", "logout");_x000D_
            response.end(Json.encodePrettily(jo));_x000D_
        }_x000D_
    }_x000D_
}_x000D_
