Launcher/LauncherAPI/src/main/java/pro/gravit/launcher/ClientPermissions.java

267 lines
6.8 KiB
Java
Raw Normal View History

package pro.gravit.launcher;
2019-06-03 10:58:10 +03:00
import pro.gravit.launcher.serialize.HInput;
2019-10-19 19:46:04 +03:00
import java.io.IOException;
2021-10-12 12:55:32 +03:00
import java.util.*;
2019-10-19 19:46:04 +03:00
2018-10-01 13:08:16 +03:00
public class ClientPermissions {
public static final ClientPermissions DEFAULT = new ClientPermissions();
2020-04-05 17:47:21 +03:00
@LauncherNetworkAPI
@Deprecated
public long permissions;
2020-04-05 17:47:21 +03:00
@LauncherNetworkAPI
@Deprecated
public long flags;
@LauncherNetworkAPI
private List<String> roles;
@LauncherNetworkAPI
private List<String> perms;
2021-10-12 12:55:32 +03:00
private transient List<PermissionPattern> available;
2019-01-15 06:35:39 +03:00
public ClientPermissions(HInput input) throws IOException {
this(input.readLong());
}
2019-01-15 06:35:39 +03:00
2018-10-01 13:08:16 +03:00
public ClientPermissions() {
2018-10-01 13:08:16 +03:00
}
2018-11-08 15:30:16 +03:00
public ClientPermissions(long permissions) {
this.permissions = permissions;
}
2019-04-03 16:27:40 +03:00
public ClientPermissions(long permissions, long flags) {
this.permissions = permissions;
this.flags = flags;
}
2018-11-08 15:30:16 +03:00
public static ClientPermissions getSuperuserAccount() {
ClientPermissions perm = new ClientPermissions();
2020-09-25 18:44:39 +03:00
perm.setPermission(PermissionConsts.ADMIN, true);
perm.addPerm("*");
return perm;
}
2020-04-05 10:27:04 +03:00
public long toLong() {
return permissions;
}
public boolean hasRole(String role) {
return roles != null && roles.contains(role);
}
public synchronized void compile() {
if (available != null) {
return;
}
2021-11-22 11:00:09 +03:00
if (perms == null) {
perms = new ArrayList<>(0);
}
available = new ArrayList<>(perms.size());
for (String a : perms) {
2021-10-12 12:55:32 +03:00
available.add(new PermissionPattern(a));
}
if (permissions != 0) {
if (isPermission(PermissionConsts.ADMIN)) {
roles.add("ADMIN");
2021-10-12 12:55:32 +03:00
available.add(new PermissionPattern("*"));
}
}
}
public boolean hasPerm(String action) {
if (available == null) {
compile();
}
2021-10-12 12:55:32 +03:00
for (PermissionPattern p : available) {
if (p.match(action)) {
return true;
}
}
return false;
}
public void addRole(String role) {
if (roles == null) {
roles = new ArrayList<>(1);
}
roles.add(role);
}
public void addPerm(String perm) {
if (perms == null) {
perms = new ArrayList<>(1);
}
perms.add(perm);
2021-09-25 14:46:07 +03:00
if(available == null) {
available = new ArrayList<>(1);
}
available.add(new PermissionPattern(perm));
}
public void removePerm(String action) {
if (perms == null) {
return;
}
if(available == null) {
return;
}
perms.remove(action);
available.remove(new PermissionPattern(action));
}
public List<String> getRoles() {
return roles;
}
public List<String> getPerms() {
return perms;
}
//Read methods
@Deprecated
2020-04-05 10:27:04 +03:00
public final boolean isPermission(PermissionConsts con) {
return (permissions & con.mask) != 0;
}
2020-04-05 10:27:04 +03:00
@Deprecated
2020-04-05 10:27:04 +03:00
public final boolean isPermission(long mask) {
return (permissions & mask) != 0;
}
2020-04-05 10:27:04 +03:00
@Deprecated
2020-04-05 10:27:04 +03:00
public final boolean isFlag(FlagConsts con) {
return (flags & con.mask) != 0;
}
2020-04-05 10:27:04 +03:00
@Deprecated
2020-04-05 10:27:04 +03:00
public final boolean isFlag(long mask) {
return (flags & mask) != 0;
}
2020-04-05 10:27:04 +03:00
//Write methods
@Deprecated
2020-04-05 10:27:04 +03:00
public final void setPermission(PermissionConsts con, boolean value) {
if (value) this.permissions |= con.mask;
else this.permissions &= ~con.mask;
}
2020-04-05 10:27:04 +03:00
@Deprecated
2020-04-05 10:27:04 +03:00
public final void setPermission(long mask, boolean value) {
if (value) this.permissions |= mask;
else this.permissions &= ~mask;
}
2020-04-05 10:27:04 +03:00
@Deprecated
2020-04-05 10:27:04 +03:00
public final void setFlag(FlagConsts con, boolean value) {
if (value) this.flags |= con.mask;
else this.flags &= ~con.mask;
}
2020-04-05 10:27:04 +03:00
@Deprecated
2020-04-05 10:27:04 +03:00
public final void setFlag(long mask, boolean value) {
if (value) this.flags |= mask;
else this.flags &= ~mask;
}
@Override
public String toString() {
2021-06-22 07:13:12 +03:00
return "ClientPermissions{" +
2021-09-25 14:46:07 +03:00
"roles=" + String.join(", ", roles == null ? Collections.emptyList() : roles) +
", actions=" + String.join(", ", perms == null ? Collections.emptyList() : perms) +
2021-06-22 07:13:12 +03:00
'}';
}
2020-04-05 10:27:04 +03:00
@Deprecated
2020-04-05 10:27:04 +03:00
public enum PermissionConsts {
ADMIN(0x01),
MANAGEMENT(0x02);
public final long mask;
PermissionConsts(long mask) {
this.mask = mask;
}
}
@Deprecated
2020-04-05 10:27:04 +03:00
public enum FlagConsts {
SYSTEM(0x01),
BANNED(0x02),
UNTRUSTED(0x04),
HIDDEN(0x08);
public final long mask;
FlagConsts(long mask) {
this.mask = mask;
}
}
2021-10-12 12:55:32 +03:00
public static class PermissionPattern {
private final String[] parts;
private final int priority;
public PermissionPattern(String pattern) {
List<String> prepare = new ArrayList<>();
for(int i=0;true;) {
int pos = pattern.indexOf("*", i);
if(pos >= 0) {
prepare.add(pattern.substring(i, pos));
i = pos+1;
} else {
prepare.add(pattern.substring(i));
break;
}
}
priority = prepare.size() - 1;
parts = prepare.toArray(new String[0]);
}
public int getPriority() {
return priority;
}
public boolean match(String str) {
if(parts.length == 0) {
return true;
}
if(parts.length == 1) {
return parts[0].equals(str);
}
int offset = 0;
if(!str.startsWith(parts[0])) {
return false;
}
if(!str.endsWith(parts[parts.length-1])) {
return false;
}
for(int i=1;i<parts.length-1;++i) {
int pos = str.indexOf(parts[i], offset);
if(pos >= 0) {
offset = pos+1;
} else {
return false;
}
}
return true;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PermissionPattern that = (PermissionPattern) o;
return priority == that.priority && Arrays.equals(parts, that.parts);
}
@Override
public int hashCode() {
int result = Objects.hash(priority);
result = 31 * result + Arrays.hashCode(parts);
return result;
}
2021-10-12 12:55:32 +03:00
}
2018-10-01 13:08:16 +03:00
}