dorkbox.network.connection.PropertyStore Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of Network Show documentation
Show all versions of Network Show documentation
Encrypted, high-performance, and event-driven/reactive network stack for Java 11+
/*
* Copyright 2010 dorkbox, llc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dorkbox.network.connection;
import dorkbox.network.util.store.SettingsStore;
import dorkbox.util.SerializationManager;
import dorkbox.util.bytes.ByteArrayWrapper;
import dorkbox.util.database.DB_Server;
import dorkbox.util.database.DatabaseStorage;
import dorkbox.util.exceptions.SecurityException;
import dorkbox.util.storage.Storage;
import dorkbox.util.storage.Store;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;
/**
* The property store is the DEFAULT type of store for the network stack.
* This is package private, and not intended to be extended.
*/
final
class PropertyStore extends SettingsStore {
private Storage storage;
private Map servers;
PropertyStore() {
}
/**
* Method of preference for creating/getting this connection store.
*
* @param serializationManager this is the serialization used for saving objects into the storage database
*/
@Override
public
void init(final SerializationManager serializationManager, final Storage ignored) throws IOException {
// make sure our custom types are registered
// only register if not ALREADY initialized, since we can initialize in the server and in the client. This creates problems if
// running inside the same JVM (we don't permit it)
if (serializationManager != null && !serializationManager.initialized()) {
serializationManager.register(HashMap.class);
serializationManager.register(ByteArrayWrapper.class);
serializationManager.register(DB_Server.class);
}
this.storage = Store.Memory()
.make();
servers = this.storage.getAndPut(DatabaseStorage.SERVERS, new HashMap(16));
DB_Server localServer = servers.get(DB_Server.IP_SELF); // this will always be null and is here to help people that copy/paste code
if (localServer == null) {
localServer = new DB_Server();
servers.put(DB_Server.IP_SELF, localServer);
// have to always specify what we are saving
this.storage.putAndSave(DatabaseStorage.SERVERS, servers);
}
}
/**
* Simple, property based method to getting the private key of the server
*/
@Override
public synchronized
ECPrivateKeyParameters getPrivateKey() throws dorkbox.util.exceptions.SecurityException {
checkAccess(EndPoint.class);
return servers.get(DB_Server.IP_SELF)
.getPrivateKey();
}
/**
* Simple, property based method for saving the private key of the server
*/
@Override
public synchronized
void savePrivateKey(final ECPrivateKeyParameters serverPrivateKey) throws SecurityException {
checkAccess(EndPoint.class);
servers.get(DB_Server.IP_SELF)
.setPrivateKey(serverPrivateKey);
// have to always specify what we are saving
storage.putAndSave(DatabaseStorage.SERVERS, servers);
}
/**
* Simple, property based method to getting the public key of the server
*/
@Override
public synchronized
ECPublicKeyParameters getPublicKey() throws SecurityException {
checkAccess(EndPoint.class);
return servers.get(DB_Server.IP_SELF)
.getPublicKey();
}
/**
* Simple, property based method for saving the public key of the server
*/
@Override
public synchronized
void savePublicKey(final ECPublicKeyParameters serverPublicKey) throws SecurityException {
checkAccess(EndPoint.class);
servers.get(DB_Server.IP_SELF)
.setPublicKey(serverPublicKey);
// have to always specify what we are saving
storage.putAndSave(DatabaseStorage.SERVERS, servers);
}
/**
* Simple, property based method to getting the server salt
*/
@Override
public synchronized
byte[] getSalt() {
final DB_Server localServer = servers.get(DB_Server.IP_SELF);
byte[] salt = localServer.getSalt();
// we don't care who gets the server salt
if (salt == null) {
SecureRandom secureRandom = new SecureRandom();
// server salt is used to salt usernames and other various connection handshake parameters
byte[] bytes = new byte[256];
secureRandom.nextBytes(bytes);
salt = bytes;
localServer.setSalt(bytes);
// have to always specify what we are saving
storage.putAndSave(DatabaseStorage.SERVERS, servers);
}
return salt;
}
/**
* Simple, property based method to getting a connected computer by host IP address
*/
@Override
public synchronized
ECPublicKeyParameters getRegisteredServerKey(final byte[] hostAddress) throws SecurityException {
checkAccess(RegistrationWrapper.class);
final DB_Server db_server = this.servers.get(ByteArrayWrapper.wrap(hostAddress));
if (db_server != null) {
return db_server.getPublicKey();
}
return null;
}
/**
* Saves a connected computer by host IP address and public key
*/
@Override
public synchronized
void addRegisteredServerKey(final byte[] hostAddress, ECPublicKeyParameters publicKey)
throws SecurityException {
checkAccess(RegistrationWrapper.class);
final ByteArrayWrapper wrap = ByteArrayWrapper.wrap(hostAddress);
DB_Server db_server = this.servers.get(wrap);
if (db_server == null) {
db_server = new DB_Server();
}
db_server.setPublicKey(publicKey);
servers.put(wrap, db_server);
}
/**
* Deletes a registered computer by host IP address
*/
@Override
public synchronized
boolean removeRegisteredServerKey(final byte[] hostAddress) throws SecurityException {
checkAccess(RegistrationWrapper.class);
final ByteArrayWrapper wrap = ByteArrayWrapper.wrap(hostAddress);
DB_Server db_server = this.servers.remove(wrap);
return db_server != null;
}
@Override
public
void close() {
Store.close(storage);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy