1 24 25 package com.mckoi.database.interpret; 26 27 import com.mckoi.database.*; 28 import java.util.ArrayList ; 29 import java.util.List ; 30 31 37 38 public class PrivManager extends Statement { 39 40 41 43 public void prepare() throws DatabaseException { 44 } 46 47 public Table evaluate() throws DatabaseException { 48 49 DatabaseQueryContext context = new DatabaseQueryContext(database); 50 51 String command_type = (String ) cmd.getObject("command"); 52 53 ArrayList priv_list = (ArrayList ) cmd.getObject("priv_list"); 54 String priv_object = (String ) cmd.getObject("priv_object"); 55 56 int grant_object; 57 String grant_param; 58 59 if (priv_object.startsWith("T:")) { 61 String table_name_str = priv_object.substring(2); 63 TableName table_name = database.resolveTableName(table_name_str); 64 if (!database.tableExists(table_name)) { 66 throw new DatabaseException("Table '" + 67 table_name + "' doesn't exist."); 68 } 69 grant_object = GrantManager.TABLE; 70 grant_param = table_name.toString(); 71 } 72 else if (priv_object.startsWith("S:")) { 73 String schema_name_str = priv_object.substring(2); 75 SchemaDef schema_name = database.resolveSchemaName(schema_name_str); 76 if (schema_name == null || 78 !database.schemaExists(schema_name.toString())) { 79 schema_name_str = schema_name == null ? schema_name_str : 80 schema_name.toString(); 81 throw new DatabaseException("Schema '" + schema_name_str + 82 "' doesn't exist."); 83 } 84 grant_object = GrantManager.SCHEMA; 85 grant_param = schema_name.toString(); 86 } 87 else { 88 throw new Error ("Priv object formatting error."); 89 } 90 91 if (command_type.equals("GRANT")) { 92 ArrayList grant_to = (ArrayList ) cmd.getObject("grant_to"); 93 boolean grant_option = cmd.getBoolean("grant_option"); 94 95 GrantManager manager = context.getGrantManager(); 97 98 Privileges options_privs = manager.userGrantOptions( 100 grant_object, grant_param, user.getUserName()); 101 102 Privileges grant_privs = Privileges.EMPTY_PRIVS; 104 for (int i = 0; i < priv_list.size(); ++i) { 105 String priv = ((String ) priv_list.get(i)).toUpperCase(); 106 int priv_bit; 107 if (priv.equals("ALL")) { 108 if (grant_object == GrantManager.TABLE) { 109 priv_bit = Privileges.TABLE_ALL_PRIVS.toInt(); 110 } 111 else if (grant_object == GrantManager.SCHEMA) { 112 priv_bit = Privileges.SCHEMA_ALL_PRIVS.toInt(); 113 } 114 else { 115 throw new Error ("Unrecognised grant object."); 116 } 117 } 118 else { 119 priv_bit = Privileges.parseString(priv); 120 } 121 if (!options_privs.permits(priv_bit)) { 122 throw new UserAccessException( 123 "User is not permitted to grant '" + priv + 124 "' access on object " + grant_param); 125 } 126 grant_privs = grant_privs.add(priv_bit); 127 } 128 129 for (int i = 0; i < grant_to.size(); ++i) { 131 String name = (String ) grant_to.get(i); 132 if (!name.equalsIgnoreCase("public") && 133 !database.getDatabase().userExists(context, name)) { 134 throw new DatabaseException("User '" + name + "' doesn't exist."); 135 } 136 } 137 138 for (int i = 0; i < grant_to.size(); ++i) { 140 String name = (String ) grant_to.get(i); 141 if (name.equalsIgnoreCase("public")) { 142 manager.addGrant(grant_privs, grant_object, grant_param, 144 GrantManager.PUBLIC_USERNAME_STR, 145 grant_option, user.getUserName()); 146 } 147 else { 148 manager.addGrant(grant_privs, grant_object, grant_param, 150 name, grant_option, user.getUserName()); 151 } 152 } 153 154 156 } 157 else if (command_type.equals("REVOKE")) { 158 ArrayList revoke_from = (ArrayList ) cmd.getObject("revoke_from"); 159 boolean revoke_grant_option = cmd.getBoolean("revoke_grant_option"); 160 161 GrantManager manager = context.getGrantManager(); 163 164 Privileges revoke_privs = Privileges.EMPTY_PRIVS; 166 for (int i = 0; i < priv_list.size(); ++i) { 167 String priv = ((String ) priv_list.get(i)).toUpperCase(); 168 int priv_bit; 169 if (priv.equals("ALL")) { 170 if (grant_object == GrantManager.TABLE) { 171 priv_bit = Privileges.TABLE_ALL_PRIVS.toInt(); 172 } 173 else if (grant_object == GrantManager.SCHEMA) { 174 priv_bit = Privileges.SCHEMA_ALL_PRIVS.toInt(); 175 } 176 else { 177 throw new Error ("Unrecognised grant object."); 178 } 179 } 180 else { 181 priv_bit = Privileges.parseString(priv); 182 } 183 revoke_privs = revoke_privs.add(priv_bit); 184 } 185 186 for (int i = 0; i < revoke_from.size(); ++i) { 188 String name = (String ) revoke_from.get(i); 189 if (name.equalsIgnoreCase("public")) { 190 manager.removeGrant(revoke_privs, grant_object, grant_param, 192 GrantManager.PUBLIC_USERNAME_STR, 193 revoke_grant_option, user.getUserName()); 194 } 195 else { 196 manager.removeGrant(revoke_privs, grant_object, grant_param, 198 name, revoke_grant_option, user.getUserName()); 199 } 200 } 201 202 204 } 205 else { 206 throw new Error ("Unknown priv manager command: " + command_type); 207 } 208 209 return FunctionTable.resultTable(context, 0); 210 } 211 212 213 } 214 215 | Popular Tags |