Compare commits

..

3 Commits

Author SHA1 Message Date
cf920c57c6 lib: add FtpServer type 2020-12-13 06:26:04 -06:00
77cf4f5820 desktop/piecannon: capture output of mvn command so we can display it to the user, capture error code so we can pass it upstream
(cherry picked from commit 2f7761bac7fddf857bb31b6db94147e0496153dd)
2020-12-13 06:20:57 -06:00
0d29b03dce remove unused imports 2020-12-13 04:18:51 -06:00
6 changed files with 80 additions and 7 deletions

View File

@ -28,4 +28,4 @@ TODO
## How to use
Place a `servers.json` in the Pie Cannon data directory. For GNU/Linux this is `XDG_DATA_HOME` (by default this would be `~/.local/share/piecannon`) (create this directory if it does not exist. For Android this would be the app's "externalFilesDir" (probably something like `Android/data/net.monarchpass.piecannon/files` - the app will tell you when you launch it). See `servers.example.json` for an example of such a file. Whenever you initiate a file upload, Pie Cannon will select one of your defined servers at random and upload the file.
For SFTP servers (the only supported type as of now), the `path` is relative to your home directory and should be where `url` points to. i.e. a file uploaded to `path` should be downloadable at `url`. In the future Pie Cannon should be able to get SSH credentials from your agent so you won't need to put a password in this file.
For FTP/SFTP servers (the only supported types as of now), the `path` is relative to your home directory and should be where `url` points to. i.e. a file uploaded to `path` should be downloadable at `url`. In the future Pie Cannon should be able to get SSH credentials from your agent so you won't need to put a password in this file.

View File

@ -8,5 +8,13 @@ STUB_POM="<project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://w
STUB_POM_FILE=/tmp/pc.xml
echo $STUB_POM > $STUB_POM_FILE
RESULT=$(mvn -f $STUB_POM_FILE -B exec:java -Dexec.mainClass=$PC_CLASS -Dexec.arguments=$1 -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN | tail -n 1)
OUTPUT=$(mvn -f $STUB_POM_FILE -B exec:java -Dexec.mainClass=$PC_CLASS -Dexec.arguments=$1 -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN)
EXEC_RESULT=$?
echo "$OUTPUT"
if [ $EXEC_RESULT != 0 ]; then
exit $EXEC_RESULT;
fi
RESULT=$(echo "$OUTPUT" | tail -n 1)
xdg-open $RESULT

View File

@ -4,15 +4,11 @@ import java.net.URI;
import java.io.File;
import java.util.List;
import java.util.ArrayList;
import org.freedesktop.BaseDirectory;
import lombok.extern.java.Log;
import java.util.logging.Level;
import net.monarchpass.piecannon.util.ServerFactory;
@Log
public class App {
public static void main (final String... args) throws Exception {

View File

@ -0,0 +1,45 @@
package net.monarchpass.piecannon.impl;
import net.monarchpass.piecannon.Server;
import com.google.common.io.ByteSource;
import com.google.common.io.ByteStreams;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import lombok.Data;
@Data
public class FtpServer implements Server {
private final String label;
private final String host;
private final int port;
private final String username;
private final String password;
private final String path;
private final URI uri;
public URI upload (String name, ByteSource source) {
name = name.replace(" ", "%20");
try {
final URI target = URI.create(uri.toString() + "/" + name);
final URL ftpUrl = new URL(String.format("ftp://%s:%s@%s:%d/%s/%s;type=i", username, password, host, port, path, name));
final URLConnection connection = ftpUrl.openConnection();
try (InputStream in = source.openStream()) {
try (OutputStream out = connection.getOutputStream()) {
ByteStreams.copy(in, out);
}
}
return target;
} catch (final IOException exception) {
throw new RuntimeException(exception);
}
}
}

View File

@ -6,13 +6,21 @@ import java.util.function.Function;
import com.google.gson.JsonObject;
import net.monarchpass.piecannon.Server;
import net.monarchpass.piecannon.impl.FtpServer;
import net.monarchpass.piecannon.impl.SftpServer;
public class ServerFactory implements Function<JsonObject, Server> {
public Server apply (final JsonObject object) {
final String type = object.getAsJsonPrimitive("type").getAsString();
if (type.equalsIgnoreCase("ftp")) {
return makeFtpServer(object);
} else if (type.equalsIgnoreCase("sftp")) {
return makeSftpServer(object);
}
throw new IllegalArgumentException("Invalid server type: " + type);
}
private Server makeSftpServer (final JsonObject object) {
final String host = object.getAsJsonPrimitive("host").getAsString();
final String label = object.has("label") ? object.getAsJsonPrimitive("label").getAsString() : host;
@ -27,4 +35,19 @@ public class ServerFactory implements Function<JsonObject, Server> {
path, URI.create(url)
);
}
private Server makeFtpServer (final JsonObject object) {
final String host = object.getAsJsonPrimitive("host").getAsString();
final String label = object.has("label") ? object.getAsJsonPrimitive("label").getAsString() : host;
final int port = object.has("port") ? object.getAsJsonPrimitive("port").getAsInt() : 21;
final String username = object.getAsJsonPrimitive("username").getAsString();
final String password = object.getAsJsonPrimitive("password").getAsString();
final String path = object.getAsJsonPrimitive("path").getAsString();
final String url = object.getAsJsonPrimitive("url").getAsString();
return new FtpServer(
label, host, port, username, password,
path, URI.create(url)
);
}
}

View File

@ -1,4 +1,5 @@
[{
"type": "ftp",
"host": "example.com",
"username": "username",
"password": "password",