Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 34 additions & 5 deletions Manager/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@
<version>1.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
Expand All @@ -96,14 +104,35 @@
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/fluent-hc -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
<version>4.5.6</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
<dependency>
<groupId>com.exadatum.xsuite.xmaven</groupId>
<artifactId>bash-maven-plugin</artifactId>
<version>1.0.7</version>
<scope>test</scope>
</dependency>


</dependencies>

<build>
Expand Down
5 changes: 3 additions & 2 deletions Manager/src/main/java/io/raspberrywallet/manager/Manager.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import io.raspberrywallet.contract.module.ModuleState;
import io.raspberrywallet.manager.bitcoin.Bitcoin;
import io.raspberrywallet.manager.cryptography.crypto.exceptions.DecryptionException;
import io.raspberrywallet.manager.cryptography.crypto.exceptions.EncryptionException;
import io.raspberrywallet.manager.cryptography.sharedsecret.shamir.Shamir;
import io.raspberrywallet.manager.cryptography.sharedsecret.shamir.ShamirException;
import io.raspberrywallet.manager.cryptography.sharedsecret.shamir.ShamirKey;
Expand Down Expand Up @@ -144,10 +145,10 @@ public void restoreFromBackupPhrase(@NotNull List<String> mnemonicCode, Map<Stri
walletEntity.setParts(keyPartEntities);
database.saveWallet(walletEntity);

} catch (ShamirException | IOException e) {
} catch (ShamirException | IOException | EncryptionException e) {
e.printStackTrace();
}

}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.raspberrywallet.manager.common.http;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.fluent.Form;
import org.json.JSONObject;

import java.io.IOException;
import java.util.List;

