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 createActiveTrusted() {
67 final FingerprintStatus status = new FingerprintStatus();
68 status.trust = Trust.TRUSTED;
69 status.active = true;
70 status.lastActivation = System.currentTimeMillis();
71 return status;
72 }
73
74 public static FingerprintStatus createActiveVerified(boolean x509) {
75 final FingerprintStatus status = new FingerprintStatus();
76 status.trust = x509 ? Trust.VERIFIED_X509 : Trust.VERIFIED;
77 status.active = true;
78 return status;
79 }
80
81 public static FingerprintStatus createActive(Boolean trusted) {
82 return createActive(trusted != null && trusted);
83 }
84
85 public static FingerprintStatus createActive(boolean trusted) {
86 final FingerprintStatus status = new FingerprintStatus();
87 status.trust = trusted ? Trust.TRUSTED : Trust.UNTRUSTED;
88 status.active = true;
89 return status;
90 }
91
92 public boolean isTrustedAndActive() {
93 return active && isTrusted();
94 }
95
96 public boolean isTrusted() {
97 return trust == Trust.TRUSTED || isVerified();
98 }
99
100 public boolean isVerified() {
101 return trust == Trust.VERIFIED || trust == Trust.VERIFIED_X509;
102 }
103
104 public boolean isCompromised() {
105 return trust == Trust.COMPROMISED;
106 }
107
108 public boolean isActive() {
109 return active;
110 }
111
112 public FingerprintStatus toActive() {
113 FingerprintStatus status = new FingerprintStatus();
114 status.trust = trust;
115 if (!status.active) {
116 status.lastActivation = System.currentTimeMillis();
117 }
118 status.active = true;
119 return status;
120 }
121
122 public FingerprintStatus toInactive() {
123 FingerprintStatus status = new FingerprintStatus();
124 status.trust = trust;
125 status.active = false;
126 return status;
127 }
128
129 public Trust getTrust() {
130 return trust;
131 }
132
133 public FingerprintStatus toVerified() {
134 FingerprintStatus status = new FingerprintStatus();
135 status.active = active;
136 status.trust = Trust.VERIFIED;
137 return status;
138 }
139
140 public FingerprintStatus toUntrusted() {
141 FingerprintStatus status = new FingerprintStatus();
142 status.active = active;
143 status.trust = Trust.UNTRUSTED;
144 return status;
145 }
146
147 public static FingerprintStatus createInactiveVerified() {
148 final FingerprintStatus status = new FingerprintStatus();
149 status.trust = Trust.VERIFIED;
150 status.active = false;
151 return status;
152 }
153
154 @Override
155 public int compareTo(FingerprintStatus o) {
156 if (active == o.active) {
157 if (lastActivation > o.lastActivation) {
158 return -1;
159 } else if (lastActivation < o.lastActivation) {
160 return 1;
161 } else {
162 return 0;
163 }
164 } else if (active){
165 return -1;
166 } else {
167 return 1;
168 }
169 }
170
171 public long getLastActivation() {
172 return lastActivation;
173 }
174
175 public enum Trust {
176 COMPROMISED,
177 UNDECIDED,
178 UNTRUSTED,
179 TRUSTED,
180 VERIFIED,
181 VERIFIED_X509
182 }
183
184}