1package eu.siacs.conversations.crypto.axolotl;
2
3import android.content.ContentValues;
4import android.database.Cursor;
5
6public class FingerprintStatus implements Comparable<FingerprintStatus> {
7
8 private static final long DO_NOT_OVERWRITE = -1;
9
10 private Trust trust = Trust.UNTRUSTED;
11 private boolean active = false;
12 private long lastActivation = DO_NOT_OVERWRITE;
13
14 @Override
15 public boolean equals(Object o) {
16 if (this == o) return true;
17 if (o == null || getClass() != o.getClass()) return false;
18
19 FingerprintStatus that = (FingerprintStatus) o;
20
21 return active == that.active && trust == that.trust;
22 }
23
24 @Override
25 public int hashCode() {
26 int result = trust.hashCode();
27 result = 31 * result + (active ? 1 : 0);
28 return result;
29 }
30
31 private FingerprintStatus() {
32
33
34 }
35
36 public ContentValues toContentValues() {
37 final ContentValues contentValues = new ContentValues();
38 contentValues.put(SQLiteAxolotlStore.TRUST,trust.toString());
39 contentValues.put(SQLiteAxolotlStore.ACTIVE,active ? 1 : 0);
40 if (lastActivation != DO_NOT_OVERWRITE) {
41 contentValues.put(SQLiteAxolotlStore.LAST_ACTIVATION,lastActivation);
42 }
43 return contentValues;
44 }
45
46 public static FingerprintStatus fromCursor(Cursor cursor) {
47 final FingerprintStatus status = new FingerprintStatus();
48 try {
49 status.trust = Trust.valueOf(cursor.getString(cursor.getColumnIndex(SQLiteAxolotlStore.TRUST)));
50 } catch(IllegalArgumentException e) {
51 status.trust = Trust.UNTRUSTED;
52 }
53 status.active = cursor.getInt(cursor.getColumnIndex(SQLiteAxolotlStore.ACTIVE)) > 0;
54 status.lastActivation = cursor.getLong(cursor.getColumnIndex(SQLiteAxolotlStore.LAST_ACTIVATION));
55 return status;
56 }
57
58 public static FingerprintStatus createActiveUndecided() {
59 final FingerprintStatus status = new FingerprintStatus();
60 status.trust = Trust.UNDECIDED;
61 status.active = true;
62 status.lastActivation = System.currentTimeMillis();
63 return status;
64 }
65
66 public static FingerprintStatus createActiveVerified(boolean x509) {
67 final FingerprintStatus status = new FingerprintStatus();
68 status.trust = x509 ? Trust.VERIFIED_X509 : Trust.VERIFIED;
69 status.active = true;
70 return status;
71 }
72
73 public static FingerprintStatus createActive(boolean trusted) {
74 final FingerprintStatus status = new FingerprintStatus();
75 status.trust = trusted ? Trust.TRUSTED : Trust.UNTRUSTED;
76 status.active = true;
77 return status;
78 }
79
80 public boolean isTrustedAndActive() {
81 return active && isTrusted();
82 }
83
84 public boolean isTrusted() {
85 return trust == Trust.TRUSTED || isVerified();
86 }
87
88 public boolean isVerified() {
89 return trust == Trust.VERIFIED || trust == Trust.VERIFIED_X509;
90 }
91
92 public boolean isCompromised() {
93 return trust == Trust.COMPROMISED;
94 }
95
96 public boolean isActive() {
97 return active;
98 }
99
100 public FingerprintStatus toActive() {
101 FingerprintStatus status = new FingerprintStatus();
102 status.trust = trust;
103 if (!status.active) {
104 status.lastActivation = System.currentTimeMillis();
105 }
106 status.active = true;
107 return status;
108 }
109
110 public FingerprintStatus toInactive() {
111 FingerprintStatus status = new FingerprintStatus();
112 status.trust = trust;
113 status.active = false;
114 return status;
115 }
116
117 public Trust getTrust() {
118 return trust;
119 }
120
121 public static FingerprintStatus createCompromised() {
122 FingerprintStatus status = new FingerprintStatus();
123 status.active = false;
124 status.trust = Trust.COMPROMISED;
125 return status;
126 }
127
128 public FingerprintStatus toVerified() {
129 FingerprintStatus status = new FingerprintStatus();
130 status.active = active;
131 status.trust = Trust.VERIFIED;
132 return status;
133 }
134
135 public static FingerprintStatus createInactiveVerified() {
136 final FingerprintStatus status = new FingerprintStatus();
137 status.trust = Trust.VERIFIED;
138 status.active = false;
139 return status;
140 }
141
142 @Override
143 public int compareTo(FingerprintStatus o) {
144 if (active == o.active) {
145 if (lastActivation > o.lastActivation) {
146 return -1;
147 } else if (lastActivation < o.lastActivation) {
148 return 1;
149 } else {
150 return 0;
151 }
152 } else if (active){
153 return -1;
154 } else {
155 return 1;
156 }
157 }
158
159 public enum Trust {
160 COMPROMISED,
161 UNDECIDED,
162 UNTRUSTED,
163 TRUSTED,
164 VERIFIED,
165 VERIFIED_X509
166 }
167
168}