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