fixed institutional logo handling
This commit is contained in:
		
							parent
							
								
									c97a2ff02b
								
							
						
					
					
						commit
						00d7a91a43
					
				
					 8 changed files with 100 additions and 20 deletions
				
			
		|  | @ -45,6 +45,7 @@ import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import org.springframework.web.filter.CharacterEncodingFilter; | ||||
| 
 | ||||
| import ch.ethz.seb.sebserver.gbl.api.API; | ||||
| import ch.ethz.seb.sebserver.gbl.profile.DevGuiProfile; | ||||
| import ch.ethz.seb.sebserver.gbl.profile.DevWebServiceProfile; | ||||
| import ch.ethz.seb.sebserver.gbl.profile.GuiProfile; | ||||
|  | @ -67,6 +68,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter implements E | |||
|     private String guiRedirect; | ||||
|     @Value("${sebserver.webservice.api.exam.endpoint.discovery}") | ||||
|     private String examAPIDiscoveryEndpoint; | ||||
|     @Value("${sebserver.webservice.api.admin.endpoint}") | ||||
|     private String adminAPIEndpoint; | ||||
| 
 | ||||
|     /** Spring bean name of user password encoder */ | ||||
|     public static final String USER_PASSWORD_ENCODER_BEAN_NAME = "userPasswordEncoder"; | ||||
|  | @ -101,6 +104,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter implements E | |||
|                 .ignoring() | ||||
|                 .antMatchers("/error") | ||||
|                 .antMatchers(this.examAPIDiscoveryEndpoint) | ||||
|                 .antMatchers(this.adminAPIEndpoint + API.INFO_ENDPOINT + API.LOGO_PATH_SEGMENT + "/**") | ||||
|                 .and(); | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ | |||
| package ch.ethz.seb.sebserver.gui; | ||||
| 
 | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.core.annotation.Order; | ||||
