package happy.research.pgp;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
public class PGPNode implements Comparable<PGPNode>
{
private int keyId;
private CertificateType certificate;
public static enum SignerType
{
ExperiencedSigner, MediumSigner, NewbieSigner
};
public static enum HonestType
{
Honest, Dishonest, Neutral
};
public static enum MistakeSingerType {
Many, Neutral, Little
}
private SignerType signerType;
private HonestType honestType;
private MistakeSingerType mistakeType;
private static Logger logger = Logger.getLogger(PGPNode.class);
/* <PGPNode, Double> = <target signed by this, trust value Be(p)> */
/* stores the targets that the current node signed */
private Map<PGPNode, TrustType> neighborus;
private Map<PGPNode, TrustType> tns; // Trusted Neighbours
private Map<PGPNode, Double> nns; // Nearest Neighbours: trust value=similarity
/* stores who signed the current node */
private Map<PGPNode, CertificateType> signers;
public PGPNode(int keyId, CertificateType validity)
{
this.keyId = keyId;
this.certificate = validity;
this.honestType = HonestType.Honest;
neighborus = new HashMap<>();
tns = new HashMap<>();
nns = new HashMap<>();
signers = new HashMap<>();
// self signing
this.signTarget(this, CertificateType.VALID, TrustType.COMPLETED_TRUST);
}
public void signTarget(PGPNode target, CertificateType validity, TrustType trustness)
{
if (target.getSigners().containsKey(this))
{
logger.warn("Target is already signed before.");
} else
{
target.getSigners().put(this, validity);
neighborus.put(target, trustness);
if (target != this && trustness.getTrustValue() >= 0.5) tns.put(target, trustness);
}
}
public void addSpecifiedTarget(PGPNode target, TrustType trustness)
{
neighborus.put(target, trustness);
tns.put(target, trustness);
}
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append("Key id = ")
.append(keyId)
.append(" \tCertificate type = ")
.append(certificate.name())
.append(" \tHonest type = ")
.append(honestType.name())
.append(" \tSigner type = ")
.append(signerType.name())
.append("\nNeighbours[")
.append(neighborus.size())
.append("]:\n");
int count = 0;
int sep = 8;
for (Entry<PGPNode, TrustType> entry : neighborus.entrySet())
{
count++;
sb.append(entry.getKey().getKeyId());
sb.append("(");
sb.append(entry.getValue().getTrustValue());
sb.append(",").append(entry.getKey().getCertificate().getInherentValue());
sb.append(")");
if (count % sep == 0)
sb.append("\n");
else
sb.append(" \t");
}
sb.append("\nTrusted Neighbours[");
sb.append(tns.size());
sb.append("]:\n");
count = 0;
for (Entry<PGPNode, TrustType> entry : tns.entrySet())
{
count++;
sb.append(entry.getKey().getKeyId());
sb.append("(").append(entry.getValue().getTrustValue());
sb.append(",").append(entry.getKey().getCertificate().getInherentValue());
sb.append(")");
if (count % sep == 0)
sb.append("\n");
else
sb.append(" \t");
}
sb.append("\nSigners[");
sb.append(signers.size());
sb.append("]:\n");
count = 0;
for (Entry<PGPNode, CertificateType> entry : signers.entrySet())
{
count++;
sb.append(entry.getKey().getKeyId());
sb.append("(");
sb.append(entry.getValue().getInherentValue());
sb.append(")");
if (count % (sep + 5) == 0)
sb.append("\n");
else
sb.append(" \t");
}
sb.append("\n--------------------------------------------------------------------------------------------------------------------\n");
return sb.toString();
}
public int getKeyId()
{
return keyId;
}
public CertificateType getCertificate()
{
return certificate;
}
public void setCertificate(CertificateType certificate)
{
this.certificate = certificate;
}
public Map<PGPNode, CertificateType> getSigners()
{
return signers;
}
public void setSigners(Map<PGPNode, CertificateType> signers)
{
this.signers = signers;
}
public Map<PGPNode, TrustType> getNeighborus()
{
return neighborus;
}
public void setNeighborus(Map<PGPNode, TrustType> neighborus)
{
this.neighborus = neighborus;
}
public Map<PGPNode, TrustType> getTns()
{
return tns;
}
public void setTns(Map<PGPNode, TrustType> tns)
{
this.tns = tns;
}
public void setKeyId(int keyId)
{
this.keyId = keyId;
}
public int compareTo(PGPNode target)
{
return (this.keyId - target.getKeyId());
}
public SignerType getSignerType()
{
return signerType;
}
public void setSignerType(SignerType signerType)
{
this.signerType = signerType;
}
public HonestType getHonestType()
{
return honestType;
}
public void setHonestType(HonestType honestType)
{
this.honestType = honestType;
}
public void setMistakeType(MistakeSingerType mistakeType) {
this.mistakeType = mistakeType;
}
public Map<PGPNode, Double> getNns()
{
return nns;
}
public void setNns(Map<PGPNode, Double> nns)
{
this.nns = nns;
}
public MistakeSingerType getMistakeType() {
return mistakeType;
}
}