/** * Copyright © 2015 Instituto Superior Técnico * * This file is part of Bennu OAuth. * * Bennu OAuth is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Bennu OAuth is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Bennu OAuth. If not, see <http://www.gnu.org/licenses/>. */ package org.fenixedu.bennu.oauth.domain; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.UUID; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.bennu.core.domain.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pt.ist.fenixframework.Atomic; import com.google.common.base.Function; import com.google.common.base.Strings; import com.google.common.collect.FluentIterable; import com.google.common.collect.Sets; import com.google.common.hash.Hashing; import com.google.common.io.ByteStreams; public class ExternalApplication extends ExternalApplication_Base { private static final Logger logger = LoggerFactory.getLogger(ExternalApplication.class); public ExternalApplication() { super(); init(); } protected void init() { setBennu(Bennu.getInstance()); setSecret(Base64.getEncoder().encodeToString( Hashing.sha512().hashBytes(UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8)).asBytes())); setState(ExternalApplicationState.ACTIVE); } public void setScopeList(List<ExternalApplicationScope> newScopes) { Set<ExternalApplicationScope> oldScopes = getScopesSet(); Set<ExternalApplicationScope> result = Sets.difference(Sets.newHashSet(newScopes), Sets.newHashSet(oldScopes)); if (result.size() > 0) { deleteAuthorizations(); } oldScopes.clear(); oldScopes.addAll(newScopes); } public void removeScope(ExternalApplicationScope scope) { List<ExternalApplicationScope> oldScopes = getScopeList(); if (oldScopes.contains(scope)) { oldScopes.remove(scope); setScopeList(oldScopes); } } public List<ExternalApplicationScope> getScopeList() { return new ArrayList<ExternalApplicationScope>(getScopesSet()); } public boolean matchesUrl(String redirectUrl) { return !Strings.isNullOrEmpty(redirectUrl) && redirectUrl.equals(getRedirectUrl()); } public boolean matchesSecret(String secret) { return !Strings.isNullOrEmpty(secret) && secret.equals(getSecret()); } public boolean matches(String redirectUrl, String secret) { return matchesUrl(redirectUrl) && matchesSecret(secret); } public ApplicationUserSession getApplicationUserSession(String code) { for (ApplicationUserSession applicationUserSession : getApplicationUserSessionSet()) { if (applicationUserSession.matchesCode(code)) { return applicationUserSession; } } return null; } public void deleteAuthorizations() { for (ApplicationUserAuthorization authorization : new HashSet<ApplicationUserAuthorization>( getApplicationUserAuthorizationSet())) { authorization.delete(); } } private Set<ApplicationUserSession> getApplicationUserSessionSet() { return FluentIterable.from(getApplicationUserAuthorizationSet()) .transformAndConcat(new Function<ApplicationUserAuthorization, Iterable<ApplicationUserSession>>() { @Override public Iterable<ApplicationUserSession> apply(ApplicationUserAuthorization auth) { return auth.getSessionSet(); } }).toSet(); } public InputStream getLogoStream() { return null; } public String getAuthorApplicationName() { String name = getAuthorName(); if (!Strings.isNullOrEmpty(name)) { return name; } else { return getAuthor().getDisplayName(); } } public void setLogoStream(InputStream stream) { try { if (stream != null) { byte[] byteArray = ByteStreams.toByteArray(stream); if (byteArray.length > 0) { setLogo(byteArray); } } } catch (IOException e) { logger.error(e.getMessage(), e); } } public Optional<ApplicationUserAuthorization> getApplicationUserAuthorization(User user) { return getApplicationUserAuthorizationSet().stream().filter(auth -> auth.getUser().equals(user)).findAny(); } @Override public ExternalApplicationState getState() { final ExternalApplicationState state = super.getState(); if (state == null) { setState(ExternalApplicationState.ACTIVE); } return super.getState(); } public boolean hasApplicationUserAuthorization(User user) { return getApplicationUserAuthorization(user).isPresent(); } public boolean isActive() { return getState().equals(ExternalApplicationState.ACTIVE); } public boolean isBanned() { return getState().equals(ExternalApplicationState.BANNED); } public boolean isDeleted() { return getState().equals(ExternalApplicationState.DELETED); } public boolean isEditable() { return isActive() || isBanned(); } @Override @Atomic public void setState(ExternalApplicationState state) { super.setState(state); } public void setActive() { setState(ExternalApplicationState.ACTIVE); } public void setBanned() { setState(ExternalApplicationState.BANNED); } public void setDeleted() { setState(ExternalApplicationState.DELETED); } @Override public String getSecret() { return super.getSecret(); } }