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 isUnverified() {
101 return trust == Trust.TRUSTED;
102 }
103
104 public boolean isVerified() {
105 return trust == Trust.VERIFIED || trust == Trust.VERIFIED_X509;
106 }
107
108 public boolean isCompromised() {
109 return trust == Trust.COMPROMISED;
110 }
111
112 public boolean isActive() {
113 return active;
114 }
115
116 public FingerprintStatus toActive() {
117 FingerprintStatus status = new FingerprintStatus();
118 status.trust = trust;
119 if (!status.active) {
120 status.lastActivation = System.currentTimeMillis();
121 }
122 status.active = true;
123 return status;
124 }
125
126 public FingerprintStatus toInactive() {
127 FingerprintStatus status = new FingerprintStatus();
128 status.trust = trust;
129 status.active = false;
130 return status;
131 }
132
133 public Trust getTrust() {
134 return trust;
135 }
136
137 public FingerprintStatus toVerified() {
138 FingerprintStatus status = new FingerprintStatus();
139 status.active = active;
140 status.trust = Trust.VERIFIED;
141 return status;
142 }
143
144 public FingerprintStatus toUntrusted() {
145 FingerprintStatus status = new FingerprintStatus();
146 status.active = active;
147 status.trust = Trust.UNTRUSTED;
148 return status;
149 }
150
151 public static FingerprintStatus createInactiveVerified() {
152 final FingerprintStatus status = new FingerprintStatus();
153 status.trust = Trust.VERIFIED;
154 status.active = false;
155 return status;
156 }
157
158 @Override
159 public int compareTo(FingerprintStatus o) {
160 if (active == o.active) {
161 if (lastActivation > o.lastActivation) {
162 return -1;
163 } else if (lastActivation < o.lastActivation) {
164 return 1;
165 } else {
166 return 0;
167 }
168 } else if (active){
169 return -1;
170 } else {
171 return 1;
172 }
173 }
174
175 public long getLastActivation() {
176 return lastActivation;
177 }
178
179 public enum Trust {
180 COMPROMISED,
181 UNDECIDED,
182 UNTRUSTED,
183 TRUSTED,
184 VERIFIED,
185 VERIFIED_X509
186 }
187
188}