01: /*
02:
03: Derby - Class org.apache.derby.impl.sql.execute.RoutinePrivilegeInfo
04:
05: Licensed to the Apache Software Foundation (ASF) under one or more
06: contributor license agreements. See the NOTICE file distributed with
07: this work for additional information regarding copyright ownership.
08: The ASF licenses this file to you under the Apache License, Version 2.0
09: (the "License"); you may not use this file except in compliance with
10: the License. You may obtain a copy of the License at
11:
12: http://www.apache.org/licenses/LICENSE-2.0
13:
14: Unless required by applicable law or agreed to in writing, software
15: distributed under the License is distributed on an "AS IS" BASIS,
16: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17: See the License for the specific language governing permissions and
18: limitations under the License.
19:
20: */
21:
22: package org.apache.derby.impl.sql.execute;
23:
24: import org.apache.derby.iapi.sql.Activation;
25: import org.apache.derby.iapi.services.sanity.SanityManager;
26: import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
27: import org.apache.derby.iapi.store.access.TransactionController;
28: import org.apache.derby.iapi.sql.depend.DependencyManager;
29: import org.apache.derby.iapi.sql.dictionary.RoutinePermsDescriptor;
30: import org.apache.derby.iapi.sql.dictionary.AliasDescriptor;
31: import org.apache.derby.iapi.sql.dictionary.StatementRoutinePermission;
32: import org.apache.derby.iapi.sql.dictionary.DataDictionary;
33: import org.apache.derby.iapi.sql.dictionary.DataDescriptorGenerator;
34: import org.apache.derby.iapi.error.StandardException;
35:
36: import java.util.Iterator;
37: import java.util.List;
38:
39: public class RoutinePrivilegeInfo extends PrivilegeInfo {
40: private AliasDescriptor aliasDescriptor;
41:
42: public RoutinePrivilegeInfo(AliasDescriptor aliasDescriptor) {
43: this .aliasDescriptor = aliasDescriptor;
44: }
45:
46: /**
47: * This is the guts of the Execution-time logic for GRANT/REVOKE of a routine execute privilege
48: *
49: * @param activation
50: * @param grant true if grant, false if revoke
51: * @param grantees a list of authorization ids (strings)
52: *
53: * @exception StandardException Thrown on failure
54: */
55: public void executeGrantRevoke(Activation activation,
56: boolean grant, List grantees) throws StandardException {
57: // Check that the current user has permission to grant the privileges.
58: LanguageConnectionContext lcc = activation
59: .getLanguageConnectionContext();
60: DataDictionary dd = lcc.getDataDictionary();
61: String currentUser = lcc.getAuthorizationId();
62: TransactionController tc = lcc.getTransactionExecute();
63:
64: // Check that the current user has permission to grant the privileges.
65: checkOwnership(currentUser, aliasDescriptor, dd
66: .getSchemaDescriptor(aliasDescriptor.getSchemaUUID(),
67: tc), dd);
68:
69: DataDescriptorGenerator ddg = dd.getDataDescriptorGenerator();
70:
71: RoutinePermsDescriptor routinePermsDesc = ddg
72: .newRoutinePermsDescriptor(aliasDescriptor, currentUser);
73:
74: dd.startWriting(lcc);
75: for (Iterator itr = grantees.iterator(); itr.hasNext();) {
76: // Keep track to see if any privileges are revoked by a revoke
77: // statement. If a privilege is not revoked, we need to raise a
78: // warning.
79: boolean privileges_revoked = false;
80: String grantee = (String) itr.next();
81: if (dd.addRemovePermissionsDescriptor(grant,
82: routinePermsDesc, grantee, tc)) {
83: privileges_revoked = true;
84: //Derby currently supports only restrict form of revoke execute
85: //privilege and that is why, we are sending invalidation action
86: //as REVOKE_PRIVILEGE_RESTRICT rather than REVOKE_PRIVILEGE
87: dd.getDependencyManager().invalidateFor(
88: routinePermsDesc,
89: DependencyManager.REVOKE_PRIVILEGE_RESTRICT,
90: lcc);
91: }
92:
93: addWarningIfPrivilegeNotRevoked(activation, grant,
94: privileges_revoked, grantee);
95: }
96: } // end of executeConstantAction
97: }
|