/*
 * nassh-relay - Relay Server for tunneling ssh through a http endpoint
 *
 * Website: https://github.com/zyclonite/nassh-relay
 *
 * Copyright 2014-2020   zyclonite    networx
 *                       http://zyclonite.net
 * Developer: Lukas Prettenthaler
 */
package net.zyclonite.nassh.handler;

import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.core.logging.Logger;
import io.vertx.core.logging.LoggerFactory;
import io.vertx.core.shareddata.LocalMap;
import io.vertx.ext.web.RoutingContext;
import net.zyclonite.nassh.model.Session;
import net.zyclonite.nassh.util.Constants;

import java.util.Base64;
import java.util.UUID;

/**
 * @author zyclonite
 */
public class WriteHandler implements Handler<RoutingContext> {

    private static Logger logger = LoggerFactory.getLogger(WriteHandler.class);
    private final Vertx vertx;

    public WriteHandler(final Vertx vertx) {
        this.vertx = vertx;
    }

    @Override
    public void handle(final RoutingContext context) {
        final HttpServerRequest request = context.request();
        final HttpServerResponse response = context.response();
        response.putHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
        response.putHeader("Pragma", "no-cache");
        if (request.params().contains("sid") && request.params().contains("wcnt") && request.params().contains("data")) {
            final UUID sid = UUID.fromString(request.params().get("sid"));
            final byte[] data = Base64.getUrlDecoder().decode(request.params().get("data"));
            response.setStatusCode(200);
            final LocalMap<String, Session> map = vertx.sharedData().getLocalMap(Constants.SESSIONS);
            final Session session = map.get(sid.toString());
            if (session == null) {
                response.setStatusCode(410);
                response.end();
                return;
            }
            session.setWrite_count(Integer.parseInt(request.params().get("wcnt")));
            final Buffer message = Buffer.buffer();
            message.appendBytes(data);
            vertx.eventBus().publish(session.getHandler(), message);
            response.end();
        } else {
            response.setStatusCode(410);
            response.end();
        }
    }
}