Plan/Plan/common/src/main/java/com/djrapitops/plan/identification/Identifiers.java

143 lines
5.7 KiB
Java
Raw Normal View History

/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan.identification;
Interface redesign package restructuring (#1146) * command.commands -> command.subcommands * command -> commands * commands -> system.commands * system.locale -> system.settings.locale * system.settings.changes -> system.settings.config.changes * system.settings.paths -> system.settings.config.paths * system.database -> system.storage.database * db -> system.storage.database * system.storage.database.access.queries -> system.storage.database.queries * system.storage.database.access.transactions -> system.storage.database.transactions * system.storage.database.access -> system.storage.database.operation * Moved Query classes to system.storage.database.queries * Moved Executable classes to system.storage.database.transactions * system.storage.database.patches -> system.storage.database.transactions.patches * system.file -> system.storage.file * system.settings.upkeep * system.storage.upkeep * system.server.info -> system.identification * system.importing -> system.gathering.importing * system.listeners -> system.gathering.listeners * system.gathering.timed * Removed duplicate class * data.container -> system.gathering.domain * data.plugin.PluginsConfigSection -> system.settings.config.ExtensionSettings * data.time -> system.gathering.domain * system.afk -> system.gathering.afk * system.cache -> system.gathering.cache * system.status -> system.gathering.listeners * system.export -> system.delivery.export * system.webserver -> system.delivery.webserver * system.json -> system.delivery.rendering.json * utilities.html -> system.delivery.rendering.html * system.delivery.rendering.html.graphs -> system.delivery.rendering.json.graphs * system.delivery.rendering.html.pages -> system.delivery.rendering.pages * system.delivery.upkeep * utilities.file -> system.settings.upkeep * data.store -> system.delivery.domain * system.update -> system.version * api.exceptions -> exceptions * ShutdownHook -> system.gathering * system.HtmlUtilities - > system.delivery.DeliveryUtilities * PeriodicAnalysisTask -> PeriodicServerExportTask * Deprecated APIv4 classes * Removed ServerTaskSystem (Reduces headache) * Moved & Fixed some tests
2019-08-30 11:36:38 +02:00
import com.djrapitops.plan.delivery.web.resolver.exception.BadRequestException;
import com.djrapitops.plan.delivery.web.resolver.request.Request;
import com.djrapitops.plan.storage.database.DBSystem;
import com.djrapitops.plan.storage.database.queries.objects.ServerQueries;
import com.djrapitops.plan.storage.database.queries.objects.UserIdentifierQueries;
import com.djrapitops.plan.utilities.dev.Untrusted;
import org.eclipse.jetty.http.HttpHeader;
import org.jetbrains.annotations.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Optional;
import java.util.UUID;
2021-02-10 09:04:21 +01:00
import java.util.concurrent.TimeUnit;
/**
* Utility for getting server identifier from different sources.
*
2021-02-13 14:16:03 +01:00
* @author AuroraLS3
*/
@Singleton
public class Identifiers {
protected final DBSystem dbSystem;
private final UUIDUtility uuidUtility;
@Inject
public Identifiers(DBSystem dbSystem, UUIDUtility uuidUtility) {
this.dbSystem = dbSystem;
this.uuidUtility = uuidUtility;
}
2020-03-06 09:09:06 +01:00
/**
* Obtain UUID of the server.
*
* @param request for Request, URIQuery needs a 'server' parameter.
* @return UUID of the server.
* @throws BadRequestException If server parameter is not defined or the server is not in the database.
*/
public ServerUUID getServerUUID(Request request) {
2020-05-12 18:25:16 +02:00
String identifier = request.getQuery().get("server")
2019-07-19 10:52:17 +02:00
.orElseThrow(() -> new BadRequestException("'server' parameter was not defined."));
Optional<ServerUUID> parsed = UUIDUtility.parseFromString(identifier).map(ServerUUID::from);
2020-05-12 18:25:16 +02:00
return parsed.orElseGet(() -> getServerUUIDFromName(identifier).orElseThrow(
() -> new BadRequestException("Given 'server' was not found in the database.")
2020-05-12 18:25:16 +02:00
));
}
public static Optional<Long> getTimestamp(@Untrusted Request request) {
try {
long currentTime = System.currentTimeMillis();
long timestamp = request.getHeader("X-Plan-Timestamp")
.map(Long::parseLong)
.orElseGet(() -> request.getQuery().get("timestamp")
.map(Long::parseLong)
.orElse(currentTime));
if (currentTime + TimeUnit.SECONDS.toMillis(10L) < timestamp) {
return Optional.empty();
}
return Optional.of(timestamp);
} catch (@Untrusted NumberFormatException nonNumberTimestamp) {
throw new BadRequestException("'timestamp' was not a number");
}
}
public static Optional<Long> getEtag(Request request) {
return request.getHeader(HttpHeader.IF_NONE_MATCH.asString())
.map(tag -> {
try {
return Long.parseLong(tag);
} catch (NumberFormatException notANumber) {
throw new BadRequestException("'" + HttpHeader.IF_NONE_MATCH.asString() + "'-header was not a number. Clear browser cache.");
}
});
}
2020-05-12 18:25:16 +02:00
/**
* Obtain UUID of the server.
*
* @param identifier Identifier (name or uuid string) of the server
* @return UUID of the server.
* @throws BadRequestException If the server is not in the database.
*/
public Optional<ServerUUID> getServerUUID(@Untrusted String identifier) {
Optional<ServerUUID> parsed = UUIDUtility.parseFromString(identifier).map(ServerUUID::from);
2020-05-12 18:25:16 +02:00
if (parsed.isPresent()) return parsed;
return getServerUUIDFromName(identifier);
}
private Optional<ServerUUID> getServerUUIDFromName(@Untrusted String serverName) {
return dbSystem.getDatabase().query(ServerQueries.fetchServerMatchingIdentifier(serverName))
2020-05-12 18:25:16 +02:00
.map(Server::getUuid);
}
2019-07-20 16:40:15 +02:00
2020-03-06 09:09:06 +01:00
/**
* Obtain UUID of the player.
*
* @param request for Request, URIQuery needs a 'player' parameter.
* @return UUID of the player.
* @throws BadRequestException If player parameter is not defined or the player is not in the database.
*/
public UUID getPlayerUUID(@Untrusted Request request) {
@Untrusted String playerIdentifier = request.getQuery().get("player")
.orElseThrow(() -> new BadRequestException("'player' parameter was not defined.")).trim();
2019-07-20 16:40:15 +02:00
Optional<UUID> parsed = UUIDUtility.parseFromString(playerIdentifier);
return parsed.orElseGet(() -> getPlayerUUIDFromName(playerIdentifier));
2019-07-20 16:40:15 +02:00
}
@Nullable
public UUID getPlayerUUID(String name) {
return uuidUtility.getUUIDOf(name);
}
2021-02-10 09:04:21 +01:00
public Optional<Integer> getPlayerUserId(UUID playerUUID) {
return dbSystem.getDatabase().query(UserIdentifierQueries.fetchUserId(playerUUID));
}
private UUID getPlayerUUIDFromName(@Untrusted String playerName) {
return dbSystem.getDatabase()
.query(UserIdentifierQueries.fetchPlayerUUIDOf(playerName))
.orElseThrow(() -> new BadRequestException("Given 'player' was not found in the database."));
2021-02-10 09:04:21 +01:00
}
}