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…
Reference in a new issue