diff --git a/lib/.factorypath b/lib/.factorypath index 500a5fa..f3afc51 100644 --- a/lib/.factorypath +++ b/lib/.factorypath @@ -8,5 +8,7 @@ + + diff --git a/lib/pom.xml b/lib/pom.xml index 8ecedbf..2d644c1 100644 --- a/lib/pom.xml +++ b/lib/pom.xml @@ -27,6 +27,11 @@ gson 2.8.6 + + org.jodd + jodd-http + 6.0.3 + org.projectlombok lombok diff --git a/lib/src/main/java/net/monarchpass/piecannon/impl/GoFileServer.java b/lib/src/main/java/net/monarchpass/piecannon/impl/GoFileServer.java new file mode 100644 index 0000000..d940452 --- /dev/null +++ b/lib/src/main/java/net/monarchpass/piecannon/impl/GoFileServer.java @@ -0,0 +1,46 @@ +package net.monarchpass.piecannon.impl; + +import java.net.URI; +import java.util.Map; + +import com.google.common.io.ByteSource; +import com.google.gson.Gson; + +import jodd.http.HttpRequest; +import lombok.Data; +import net.monarchpass.piecannon.Server; +import net.monarchpass.piecannon.util.ByteSourceUploadable; + +@Data +public class GoFileServer implements Server { + public static final String DEFAULT_HOST = "gofile.io"; + public static final String DEFAULT_API_HOST = "apiv2." + DEFAULT_HOST; + + private final Gson gson = new Gson(); + private final String label; + private String host = DEFAULT_HOST; + private String apiHost = DEFAULT_API_HOST; + + @Override + public URI upload (String name, ByteSource source) { + Response response = request(HttpRequest.get(String.format("https://%s/getServer", apiHost))); + + final String serverId = (String)response.getData().get("server"); + response = request(HttpRequest.post(String.format("https://%s.%s/uploadFile", serverId, host)) + .form("file", new ByteSourceUploadable(name, source))); + + final String code = (String)response.getData().get("code"); + final URI uri = URI.create(String.format("https://%s/d/%s", host, code)); + return uri; + } + + private Response request (final HttpRequest request) { + return gson.fromJson(request.send().bodyText(), Response.class); + } + + @Data + public static class Response { + public final String status; + public final Map data; + } +} diff --git a/lib/src/main/java/net/monarchpass/piecannon/impl/WebDavServer.java b/lib/src/main/java/net/monarchpass/piecannon/impl/WebDavServer.java new file mode 100644 index 0000000..d43dbcd --- /dev/null +++ b/lib/src/main/java/net/monarchpass/piecannon/impl/WebDavServer.java @@ -0,0 +1,37 @@ +package net.monarchpass.piecannon.impl; + +import java.io.IOException; +import java.net.URI; + +import com.google.common.io.ByteSource; + +import jodd.http.HttpRequest; +import lombok.Data; +import net.monarchpass.piecannon.Server; + +@Data +public class WebDavServer implements Server { + private final String label; + private final URI uri; + + private final String username; + private final String password; + + @Override + public URI upload (String name, ByteSource source) { + try { + final URI target = URI.create(uri.toString() + "/" + name.replace(" ", "%20")); + final HttpRequest request = HttpRequest.put(target.toString()) + .body(source.read(), ""); + + if (username != null && password != null) { + request.basicAuthentication(username, password); + } + + request.send(); + return target; + } catch (final IOException exception) { + throw new RuntimeException(exception); + } + } +} diff --git a/lib/src/main/java/net/monarchpass/piecannon/util/ByteSourceUploadable.java b/lib/src/main/java/net/monarchpass/piecannon/util/ByteSourceUploadable.java new file mode 100644 index 0000000..edeb660 --- /dev/null +++ b/lib/src/main/java/net/monarchpass/piecannon/util/ByteSourceUploadable.java @@ -0,0 +1,54 @@ +package net.monarchpass.piecannon.util; + +import java.io.IOException; +import java.io.InputStream; + +import com.google.common.io.ByteSource; + +import jodd.http.HttpException; +import jodd.http.upload.Uploadable; +import lombok.Data; + +@Data +public class ByteSourceUploadable implements Uploadable { + private final String fileName; + private final ByteSource source; + + @Override + public ByteSource getContent () { + return source; + } + + @Override + public byte[] getBytes () { + try { + return source.read(); + } catch (final IOException exception) { + throw new HttpException(exception); + } + } + + @Override + public String getFileName () { + return fileName; + } + + @Override + public String getMimeType () { + return null; + } + + @Override + public int getSize () { + try { + return (int) source.size(); + } catch (final IOException exception) { + throw new HttpException(exception); + } + } + + @Override + public InputStream openInputStream () throws IOException { + return source.openStream(); + } +} diff --git a/lib/src/main/java/net/monarchpass/piecannon/util/ServerFactory.java b/lib/src/main/java/net/monarchpass/piecannon/util/ServerFactory.java index 36045c6..b4c0e48 100644 --- a/lib/src/main/java/net/monarchpass/piecannon/util/ServerFactory.java +++ b/lib/src/main/java/net/monarchpass/piecannon/util/ServerFactory.java @@ -1,15 +1,18 @@ package net.monarchpass.piecannon.util; import java.net.URI; - +import java.util.Optional; import java.util.function.Function; import com.google.gson.JsonObject; import com.jcraft.jsch.IdentityRepository; +import com.google.gson.JsonPrimitive; import net.monarchpass.piecannon.Server; import net.monarchpass.piecannon.impl.FtpServer; +import net.monarchpass.piecannon.impl.GoFileServer; import net.monarchpass.piecannon.impl.SftpServer; +import net.monarchpass.piecannon.impl.WebDavServer; import lombok.Setter; @@ -17,16 +20,40 @@ public class ServerFactory implements Function { private @Setter IdentityRepository identityRepository; public Server apply (final JsonObject object) { - final String type = object.getAsJsonPrimitive("type").getAsString(); - if (type.equalsIgnoreCase("ftp")) { + final String type = Optional.ofNullable(object.getAsJsonPrimitive("type")) + .map(JsonPrimitive::getAsString) + .orElse("webdav"); + + if (type.equals("webdav")) { + return makeWebDavServer(object); + } else if (type.equalsIgnoreCase("gofile")) { + return new GoFileServer(Optional.ofNullable(object.getAsJsonPrimitive("label")).map(JsonPrimitive::getAsString).orElse("GoFile")); + } else if (type.equalsIgnoreCase("ftp")) { return makeFtpServer(object); } else if (type.equalsIgnoreCase("sftp")) { return makeSftpServer(object); } - throw new IllegalArgumentException("Invalid server type: " + type); + throw new IllegalArgumentException("Invalid server type: " + type); } + private Server makeWebDavServer (final JsonObject object) { + final String label = Optional.ofNullable(object.getAsJsonPrimitive("label")) + .map(JsonPrimitive::getAsString) + .orElse("WebDav"); + final String username = Optional.ofNullable(object.getAsJsonPrimitive("username")) + .map(JsonPrimitive::getAsString) + .orElse(null); + final String password = Optional.ofNullable(object.getAsJsonPrimitive("password")) + .map(JsonPrimitive::getAsString) + .orElse(null); + final String url = object.getAsJsonPrimitive("url").getAsString(); + + return new WebDavServer( + label, URI.create(url), username, password + ); + } + private Server makeSftpServer (final JsonObject object) { final String host = object.getAsJsonPrimitive("host").getAsString(); final String label = object.has("label") ? object.getAsJsonPrimitive("label").getAsString() : host; diff --git a/lib/src/test/java/net/monarchpass/piecannon/GoFileTest.java b/lib/src/test/java/net/monarchpass/piecannon/GoFileTest.java new file mode 100644 index 0000000..7894d67 --- /dev/null +++ b/lib/src/test/java/net/monarchpass/piecannon/GoFileTest.java @@ -0,0 +1,27 @@ +package net.monarchpass.piecannon; + +import static com.google.common.truth.Truth.assertThat; + +import java.util.logging.Level; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import lombok.extern.java.Log; +import net.monarchpass.piecannon.impl.GoFileServer; + +@Log +public class GoFileTest { + @Test + @Disabled + public void test () throws Exception { + try { + System.setProperty("https.protocols", "TLSv1.2"); + final GoFileServer server = new GoFileServer("GoFileTest"); + assertThat(PieCannon.testServer(server)).isTrue(); + } catch (final Exception exception) { + log.log(Level.SEVERE, "", exception); + throw exception; + } + } +}