1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Member;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Permission;
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Enforcer extends SecurityManager {
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final Enforcer THE_ONE = new Enforcer();
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** whether to deny the next request */
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private boolean deny;
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Not publicly constructable. Use {@link #THE_ONE}.
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private Enforcer() {
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        deny = false;
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Deny the next request.
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void denyNext() {
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        deny = true;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception if the instance had been asked to deny a request.
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void denyIfAppropriate() {
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (deny) {
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            deny = false;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new SecurityException("Denied!");
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void checkPackageAccess(String pkg) {
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.out.println("checkPackageAccess: " + pkg);
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        denyIfAppropriate();
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.checkPackageAccess(pkg);
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void checkMemberAccess(Class c, int which) {
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String member;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        switch (which) {
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case Member.DECLARED: member = "DECLARED"; break;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case Member.PUBLIC:   member = "PUBLIC";   break;
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            default:              member = "<" + which + ">?"; break;
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.out.println("checkMemberAccess: " + c.getName() + ", " +
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                member);
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        denyIfAppropriate();
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.checkMemberAccess(c, which);
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void checkPermission(Permission perm) {
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.out.println("checkPermission: " + perm);
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        denyIfAppropriate();
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.checkPermission(perm);
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void checkPermission(Permission perm, Object context) {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.out.println("checkPermission: " + perm + ", " + context);
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        denyIfAppropriate();
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.checkPermission(perm, context);
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
67