sdkcreationmw/sdkconnectivityfw/emuconnectmanager/epdt_java/src/com/nokia/epdt/plugins/s60/securityconf/SecConfModel.java
author rajpuroh
Wed, 21 Apr 2010 09:56:53 +0530
changeset 1 ac50fd48361b
parent 0 b26acd06ea60
permissions -rw-r--r--
Second Contribution
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     1
/*
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     2
* Copyright (c) 2000 - 2006 Nokia Corporation and/or its subsidiary(-ies).
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     3
* All rights reserved.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     4
* This component and the accompanying materials are made available
1
ac50fd48361b Second Contribution
rajpuroh
parents: 0
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
0
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     6
* which accompanies this distribution, and is available
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     8
*
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
     9
* Initial Contributors:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    11
*
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    12
* Contributors:
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    13
*
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    14
* Description: 
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    15
 *
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    16
*/
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    17
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    18
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    19
package com.nokia.epdt.plugins.s60.securityconf;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    20
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    21
/* java.util */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    22
import java.util.List;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    23
import java.util.ArrayList;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    24
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    25
/* java.io */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    26
import java.io.IOException;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    27
import java.io.InputStream;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    28
import java.io.BufferedReader;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    29
import java.io.InputStreamReader;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    30
import java.io.ObjectInputStream;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    31
import java.io.ObjectOutputStream;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    32
import java.io.OutputStream;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    33
import java.io.PrintWriter;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    34
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    35
/**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    36
 * MIDP security configuration model.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    37
 */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    38
