Compare commits
7 Commits
06d56064c4
...
d1a851e7da
Author | SHA1 | Date |
---|---|---|
Metall | d1a851e7da | |
Gravita | 00ab20473c | |
Gravita | cdb54b34de | |
Metall | 8f20cbe104 | |
Metall | 66d8b9d9ca | |
Metall | 90ee90973e | |
Metall | 8bf58cff18 |
|
@ -0,0 +1,42 @@
|
|||
package pro.gravit.launchserver.auth.password;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.bouncycastle.crypto.digests.SHA256Digest;
|
||||
import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator;
|
||||
import org.bouncycastle.crypto.params.KeyParameter;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Base64;
|
||||
|
||||
public class DjangoPasswordVerifier extends PasswordVerifier {
|
||||
public final Integer DEFAULT_ITERATIONS = 10000;
|
||||
private static final Logger logger = LogManager.getLogger();
|
||||
private static final String algorithm = "pbkdf2_sha256";
|
||||
|
||||
public String getEncodedHash(String password, String salt, int iterations) {
|
||||
PKCS5S2ParametersGenerator generator = new PKCS5S2ParametersGenerator(new SHA256Digest());
|
||||
generator.init(password.getBytes(StandardCharsets.UTF_8), salt.getBytes(), iterations);
|
||||
byte[] dk = ((KeyParameter) generator.generateDerivedParameters(256)).getKey();
|
||||
byte[] hashBase64 = Base64.getEncoder().encode(dk);
|
||||
return new String(hashBase64);
|
||||
}
|
||||
|
||||
public String encode(String password, String salt, int iterations) {
|
||||
String hash = getEncodedHash(password, salt, iterations);
|
||||
return String.format("%s$%d$%s$%s", algorithm, iterations, salt, hash);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(String encryptedPassword, String password) {
|
||||
String[] params = encryptedPassword.split("\\$");
|
||||
if (params.length != 4) {
|
||||
logger.warn(" end 1 " + params.length);
|
||||
return false;
|
||||
}
|
||||
int iterations = Integer.parseInt(params[1]);
|
||||
String salt = params[2];
|
||||
String hash = encode(password, salt, iterations);
|
||||
return hash.equals(encryptedPassword);
|
||||
}
|
||||
}
|
|
@ -15,6 +15,7 @@ public abstract class PasswordVerifier {
|
|||
providers.register("bcrypt", BCryptPasswordVerifier.class);
|
||||
providers.register("accept", AcceptPasswordVerifier.class);
|
||||
providers.register("reject", RejectPasswordVerifier.class);
|
||||
providers.register("django", DjangoPasswordVerifier.class);
|
||||
registeredProviders = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,12 +29,12 @@ public class StdProtectHandler extends ProtectHandler implements ProfilesProtect
|
|||
|
||||
@Override
|
||||
public boolean canGetProfile(ClientProfile profile, Client client) {
|
||||
return !profile.isLimited() || isWhitelisted("launchserver.profile.%s.show", profile, client);
|
||||
return (client.isAuth && !profile.isLimited()) || isWhitelisted("launchserver.profile.%s.show", profile, client);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canChangeProfile(ClientProfile profile, Client client) {
|
||||
return !profile.isLimited() || isWhitelisted("launchserver.profile.%s.enter", profile, client);
|
||||
return (client.isAuth && !profile.isLimited()) || isWhitelisted("launchserver.profile.%s.enter", profile, client);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -31,7 +31,6 @@ import pro.gravit.launchserver.socket.response.secure.HardwareReportResponse;
|
|||
import pro.gravit.launchserver.socket.response.secure.SecurityReportResponse;
|
||||
import pro.gravit.launchserver.socket.response.secure.VerifySecureLevelKeyResponse;
|
||||
import pro.gravit.launchserver.socket.response.update.LauncherResponse;
|
||||
import pro.gravit.launchserver.socket.response.update.UpdateListResponse;
|
||||
import pro.gravit.launchserver.socket.response.update.UpdateResponse;
|
||||
import pro.gravit.utils.BiHookSet;
|
||||
import pro.gravit.utils.HookSet;
|
||||
|
@ -74,7 +73,6 @@ public class WebSocketService {
|
|||
providers.register("joinServer", JoinServerResponse.class);
|
||||
providers.register("profiles", ProfilesResponse.class);
|
||||
providers.register("launcher", LauncherResponse.class);
|
||||
providers.register("updateList", UpdateListResponse.class);
|
||||
providers.register("setProfile", SetProfileResponse.class);
|
||||
providers.register("update", UpdateResponse.class);
|
||||
providers.register("batchProfileByUsername", BatchProfileByUsername.class);
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
package pro.gravit.launchserver.socket.response.update;
|
||||
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import pro.gravit.launcher.base.events.request.UpdateListRequestEvent;
|
||||
import pro.gravit.launchserver.socket.Client;
|
||||
import pro.gravit.launchserver.socket.response.SimpleResponse;
|
||||
|
||||
import java.util.HashSet;
|
||||
|
||||
public class UpdateListResponse extends SimpleResponse {
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return "updateList";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(ChannelHandlerContext ctx, Client client) {
|
||||
if (!client.isAuth) {
|
||||
sendError("Access denied");
|
||||
return;
|
||||
}
|
||||
HashSet<String> set = server.updatesManager.getUpdatesList();
|
||||
sendResult(new UpdateListRequestEvent(set));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
package pro.gravit.launcher.base.events.request;
|
||||
|
||||
import pro.gravit.launcher.core.LauncherNetworkAPI;
|
||||
import pro.gravit.launcher.base.events.RequestEvent;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.UUID;
|
||||
|
||||
|
||||
public class UpdateListRequestEvent extends RequestEvent {
|
||||
@SuppressWarnings("unused")
|
||||
private static final UUID uuid = UUID.fromString("5fa836ae-6b61-401c-96ac-d8396f07ec6b");
|
||||
@LauncherNetworkAPI
|
||||
public final HashSet<String> dirs;
|
||||
|
||||
public UpdateListRequestEvent(HashSet<String> dirs) {
|
||||
this.dirs = dirs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return "updateList";
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
package pro.gravit.launcher.base.request.update;
|
||||
|
||||
import pro.gravit.launcher.base.events.request.UpdateListRequestEvent;
|
||||
import pro.gravit.launcher.base.request.Request;
|
||||
import pro.gravit.launcher.base.request.websockets.WebSocketRequest;
|
||||
|
||||
public final class UpdateListRequest extends Request<UpdateListRequestEvent> implements WebSocketRequest {
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return "updateList";
|
||||
}
|
||||
}
|
|
@ -94,7 +94,6 @@ public abstract class ClientWebSocketService extends ClientJSONPoint {
|
|||
results.register("batchProfileByUsername", BatchProfileByUsernameRequestEvent.class);
|
||||
results.register("profiles", ProfilesRequestEvent.class);
|
||||
results.register("setProfile", SetProfileRequestEvent.class);
|
||||
results.register("updateList", UpdateListRequestEvent.class);
|
||||
results.register("error", ErrorRequestEvent.class);
|
||||
results.register("update", UpdateRequestEvent.class);
|
||||
results.register("getAvailabilityAuth", GetAvailabilityAuthRequestEvent.class);
|
||||
|
|
Binary file not shown.
|
@ -1,6 +1,6 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
|
2
modules
2
modules
|
@ -1 +1 @@
|
|||
Subproject commit e93620f10963b951c8874dfef17dce91cf8c8da9
|
||||
Subproject commit dba18b58312a92e465ad17d78ea3504a8b3c1818
|
Loading…
Reference in New Issue