package com.sungardas.init;
import com.amazonaws.AmazonClientException;
import com.sungardas.enhancedsnapshots.aws.dynamodb.model.User;
import com.sungardas.enhancedsnapshots.dto.InitConfigurationDto;
import com.sungardas.enhancedsnapshots.dto.MailConfigurationTestDto;
import com.sungardas.enhancedsnapshots.dto.converter.BucketNameValidationDTO;
import com.sungardas.enhancedsnapshots.exception.ConfigurationException;
import com.sungardas.enhancedsnapshots.exception.EnhancedSnapshotsException;
import com.sungardas.enhancedsnapshots.service.MailService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY;
@RestController
class InitController {
private static final Logger LOG = LogManager.getLogger(InitController.class);
private String idpMetadata = "idp_metadata.xml";
private String samlCertPem = "saml_sp_cert.pem";
@Autowired
private InitConfigurationService initConfigurationService;
@Autowired
private ContextManager contextManager;
private InitConfigurationDto configurationDto;
@Autowired
private MailService mailService;
@PostConstruct
private void init() {
// check that aws credentials are provided
// try to authenticate as real admin user
if (initConfigurationService.systemIsConfigured()) {
LOG.info("System is already configured.");
initConfigurationService.configureSystem(null);
} else {
LOG.info("System is not configured");
}
}
@ExceptionHandler(value = {EnhancedSnapshotsException.class, ConfigurationException.class})
@ResponseBody
@ResponseStatus(INTERNAL_SERVER_ERROR)
private Exception internalServerError(Exception exception) {
LOG.error(exception);
return exception;
}
@ExceptionHandler(value = IllegalArgumentException.class)
@ResponseBody
@ResponseStatus(UNPROCESSABLE_ENTITY)
private Exception illegalArg(IllegalArgumentException exception) {
LOG.error(exception);
return exception;
}
@ExceptionHandler(value = {Exception.class, AmazonClientException.class})
@ResponseBody
@ResponseStatus(INTERNAL_SERVER_ERROR)
private Exception amazonException(Exception exception) {
LOG.error(exception);
return new EnhancedSnapshotsException("Internal server error", exception);
}
@RequestMapping(method = RequestMethod.POST, value = "/session")
public ResponseEntity<String> init(@RequestBody User user) {
if (contextManager.contextRefreshInProcess()) {
return new ResponseEntity<>("", HttpStatus.NOT_FOUND);
}
// no aws credentials are provided
// try to authenticate as default user admin@enhancedsnapshots:<instance-id>
else if (initConfigurationService.checkDefaultUser(user.getEmail(), user.getPassword())) {
return new ResponseEntity<>("{ \"role\":\"configurator\" }", HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
}
}
@RequestMapping(value = "/configuration/current", method = RequestMethod.GET)
public ResponseEntity<InitConfigurationDto> getConfiguration() {
return new ResponseEntity<>(getInitConfigurationDTO(), HttpStatus.OK);
}
@RequestMapping(value = "/configuration/current", method = RequestMethod.POST)
public ResponseEntity<String> setConfiguration(@RequestBody ConfigDto config) {
initConfigurationService.configureSystem(config);
return new ResponseEntity<>("", HttpStatus.OK);
}
@RequestMapping(value = "/system/mail/configuration/test", method = RequestMethod.POST)
public ResponseEntity mailConfigurationTest(@RequestBody MailConfigurationTestDto dto) {
mailService.testConfiguration(dto.getMailConfiguration(), dto.getTestEmail(), dto.getDomain());
return new ResponseEntity<>(HttpStatus.OK);
}
/**
* Upload idp metadata & saml sp certificate
*/
@RequestMapping(value = "/configuration/uploadFiles", method = RequestMethod.POST)
public
@ResponseBody
ResponseEntity<String> uploadSSOFiles(@RequestParam("name") String name[],
@RequestParam("file") MultipartFile[] file) throws Exception {
if (name.length != 2 && file.length != name.length) {
return new ResponseEntity<>("Failed to upload files. Saml certificate and IDP metadata should be provided", HttpStatus.BAD_REQUEST);
}
if(name[0].equals(idpMetadata) && name[1].equals(samlCertPem)){
initConfigurationService.saveAndProcessSAMLFiles(file[1], file[0]);
} else if (name[0].equals(samlCertPem) && name[0].equals(idpMetadata)) {
initConfigurationService.saveAndProcessSAMLFiles(file[0], file[1]);
} else{
return new ResponseEntity<>("Failed to upload SAML files. Saml certificate and IDP metadata should be provided", HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>("File uploaded successfully", HttpStatus.OK);
}
@RequestMapping(value = "/configuration/bucket/{name:.+}", method = RequestMethod.GET)
public ResponseEntity<BucketNameValidationDTO> validateBucketName(@PathVariable("name") String bucketName) {
return new ResponseEntity<>(initConfigurationService.validateBucketName(bucketName), HttpStatus.OK);
}
@RequestMapping(value = "/configuration/bucket/{name:.+}/metadata", method = RequestMethod.GET)
public ResponseEntity<BucketNameValidationDTO> containsMetadata(@PathVariable("name") String bucketName) {
return new ResponseEntity(initConfigurationService.containsMetadata(bucketName), HttpStatus.OK);
}
@RequestMapping(value = "/user/currentUser", method = RequestMethod.GET)
public ResponseEntity getCurrentUser() {
return new ResponseEntity<>("{ \"role\":\"configurator"
+ "\", \"email\":\"admin@enhancedsnapshots\" }", HttpStatus.OK);
}
private InitConfigurationDto getInitConfigurationDTO() {
if (configurationDto == null) {
configurationDto = initConfigurationService.getInitConfigurationDto();
}
return configurationDto;
}
}