001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.satsa.acl;
028:
029: import com.sun.midp.security.SecurityToken;
030: import java.util.Vector;
031: import java.lang.SecurityException;
032:
033: /**
034: * This class represents a set of ACL permissions.
035: */
036: public class ACLPermissions {
037:
038: /** PIN operation constant. */
039: public static final int CMD_VERIFY = 0;
040: /** PIN operation constant. */
041: public static final int CMD_CHANGE = 1;
042: /** PIN operation constant. */
043: public static final int CMD_DISABLE = 2;
044: /** PIN operation constant. */
045: public static final int CMD_ENABLE = 3;
046: /** PIN operation constant. */
047: public static final int CMD_UNBLOCK = 4;
048: /** The number of supported PIN commands. */
049: public static final int CMD_COUNT = 5;
050:
051: /**
052: * Flag that indicates that the object contains permissions.
053: */
054: static final int CHECK = 0;
055:
056: /**
057: * Flag that indicates that MIDlet suite have full access.
058: */
059: static final int ALLOW = 1;
060: /**
061: * Flag that indicates that MIDlet suite have not access.
062: */
063: static final int DISALLOW = 2;
064:
065: /**
066: * Verifier type.
067: */
068: int type = CHECK;
069: /**
070: * The list of permissions.
071: */
072: Vector permissions;
073:
074: /**
075: * Array of PIN data for this permission.
076: */
077: private PINData[] pins;
078:
079: /** Parent ACSlot object, contains PIN attributes. */
080: protected ACSlot parent;
081:
082: /**
083: * Constructs new object.
084: * @param parent parent ACSlot object.
085: */
086: public ACLPermissions(ACSlot parent) {
087: this .parent = parent;
088: }
089:
090: /**
091: * Set the list of permissions.
092: * @param permissions the list of permissions.
093: */
094: public void setPermissions(Vector permissions) {
095: this .permissions = permissions;
096: }
097:
098: /**
099: * Set type of the permission.
100: * @param type permission type.
101: */
102: public void setType(int type) {
103: this .type = type;
104: }
105:
106: /**
107: * Set PIN data for this permission.
108: * @param data PIN data for this permission.
109: */
110: public void setPINData(PINData[] data) {
111: pins = data;
112: }
113:
114: /** Attributes of the first PIN to be entered. */
115: protected PINAttributes attr1;
116: /** Attributes of the second PIN or null. */
117: protected PINAttributes attr2;
118:
119: /**
120: * Verifies that PIN operation is supported, finds PIN attributes.
121: * @param pinID PIN identifier.
122: * @param unblockPinID unblocking PIN identifier.
123: * @param action PIN operation identifier.
124: * @exception SecurityException if operation is not
125: * supported.
126: */
127: protected void checkPINOperation(int pinID, int unblockPinID,
128: int action) {
129:
130: if (pins == null) {
131: throw new SecurityException();
132: }
133:
134: boolean found = false;
135: for (int i = 0; i < pins.length; i++) {
136: found |= (pins[i].id == pinID);
137: }
138: attr1 = parent.getPINAttributes(pinID);
139:
140: if (!found || attr1 == null || !attr1.check(action)) {
141: throw new SecurityException();
142: }
143:
144: if (action == CMD_UNBLOCK) {
145: attr2 = parent.getPINAttributes(unblockPinID);
146: if (attr2 == null || !attr2.isUnblockingPIN()) {
147: throw new SecurityException();
148: }
149: } else {
150: attr2 = null;
151: }
152: }
153:
154: /**
155: * Requests the user to enter the PIN value(s).
156: * @param securityToken class security token.
157: * @param action PIN operation identifier.
158: * @return null if operation was cancelled or the array that contains
159: * byte array(s) with PIN value(s).
160: */
161: public Object[] enterPIN(SecurityToken securityToken, int action) {
162:
163: PINEntryDialog dialog;
164: try {
165: dialog = new PINEntryDialog(securityToken, action, attr1,
166: attr2);
167: } catch (InterruptedException e) {
168: throw new SecurityException("Interrupted");
169: }
170:
171: dialog.waitForAnswer();
172:
173: return dialog.getPINs();
174: }
175:
176: /**
177: * Get PIN command for specified ID and operation.
178: * @param pinID PIN identifier.
179: * @param action PIN operation identifier.
180: * @return PIN data or null if not found.
181: */
182: Object getPINCommand(int pinID, int action) {
183:
184: for (int i = 0; i < pins.length; i++) {
185: if (pins[i].id == pinID && pins[i].commands[action] != null) {
186: return pins[i].commands[action];
187: }
188: }
189: return null;
190: }
191: }
|