package org.syncany.plugins.transfer;
import java.lang.reflect.Field;
import java.util.List;
import org.simpleframework.xml.convert.Converter;
import org.simpleframework.xml.stream.InputNode;
import org.simpleframework.xml.stream.OutputNode;
import org.syncany.config.UserConfig;
import org.syncany.util.ReflectionUtil;
import com.google.common.collect.Lists;
/**
* Converter to encrypt fields marked with the {@link Encrypted}
* annotation. Every marked field is encrypted with the user-specific
* config key from {@link UserConfig}.
*
* @author Christian Roth <christian.roth@port17.de>
*/
public class EncryptedTransferSettingsConverter implements Converter<String> {
private List<String> encryptedFields;
public EncryptedTransferSettingsConverter() {
// Nothing.
}
public EncryptedTransferSettingsConverter(Class<? extends TransferSettings> transferSettingsClass) {
this.encryptedFields = getEncryptedFields(transferSettingsClass);
}
@Override
public String read(InputNode node) throws Exception {
InputNode encryptedAttribute = node.getAttribute("encrypted");
if (encryptedAttribute != null && encryptedAttribute.getValue().equals(Boolean.TRUE.toString())) {
return TransferSettings.decrypt(node.getValue());
}
return node.getValue();
}
@Override
public void write(OutputNode node, String raw) throws Exception {
if (encryptedFields.contains(node.getName())) {
node.setValue(TransferSettings.encrypt(raw));
node.setAttribute("encrypted", Boolean.TRUE.toString());
}
else {
node.setValue(raw);
}
}
private List<String> getEncryptedFields(Class<? extends TransferSettings> clazz) {
List<String> encryptedFields = Lists.newArrayList();
for (Field field : ReflectionUtil.getAllFieldsWithAnnotation(clazz, Encrypted.class)) {
encryptedFields.add(field.getName());
}
return encryptedFields;
}
}