public abstract class ApacheHttpClient {

public abstract HttpResponse sendPOSTRequest(Form body, String endpoint) throws IOException;

public abstract HttpResponse sendGETRequest(Form body, String endpoint);

JSONObject convert(Form body) {
List<NameValuePair> keyValuesList = body.build();
JSONObject convertedJson = new JSONObject();
keyValuesList.forEach(pair -> convertedJson.put(pair.getName(), pair.getValue()));
return convertedJson;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package io.raspberrywallet.manager.common.http;

import org.apache.commons.lang.NotImplementedException;
import org.apache.http.HttpResponse;
import org.apache.http.client.fluent.Form;

import java.io.IOException;

public class SecureApacheApacheHttpClient extends ApacheHttpClient {

@Override
public HttpResponse sendPOSTRequest(Form body, String endpoint) throws IOException {
throw new NotImplementedException();
}

@Override
public HttpResponse sendGETRequest(Form body, String endpoint) {
throw new NotImplementedException();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package io.raspberrywallet.manager.common.http;

import org.apache.commons.lang.NotImplementedException;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.fluent.Form;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class UnsecureApacheApacheHttpClient extends ApacheHttpClient {

private Header[] defaultHeaders;

public UnsecureApacheApacheHttpClient(Form defaultHeaders) {
this.defaultHeaders = toHeadersArray(defaultHeaders);
}

@Override
public HttpResponse sendPOSTRequest(Form body, String endpoint) throws IOException {
org.apache.http.client.HttpClient client = HttpClients.createDefault();

JSONObject jsonObject = convert(body);
StringEntity stringEntity = new StringEntity(jsonObject.toString());

HttpPost httpRequest = new HttpPost(endpoint);
httpRequest.setEntity(stringEntity);
httpRequest.setHeaders(defaultHeaders);

return client.execute(httpRequest);
}

@Override
public HttpResponse sendGETRequest(Form body, String endpoint) {
throw new NotImplementedException();
}

private Header[] toHeadersArray(Form form) {
List<NameValuePair> list = form.build();
List<Header> result = new ArrayList<>(list.size());
list.forEach(nameValuePair -> {
BasicHeader basicHeader = new BasicHeader(nameValuePair.getName(), nameValuePair.getValue());
result.add(basicHeader);
});

Header[] headers = new Header[result.size()];
return result.toArray(headers);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.raspberrywallet.manager.common;
package io.raspberrywallet.manager.common.interfaces;

public interface Destroyable {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package io.raspberrywallet.manager.common.readers;

import org.apache.commons.lang.SerializationUtils;

import java.io.IOException;
import java.io.Serializable;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

abstract class Reader <T extends Serializable> {

final static String WALLET_DIR = "/opt/wallet/";

private Path pathToFile;

abstract String getFilePath();

T read() {
try {
return (T)SerializationUtils.deserialize(Files.readAllBytes(pathToFile));
} catch (IOException e) {
throw new IllegalStateException(e);
}
}

void write(T input) {
if (pathToFile == null)
readFilePath();

try {
byte[] serializedData = SerializationUtils.serialize(input);
Files.write(pathToFile, serializedData,
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING );
} catch (IOException e) {
e.printStackTrace();
}
}

boolean fileExists() {
if (pathToFile == null)
readFilePath();

return Files.exists(pathToFile);
}

private void readFilePath() {
pathToFile = Paths.get(getFilePath());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package io.raspberrywallet.manager.common.readers;

import lombok.Synchronized;

import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.UUID;

public class WalletUUIDReader extends Reader<UUID> {

private final static String UUID_FILE_NAME = "wallet.uuid";
private final static WalletUUIDReader INSTANCE = new WalletUUIDReader();

private UUID walletUUID;

private WalletUUIDReader() {}

public static WalletUUIDReader getInstance() {
return INSTANCE;
}

@Synchronized
public UUID get() {
if (walletUUID != null)
return walletUUID;

if (fileExists()) {
walletUUID = read();
return walletUUID;
}

walletUUID = UUID.randomUUID();
write(walletUUID);
return walletUUID;
}

@Override
String getFilePath() {
return WALLET_DIR + UUID_FILE_NAME;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package io.raspberrywallet.manager.common.wrappers;

import java.util.Base64;

public class Base64Secret extends Secret {

public Base64Secret(byte[] data) {
byte[] dataConverted = Base64.getEncoder().encode(data);
byteWrapper = new ByteWrapper(dataConverted);
}

}
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
package io.raspberrywallet.manager.common.wrappers;

import io.raspberrywallet.manager.common.ArrayDestroyer;
import io.raspberrywallet.manager.common.interfaces.Destroyable;
import lombok.Getter;

import java.io.Serializable;
import java.util.Arrays;

public class ByteWrapper implements Serializable {
public class ByteWrapper implements Serializable, Destroyable {

@Getter
private byte[] data;

public ByteWrapper(byte[] data) {
this.data = data;
}

public byte[] getData() {
return data;
}

@Override
public int hashCode() {
return Arrays.hashCode(data);
Expand All @@ -31,4 +32,10 @@ public boolean equals(Object other) {
ByteWrapper otherCasted = (ByteWrapper)other;
return this.hashCode() == otherCasted.hashCode();
}

@Override
public void destroy() {
ArrayDestroyer.destroy(data);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.raspberrywallet.manager.common.wrappers;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Base64;

@AllArgsConstructor
@Getter
public class Credentials {

private String name;
private String password;

public String getPasswordBase64() {
return Base64.getEncoder().encodeToString(password.getBytes());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package io.raspberrywallet.manager.common.wrappers;

import io.raspberrywallet.manager.common.interfaces.Destroyable;

import java.util.Base64;

public class Secret implements Destroyable {

ByteWrapper byteWrapper;

public byte[] getData() {
return byteWrapper.getData();
}

Secret() {}

/**
* Warning, this constructor assumes, that given data is encoded in Base64
* @param base64Data base64 encoded data
*/
public Secret(String base64Data) {
byte[] decodedData = Base64.getDecoder().decode(base64Data);
byteWrapper = new ByteWrapper(decodedData);
}

@Override
public void destroy() {
byteWrapper.destroy();
}

@Override
public int hashCode() {
return byteWrapper.hashCode();
}
}
Loading