package com.thundermoose.plugins.admin; import com.atlassian.sal.api.transaction.TransactionCallback; import com.atlassian.sal.api.transaction.TransactionTemplate; import com.atlassian.sal.api.user.UserManager; import com.atlassian.sal.api.user.UserProfile; import com.thundermoose.plugins.user.UserConfig; import com.thundermoose.plugins.user.UserConfigDao; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import java.util.Objects; @Path("/admin") public class AdminConfigResource { private final static Logger log = LoggerFactory.getLogger(AdminConfigResource.class); private final TransactionTemplate transactionTemplate; private final UserManager userManager; private final AdminConfigDao adminDao; private final UserConfigDao userDao; public AdminConfigResource(TransactionTemplate transactionTemplate, UserManager userManager, AdminConfigDao adminDao, UserConfigDao userDao) { this.transactionTemplate = transactionTemplate; this.userManager = userManager; this.adminDao = adminDao; this.userDao = userDao; } @GET @Produces(MediaType.APPLICATION_JSON) public Response get(@Context HttpServletRequest request) { UserProfile user = userManager.getRemoteUser(); if (user == null || !userManager.isSystemAdmin(user.getUserKey())) { return Response.status(Response.Status.UNAUTHORIZED).build(); } return Response.ok(adminDao.getAdminConfig()).build(); } @PUT @Consumes(MediaType.APPLICATION_JSON) public Response put(final AdminConfig config, @Context HttpServletRequest request) { final UserProfile user = userManager.getRemoteUser(); if (user == null || !userManager.isSystemAdmin(user.getUserKey())) { return Response.status(Status.UNAUTHORIZED).build(); } transactionTemplate.execute(new TransactionCallback<Object>() { @Override public Object doInTransaction() { AdminConfig current = adminDao.getAdminConfig(); //if the server secret changes, we need to invalidate all tokens if (!Objects.equals(current.getKey(), config.getKey())) { log.warn("Server secret was changed, removing all current tokens"); for (UserConfig uc : userDao.getAllUserConfigs()) { uc.setToken(null); userDao.setUserConfig(uc.getUsername(), uc); } } adminDao.setAdminConfig(config); return null; } }); return Response.noContent().build(); } }