Skip to content

Commit

Permalink
[SHIBUI-1030]
Browse files Browse the repository at this point in the history
Added query to get users by role name.
Added simple email test.
Updated gradle build to spin up docker compose before the test task and
shut down after. In theory.
  • Loading branch information
Bill Smith committed Jan 11, 2019
1 parent 4f6a5df commit f475fb8
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 7 deletions.
5 changes: 5 additions & 0 deletions backend/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -325,4 +325,9 @@ dockerCompose {
useComposeFiles = ['./src/main/docker-files/docker-compose.yml']
captureContainersOutput = true
waitForTcpPorts = false
}

task test(overwrite: true) {
dependsOn 'composeUp'
finalizedBy 'composeDown'
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package edu.internet2.tier.shibboleth.admin.ui.configuration;

import edu.internet2.tier.shibboleth.admin.ui.security.repository.UserRepository;
import edu.internet2.tier.shibboleth.admin.ui.service.EmailService;
import edu.internet2.tier.shibboleth.admin.ui.service.EmailServiceImpl;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
Expand Down Expand Up @@ -43,10 +43,10 @@ public class EmailConfiguration {
private String systemEmailAddress = "doNotReply@shibui.org";

@Autowired
private ApplicationContext applicationContext;
private JavaMailSender javaMailSender;

@Autowired
private JavaMailSender javaMailSender;
private UserRepository userRepository;

@Bean
public ResourceBundleMessageSource emailMessageSource() {
Expand Down Expand Up @@ -97,6 +97,11 @@ private ITemplateResolver htmlTemplateResolver() {

@Bean
public EmailService emailService() {
return new EmailServiceImpl(javaMailSender, emailMessageSource(), textEmailTemplateEngine(), htmlEmailTemplateEngine(), systemEmailAddress);
return new EmailServiceImpl(javaMailSender,
emailMessageSource(),
textEmailTemplateEngine(),
htmlEmailTemplateEngine(),
systemEmailAddress,
userRepository);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
import edu.internet2.tier.shibboleth.admin.ui.configuration.CustomPropertiesConfiguration;
import edu.internet2.tier.shibboleth.admin.ui.security.model.Role;
import edu.internet2.tier.shibboleth.admin.ui.security.repository.RoleRepository;
import edu.internet2.tier.shibboleth.admin.ui.service.EmailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.mail.MessagingException;
import java.util.stream.Collectors;

/**
Expand All @@ -24,6 +27,14 @@ public class ConfigurationController {
@Autowired
RoleRepository roleRepository;

@Autowired
EmailService emailService;

@ExceptionHandler(MessagingException.class)
public ResponseEntity<?> handleMessagingExcepgtion() {
return ResponseEntity.badRequest().body(new ErrorResponse("12345", "Something exploded."));
}

@GetMapping(value = "/customAttributes")
public ResponseEntity<?> getCustomAttributes() {
return ResponseEntity.ok(customPropertiesConfiguration.getAttributes());
Expand All @@ -33,4 +44,10 @@ public ResponseEntity<?> getCustomAttributes() {
public ResponseEntity<?> getSupportedRoles() {
return ResponseEntity.ok(roleRepository.findAll().stream().map(Role::getName).collect(Collectors.toList()));
}

@GetMapping(value = "/foo")
public ResponseEntity<?> getFoo() throws MessagingException {
emailService.sendNewUserMail("foobar");
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;
import java.util.Set;

/**
* Spring Data repository to manage entities of type {@link User}.
Expand All @@ -13,4 +14,5 @@
public interface UserRepository extends JpaRepository<User, Long> {

Optional<User> findByUsername(String username);
Set<User> findByRoles_Name(String roleName);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package edu.internet2.tier.shibboleth.admin.ui.service;

import edu.internet2.tier.shibboleth.admin.ui.security.model.User;
import edu.internet2.tier.shibboleth.admin.ui.security.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ResourceBundleMessageSource;
Expand All @@ -10,7 +12,9 @@

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;

/**
* @author Bill Smith (wsmith@unicon.net)
Expand All @@ -23,17 +27,20 @@ public class EmailServiceImpl implements EmailService {
private ResourceBundleMessageSource emailMessageSource;
private TemplateEngine textEmailTemplateEngine;
private TemplateEngine htmlEmailTemplateEngine;
private UserRepository userRepository;

public EmailServiceImpl(JavaMailSender emailSender,
ResourceBundleMessageSource emailMessageSource,
TemplateEngine textEmailTemplateEngine,
TemplateEngine htmlEmailTemplateEngine,
String systemEmailAddress) {
String systemEmailAddress,
UserRepository userRepository) {
this.emailSender = emailSender;
this.emailMessageSource = emailMessageSource;
this.textEmailTemplateEngine = textEmailTemplateEngine;
this.htmlEmailTemplateEngine = htmlEmailTemplateEngine;
this.systemEmailAddress = systemEmailAddress;
this.userRepository = userRepository;
}

public void sendMail(String emailTemplate, String fromAddress, String[] recipients, String subject, Locale locale) throws MessagingException {
Expand All @@ -50,7 +57,6 @@ public void sendMail(String emailTemplate, String fromAddress, String[] recipien
String htmlContent = htmlEmailTemplateEngine.process(emailTemplate, context);
message.setText(textContent, htmlContent);

// TODO: Uncomment when we're ready to actually send emails
emailSender.send(mimeMessage);
}

Expand All @@ -60,6 +66,12 @@ public void sendNewUserMail(String newUsername) throws MessagingException {
}

private String[] getSystemAdmins() {
return new String[]{"admin1@shibui.org", "admin2@shibui.org"};
Set<User> systemAdmins = userRepository.findByRoles_Name("ROLE_ADMIN");
if (systemAdmins == null || systemAdmins.size() == 0) {
//TODO: Should this be an exception?
logger.warn("No users with ROLE_ADMIN were found! Check your configuration!");
systemAdmins = new HashSet<>();
}
return systemAdmins.stream().map(User::getEmailAddress).distinct().toArray(String[]::new);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.core.io.ClassPathResource
import org.springframework.mail.javamail.JavaMailSender
import org.springframework.mail.javamail.JavaMailSenderImpl

@Configuration
class TestConfiguration {
Expand All @@ -35,6 +37,15 @@ class TestConfiguration {
this.metadataResolverRepository = metadataResolverRepository
}

@Bean
JavaMailSender javaMailSender() {
return new JavaMailSenderImpl().with {
it.host = 'localhost'
it.port = 1025
it
}
}

@Bean
MetadataResolver metadataResolver() {
ChainingMetadataResolver metadataResolver = new OpenSamlChainingMetadataResolver()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package edu.internet2.tier.shibboleth.admin.ui.service

import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration
import edu.internet2.tier.shibboleth.admin.ui.configuration.DevConfig
import edu.internet2.tier.shibboleth.admin.ui.configuration.EmailConfiguration
import edu.internet2.tier.shibboleth.admin.ui.configuration.InternationalizationConfiguration
import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration
import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.domain.EntityScan
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.data.jpa.repository.config.EnableJpaRepositories
import org.springframework.test.context.ActiveProfiles
import org.springframework.test.context.ContextConfiguration
import spock.lang.Specification

/**
* @author Bill Smith (wsmith@unicon.net)
*/
@SpringBootTest
@DataJpaTest
@ContextConfiguration(classes=[CoreShibUiConfiguration, EmailConfiguration, TestConfiguration, InternationalizationConfiguration, SearchConfiguration, DevConfig])
@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"])
@EntityScan("edu.internet2.tier.shibboleth.admin.ui")
@ActiveProfiles(["no-auth", "dev"])
class EmailServiceImplTests extends Specification {

@Autowired
EmailService emailService

def "emailService can successfully send an email"() {
when:
emailService.sendNewUserMail("foobar")

then:
noExceptionThrown()
}
}

0 comments on commit f475fb8

Please sign in to comment.