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