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