General API work
This commit is contained in:
parent
a07d9f524b
commit
3780ead458
|
@ -7,8 +7,9 @@ import com.mongodb.MongoClient;
|
|||
import com.mongodb.MongoCredential;
|
||||
import com.mongodb.ServerAddress;
|
||||
import lombok.Getter;
|
||||
import net.frozenorb.apiv3.models.Rank;
|
||||
import net.frozenorb.apiv3.models.ServerGroup;
|
||||
import net.frozenorb.apiv3.filters.ActorAttributeFilter;
|
||||
import net.frozenorb.apiv3.filters.AuthorizationFilter;
|
||||
import net.frozenorb.apiv3.filters.ContentTypeFilter;
|
||||
import net.frozenorb.apiv3.routes.GETDump;
|
||||
import net.frozenorb.apiv3.routes.GETRoutes;
|
||||
import net.frozenorb.apiv3.routes.announcements.GETAnnouncements;
|
||||
|
@ -28,27 +29,30 @@ import net.frozenorb.apiv3.routes.serverGroups.GETServerGroups;
|
|||
import net.frozenorb.apiv3.routes.servers.GETServer;
|
||||
import net.frozenorb.apiv3.routes.servers.GETServers;
|
||||
import net.frozenorb.apiv3.routes.users.*;
|
||||
import net.frozenorb.apiv3.weirdStuff.*;
|
||||
import net.frozenorb.apiv3.serialization.FollowAnnotationExclusionStrategy;
|
||||
import net.frozenorb.apiv3.serialization.ObjectIdTypeAdapter;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.mongodb.morphia.Datastore;
|
||||
import org.mongodb.morphia.Morphia;
|
||||
import spark.Request;
|
||||
import spark.Spark;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import static spark.Spark.*;
|
||||
|
||||
public final class APIv3 {
|
||||
|
||||
// TODO: Cleanup main class
|
||||
|
||||
@Getter private static Datastore datastore;
|
||||
private final Gson gson = new GsonBuilder().registerTypeAdapter(ObjectId.class, new ObjectIdTypeAdapter()).setExclusionStrategies(new FollowAnnotationExclusionStrategy()).create();
|
||||
private final Properties config = new Properties();
|
||||
@Getter private static Properties config = new Properties();
|
||||
private final Gson gson = new GsonBuilder()
|
||||
.registerTypeAdapter(ObjectId.class, new ObjectIdTypeAdapter())
|
||||
.setExclusionStrategies(new FollowAnnotationExclusionStrategy())
|
||||
.create();
|
||||
|
||||
APIv3() {
|
||||
try {
|
||||
// TODO: Load
|
||||
config.load(APIv3.class.getClassLoader().getResourceAsStream("apiv3.properties"));
|
||||
} catch (Exception ex) {
|
||||
throw new RuntimeException(ex);
|
||||
|
@ -56,40 +60,12 @@ public final class APIv3 {
|
|||
|
||||
setupDatabase();
|
||||
setupHttp();
|
||||
|
||||
ServerGroup scope = ServerGroup.byId("HCTeams");
|
||||
Map<ServerGroup, Rank> userRanks = new HashMap<>();
|
||||
|
||||
|
||||
ServerGroup global = ServerGroup.byId("Global");
|
||||
Map<String, Boolean> calculatedPermissions = global.getPermissions(userRanks.get(global));
|
||||
|
||||
// for global calculations
|
||||
|
||||
for (ServerGroup serverGroup : ServerGroup.values()) {
|
||||
if (serverGroup != global) {
|
||||
mergePermissions(serverGroup, userRanks.get(serverGroup), calculatedPermissions);
|
||||
}
|
||||
}
|
||||
|
||||
// for scoped calculations
|
||||
|
||||
mergePermissions(scope, userRanks.get(scope), calculatedPermissions);
|
||||
|
||||
}
|
||||
|
||||
public void mergePermissions(ServerGroup serverGroup, Rank rank, Map<String, Boolean> current) {
|
||||
Map<String, Boolean> groupPermissions = serverGroup.getPermissions(rank);
|
||||
|
||||
groupPermissions.forEach((permissionNode, grant) -> {
|
||||
if (!current.containsKey(permissionNode) || !current.get(permissionNode)) {
|
||||
current.put(permissionNode, grant);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setupDatabase() {
|
||||
MongoClient mongoClient = new MongoClient(new ServerAddress((String) config.get("mongo.address"), (Integer) config.get("mongo.port")),
|
||||
MongoClient mongoClient = new MongoClient(new ServerAddress(
|
||||
(String) config.get("mongo.address"),
|
||||
(Integer) config.get("mongo.port")),
|
||||
ImmutableList.of(
|
||||
MongoCredential.createCredential(
|
||||
(String) config.get("mongo.username"),
|
||||
|
@ -109,6 +85,7 @@ public final class APIv3 {
|
|||
port((Integer) config.get("http.port"));
|
||||
before(new ContentTypeFilter());
|
||||
before(new ActorAttributeFilter());
|
||||
before(new AuthorizationFilter());
|
||||
|
||||
get("/announcements", new GETAnnouncements(), gson::toJson);
|
||||
|
||||
|
@ -134,11 +111,12 @@ public final class APIv3 {
|
|||
get("/server/:id", new GETServer(), gson::toJson);
|
||||
get("/servers", new GETServers(), gson::toJson);
|
||||
|
||||
delete("/user/:id/meta", new DELETEUserMeta(), gson::toJson);
|
||||
get("/staff", new GETStaff(), gson::toJson);
|
||||
get("/user/:id", new GETUser(), gson::toJson);
|
||||
get("/user/:id/details", new GETUserDetails(), gson::toJson);
|
||||
get("/user/:id/meta/:serverGroup", new GETUserMeta(), gson::toJson);
|
||||
get("/users", new GETUsers(), gson::toJson);
|
||||
post("/user/:id/login", new POSTUserLogin(), gson::toJson);
|
||||
post("/user/:id/notify", new POSTUserNotify(), gson::toJson);
|
||||
post("/user/:id/register", new POSTUserRegister(), gson::toJson);
|
||||
put("/user/:id/meta/:serverGroup", new PUTUserMeta(), gson::toJson);
|
||||
|
@ -147,11 +125,4 @@ public final class APIv3 {
|
|||
get("/routes", new GETRoutes());
|
||||
}
|
||||
|
||||
public static void requireAuthorizedActor(Request req) {
|
||||
Actor actor = req.attribute("actor");
|
||||
if (!actor.isAuthorized()) {
|
||||
Spark.halt();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
package net.frozenorb.apiv3.weirdStuff;
|
||||
package net.frozenorb.apiv3.filters;
|
||||
|
||||
import net.frozenorb.apiv3.unsorted.Actor;
|
||||
import spark.Filter;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
|
@ -0,0 +1,20 @@
|
|||
package net.frozenorb.apiv3.filters;
|
||||
|
||||
import net.frozenorb.apiv3.unsorted.Actor;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import spark.Filter;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Spark;
|
||||
|
||||
public final class AuthorizationFilter implements Filter {
|
||||
|
||||
public void handle(Request req, Response res) {
|
||||
Actor actor = req.attribute("actor");
|
||||
|
||||
if (!actor.isAuthorized()) {
|
||||
Spark.halt(ErrorUtils.error("Unauthorized access: Please authenticate as either a server, the website, or an authorized user.").toJson());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package net.frozenorb.apiv3.weirdStuff;
|
||||
package net.frozenorb.apiv3.filters;
|
||||
|
||||
import spark.Filter;
|
||||
import spark.Request;
|
|
@ -1,14 +1,13 @@
|
|||
package net.frozenorb.apiv3.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import net.frozenorb.apiv3.APIv3;
|
||||
import net.frozenorb.apiv3.unsorted.Actor;
|
||||
import org.bson.Document;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.mongodb.morphia.annotations.Entity;
|
||||
import org.mongodb.morphia.annotations.Id;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Entity(value = "auditLog", noClassnameStored = true)
|
||||
|
@ -17,19 +16,17 @@ public final class AuditLogEntry {
|
|||
@Getter @Id private ObjectId id;
|
||||
@Getter private UUID performedBy;
|
||||
@Getter private Date performedAt;
|
||||
@Getter private String performedFrom;
|
||||
@Getter private String actorName;
|
||||
@Getter private String actionType;
|
||||
@Getter private String description;
|
||||
@Getter private Document actionData;
|
||||
|
||||
public AuditLogEntry() {} // For Morphia
|
||||
|
||||
public AuditLogEntry(User performedBy, String performedFrom, String actionType, String description, Document actionData) {
|
||||
public AuditLogEntry(User performedBy, Actor actor, String actionType, Document actionData) {
|
||||
this.performedBy = performedBy.getId();
|
||||
this.performedAt = new Date();
|
||||
this.performedFrom = performedFrom;
|
||||
this.actorName = actor.getName();
|
||||
this.actionType = actionType;
|
||||
this.description = description;
|
||||
this.actionData = actionData;
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,10 @@ import org.bson.types.ObjectId;
|
|||
import org.mongodb.morphia.annotations.Entity;
|
||||
import org.mongodb.morphia.annotations.Id;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
@Entity(value = "grants", noClassnameStored = true)
|
||||
public final class Grant {
|
||||
|
@ -66,4 +69,12 @@ public final class Grant {
|
|||
return removedBy != null;
|
||||
}
|
||||
|
||||
public boolean appliesOn(Server server) {
|
||||
return scopes.contains(server.getId());
|
||||
}
|
||||
|
||||
public boolean appliesOn(ServerGroup serverGroup) {
|
||||
return scopes.contains(serverGroup.getId());
|
||||
}
|
||||
|
||||
}
|
|
@ -7,7 +7,6 @@ import org.mongodb.morphia.annotations.Entity;
|
|||
import org.mongodb.morphia.annotations.Id;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Entity(value = "ipLog", noClassnameStored = true)
|
||||
|
|
|
@ -5,10 +5,7 @@ import net.frozenorb.apiv3.APIv3;
|
|||
import org.mongodb.morphia.annotations.Entity;
|
||||
import org.mongodb.morphia.annotations.Id;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
@Entity(value = "notificationTemplates", noClassnameStored = true)
|
||||
public final class NotificationTemplate {
|
||||
|
@ -16,8 +13,6 @@ public final class NotificationTemplate {
|
|||
@Getter @Id private String id;
|
||||
@Getter private String subject;
|
||||
@Getter private String body;
|
||||
@Getter private Date lastUpdatedAt;
|
||||
@Getter private UUID lastUpdatedBy;
|
||||
|
||||
public static NotificationTemplate byId(String id) {
|
||||
return APIv3.getDatastore().createQuery(NotificationTemplate.class).field("id").equalIgnoreCase(id).get();
|
||||
|
@ -25,18 +20,14 @@ public final class NotificationTemplate {
|
|||
|
||||
public NotificationTemplate() {} // For Morphia
|
||||
|
||||
public NotificationTemplate(String subject, String body, User creator) {
|
||||
public NotificationTemplate(String subject, String body) {
|
||||
this.subject = subject;
|
||||
this.body = body;
|
||||
this.lastUpdatedAt = new Date();
|
||||
this.lastUpdatedBy = creator.getId();
|
||||
}
|
||||
|
||||
public void update(String subject, String body, User updatedBy) {
|
||||
public void update(String subject, String body) {
|
||||
this.subject = subject;
|
||||
this.body = body;
|
||||
this.lastUpdatedAt = new Date();
|
||||
this.lastUpdatedBy = updatedBy.getId();
|
||||
|
||||
APIv3.getDatastore().save(this);
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@ import org.mongodb.morphia.annotations.Entity;
|
|||
import org.mongodb.morphia.annotations.Id;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Entity(value = "punishments", noClassnameStored = true)
|
||||
|
|
|
@ -18,7 +18,7 @@ public final class Rank {
|
|||
@Getter private boolean staffRank;
|
||||
|
||||
public static Rank byId(String id) {
|
||||
return APIv3.getDatastore().createQuery(Rank.class).field("id").equalIgnoreCase(id).get();
|
||||
return APIv3.getDatastore().createQuery(Rank.class).order("weight").field("id").equalIgnoreCase(id).get();
|
||||
}
|
||||
|
||||
public static List<Rank> values() {
|
||||
|
|
|
@ -3,7 +3,7 @@ package net.frozenorb.apiv3.models;
|
|||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.frozenorb.apiv3.APIv3;
|
||||
import net.frozenorb.apiv3.weirdStuff.ExcludeFromReplies;
|
||||
import net.frozenorb.apiv3.serialization.ExcludeFromReplies;
|
||||
import org.bson.Document;
|
||||
import org.mindrot.jbcrypt.BCrypt;
|
||||
import org.mongodb.morphia.annotations.Entity;
|
||||
|
@ -130,4 +130,28 @@ public final class User {
|
|||
return BCrypt.checkpw(new String(unencrypted), password);
|
||||
}
|
||||
|
||||
public Map<String, Boolean> calculateGlobalPermissions() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Map<String, Boolean> calculatePermissions(ServerGroup serverGroup) {
|
||||
/*ServerGroup scope = ServerGroup.byId("HCTeams");
|
||||
Map<ServerGroup, Rank> userRanks = new HashMap<>();
|
||||
|
||||
|
||||
//ServerGroup global = ServerGroup.byId("Global");
|
||||
Map<String, Boolean> calculatedPermissions = global.getPermissions(userRanks.get(global));
|
||||
|
||||
// for global calculations
|
||||
|
||||
for (ServerGroup serverGroup : ServerGroup.values()) {
|
||||
mergePermissions(serverGroup, userRanks.get(serverGroup), calculatedPermissions);
|
||||
}
|
||||
|
||||
// for scoped calculations
|
||||
|
||||
mergePermissions(scope, userRanks.get(scope), calculatedPermissions);*/
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -8,7 +8,6 @@ import org.bson.types.ObjectId;
|
|||
import org.mongodb.morphia.annotations.Entity;
|
||||
import org.mongodb.morphia.annotations.Id;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Entity(value = "userMeta", noClassnameStored = true)
|
||||
|
|
|
@ -3,7 +3,7 @@ package net.frozenorb.apiv3.routes;
|
|||
import net.frozenorb.apiv3.APIv3;
|
||||
import net.frozenorb.apiv3.models.Grant;
|
||||
import net.frozenorb.apiv3.models.Punishment;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Route;
|
||||
|
|
|
@ -3,7 +3,7 @@ package net.frozenorb.apiv3.routes;
|
|||
import com.google.common.collect.ImmutableList;
|
||||
import net.frozenorb.apiv3.APIv3;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import org.bson.Document;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
|
|
|
@ -2,9 +2,9 @@ package net.frozenorb.apiv3.routes.grants;
|
|||
|
||||
import net.frozenorb.apiv3.models.Grant;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.weirdStuff.AuditLog;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.weirdStuff.Permissions;
|
||||
import net.frozenorb.apiv3.unsorted.AuditLog;
|
||||
import net.frozenorb.apiv3.unsorted.Permissions;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import org.bson.Document;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
|
@ -30,11 +30,10 @@ public final class DELETEGrant implements Route {
|
|||
return ErrorUtils.unauthorized(requiredPermission);
|
||||
}
|
||||
|
||||
String removedByIp = req.queryParams("removedByIp");
|
||||
String reason = req.queryParams("removalReason");
|
||||
|
||||
grant.delete(removedBy, reason);
|
||||
AuditLog.log(removedBy, removedByIp, "grant.remove", "Removed a " + grant.getRank() + " grant from " + grant.getTarget() + " for \" " + reason + "\"", new Document("grantId", grant.getId()));
|
||||
AuditLog.log(removedBy, req.attribute("actor"), "grant.remove", new Document("grantId", grant.getId()));
|
||||
return grant;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package net.frozenorb.apiv3.routes.grants;
|
||||
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Route;
|
||||
|
|
|
@ -5,8 +5,8 @@ import net.frozenorb.apiv3.models.Grant;
|
|||
import net.frozenorb.apiv3.models.Rank;
|
||||
import net.frozenorb.apiv3.models.ServerGroup;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.weirdStuff.Permissions;
|
||||
import net.frozenorb.apiv3.unsorted.Permissions;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Route;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package net.frozenorb.apiv3.routes.ipLog;
|
||||
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Route;
|
||||
|
|
|
@ -2,9 +2,9 @@ package net.frozenorb.apiv3.routes.punishments;
|
|||
|
||||
import net.frozenorb.apiv3.models.Punishment;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.weirdStuff.AuditLog;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.weirdStuff.Permissions;
|
||||
import net.frozenorb.apiv3.unsorted.AuditLog;
|
||||
import net.frozenorb.apiv3.unsorted.Permissions;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import org.bson.Document;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
|
@ -30,11 +30,10 @@ public final class DELETEPunishment implements Route {
|
|||
return ErrorUtils.unauthorized(requiredPermission);
|
||||
}
|
||||
|
||||
String removedByIp = req.queryParams("removedByIp");
|
||||
String reason = req.queryParams("removalReason");
|
||||
|
||||
punishment.delete(removedBy, reason);
|
||||
AuditLog.log(removedBy, removedByIp, "punishment.remove", "Removed a " + punishment.getType().name().toLowerCase() + " from " + punishment.getTarget() + " for \" " + reason + "\"", new Document("punishmentId", punishment.getId()));
|
||||
AuditLog.log(removedBy, req.attribute("actor"), "punishment.remove", new Document("punishmentId", punishment.getId()));
|
||||
return punishment;
|
||||
}
|
||||
|
||||
|
|
|
@ -4,8 +4,8 @@ import net.frozenorb.apiv3.APIv3;
|
|||
import net.frozenorb.apiv3.models.Punishment;
|
||||
import net.frozenorb.apiv3.models.Server;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.weirdStuff.Permissions;
|
||||
import net.frozenorb.apiv3.unsorted.Permissions;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Route;
|
||||
|
|
|
@ -3,7 +3,7 @@ package net.frozenorb.apiv3.routes.users;
|
|||
import net.frozenorb.apiv3.models.ServerGroup;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.models.UserMetaEntry;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Route;
|
||||
|
|
|
@ -2,7 +2,7 @@ package net.frozenorb.apiv3.routes.users;
|
|||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Route;
|
||||
|
|
|
@ -3,7 +3,7 @@ package net.frozenorb.apiv3.routes.users;
|
|||
import net.frozenorb.apiv3.models.ServerGroup;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.models.UserMetaEntry;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Route;
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
package net.frozenorb.apiv3.routes.users;
|
||||
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Route;
|
||||
|
||||
public final class GETUsers implements Route {
|
||||
|
||||
public Object handle(Request req, Response res) {
|
||||
return User.values();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package net.frozenorb.apiv3.routes.users;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Route;
|
||||
|
||||
public final class POSTUserLogin implements Route {
|
||||
|
||||
public Object handle(Request req, Response res) {
|
||||
User user = User.byIdOrName(req.params("id"));
|
||||
|
||||
if (user == null) {
|
||||
return ErrorUtils.notFound("User", req.params("id"));
|
||||
}
|
||||
|
||||
return ImmutableMap.of(
|
||||
"user", user,
|
||||
"access", user.getGrants(),
|
||||
"rank", user.getIPLog(),
|
||||
"permissions", user.getPunishments()
|
||||
);
|
||||
}
|
||||
|
||||
}
|
|
@ -2,8 +2,8 @@ package net.frozenorb.apiv3.routes.users;
|
|||
|
||||
import net.frozenorb.apiv3.models.NotificationTemplate;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.weirdStuff.Notification;
|
||||
import net.frozenorb.apiv3.unsorted.Notification;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import org.bson.Document;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
|
|
|
@ -4,8 +4,8 @@ import com.google.common.collect.ImmutableMap;
|
|||
import net.frozenorb.apiv3.APIv3;
|
||||
import net.frozenorb.apiv3.models.NotificationTemplate;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.weirdStuff.Notification;
|
||||
import net.frozenorb.apiv3.unsorted.Notification;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import org.bson.Document;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
|
|
|
@ -2,7 +2,7 @@ package net.frozenorb.apiv3.routes.users;
|
|||
|
||||
import net.frozenorb.apiv3.models.ServerGroup;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import net.frozenorb.apiv3.weirdStuff.ErrorUtils;
|
||||
import net.frozenorb.apiv3.utils.ErrorUtils;
|
||||
import org.bson.Document;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package net.frozenorb.apiv3.weirdStuff;
|
||||
package net.frozenorb.apiv3.serialization;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
|
@ -1,4 +1,4 @@
|
|||
package net.frozenorb.apiv3.weirdStuff;
|
||||
package net.frozenorb.apiv3.serialization;
|
||||
|
||||
import com.google.gson.ExclusionStrategy;
|
||||
import com.google.gson.FieldAttributes;
|
|
@ -1,4 +1,4 @@
|
|||
package net.frozenorb.apiv3.weirdStuff;
|
||||
package net.frozenorb.apiv3.serialization;
|
||||
|
||||
import com.google.gson.TypeAdapter;
|
||||
import com.google.gson.stream.JsonReader;
|
|
@ -1,4 +1,4 @@
|
|||
package net.frozenorb.apiv3.weirdStuff;
|
||||
package net.frozenorb.apiv3.unsorted;
|
||||
|
||||
public interface Actor {
|
||||
|
||||
|
@ -8,7 +8,7 @@ public interface Actor {
|
|||
|
||||
enum Type {
|
||||
|
||||
WEBSITE, SERVER, UNKNOWN
|
||||
WEBSITE, SERVER, USER, UNKNOWN
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
package net.frozenorb.apiv3.unsorted;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import net.frozenorb.apiv3.APIv3;
|
||||
import net.frozenorb.apiv3.models.AuditLogEntry;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import org.bson.Document;
|
||||
|
||||
@UtilityClass
|
||||
public class AuditLog {
|
||||
|
||||
// TODO: Store user IPs
|
||||
|
||||
public static void log(User performedBy, Actor actor, String actionType) {
|
||||
log(performedBy, actor, actionType, new Document());
|
||||
}
|
||||
|
||||
public static void log(User performedBy, Actor actor, String actionType, Document actionData) {
|
||||
APIv3.getDatastore().save(new AuditLogEntry(performedBy, actor, actionType, actionData));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package net.frozenorb.apiv3.weirdStuff;
|
||||
package net.frozenorb.apiv3.unsorted;
|
||||
|
||||
import com.cribbstechnologies.clients.mandrill.exception.RequestFailedException;
|
||||
import com.cribbstechnologies.clients.mandrill.model.MandrillHtmlMessage;
|
||||
|
@ -6,6 +6,7 @@ import com.cribbstechnologies.clients.mandrill.model.MandrillMessageRequest;
|
|||
import com.cribbstechnologies.clients.mandrill.model.MandrillRecipient;
|
||||
import com.cribbstechnologies.clients.mandrill.request.MandrillMessagesRequest;
|
||||
import net.frozenorb.apiv3.models.NotificationTemplate;
|
||||
import net.frozenorb.apiv3.utils.MandrillUtils;
|
||||
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -20,7 +21,7 @@ public final class Notification {
|
|||
|
||||
public Notification(NotificationTemplate template, Map<String, Object> subjectReplacements, Map<String, Object> bodyReplacements) {
|
||||
this.subject = template.fillSubject(subjectReplacements);
|
||||
this.body = template.fillSubject(bodyReplacements);
|
||||
this.body = template.fillBody(bodyReplacements);
|
||||
}
|
||||
|
||||
public void sendAsEmail(String email) throws IOException {
|
|
@ -1,4 +1,4 @@
|
|||
package net.frozenorb.apiv3.weirdStuff;
|
||||
package net.frozenorb.apiv3.unsorted;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package net.frozenorb.apiv3.weirdStuff;
|
||||
package net.frozenorb.apiv3.utils;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bson.Document;
|
|
@ -1,29 +1,20 @@
|
|||
package net.frozenorb.apiv3.weirdStuff;
|
||||
package net.frozenorb.apiv3.utils;
|
||||
|
||||
import com.cribbstechnologies.clients.mandrill.request.MandrillMessagesRequest;
|
||||
import com.cribbstechnologies.clients.mandrill.request.MandrillRESTRequest;
|
||||
import com.cribbstechnologies.clients.mandrill.util.MandrillConfiguration;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import net.frozenorb.apiv3.APIv3;
|
||||
import org.apache.http.impl.client.HttpClientBuilder;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
@UtilityClass
|
||||
public class MandrillUtils {
|
||||
|
||||
public static MandrillMessagesRequest createMessagesRequest() {
|
||||
Properties props = new Properties();
|
||||
|
||||
try {
|
||||
props.load(MandrillUtils.class.getClassLoader().getResourceAsStream("mandrill.properties"));
|
||||
} catch (Exception ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
|
||||
MandrillConfiguration config = new MandrillConfiguration();
|
||||
|
||||
config.setApiKey(props.getProperty("apiKey"));
|
||||
config.setApiKey(APIv3.getConfig().getProperty("mandrill.apiKey"));
|
||||
config.setApiVersion("1.0");
|
||||
config.setBaseURL("https://mandrillapp.com/api");
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
package net.frozenorb.apiv3.utils;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import net.frozenorb.apiv3.models.Rank;
|
||||
import net.frozenorb.apiv3.models.ServerGroup;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@UtilityClass
|
||||
public class PermissionUtils {
|
||||
|
||||
public static void mergePermissions(ServerGroup serverGroup, Rank rank, Map<String, Boolean> current) {
|
||||
Map<String, Boolean> groupPermissions = serverGroup.getPermissions(rank);
|
||||
|
||||
groupPermissions.forEach((permissionNode, grant) -> {
|
||||
if (!current.containsKey(permissionNode) || !current.get(permissionNode)) {
|
||||
current.put(permissionNode, grant);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
package net.frozenorb.apiv3.weirdStuff;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import net.frozenorb.apiv3.APIv3;
|
||||
import net.frozenorb.apiv3.models.AuditLogEntry;
|
||||
import net.frozenorb.apiv3.models.User;
|
||||
import org.bson.Document;
|
||||
|
||||
@UtilityClass
|
||||
public class AuditLog {
|
||||
|
||||
public static void log(User performedBy, String performedFrom, String actionType, String description) {
|
||||
log(performedBy, performedFrom, actionType, description, new Document());
|
||||
}
|
||||
|
||||
public static void log(User performedBy, String performedFrom, String actionType, String description, Document actionData) {
|
||||
APIv3.getDatastore().save(new AuditLogEntry(performedBy, performedFrom, actionType, description, actionData));
|
||||
}
|
||||
|
||||
}
|
|
@ -5,3 +5,4 @@ mongo.username=test
|
|||
mongo.password=test
|
||||
http.address=
|
||||
http.port=80
|
||||
mandrill.apiKey=0OYtwymqJP6oqvszeJu0vQ
|
|
@ -1 +0,0 @@
|
|||
apiKey=0OYtwymqJP6oqvszeJu0vQ
|
Loading…
Reference in New Issue