package peergos.shared.user;
import peergos.shared.cbor.*;
import peergos.shared.crypto.symmetric.SymmetricKey;
import peergos.shared.user.fs.FilePointer;
import peergos.shared.util.*;
import java.io.*;
import java.util.*;
public class UserStaticData implements Cborable {
private final List<EntryPoint> staticData;
public final SymmetricKey rootKey;
public UserStaticData(List<EntryPoint> staticData, SymmetricKey rootKey) {
this.staticData = staticData;
this.rootKey = rootKey;
}
public UserStaticData(SymmetricKey rootKey) {
this(new ArrayList<>(), rootKey);
}
public UserStaticData withKey(SymmetricKey newKey) {
return new UserStaticData(staticData, newKey);
}
public void clear() {
staticData.clear();
}
public int size() {
return staticData.size();
}
public void add(EntryPoint entryPoint) {
if (! staticData.contains(entryPoint))
staticData.add(entryPoint);
}
public boolean remove(FilePointer filePointer) {
for (Iterator<EntryPoint> it = staticData.iterator() ;it.hasNext();) {
EntryPoint entry = it.next();
if (entry.pointer.equals(filePointer)) {
it.remove();
return true;
}
}
return false;
}
public byte[] serialize() {
DataSink sink = new DataSink();
sink.writeInt(staticData.size());
staticData.forEach(ep -> sink.writeArray(ep.serializeAndSymmetricallyEncrypt(rootKey)));
return sink.toByteArray();
}
public static UserStaticData deserialize(byte[] raw, SymmetricKey rootKey) {
try {
DataSource source = new DataSource(raw);
int count = source.readInt();
System.out.println("Found "+count+" entry points");
UserStaticData staticData = new UserStaticData(rootKey);
for (int i = 0; i < count; i++) {
EntryPoint entry = EntryPoint.symmetricallyDecryptAndDeserialize(source.readArray(), rootKey);
staticData.add(entry);
}
return staticData;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public Set<EntryPoint> getEntryPoints() {
return new HashSet<>(staticData);
}
@Override
public CborObject toCbor() {
return new CborObject.CborByteArray(serialize());
}
public static UserStaticData fromCbor(CborObject cbor, SymmetricKey rootKey) {
if (! (cbor instanceof CborObject.CborByteArray))
throw new IllegalStateException("UserStaticData cbor must be a byte[]! " + cbor);
return deserialize(((CborObject.CborByteArray) cbor).value, rootKey);
}
}