package io.shockah.skylark.permissions;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.pircbotx.User;
import com.j256.ormlite.field.SqlType;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.SelectArg;
import io.shockah.skylark.UnexpectedException;
import io.shockah.skylark.db.DatabaseManager;
import io.shockah.skylark.ident.IdentMethod;
import io.shockah.skylark.ident.IdentPlugin;
import io.shockah.skylark.permissions.db.UserGroup;
import io.shockah.skylark.permissions.db.UserGroupIdent;
import io.shockah.skylark.plugin.Plugin;
import io.shockah.skylark.plugin.PluginManager;
public class PermissionsPlugin extends Plugin {
@Dependency
protected IdentPlugin identPlugin;
public PermissionsPlugin(PluginManager manager, Info info) {
super(manager, info);
}
public List<UserGroup> getUserGroups(User user) {
Map<IdentMethod, String> idents = identPlugin.getIdentsForUser(user);
List<UserGroup> groups = new ArrayList<>();
for (Map.Entry<IdentMethod, String> entry : idents.entrySet()) {
List<UserGroup> groupsForIdent = getGroupsForIdent(entry.getKey(), entry.getValue());
for (UserGroup group : groupsForIdent) {
if (!groups.contains(group))
groups.add(group);
}
}
return groups;
}
public List<UserGroup> getGroupsForIdent(IdentMethod method, String identString) {
try {
DatabaseManager databaseManager = manager.app.databaseManager;
QueryBuilder<UserGroupIdent, Integer> qbIdent = databaseManager.getDao(UserGroupIdent.class, Integer.class).queryBuilder();
qbIdent.where().eq(UserGroupIdent.METHOD_COLUMN, method.prefix)
.and().raw(String.format("? REGEXP %s", UserGroupIdent.IDENT_PATTERN_COLUMN), new SelectArg(SqlType.STRING, identString));
QueryBuilder<UserGroup, Integer> qbGroup = databaseManager.getDao(UserGroup.class, Integer.class).queryBuilder();
return qbGroup.join(qbIdent).query();
} catch (SQLException e) {
throw new UnexpectedException(e);
}
}
public boolean permissionGranted(User user, Plugin plugin, String subpermission) {
return permissionGranted(user, plugin.info, subpermission);
}
public boolean permissionGranted(User user, Plugin.Info pluginInfo, String subpermission) {
return permissionGranted(user, String.format("%s.%s", pluginInfo.packageName(), subpermission));
}
public boolean permissionGranted(User user, String permission) {
for (UserGroup group : getUserGroups(user)) {
if (group.permissionGranted(permission))
return true;
}
return false;
}
public boolean permissionGranted(IdentMethod method, String identString, Plugin plugin, String subpermission) {
return permissionGranted(method, identString, plugin.info, subpermission);
}
public boolean permissionGranted(IdentMethod method, String identString, Plugin.Info pluginInfo, String subpermission) {
return permissionGranted(method, identString, String.format("%s.%s", pluginInfo.packageName(), subpermission));
}
public boolean permissionGranted(IdentMethod method, String identString, String permission) {
for (UserGroup group : getGroupsForIdent(method, identString)) {
if (group.permissionGranted(permission))
return true;
}
return false;
}
/*@Override
protected void onLoad() {
DatabaseManager databaseManager = manager.app.databaseManager;
UserGroup group = databaseManager.create(UserGroup.class, obj -> {
obj.name = "admin";
});
databaseManager.create(UserGroupIdent.class, obj -> {
obj.method = "ns";
obj.identPattern = Pattern.compile(Pattern.quote("Shockah"));
obj.setUserGroup(group);
});
databaseManager.create(UserGroupPermission.class, obj -> {
obj.permission = "*";
obj.setUserGroup(group);
});
}*/
}