Commit 5a3315ab authored by Grzegorz Pietrusza's avatar Grzegorz Pietrusza

refactor injections

parent 92c99e64
import auth.ExampleAuthenticator;
import com.bazaarvoice.dropwizard.webjars.WebJarBundle;
import com.google.common.base.Optional;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.mongodb.MongoClient;
import core.ApplicationConfiguration;
import core.TaskType;
import helpers.CryptoTaskConfig;
import helpers.WebTaskConfig;
import io.dropwizard.Application;
import io.dropwizard.assets.AssetsBundle;
import io.dropwizard.auth.*;
import io.dropwizard.auth.AuthDynamicFeature;
import io.dropwizard.auth.AuthValueFactoryProvider;
import io.dropwizard.auth.Authorizer;
import io.dropwizard.auth.basic.BasicCredentialAuthFilter;
import io.dropwizard.auth.basic.BasicCredentials;
import io.dropwizard.jersey.setup.JerseyEnvironment;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import objects.Flag;
import objects.User;
import objects.tasks.Task;
import objects.tasks.TaskCryptoContent;
import objects.tasks.TaskWebContent;
import org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.Morphia;
......@@ -30,7 +24,6 @@ import repositories.TeamsRepository;
import repositories.UsersRepository;
import resources.*;
import java.util.List;
import java.util.stream.Stream;
/**
......@@ -46,6 +39,8 @@ public class CTFApplication extends Application<ApplicationConfiguration> {
private SolutionsRepository solutionsRepository;
private Injector injector;
//todo: move initalization to repositories
@Override
public void initialize(final Bootstrap<ApplicationConfiguration> bootstrap) {
bootstrap.addBundle(new AssetsBundle("/assets", "/page", "index.html"));
......@@ -61,43 +56,6 @@ public class CTFApplication extends Application<ApplicationConfiguration> {
datastore.ensureIndexes();
}
//todo: cleanup
private void initializeTeams(ApplicationConfiguration applicationConfiguration) {
teamsRepository.clean();
applicationConfiguration.getTeams().forEach(team -> {
team.getMembers().stream().forEach(user -> datastore.save(user));
datastore.save(team);
});
}
private void initializeTasks(ApplicationConfiguration applicationConfiguration) {
List<CryptoTaskConfig> cryptoTasks = applicationConfiguration.getCryptoTasks();
List<WebTaskConfig> webTasks = applicationConfiguration.getWebTasks();
tasksRepository.clean();
cryptoTasks.forEach(cryptoTaskConfig -> tasksRepository.add(new Task(
cryptoTaskConfig.getName(),
cryptoTaskConfig.getLevel(),
TaskType.CRYPTO,
new Flag(cryptoTaskConfig.getFlag()),
new TaskCryptoContent(cryptoTaskConfig.getText())
)));
webTasks.forEach(webTaskConfig -> tasksRepository.add(new Task(
webTaskConfig.getName(),
webTaskConfig.getLevel(),
TaskType.WEB,
new Flag(webTaskConfig.getFlag()),
new TaskWebContent(webTaskConfig.getUrl())
)));
}
private void initializeSolutions() {
solutionsRepository.clean();
}
private void registerResources(Environment environment) {
JerseyEnvironment jersey = environment.jersey();
jersey.register(injector.getInstance(TeamsResource.class));
......@@ -110,7 +68,7 @@ public class CTFApplication extends Application<ApplicationConfiguration> {
private void registerAuthFeatures(Environment environment) {
environment.jersey().register(new AuthDynamicFeature(
new BasicCredentialAuthFilter.Builder<User>()
.setAuthenticator(new ExampleAuthenticator(usersRepository))
.setAuthenticator(injector.getInstance(ExampleAuthenticator.class))
.setAuthorizer(new ExampleAuthorizer())
.setRealm("SUPER SECRET STUFF")
.buildAuthFilter()));
......@@ -124,31 +82,12 @@ public class CTFApplication extends Application<ApplicationConfiguration> {
initializeMorhpia();
injector = createInjector(applicationConfiguration, datastore);
initializeTeams(applicationConfiguration);
initializeTasks(applicationConfiguration);
initializeSolutions();
registerResources(environment);
registerAuthFeatures(environment);
}
//todo: move to seperate class
public class ExampleAuthenticator implements Authenticator<BasicCredentials, User> {
private UsersRepository usersRepository;
public ExampleAuthenticator(UsersRepository usersRepository) {
this.usersRepository = usersRepository;
}
@Override
public com.google.common.base.Optional<User> authenticate(BasicCredentials credentials) throws AuthenticationException {
User user = usersRepository.authenticateUser(credentials);
if (user != null) {
return Optional.of(user);
}
return Optional.absent();
}
}
public class ExampleAuthorizer implements Authorizer<User> {
@Override
......@@ -162,24 +101,8 @@ public class CTFApplication extends Application<ApplicationConfiguration> {
return Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(ApplicationConfiguration.class).toInstance(applicationConfiguration);
//todo: refactor?
teamsRepository = new TeamsRepository(datastore);
usersRepository = new UsersRepository(datastore, teamsRepository);
solutionsRepository = new SolutionsRepository(datastore);
tasksRepository = new TasksRepository(applicationConfiguration, datastore, teamsRepository, solutionsRepository,
usersRepository);
bind(TeamsRepository.class).toInstance(teamsRepository);
bind(TasksRepository.class).toInstance(tasksRepository);
bind(UsersRepository.class).toInstance(usersRepository);
bind(TeamsResource.class).toInstance(new TeamsResource(teamsRepository));
bind(TasksResource.class).toInstance(new TasksResource(tasksRepository
));
bind(SolutionsResource.class).toInstance(new SolutionsResource(solutionsRepository));
bind(TaskResource.class).toInstance(new TaskResource(tasksRepository));
bind(ApplicationConfiguration.class).toInstance(applicationConfiguration); //todo: refactor
bind(Datastore.class).toInstance(datastore);
}
});
}
......
package auth;
import com.google.common.base.Optional;
import com.google.inject.Inject;
import io.dropwizard.auth.AuthenticationException;
import io.dropwizard.auth.Authenticator;
import io.dropwizard.auth.basic.BasicCredentials;
import objects.User;
import repositories.UsersRepository;
public class ExampleAuthenticator implements Authenticator<BasicCredentials, User> {
private UsersRepository usersRepository;
@Inject
public ExampleAuthenticator(UsersRepository usersRepository) {
this.usersRepository = usersRepository;
}
@Override
public com.google.common.base.Optional<User> authenticate(BasicCredentials credentials) throws AuthenticationException {
User user = usersRepository.authenticateUser(credentials);
if (user != null) {
return Optional.of(user);
}
return Optional.absent();
}
}
\ No newline at end of file
......@@ -8,6 +8,7 @@ import java.util.List;
public interface Repository {
// void get(UUID uuid);
List getAll();
void initialize();
// void add(User user); //todo: not user //todo: use generics?
}
......@@ -4,17 +4,20 @@ import objects.Solution;
import org.mongodb.morphia.Datastore;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.List;
/**
* Created by gpietrus on 20.02.2016.
*/
@Singleton
public class SolutionsRepository implements Repository {
private Datastore datastore;
@Inject
public SolutionsRepository(Datastore datastore) {
this.datastore = datastore;
initialize();
}
// public void get(UUID uuid) {
......@@ -25,6 +28,11 @@ public class SolutionsRepository implements Repository {
return datastore.createQuery(Solution.class).asList();
}
@Override
public void initialize() {
this.clean();
}
public void add(Solution solution) { //todo
datastore.save(solution); //todo: error handling?
//todo: do not add if already exists
......
package repositories;
import core.ApplicationConfiguration;
import core.TaskType;
import helpers.CryptoTaskConfig;
import helpers.WebTaskConfig;
import objects.Flag;
import objects.Solution;
import objects.tasks.Task;
import objects.Team;
import objects.User;
import objects.tasks.Task;
import objects.tasks.TaskCryptoContent;
import objects.tasks.TaskWebContent;
import org.apache.commons.codec.binary.Hex;
import org.mongodb.morphia.Datastore;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
......@@ -19,6 +26,7 @@ import java.util.stream.Collectors;
/**
* Created by gpietrus on 20.02.2016.
*/
@Singleton
public class TasksRepository implements Repository {
private ApplicationConfiguration applicationConfiguration;
......@@ -37,6 +45,7 @@ public class TasksRepository implements Repository {
this.teamsRepository = teamsRepository;
this.solutionsRepository = solutionsRepository;
this.usersRepository = usersRepository;
initialize();
}
public Task get(String taskName) { //todo: task name?
......@@ -55,6 +64,30 @@ public class TasksRepository implements Repository {
return datastore.createQuery(Task.class).asList();
}
@Override
public void initialize() {
List<CryptoTaskConfig> cryptoTasks = applicationConfiguration.getCryptoTasks();
List<WebTaskConfig> webTasks = applicationConfiguration.getWebTasks();
this.clean();
cryptoTasks.forEach(cryptoTaskConfig -> this.add(new Task(
cryptoTaskConfig.getName(),
cryptoTaskConfig.getLevel(),
TaskType.CRYPTO,
new Flag(cryptoTaskConfig.getFlag()),
new TaskCryptoContent(cryptoTaskConfig.getText())
)));
webTasks.forEach(webTaskConfig -> this.add(new Task(
webTaskConfig.getName(),
webTaskConfig.getLevel(),
TaskType.WEB,
new Flag(webTaskConfig.getFlag()),
new TaskWebContent(webTaskConfig.getUrl())
)));
}
public void add(Task task) {
datastore.save(task);
}
......
package repositories;
import core.ApplicationConfiguration;
import objects.Team;
import objects.User;
import org.mongodb.morphia.Datastore;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
......@@ -12,13 +14,17 @@ import java.util.UUID;
/**
* Created by gpietrus on 20.02.2016.
*/
@Singleton
public class TeamsRepository implements Repository {
private Datastore datastore;
private ApplicationConfiguration applicationConfiguration;
@Inject
public TeamsRepository(Datastore datastore) {
public TeamsRepository(Datastore datastore, ApplicationConfiguration applicationConfiguration) {
this.datastore = datastore;
this.applicationConfiguration = applicationConfiguration;
initialize();
}
public Optional<Team> getTeamByUser(User user) {
......@@ -35,11 +41,21 @@ public class TeamsRepository implements Repository {
return datastore.createQuery(Team.class).asList();
}
@Override
public void initialize() {
this.clean();
applicationConfiguration.getTeams().forEach(team -> {
team.getMembers().stream().forEach(user -> datastore.save(user));
datastore.save(team);
});
}
//todo: move to interface
public void add(Team team) {
datastore.save(team);
}
//todo: move clean to upper class?
public void clean() {
datastore.getCollection(Team.class).drop();
}
......
package repositories;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import io.dropwizard.auth.basic.BasicCredentials;
import objects.User;
import org.apache.commons.codec.binary.Hex;
......@@ -12,12 +14,14 @@ import java.util.List;
/**
* Created by gpietrus on 20.02.2016.
*/
@Singleton
public class UsersRepository implements Repository {
private Datastore datastore;
private TeamsRepository teamsRepository;
private MessageDigest messageDigest;
@Inject
public UsersRepository(Datastore datastore,
TeamsRepository teamsRepository) {
this.datastore = datastore;
......@@ -47,4 +51,9 @@ public class UsersRepository implements Repository {
public List getAll() {
return null;
}
@Override
public void initialize() {
}
}
......@@ -4,6 +4,7 @@ import objects.Solution;
import repositories.SolutionsRepository;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
......@@ -16,6 +17,7 @@ import java.util.stream.Collectors;
/**
* Created by gpietrus on 16.02.16.
*/
@Singleton
@Path(value = "/solutions")
@Produces(MediaType.APPLICATION_JSON)
public class SolutionsResource {
......
......@@ -13,6 +13,7 @@ import org.apache.http.impl.client.HttpClients;
import repositories.TasksRepository;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
......@@ -26,6 +27,7 @@ import java.util.stream.Collectors;
/**
* Created by gpietrus on 23.02.2016.
*/
@Singleton
@Path(value = "/task")
public class TaskResource {
......
......@@ -2,11 +2,12 @@ package resources;
import helpers.TaskUserPair;
import io.dropwizard.auth.Auth;
import objects.tasks.Task;
import objects.User;
import objects.tasks.Task;
import repositories.TasksRepository;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.validation.Valid;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
......@@ -18,6 +19,7 @@ import java.util.Optional;
/**
* Created by gpietrus on 16.02.16.
*/
@Singleton
@Path(value = "/tasks")
@Produces(MediaType.APPLICATION_JSON)
public class TasksResource
......
package resources;
import repositories.TeamsRepository;
import objects.Team;
import repositories.TeamsRepository;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
......@@ -13,6 +14,7 @@ import java.util.List;
/**
* Created by gpietrus on 16.02.16.
*/
@Singleton
@Path(value = "/teams")
@Produces(MediaType.APPLICATION_JSON)
public class TeamsResource
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment