/*
* Copyright (C) 2015 The Pennsylvania State University and the University of Wisconsin
* Systems and Internet Infrastructure Security Laboratory
*
* Author: Damien Octeau
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.psu.cse.siis.ic3.db;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class PermissionTable extends Table {
private static final String INSERT = "INSERT INTO Permissions (id, level) VALUES (?, ?)";
private static final String FIND = "SELECT id FROM Permissions WHERE id = ? AND level = ?";
private static final String FIND_SIGNATURE_OR_SYSTEM = "SELECT Permissions.id FROM Permissions "
+ "JOIN PermissionStrings ON Permissions.id = PermissionStrings.id "
+ "WHERE st = ? AND (level = ? OR level = ?)";
private PreparedStatement findSignatureOrSystemStatement;
PermissionTable() {
}
public int insert(int permissionId, String level) throws SQLException {
int id = find(permissionId, level);
if (id != NOT_FOUND) {
return id;
}
return forceInsert(permissionId, level);
}
public int forceInsert(int permissionId, String level) throws SQLException {
if (insertStatement == null || insertStatement.isClosed()) {
insertStatement = getConnection().prepareStatement(INSERT);
}
insertStatement.setInt(1, permissionId);
insertStatement.setString(2, level);
if (insertStatement.executeUpdate() == 0) {
return NOT_FOUND;
}
return permissionId;
}
public int find(int permissionId, String level) throws SQLException {
if (findStatement == null || findStatement.isClosed()) {
findStatement = getConnection().prepareStatement(FIND);
}
findStatement.setInt(1, permissionId);
findStatement.setString(2, level);
return processIntFindQuery(findStatement);
}
/**
* Figure out if a permission is a signature or signatureOrSystem one.
*
* @param permission The permission to look for.
* @return True if the permission is found and it is has a signature or signatureOrSystem
* protection level. Note that this returns false if the permission is not found, even if
* it is in fact a signature or signatureOrSystem permission.
* @throws SQLException
*/
public boolean isSignatureOrSystem(String permission) throws SQLException {
if (findSignatureOrSystemStatement == null || findSignatureOrSystemStatement.isClosed()) {
findStatement = getConnection().prepareStatement(FIND_SIGNATURE_OR_SYSTEM);
}
findStatement.setString(1, permission);
findStatement.setString(2, Constants.PermissionLevel.SIGNATURE_SHORT);
findStatement.setString(3, Constants.PermissionLevel.SIGNATURE_OR_SYSTEM_SHORT);
return processIntFindQuery(findStatement) != NOT_FOUND;
}
}