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