blob: 244613180d007d9446841a1f420aeca5c0329a24 [file] [log] [blame]
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.pm;
18
Todd Kennedy0eb97382017-10-03 16:57:22 -070019import android.annotation.Nullable;
Jeff Vander Stoepd1cf4992018-01-11 16:09:58 -080020import android.content.pm.ApplicationInfo;
Todd Kennedy0eb97382017-10-03 16:57:22 -070021import android.content.pm.PackageParser;
Yi Jind6759d42017-10-12 15:08:49 -070022import android.service.pm.PackageServiceDumpProto;
Jeff Sharkey9f837a92014-10-24 12:07:24 -070023import android.util.ArraySet;
Yi Jind6759d42017-10-12 15:08:49 -070024import android.util.proto.ProtoOutputStream;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070025
Todd Kennedy0eb97382017-10-03 16:57:22 -070026import java.util.ArrayList;
27import java.util.Collection;
28import java.util.List;
29
Kenny Rootcf0b38c2011-03-22 14:17:59 -070030/**
31 * Settings data for a particular shared user ID we know about.
32 */
Todd Kennedy0eb97382017-10-03 16:57:22 -070033public final class SharedUserSetting extends SettingBase {
Kenny Rootcf0b38c2011-03-22 14:17:59 -070034 final String name;
35
36 int userId;
37
Ben Gruverdd72c9e2013-08-06 12:34:17 -070038 // flags that are associated with this uid, regardless of any package flags
39 int uidFlags;
Alex Klyubinb9f8a522015-02-03 11:12:59 -080040 int uidPrivateFlags;
Ben Gruverdd72c9e2013-08-06 12:34:17 -070041
Jeff Sharkey9f837a92014-10-24 12:07:24 -070042 final ArraySet<PackageSetting> packages = new ArraySet<PackageSetting>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -070043
44 final PackageSignatures signatures = new PackageSignatures();
45
Alex Klyubinb9f8a522015-02-03 11:12:59 -080046 SharedUserSetting(String _name, int _pkgFlags, int _pkgPrivateFlags) {
47 super(_pkgFlags, _pkgPrivateFlags);
Ben Gruverdd72c9e2013-08-06 12:34:17 -070048 uidFlags = _pkgFlags;
Alex Klyubinb9f8a522015-02-03 11:12:59 -080049 uidPrivateFlags = _pkgPrivateFlags;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070050 name = _name;
51 }
52
53 @Override
54 public String toString() {
55 return "SharedUserSetting{" + Integer.toHexString(System.identityHashCode(this)) + " "
56 + name + "/" + userId + "}";
57 }
Ben Gruverdd72c9e2013-08-06 12:34:17 -070058
Yi Jind6759d42017-10-12 15:08:49 -070059 public void writeToProto(ProtoOutputStream proto, long fieldId) {
60 long token = proto.start(fieldId);
61 proto.write(PackageServiceDumpProto.SharedUserProto.USER_ID, userId);
62 proto.write(PackageServiceDumpProto.SharedUserProto.NAME, name);
63 proto.end(token);
64 }
65
Ben Gruverdd72c9e2013-08-06 12:34:17 -070066 void removePackage(PackageSetting packageSetting) {
67 if (packages.remove(packageSetting)) {
68 // recalculate the pkgFlags for this shared user if needed
69 if ((this.pkgFlags & packageSetting.pkgFlags) != 0) {
70 int aggregatedFlags = uidFlags;
71 for (PackageSetting ps : packages) {
72 aggregatedFlags |= ps.pkgFlags;
73 }
74 setFlags(aggregatedFlags);
75 }
Alex Klyubinb9f8a522015-02-03 11:12:59 -080076 if ((this.pkgPrivateFlags & packageSetting.pkgPrivateFlags) != 0) {
77 int aggregatedPrivateFlags = uidPrivateFlags;
78 for (PackageSetting ps : packages) {
79 aggregatedPrivateFlags |= ps.pkgPrivateFlags;
80 }
81 setPrivateFlags(aggregatedPrivateFlags);
82 }
Ben Gruverdd72c9e2013-08-06 12:34:17 -070083 }
84 }
85
86 void addPackage(PackageSetting packageSetting) {
87 if (packages.add(packageSetting)) {
88 setFlags(this.pkgFlags | packageSetting.pkgFlags);
Alex Klyubinb9f8a522015-02-03 11:12:59 -080089 setPrivateFlags(this.pkgPrivateFlags | packageSetting.pkgPrivateFlags);
Ben Gruverdd72c9e2013-08-06 12:34:17 -070090 }
91 }
Todd Kennedy0eb97382017-10-03 16:57:22 -070092
93 public @Nullable List<PackageParser.Package> getPackages() {
94 if (packages == null || packages.size() == 0) {
95 return null;
96 }
97 final ArrayList<PackageParser.Package> pkgList = new ArrayList<>(packages.size());
98 for (PackageSetting ps : packages) {
99 if (ps == null) {
100 continue;
101 }
102 pkgList.add(ps.pkg);
103 }
104 return pkgList;
105 }
Jeff Vander Stoepd1cf4992018-01-11 16:09:58 -0800106
107 public boolean isPrivileged() {
108 return (this.pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
109 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700110}