class SecConfModel implements SecurityConstants {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    39
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    40
    // Emulater/real life security mode
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    41
    private boolean iEmulatedSecurityMode = false;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    42
    private String iSelectedDomainId;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    43
    private ProtectionDomain iUserDefinedDomain;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    44
    private List iProtectionDomains = new ArrayList();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    45
    private List iFunctionGroups = new ArrayList();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    46
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    47
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    48
     * Creates MIDP security configuration model.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    49
     * @throws IOException if it fails to load default MIDP security
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    50
     * configuration from the resources.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    51
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    52
    SecConfModel() throws IOException {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    53
        InputStream in = openPolicyFileResource();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    54
        try {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    55
            PolicyFileParser.parse(in, new InitialScan());
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    56
        } finally {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    57
            in.close();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    58
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    59
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    60
        // Create user defined domain
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    61
        iUserDefinedDomain = new ProtectionDomain(USER_DEFINED_DOMAIN);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    62
        iProtectionDomains.add(iUserDefinedDomain);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    63
        int n = iFunctionGroups.size();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    64
        for (int i=0; i<n; i++) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    65
            String domain = (String)iFunctionGroups.get(i);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    66
            iUserDefinedDomain.setPermission(domain,Permission.Allowed);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    67
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    68
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    69
        // Select first domain by default
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    70
        iSelectedDomainId = ((ProtectionDomain)
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    71
                             iProtectionDomains.get(0)).getIdentifier();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    72
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    73
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    74
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    75
     * Gets the protection domains known to the model, including the
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    76
     * "User defined" pseudo-domain.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    77
     *
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    78
     * @param aIncludeHidden <code>true</code> to include hidden domains
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    79
     * @return array of protection domains
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    80
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    81
    ProtectionDomain [] getProtectionDomains(boolean aIncludeHidden) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    82
        List domains = iProtectionDomains;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    83
        if (!aIncludeHidden) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    84
            // remove hidden domains from the list
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    85
            domains = new ArrayList(iProtectionDomains);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    86
            for (int i=domains.size()-1; i>=0; i--) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    87
                ProtectionDomain domain = (ProtectionDomain)domains.get(i);
1
ac50fd48361b Second Contribution
rajpuroh
parents: 0
diff changeset
    88
                
ac50fd48361b Second Contribution
rajpuroh
parents: 0
diff changeset
    89
                if( i ==5 || i == 6)
ac50fd48361b Second Contribution
rajpuroh
parents: 0
diff changeset
    90
                	domains.remove(i);
0
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    91
                if (domain.isHidden()) domains.remove(i);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    92
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    93
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    94
        return (ProtectionDomain[]) domains.toArray(
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    95
            new ProtectionDomain[domains.size()]);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    96
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    97
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    98
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
    99
     * Gets currently selected protection domain.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   100
     * @return the currently selected protection domain, <code>null</code>
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   101
     *    if none.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   102
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   103
    ProtectionDomain getSelectedDomain() {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   104
        return findProtectionDomain(iSelectedDomainId);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   105
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   106
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   107
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   108
     * Selects a protection domain
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   109
     * @param aDomain the domain to select
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   110
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   111
    void setSelectedDomain(ProtectionDomain aDomain) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   112
        if (aDomain == null) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   113
            iSelectedDomainId = null;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   114
        } else {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   115
            iSelectedDomainId = aDomain.getIdentifier();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   116
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   117
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   118
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   119
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   120
     * Gets known function groups.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   121
     * @return array of function group names
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   122
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   123
    String[] getFunctionGroups() {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   124
        return (String[])iFunctionGroups.toArray(
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   125
            new String[iFunctionGroups.size()]);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   126
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   127
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   128
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   129
     * Checks if we are in the "emulated security mode".
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   130
     * @return <code>true</code> if we are enforcing the same permissions
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   131
     *   for all protection domains.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   132
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   133
    boolean isEmulatedSecurityMode() {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   134
        return iEmulatedSecurityMode;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   135
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   136
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   137
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   138
     * Turns the "emulated security mode" on or off.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   139
     * @param aEmulatedSecurityMode <code>true</code> to enforce the same
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   140
     *   permissions for all protection domains, <code>false</code> to use
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   141
     *   default JVM secrity settings.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   142
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   143
    void setEmulatedSecurityMode(boolean aEmulatedSecurityMode) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   144
        iEmulatedSecurityMode = aEmulatedSecurityMode;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   145
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   146
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   147
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   148
     * Opens the policy file resource.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   149
     * @return the input stream for the policy file resource.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   150
     * Never returns null.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   151
     * @throws IOException if resource is not found
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   152
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   153
    private InputStream openPolicyFileResource() throws IOException {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   154
        InputStream in = getClass().getResourceAsStream(POLICY_FILE_NAME);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   155
        if (in != null) return in;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   156
        throw new IOException(POLICY_FILE_NAME);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   157
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   158
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   159
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   160
     * Finds ProtectionDomain object for the specified identifier.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   161
     * @param aId the domain identifier
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   162
     * @return ProtectionDomain object if found, null otherwise.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   163
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   164
    private ProtectionDomain findProtectionDomain(String aId) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   165
        int n = iProtectionDomains.size();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   166
        for (int i=0; i<n; i++) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   167
            ProtectionDomain d = (ProtectionDomain)iProtectionDomains.get(i);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   168
            if (d.getIdentifier().equals(aId)) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   169
                return d;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   170
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   171
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   172
        return null;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   173
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   174
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   175
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   176
     * Writes policy file to the output stream
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   177
     * @param aStream the stream to write to
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   178
     * @throws IOException if an I/O error occurs
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   179
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   180
    void writePolicyFile(OutputStream aStream) throws IOException {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   181
        InputStream in = openPolicyFileResource();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   182
        try {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   183
            PrintWriter out = new PrintWriter(aStream, false);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   184
            try {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   185
                if (!iEmulatedSecurityMode) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   186
                    // Just copy the original file
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   187
                    BufferedReader reader = new BufferedReader(
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   188
                        new InputStreamReader(in));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   189
                    String line = null;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   190
                    while ((line = reader.readLine()) != null) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   191
                        out.println(line);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   192
                    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   193
                } else {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   194
                    // Save modified version of the original file
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   195
                    out.println("# This is a generated file.");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   196
                    out.println();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   197
                    PolicyFileParser.parse(in, new PolicyFileWriter(out));
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   198
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   199
            } finally {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   200
                out.flush();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   201
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   202
        } finally {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   203
            in.close();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   204
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   205
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   206
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   207
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   208
     * Saves the state of the model to the output stream
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   209
     * @param aStream the stream to write to
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   210
     * @throws IOException if an I/O error occurs
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   211
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   212
    void save(OutputStream aStream) throws IOException {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   213
        ObjectOutputStream out = new ObjectOutputStream(aStream);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   214
        out.writeBoolean(iEmulatedSecurityMode);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   215
        out.writeObject(iSelectedDomainId);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   216
        out.writeObject(iUserDefinedDomain);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   217
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   218
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   219
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   220
     * Loads the state of the model from the input stream
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   221
     * @param aStream the stream to read from
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   222
     * @throws IOException if an I/O error occurs
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   223
     * @throws ClassNotFoundException if deserialization error occurs
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   224
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   225
    void load(InputStream aStream) throws IOException, ClassNotFoundException {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   226
        ObjectInputStream in = new ObjectInputStream(aStream);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   227
        boolean emulatedSecurityMode = in.readBoolean();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   228
        String selectedDomainId = (String)in.readObject();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   229
        ProtectionDomain userDomain = (ProtectionDomain)in.readObject();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   230
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   231
        // Verify and store deserialized values
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   232
        iEmulatedSecurityMode = emulatedSecurityMode;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   233
        if (findProtectionDomain(selectedDomainId) != null) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   234
            iSelectedDomainId = selectedDomainId;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   235
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   236
        if (userDomain.isUserDefined()) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   237
            // User defined domain is always the last one
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   238
            iProtectionDomains.set(iProtectionDomains.size()-1,userDomain);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   239
            iUserDefinedDomain = userDomain;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   240
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   241
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   242
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   243
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   244
     * This handler scans the policy file to collect information about
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   245
     * domains, function groups and bindings.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   246
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   247
    private class InitialScan implements PolicyFileParser.Handler {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   248
        private String iProtectionDomain;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   249
        private String iFunctionGroup;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   250
        public void handleFormatDecl(String aFormatVersion) {}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   251
        public void handleEmptyLine() {}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   252
        public void handleDecl(String aLine) {}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   253
        public void handleProtectionDomainDecl(String aDomain) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   254
            ProtectionDomain domain = findProtectionDomain(aDomain);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   255
            if (domain == null) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   256
                domain = new ProtectionDomain(aDomain);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   257
                iProtectionDomains.add(domain);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   258
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   259
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   260
        public void handleFunctionGroupDecl(String aGroupName) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   261
            iFunctionGroups.add(aGroupName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   262
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   263
        public void handleDomainBindingsDecl(String aProtectionDomain) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   264
            iProtectionDomain = aProtectionDomain;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   265
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   266
        public void handleFunctionGroupBindingDecl(String aFunctionGroup) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   267
            iFunctionGroup = aFunctionGroup;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   268
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   269
        public void handlePermission(Permission aPermission) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   270
            ProtectionDomain domain = findProtectionDomain(iProtectionDomain);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   271
            if (domain != null && iFunctionGroup != null) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   272
                if (WILDCARD.equals(iFunctionGroup)) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   273
                    int n = iFunctionGroups.size();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   274
                    for (int i=0; i<n; i++) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   275
                        domain.setPermission((String)iFunctionGroups.get(i),
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   276
                                             aPermission);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   277
                    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   278
                } else {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   279
                    domain.setPermission(iFunctionGroup, aPermission);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   280
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   281
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   282
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   283
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   284
        public void handleEndFunctionGroupBinding() {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   285
            iFunctionGroup = null;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   286
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   287
        public void handleEndDomainBindings() {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   288
            iProtectionDomain = null;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   289
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   290
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   291
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   292
    /**
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   293
     * This handler writes a modified version of the policy file.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   294
     * Must only be used in the "emulated" security mode.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   295
     */
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   296
    private class PolicyFileWriter implements PolicyFileParser.Handler {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   297
        private PrintWriter iWriter;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   298
        private ProtectionDomain iEmulatedDomain;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   299
        private String iProtectionDomain;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   300
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   301
        PolicyFileWriter(PrintWriter aWriter) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   302
            if (!isEmulatedSecurityMode()) throw new IllegalStateException();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   303
            iWriter = aWriter;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   304
            iEmulatedDomain = getSelectedDomain();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   305
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   306
        private void printDecl(String aKeyword, String aValue) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   307
            iWriter.print('\t');
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   308
            iWriter.print(aKeyword);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   309
            iWriter.print(' ');
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   310
            // For some reason, strings enclosed in square brackets (such as
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   311
            // [UNTRUSTED] or [*]) are not quoted. That may have some special
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   312
            // meaning to the phone software.
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   313
            int len = aValue.length();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   314
            if (len >= 2 &&
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   315
                aValue.charAt(0) == '[' &&
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   316
                aValue.charAt(len-1) == ']') {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   317
                iWriter.println(aValue);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   318
            } else {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   319
                iWriter.print('"');
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   320
                iWriter.print(aValue);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   321
                iWriter.println('"');
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   322
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   323
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   324
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   325
        // PolicyFileParser.Handler interface
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   326
        public void handleFormatDecl(String aFormatVersion) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   327
            iWriter.print(FORMAT_VERSION_KEYWORD);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   328
            iWriter.print(" ");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   329
            iWriter.println(aFormatVersion);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   330
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   331
        public void handleEmptyLine() {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   332
            if (iProtectionDomain == null) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   333
                iWriter.println();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   334
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   335
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   336
        public void handleDecl(String aLine) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   337
            if (iProtectionDomain == null) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   338
                iWriter.println(aLine);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   339
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   340
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   341
        public void handleProtectionDomainDecl(String aProtectionDomain) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   342
            printDecl(DOMAIN_KEYWORD, aProtectionDomain);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   343
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   344
        public void handleFunctionGroupDecl(String aGroupName) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   345
            iWriter.print('\t');
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   346
            iWriter.print(FUNCTION_GROUP_KEYWORD);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   347
            iWriter.print(" \"");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   348
            iWriter.print(aGroupName);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   349
            iWriter.println('"');
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   350
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   351
        public void handleDomainBindingsDecl(String aProtectionDomain) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   352
            printDecl(DOMAIN_BINDINGS_KEYWORD, aProtectionDomain);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   353
            iWriter.println();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   354
            iProtectionDomain = aProtectionDomain;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   355
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   356
        public void handleFunctionGroupBindingDecl(String aFunctionGroup) {}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   357
        public void handlePermission(Permission aPermission) {}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   358
        public void handleEndFunctionGroupBinding() {}
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   359
        public void handleEndDomainBindings() {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   360
            int n = iFunctionGroups.size();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   361
            for (int i=0; i<n; i++) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   362
                String group = (String)iFunctionGroups.get(i);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   363
                Permission p = iEmulatedDomain.getPermission(group);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   364
                if (!p.isDenied()) {
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   365
                    iWriter.print('\t');
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   366
                    printDecl(FUNCTION_GROUP_BINDING_KEYWORD, group);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   367
                    iWriter.println();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   368
                    p.print(iWriter);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   369
                    iWriter.print("\t\t");
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   370
                    iWriter.println(END_FUNCTION_GROUP_BINDING_KEYWORD);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   371
                    iWriter.println();
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   372
                }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   373
            }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   374
            iWriter.print('\t');
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   375
            iWriter.println(END_DOMAIN_BINDINGS_KEYWORD);
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   376
            iProtectionDomain = null;
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   377
        }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   378
    }
b26acd06ea60 First Contribution of SDK components
rajpuroh
parents:
diff changeset
   379
}