package org.openslx.bwlp.sat.web; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.util.HashMap; import java.util.Map; import javax.security.auth.login.LoginException; import org.apache.commons.io.output.ByteArrayOutputStream; import org.openslx.bwlp.sat.database.mappers.DbConfiguration; import org.openslx.bwlp.sat.mail.MailTemplate; import org.openslx.bwlp.sat.mail.MailTemplatePlain.Template; import org.openslx.bwlp.sat.mail.SmtpMailer; import org.openslx.bwlp.sat.mail.SmtpMailer.EncryptionMode; import org.openslx.bwlp.sat.maintenance.DeleteOldImages; import org.openslx.bwlp.sat.maintenance.ImageValidCheck; import org.openslx.bwlp.sat.maintenance.ImageValidCheck.CheckResult; import org.openslx.bwlp.sat.maintenance.ImageValidCheck.SubmitResult; import org.openslx.util.Json; import org.openslx.util.Util; import fi.iki.elonen.NanoHTTPD; import fi.iki.elonen.NanoHTTPD.Response; public class WebRpc { public static Response handle(String uri, Map params) { if (uri.equals("mailtest")) { return mailTest(params); } if (uri.equals("delete-images")) { return deleteImages(); } if (uri.equals("start-image-check")) { return checkImage(params); } if (uri.equals("query-image-check")) { return queryImageCheck(params); } if (uri.equals("reset-mail-templates")) { return resetMailTemplates(); } return WebServer.notFound(); } private static Response resetMailTemplates() { DbConfiguration.updateMailTemplates(true); return new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, "text/plain; charset=utf-8", "OK"); } private static Response checkImage(Map params) { String versionId = params.get("versionid"); if (versionId == null) return WebServer.badRequest("Missing versionid param"); versionId = versionId.toLowerCase(); boolean checkHashes = Boolean.valueOf(params.get("hash")); boolean updateState = Boolean.valueOf(params.get("update")); SubmitResult res = ImageValidCheck.check(versionId, checkHashes, updateState); return new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, "text/plain; charset=utf-8", res.name()); } private static Response queryImageCheck(Map params) { String versionId = params.get("versionid"); Map result; if (versionId == null) { result = ImageValidCheck.getAll(); } else { versionId = versionId.toLowerCase(); CheckResult res = ImageValidCheck.getStatus(versionId); result = new HashMap<>(); result.put(versionId, res); } return new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, "application/json; charset=utf-8", Json.serialize(result)); } /** * Delete all image versions marked as WANT_DELETE. */ private static Response deleteImages() { StringBuilder res = DeleteOldImages.hardDeleteImages(); if (res == null) return WebServer.internalServerError(); return new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, "text/plain; charset=utf-8", res.toString()); } /** * Send test mail to given SMTP config. */ private static Response mailTest(Map params) { SmtpMailer smtpc; String recipient = params.get("recipient"); String host = params.get("host"); String senderAddress = params.get("senderAddress"); String serverName = params.get("serverName"); String replyTo = params.get("replyTo"); String username = params.get("username"); String password = params.get("password"); int port = Util.parseInt(params.get("port"), 0); EncryptionMode ssl; try { ssl = EncryptionMode.valueOf(params.get("ssl")); } catch (Exception e) { return WebServer.badRequest("Invalid SSL mode '" + params.get("ssl") + "'"); } // Validate if (port < 1 || port > 65535) return WebServer.badRequest("Invalid port"); if (recipient == null) return WebServer.badRequest("Missing recipient"); if (host == null) return WebServer.badRequest("Missing host"); if (senderAddress == null) return WebServer.badRequest("Missing senderAddress"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { smtpc = new SmtpMailer(host, port, ssl, senderAddress, serverName, replyTo, username, password, new PrintStream(baos)); } catch (InvalidKeyException | LoginException | NoSuchAlgorithmException | InvalidKeySpecException | IOException e) { try { baos.write("Could not connect to mail server".getBytes(StandardCharsets.UTF_8)); e.printStackTrace(new PrintWriter(baos)); } catch (IOException e1) { } smtpc = null; } boolean ret = false; if (smtpc != null) { MailTemplate template = DbConfiguration.getMailTemplate(Template.TEST_MAIL); Map templateArgs = new HashMap<>(); templateArgs.put("host", host); templateArgs.put("port", String.valueOf(port)); templateArgs.put("ssl", ssl.toString()); templateArgs.put("username", username); String msg = template.format(templateArgs); ret = smtpc.send(recipient, "bwLehrpool Mail Test", msg, ""); } try { baos.write(("\n\n-----------------------------------------\nTestergebnis: " + (ret ? "" : "nicht ") + "erfolgreich").getBytes(StandardCharsets.UTF_8)); } catch (IOException e) { } return new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, "text/plain; charset=utf-8", new ByteArrayInputStream(baos.toByteArray())); } }