TrustArchive.java revision 7861c663fd64af33ec2a4c5ad653c806dc8bd994
17a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos/* 27a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * Copyright (C) 2014 The Android Open Source Project 37a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * 47a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * Licensed under the Apache License, Version 2.0 (the "License"); 57a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * you may not use this file except in compliance with the License. 67a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * You may obtain a copy of the License at 77a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * 87a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * http://www.apache.org/licenses/LICENSE-2.0 97a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * 107a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * Unless required by applicable law or agreed to in writing, software 117a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * distributed under the License is distributed on an "AS IS" BASIS, 127a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * See the License for the specific language governing permissions and 147a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * limitations under the License 157a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos */ 167a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 177a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roospackage com.android.server.trust; 187a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 197a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport android.content.ComponentName; 207a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport android.os.SystemClock; 217a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport android.os.UserHandle; 227a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport android.util.TimeUtils; 237a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 247a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport java.io.PrintWriter; 257a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport java.util.ArrayDeque; 267a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roosimport java.util.Iterator; 277a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 287a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos/** 297a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos * An archive of trust events. 307a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos */ 317a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roospublic class TrustArchive { 327a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos private static final int TYPE_GRANT_TRUST = 0; 337a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos private static final int TYPE_REVOKE_TRUST = 1; 347a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos private static final int TYPE_TRUST_TIMEOUT = 2; 357a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos private static final int TYPE_AGENT_DIED = 3; 367d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos private static final int TYPE_AGENT_CONNECTED = 4; 377d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos private static final int TYPE_AGENT_STOPPED = 5; 387861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos private static final int TYPE_MANAGING_TRUST = 6; 397a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 407a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos private static final int HISTORY_LIMIT = 200; 417a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 427a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos private static class Event { 437a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos final int type; 447a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos final int userId; 457a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos final ComponentName agent; 467a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos final long elapsedTimestamp; 477a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 487a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos // grantTrust 497a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos final String message; 507a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos final long duration; 517a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos final boolean userInitiated; 527a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 537861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos // managingTrust 547861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos final boolean managingTrust; 557861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos 567a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos private Event(int type, int userId, ComponentName agent, String message, 577861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos long duration, boolean userInitiated, boolean managingTrust) { 587a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos this.type = type; 597a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos this.userId = userId; 607a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos this.agent = agent; 617a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos this.elapsedTimestamp = SystemClock.elapsedRealtime(); 627a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos this.message = message; 637a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos this.duration = duration; 647a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos this.userInitiated = userInitiated; 657861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos this.managingTrust = managingTrust; 667a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 677a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 687a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 697a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos ArrayDeque<Event> mEvents = new ArrayDeque<Event>(); 707a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 717a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos public void logGrantTrust(int userId, ComponentName agent, String message, 727a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos long duration, boolean userInitiated) { 737a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos addEvent(new Event(TYPE_GRANT_TRUST, userId, agent, message, duration, 747861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos userInitiated, false)); 757a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 767a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 777a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos public void logRevokeTrust(int userId, ComponentName agent) { 787861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos addEvent(new Event(TYPE_REVOKE_TRUST, userId, agent, null, 0, false, false)); 797a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 807a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 817a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos public void logTrustTimeout(int userId, ComponentName agent) { 827861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos addEvent(new Event(TYPE_TRUST_TIMEOUT, userId, agent, null, 0, false, false)); 837a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 847a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 857a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos public void logAgentDied(int userId, ComponentName agent) { 867861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos addEvent(new Event(TYPE_AGENT_DIED, userId, agent, null, 0, false, false)); 877a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 887a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 897d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos public void logAgentConnected(int userId, ComponentName agent) { 907861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos addEvent(new Event(TYPE_AGENT_CONNECTED, userId, agent, null, 0, false, false)); 917d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos } 927d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos 937d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos public void logAgentStopped(int userId, ComponentName agent) { 947861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos addEvent(new Event(TYPE_AGENT_STOPPED, userId, agent, null, 0, false, false)); 957861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos } 967861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos 977861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos public void logManagingTrust(int userId, ComponentName agent, boolean managing) { 987861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos addEvent(new Event(TYPE_MANAGING_TRUST, userId, agent, null, 0, false, managing)); 997d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos } 1007d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos 1017a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos private void addEvent(Event e) { 1027a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos if (mEvents.size() >= HISTORY_LIMIT) { 1037a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos mEvents.removeFirst(); 1047a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1057a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos mEvents.addLast(e); 1067a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1077a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 1087a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos public void dump(PrintWriter writer, int limit, int userId, String linePrefix, 1097a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos boolean duplicateSimpleNames) { 1107a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos int count = 0; 1117a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos Iterator<Event> iter = mEvents.descendingIterator(); 1127a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos while (iter.hasNext() && count < limit) { 1137a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos Event ev = iter.next(); 1147a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos if (userId != UserHandle.USER_ALL && userId != ev.userId) { 1157a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos continue; 1167a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1177a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 1187a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos writer.print(linePrefix); 1197a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos writer.printf("#%-2d %s %s: ", count, formatElapsed(ev.elapsedTimestamp), 1207a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos dumpType(ev.type)); 1217a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos if (userId == UserHandle.USER_ALL) { 1227a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos writer.print("user="); writer.print(ev.userId); writer.print(", "); 1237a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1247a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos writer.print("agent="); 1257a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos if (duplicateSimpleNames) { 1267a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos writer.print(ev.agent.flattenToShortString()); 1277a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } else { 1287a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos writer.print(getSimpleName(ev.agent)); 1297a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1307a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos switch (ev.type) { 1317a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos case TYPE_GRANT_TRUST: 1327a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos writer.printf(", message=\"%s\", duration=%s", 1337a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos ev.message, formatDuration(ev.duration)); 1347a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos break; 1357861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos case TYPE_MANAGING_TRUST: 1367861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos writer.printf(", managingTrust=" + ev.managingTrust); 1377861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos break; 1387a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos default: 1397a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1407a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos writer.println(); 1417a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos count++; 1427a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1437a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1447a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 145c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos public static String formatDuration(long duration) { 1467a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos StringBuilder sb = new StringBuilder(); 1477a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos TimeUtils.formatDuration(duration, sb); 1487a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos return sb.toString(); 1497a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1507a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 1517a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos private static String formatElapsed(long elapsed) { 1527a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos long delta = elapsed - SystemClock.elapsedRealtime(); 1537a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos long wallTime = delta + System.currentTimeMillis(); 1547a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos return TimeUtils.logTimeOfDay(wallTime); 1557a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1567a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 1577a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos /* package */ static String getSimpleName(ComponentName cn) { 1587a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos String name = cn.getClassName(); 1597a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos int idx = name.lastIndexOf('.'); 1607a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos if (idx < name.length() && idx >= 0) { 1617a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos return name.substring(idx + 1); 1627a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } else { 1637a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos return name; 1647a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1657a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1667a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos 1677a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos private String dumpType(int type) { 1687a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos switch (type) { 1697a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos case TYPE_GRANT_TRUST: 1707a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos return "GrantTrust"; 1717a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos case TYPE_REVOKE_TRUST: 1727a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos return "RevokeTrust"; 1737a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos case TYPE_TRUST_TIMEOUT: 1747a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos return "TrustTimeout"; 1757a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos case TYPE_AGENT_DIED: 1767a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos return "AgentDied"; 1777d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos case TYPE_AGENT_CONNECTED: 1787d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos return "AgentConnected"; 1797d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos case TYPE_AGENT_STOPPED: 1807d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos return "AgentStopped"; 1817861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos case TYPE_MANAGING_TRUST: 1827861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos return "ManagingTrust"; 1837a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos default: 1847a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos return "Unknown(" + type + ")"; 1857a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1867a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos } 1877a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos} 188