| import org.springframework.security.config.annotation.web.builders.HttpSecurity; | ||||
|  | @ -30,12 +31,15 @@ public class GuiWebsecurityConfig extends WebSecurityConfigurerAdapter { | |||
|     @Autowired | ||||
|     private InstitutionalAuthenticationEntryPoint institutionalAuthenticationEntryPoint; | ||||
| 
 | ||||
|     @Value("${sebserver.gui.entrypoint:/gui}") | ||||
|     private String guiEntryPoint; | ||||
| 
 | ||||
|     /** Gui-service related public URLS from spring web security perspective */ | ||||
|     public static final RequestMatcher PUBLIC_URLS = new OrRequestMatcher( | ||||
|             // OAuth entry-points | ||||
|             new AntPathRequestMatcher(API.OAUTH_REVOKE_TOKEN_ENDPOINT), | ||||
|             // GUI entry-point | ||||
|             new AntPathRequestMatcher("/gui"), | ||||
| //            new AntPathRequestMatcher(guiEntryPoint), | ||||
|             // RAP/RWT resources has to be accessible | ||||
|             new AntPathRequestMatcher("/rwt-resources/**"), | ||||
|             // project specific static resources | ||||
|  | @ -47,7 +51,8 @@ public class GuiWebsecurityConfig extends WebSecurityConfigurerAdapter { | |||
|     public void configure(final WebSecurity web) { | ||||
|         web | ||||
|                 .ignoring() | ||||
|                 .requestMatchers(PUBLIC_URLS); | ||||
|                 .requestMatchers(PUBLIC_URLS) | ||||
|                 .antMatchers(this.guiEntryPoint); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  |  | |||
|  | @ -65,21 +65,25 @@ final class InstitutionalAuthenticationEntryPoint implements AuthenticationEntry | |||
| 
 | ||||
|         final String logoImageBase64 = requestLogoImage(requestURI); | ||||
|         if (StringUtils.isNotBlank(logoImageBase64)) { | ||||
|             // forward | ||||
|             request.getSession().setAttribute(API.PARAM_LOGO_IMAGE, logoImageBase64); | ||||
|             final RequestDispatcher dispatcher = request.getServletContext() | ||||
|                     .getRequestDispatcher(this.guiEntryPoint); | ||||
|             dispatcher.forward(request, response); | ||||
|             // redirect | ||||
|         } else { | ||||
|             request.getSession().removeAttribute(API.PARAM_LOGO_IMAGE); | ||||
|             response.setStatus(HttpStatus.UNAUTHORIZED.value()); | ||||
|             response.sendRedirect(this.guiEntryPoint); | ||||
|         } | ||||
| 
 | ||||
|         final RequestDispatcher dispatcher = request.getServletContext() | ||||
|                 .getRequestDispatcher(this.guiEntryPoint); | ||||
|         dispatcher.forward(request, response); | ||||
|     } | ||||
| 
 | ||||
|     private String requestLogoImage(final String requestURI) { | ||||
|         log.debug("Trying to verify insitution from requested entrypoint url: {}", requestURI); | ||||
| 
 | ||||
|         final String instPrefix = requestURI.replaceAll("/", ""); | ||||
|         if (StringUtils.isBlank(instPrefix)) { | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
| 
 | ||||
|             final RestTemplate restTemplate = new RestTemplate(); | ||||
|  | @ -93,7 +97,7 @@ final class InstitutionalAuthenticationEntryPoint implements AuthenticationEntry | |||
|                             HttpMethod.GET, | ||||
|                             HttpEntity.EMPTY, | ||||
|                             String.class, | ||||
|                             requestURI.replaceAll("/", "")); | ||||
|                             instPrefix); | ||||
| 
 | ||||
|             if (exchange.getStatusCodeValue() == HttpStatus.OK.value()) { | ||||
|                 return exchange.getBody(); | ||||
|  |  | |||
|  | @ -27,6 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey; | |||
| import ch.ethz.seb.sebserver.gui.service.page.PageContext; | ||||
| import ch.ethz.seb.sebserver.gui.service.page.PageService; | ||||
| import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer; | ||||
| import ch.ethz.seb.sebserver.gui.service.page.impl.DefaultPageLayout; | ||||
| import ch.ethz.seb.sebserver.gui.service.page.impl.PageUtils; | ||||
| import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService; | ||||
| import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.ActivateInstitution; | ||||
|  | @ -129,7 +130,9 @@ public class InstitutionForm implements TemplateComposer { | |||
|                 .addField(FormBuilder.imageUpload( | ||||
|                         Domain.INSTITUTION.ATTR_LOGO_IMAGE, | ||||
|                         FORM_LOGO_IMAGE_TEXT_KEY, | ||||
|                         institution.logoImage)) | ||||
|                         institution.logoImage) | ||||
|                         .withMaxWidth(DefaultPageLayout.LOGO_IMAGE_MAX_WIDTH) | ||||
|                         .withMaxHeight(DefaultPageLayout.LOGO_IMAGE_MAX_HEIGHT)) | ||||
|                 .buildFor((isNew) | ||||
|                         ? this.restService.getRestCall(NewInstitution.class) | ||||
|                         : this.restService.getRestCall(SaveInstitution.class)); | ||||
|  |  | |||
|  | @ -18,10 +18,23 @@ import ch.ethz.seb.sebserver.gui.widget.ImageUpload; | |||
| 
 | ||||
| public final class ImageUploadFieldBuilder extends FieldBuilder<String> { | ||||
| 
 | ||||
|     private int maxWidth = 100; | ||||
|     private int maxHeight = 100; | ||||
| 
 | ||||
|     ImageUploadFieldBuilder(final String name, final LocTextKey label, final String value) { | ||||
|         super(name, label, value); | ||||
|     } | ||||
| 
 | ||||
|     public ImageUploadFieldBuilder withMaxWidth(final int width) { | ||||
|         this.maxWidth = width; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     public ImageUploadFieldBuilder withMaxHeight(final int height) { | ||||
|         this.maxHeight = height; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     void build(final FormBuilder builder) { | ||||
| 
 | ||||
|  | @ -35,7 +48,9 @@ public final class ImageUploadFieldBuilder extends FieldBuilder<String> { | |||
|         final ImageUpload imageUpload = builder.widgetFactory.imageUploadLocalized( | ||||
|                 fieldGrid, | ||||
|                 new LocTextKey("sebserver.overall.upload"), | ||||
|                 builder.readonly || this.readonly); | ||||
|                 builder.readonly || this.readonly, | ||||
|                 this.maxWidth, | ||||
|                 this.maxHeight); | ||||
|         final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false); | ||||
|         imageUpload.setLayoutData(gridData); | ||||
|         imageUpload.setImageBase64(this.value); | ||||
|  |  | |||
|  | @ -17,11 +17,14 @@ import org.apache.commons.lang3.StringUtils; | |||
| import org.eclipse.rap.rwt.RWT; | ||||
| import org.eclipse.swt.SWT; | ||||
| import org.eclipse.swt.graphics.Image; | ||||
| import org.eclipse.swt.graphics.ImageData; | ||||
| import org.eclipse.swt.graphics.Rectangle; | ||||
| import org.eclipse.swt.layout.GridData; | ||||
| import org.eclipse.swt.layout.GridLayout; | ||||
| import org.eclipse.swt.layout.RowLayout; | ||||
| import org.eclipse.swt.widgets.Button; | ||||
| import org.eclipse.swt.widgets.Composite; | ||||
| import org.eclipse.swt.widgets.Display; | ||||
| import org.eclipse.swt.widgets.Label; | ||||
| import org.eclipse.swt.widgets.MessageBox; | ||||
| import org.slf4j.Logger; | ||||
|  | @ -49,6 +52,9 @@ public class DefaultPageLayout implements TemplateComposer { | |||
| 
 | ||||
|     private static final Logger log = LoggerFactory.getLogger(DefaultPageLayout.class); | ||||
| 
 | ||||
|     public static final int LOGO_IMAGE_MAX_WIDTH = 400; | ||||
|     public static final int LOGO_IMAGE_MAX_HEIGHT = 80; | ||||
| 
 | ||||
|     private final WidgetFactory widgetFactory; | ||||
|     private final PolyglotPageService polyglotPageService; | ||||
|     private final AuthorizationContextHolder authorizationContextHolder; | ||||
|  | @ -155,9 +161,9 @@ public class DefaultPageLayout implements TemplateComposer { | |||
| 
 | ||||
|         final Composite logo = new Composite(logoBar, SWT.NONE); | ||||
|         final GridData logoCell = new GridData(SWT.LEFT, SWT.CENTER, true, true); | ||||
|         logoCell.minimumHeight = 80; | ||||
|         logoCell.heightHint = 80; | ||||
|         logoCell.minimumWidth = 400; | ||||
|         logoCell.minimumHeight = LOGO_IMAGE_MAX_HEIGHT; | ||||
|         logoCell.heightHint = LOGO_IMAGE_MAX_HEIGHT; | ||||
|         logoCell.minimumWidth = LOGO_IMAGE_MAX_WIDTH; | ||||
|         logoCell.horizontalIndent = 50; | ||||
|         logo.setLayoutData(logoCell); | ||||
| 
 | ||||
|  | @ -283,8 +289,19 @@ public class DefaultPageLayout implements TemplateComposer { | |||
|                     new ByteArrayInputStream(imageBase64.getBytes(StandardCharsets.UTF_8)), | ||||
|                     false); | ||||
| 
 | ||||
|             final Display display = pageContext.getShell().getDisplay(); | ||||
|             final Image image = new Image(display, input); | ||||
|             final Rectangle imageBounds = image.getBounds(); | ||||
|             final int width = (imageBounds.width > LOGO_IMAGE_MAX_WIDTH) | ||||
|                     ? LOGO_IMAGE_MAX_WIDTH | ||||
|                     : imageBounds.width; | ||||
|             final int height = (imageBounds.height > LOGO_IMAGE_MAX_HEIGHT) | ||||
|                     ? LOGO_IMAGE_MAX_HEIGHT | ||||
|                     : imageBounds.height; | ||||
|             final ImageData imageData = image.getImageData().scaledTo(width, height); | ||||
| 
 | ||||
|             logo.setData(RWT.CUSTOM_VARIANT, "bgLogoNoImage"); | ||||
|             logo.setBackgroundImage(new Image(pageContext.getShell().getDisplay(), input)); | ||||
|             logo.setBackgroundImage(new Image(display, imageData)); | ||||
| 
 | ||||
|         } catch (final Exception e) { | ||||
|             log.warn("Get institutional logo failed: {}", e.getMessage()); | ||||
|  |  | |||
|  | @ -32,6 +32,7 @@ import org.eclipse.swt.events.SelectionAdapter; | |||
| import org.eclipse.swt.events.SelectionEvent; | ||||
| import org.eclipse.swt.graphics.Image; | ||||
| import org.eclipse.swt.graphics.ImageData; | ||||
| import org.eclipse.swt.graphics.Rectangle; | ||||
| import org.eclipse.swt.layout.GridData; | ||||
| import org.eclipse.swt.layout.GridLayout; | ||||
| import org.eclipse.swt.widgets.Composite; | ||||
|  | @ -54,6 +55,9 @@ public final class ImageUpload extends Composite { | |||
| 
 | ||||
|     private final Composite imageCanvas; | ||||
|     private final FileUpload fileUpload; | ||||
|     private final int maxWidth; | ||||
|     private final int maxHeight; | ||||
| 
 | ||||
|     private Consumer<String> errorHandler; | ||||
|     private String imageBase64 = null; | ||||
|     private boolean loadNewImage = false; | ||||
|  | @ -63,12 +67,16 @@ public final class ImageUpload extends Composite { | |||
|             final Composite parent, | ||||
|             final ServerPushService serverPushService, | ||||
|             final I18nSupport i18nSupport, | ||||
|             final boolean readonly) { | ||||
|             final boolean readonly, | ||||
|             final int maxWidth, | ||||
|             final int maxHeight) { | ||||
| 
 | ||||
|         super(parent, SWT.NONE); | ||||
|         super.setLayout(new GridLayout(1, false)); | ||||
| 
 | ||||
|         this.serverPushService = serverPushService; | ||||
|         this.maxWidth = maxWidth; | ||||
|         this.maxHeight = maxHeight; | ||||
| 
 | ||||
|         if (!readonly) { | ||||
|             this.fileUpload = new FileUpload(this, SWT.NONE); | ||||
|  | @ -189,8 +197,14 @@ public final class ImageUpload extends Composite { | |||
|         imageUpload.imageCanvas.setData(RWT.CUSTOM_VARIANT, "bgLogoNoImage"); | ||||
| 
 | ||||
|         final Image image = new Image(imageUpload.imageCanvas.getDisplay(), input); | ||||
|         final ImageData imageData = image.getImageData().scaledTo(200, 100); | ||||
| 
 | ||||
|         final Rectangle imageBounds = image.getBounds(); | ||||
|         final int width = (imageBounds.width > imageUpload.maxWidth) | ||||
|                 ? imageUpload.maxWidth | ||||
|                 : imageBounds.width; | ||||
|         final int height = (imageBounds.height > imageUpload.maxHeight) | ||||
|                 ? imageUpload.maxHeight | ||||
|                 : imageBounds.height; | ||||
|         final ImageData imageData = image.getImageData().scaledTo(width, height); | ||||
|         imageUpload.imageCanvas.setBackgroundImage(new Image(imageUpload.imageCanvas.getDisplay(), imageData)); | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -48,6 +48,7 @@ import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport; | |||
| import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey; | ||||
| import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService; | ||||
| import ch.ethz.seb.sebserver.gui.service.page.PageService; | ||||
| import ch.ethz.seb.sebserver.gui.service.page.impl.DefaultPageLayout; | ||||
| import ch.ethz.seb.sebserver.gui.service.push.ServerPushService; | ||||
| 
 | ||||
| @Lazy | ||||
|  | @ -584,16 +585,33 @@ public class WidgetFactory { | |||
|         return thresholdList; | ||||
|     } | ||||
| 
 | ||||
|     public ImageUpload imageUploadLocalized( | ||||
|     public ImageUpload logoImageUploadLocalized( | ||||
|             final Composite parent, | ||||
|             final LocTextKey locTextKey, | ||||
|             final boolean readonly) { | ||||
| 
 | ||||
|         return imageUploadLocalized( | ||||
|                 parent, | ||||
|                 locTextKey, | ||||
|                 readonly, | ||||
|                 DefaultPageLayout.LOGO_IMAGE_MAX_WIDTH, | ||||
|                 DefaultPageLayout.LOGO_IMAGE_MAX_HEIGHT); | ||||
|     } | ||||
| 
 | ||||
|     public ImageUpload imageUploadLocalized( | ||||
|             final Composite parent, | ||||
|             final LocTextKey locTextKey, | ||||
|             final boolean readonly, | ||||
|             final int maxWidth, | ||||
|             final int maxHeight) { | ||||
| 
 | ||||
|         final ImageUpload imageUpload = new ImageUpload( | ||||
|                 parent, | ||||
|                 this.serverPushService, | ||||
|                 this.i18nSupport, | ||||
|                 readonly); | ||||
|                 readonly, | ||||
|                 maxWidth, | ||||
|                 maxHeight); | ||||
| 
 | ||||
|         this.polyglotPageService.injectI18n(imageUpload, locTextKey); | ||||
|         return imageUpload; | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 anhefti
						anhefti