19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
257e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn/**
267e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn * Description of a permission granted to an app to access a particular URI.
277e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn *
287e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn * CTS tests for this functionality can be run with "runtest cts-appsecurity".
297e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn *
30cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn * Test cases are at cts/tests/appsecurity-tests/test-apps/UsePermissionDiffCert/
31cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn *      src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
327e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn */
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass UriPermission {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final int uid;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Uri uri;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int modeFlags = 0;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int globalModeFlags = 0;
3839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn    final HashSet<UriPermissionOwner> readOwners = new HashSet<UriPermissionOwner>();
3939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn    final HashSet<UriPermissionOwner> writeOwners = new HashSet<UriPermissionOwner>();
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    String stringName;
421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    UriPermission(int _uid, Uri _uri) {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uid = _uid;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uri = _uri;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
480de8ddb0cfd65968387b51fb0d4f505b81d8b0a2Steve Howard    void clearModes(int modeFlagsToClear) {
490de8ddb0cfd65968387b51fb0d4f505b81d8b0a2Steve Howard        if ((modeFlagsToClear&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            globalModeFlags &= ~Intent.FLAG_GRANT_READ_URI_PERMISSION;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            modeFlags &= ~Intent.FLAG_GRANT_READ_URI_PERMISSION;
5239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            if (readOwners.size() > 0) {
5339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                for (UriPermissionOwner r : readOwners) {
5439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    r.removeReadPermission(this);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                readOwners.clear();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
590de8ddb0cfd65968387b51fb0d4f505b81d8b0a2Steve Howard        if ((modeFlagsToClear&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            globalModeFlags &= ~Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            modeFlags &= ~Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
62ac5f998396d6a3f1fa5bab131eb170e0fbcb375cVairavan Srinivasan            if (writeOwners.size() > 0) {
6339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                for (UriPermissionOwner r : writeOwners) {
6439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    r.removeWritePermission(this);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
66ac5f998396d6a3f1fa5bab131eb170e0fbcb375cVairavan Srinivasan                writeOwners.clear();
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (stringName != null) {
731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            return stringName;
741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        StringBuilder sb = new StringBuilder(128);
761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append("UriPermission{");
771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(Integer.toHexString(System.identityHashCode(this)));
781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(' ');
791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(uri);
801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append('}');
811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        return stringName = sb.toString();
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dump(PrintWriter pw, String prefix) {
851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.print(prefix); pw.print("modeFlags=0x");
861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(Integer.toHexString(modeFlags));
871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(" uid="); pw.print(uid);
881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(" globalModeFlags=0x");
891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.println(Integer.toHexString(globalModeFlags));
9039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        if (readOwners.size() != 0) {
9139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(prefix); pw.println("readOwners:");
9239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            for (UriPermissionOwner owner : readOwners) {
9339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                pw.print(prefix); pw.print("  * "); pw.println(owner);
9439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            }
951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
9639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        if (writeOwners.size() != 0) {
9739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(prefix); pw.println("writeOwners:");
9839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            for (UriPermissionOwner owner : writeOwners) {
9939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                pw.print(prefix); pw.print("  * "); pw.println(owner);
10039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            }
1011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
104