/**
* Copyright (c) 2008-2012 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sakaiproject.profile2.logic;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.Setter;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.sakaiproject.api.common.edu.person.SakaiPerson;
import org.sakaiproject.api.common.edu.person.SakaiPersonManager;
import org.sakaiproject.authz.api.SecurityAdvisor;
import org.sakaiproject.authz.api.SecurityAdvisor.SecurityAdvice;
import org.sakaiproject.authz.api.SecurityService;
import org.sakaiproject.component.api.ServerConfigurationService;
import org.sakaiproject.content.api.ContentHostingService;
import org.sakaiproject.content.api.ContentResource;
import org.sakaiproject.content.api.ContentResourceEdit;
import org.sakaiproject.email.api.EmailService;
import org.sakaiproject.emailtemplateservice.model.RenderedTemplate;
import org.sakaiproject.emailtemplateservice.service.EmailTemplateService;
import org.sakaiproject.entity.api.Entity;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.event.api.ActivityService;
import org.sakaiproject.event.api.EventTrackingService;
import org.sakaiproject.event.api.NotificationService;
import org.sakaiproject.exception.IdInvalidException;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.IdUsedException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.id.api.IdManager;
import org.sakaiproject.profile2.model.MimeTypeByteArray;
import org.sakaiproject.profile2.util.ProfileConstants;
import org.sakaiproject.profile2.util.ProfileUtils;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.api.SiteService;
import org.sakaiproject.site.api.SiteService.SelectionType;
import org.sakaiproject.site.api.SiteService.SortType;
import org.sakaiproject.site.api.ToolConfiguration;
import org.sakaiproject.tool.api.SessionManager;
import org.sakaiproject.tool.api.Tool;
import org.sakaiproject.tool.api.ToolManager;
import org.sakaiproject.user.api.User;
import org.sakaiproject.user.api.UserDirectoryService;
import org.sakaiproject.user.api.UserEdit;
import org.sakaiproject.user.api.UserNotDefinedException;
/**
* Implementation of SakaiProxy for Profile2.
*
* @author Steve Swinsburg (s.swinsburg@lancaster.ac.uk)
*
*/
public class SakaiProxyImpl implements SakaiProxy {
private static final Logger log = Logger.getLogger(SakaiProxyImpl.class);
/**
* {@inheritDoc}
*/
public String getCurrentSiteId(){
return toolManager.getCurrentPlacement().getContext();
}
/**
* {@inheritDoc}
*/
public String getCurrentUserId() {
return sessionManager.getCurrentSessionUserId();
}
/**
* {@inheritDoc}
*/
public User getCurrentUser() {
return userDirectoryService.getCurrentUser();
}
/**
* {@inheritDoc}
*/
public String getUserEid(String userId){
String eid = null;
try {
eid = userDirectoryService.getUser(userId).getEid();
} catch (UserNotDefinedException e) {
log.warn("Cannot get eid for id: " + userId + " : " + e.getClass() + " : " + e.getMessage());
}
return eid;
}
/**
* {@inheritDoc}
*/
public String getUserIdForEid(String eid) {
String userUuid = null;
try {
userUuid = userDirectoryService.getUserByEid(eid).getId();
} catch (UserNotDefinedException e) {
log.warn("Cannot get id for eid: " + eid + " : " + e.getClass() + " : " + e.getMessage());
}
return userUuid;
}
/**
* {@inheritDoc}
*/
public String getUserDisplayName(String userId) {
String name = null;
try {
name = userDirectoryService.getUser(userId).getDisplayName();
} catch (UserNotDefinedException e) {
log.warn("Cannot get displayname for id: " + userId + " : " + e.getClass() + " : " + e.getMessage());
}
return name;
}
/**
* {@inheritDoc}
*/
public String getUserFirstName(String userId) {
String email = null;
try {
email = userDirectoryService.getUser(userId).getFirstName();
} catch (UserNotDefinedException e) {
log.warn("Cannot get first name for id: " + userId + " : " + e.getClass() + " : " + e.getMessage());
}
return email;
}
/**
* {@inheritDoc}
*/
public String getUserLastName(String userId) {
String email = null;
try {
email = userDirectoryService.getUser(userId).getLastName();
} catch (UserNotDefinedException e) {
log.warn("Cannot get last name for id: " + userId + " : " + e.getClass() + " : " + e.getMessage());
}
return email;
}
/**
* {@inheritDoc}
*/
public String getUserEmail(String userId) {
String email = null;
try {
email = userDirectoryService.getUser(userId).getEmail();
} catch (UserNotDefinedException e) {
log.warn("Cannot get email for id: " + userId + " : " + e.getClass() + " : " + e.getMessage());
}
return email;
}
/**
* {@inheritDoc}
*/
public boolean checkForUser(String userId) {
User u = null;
try {
u = userDirectoryService.getUser(userId);
if (u != null) {
return true;
}
} catch (UserNotDefinedException e) {
log.info("User with id: " + userId + " does not exist : " + e.getClass() + " : " + e.getMessage());
}
return false;
}
/**
* {@inheritDoc}
*/
public boolean checkForUserByEid(String eid) {
User u = null;
try {
u = userDirectoryService.getUserByEid(eid);
if (u != null) {
return true;
}
} catch (UserNotDefinedException e) {
log.info("User with eid: " + eid + " does not exist : " + e.getClass() + " : " + e.getMessage());
}
return false;
}
/**
* {@inheritDoc}
*/
public boolean isSuperUser() {
return securityService.isSuperUser();
}
/**
* {@inheritDoc}
*/
public boolean isAdminUser() {
return StringUtils.equals(sessionManager.getCurrentSessionUserId(), UserDirectoryService.ADMIN_ID);
}
/**
* {@inheritDoc}
*/
public boolean isSuperUserAndProxiedToUser(String userId) {
return (isSuperUser() && !StringUtils.equals(userId, getCurrentUserId()));
}
/**
* {@inheritDoc}
*/
public String getUserType(String userId) {
String type = null;
try {
type = userDirectoryService.getUser(userId).getType();
} catch (UserNotDefinedException e) {
log.info("User with eid: " + userId + " does not exist : " + e.getClass() + " : " + e.getMessage());
}
return type;
}
/**
* {@inheritDoc}
*/
public User getUserById(String userId) {
User u = null;
try {
u = userDirectoryService.getUser(userId);
} catch (UserNotDefinedException e) {
log.info("User with id: " + userId + " does not exist : " + e.getClass() + " : " + e.getMessage());
}
return u;
}
/**
* {@inheritDoc}
*/
public User getUserQuietly(String userId) {
User u = null;
try {
u = userDirectoryService.getUser(userId);
} catch (UserNotDefinedException e) {
//carry on, no log output. see javadoc for reason.
}
return u;
}
/**
* {@inheritDoc}
*/
public String getCurrentToolTitle() {
Tool tool = toolManager.getCurrentTool();
if(tool != null)
return tool.getTitle();
else
return "Profile";
}
/**
* {@inheritDoc}
*/
public List<User> getUsers(List<String> userIds) {
return userDirectoryService.getUsers(userIds);
}
/**
* {@inheritDoc}
*/
public List<String> getUuids(List<User> users) {
List<String> uuids = new ArrayList<String>();
for(User u: users){
uuids.add(u.getId());
}
return uuids;
}
/**
* {@inheritDoc}
*/
public SakaiPerson getSakaiPerson(String userId) {
SakaiPerson sakaiPerson = null;
try {
sakaiPerson = sakaiPersonManager.getSakaiPerson(userId, sakaiPersonManager.getUserMutableType());
} catch (Exception e) {
log.error("SakaiProxy.getSakaiPerson(): Couldn't get SakaiPerson for: " + userId + " : " + e.getClass() + " : " + e.getMessage());
}
return sakaiPerson;
}
/**
* {@inheritDoc}
*/
public byte[] getSakaiPersonJpegPhoto(String userId) {
SakaiPerson sakaiPerson = null;
byte[] image = null;
try {
//try normal user type
sakaiPerson = sakaiPersonManager.getSakaiPerson(userId, sakaiPersonManager.getUserMutableType());
if(sakaiPerson != null) {
image = sakaiPerson.getJpegPhoto();
}
//if null try system user type as a profile might have been created with this type
if(image == null) {
sakaiPerson = sakaiPersonManager.getSakaiPerson(userId, sakaiPersonManager.getSystemMutableType());
if(sakaiPerson != null) {
image = sakaiPerson.getJpegPhoto();
}
}
} catch (Exception e) {
log.error("SakaiProxy.getSakaiPersonJpegPhoto(): Couldn't get SakaiPerson Jpeg photo for: " + userId + " : " + e.getClass() + " : " + e.getMessage());
}
return image;
}
/**
* {@inheritDoc}
*/
public String getSakaiPersonImageUrl(String userId) {
SakaiPerson sakaiPerson = null;
String url = null;
try {
//try normal user type
sakaiPerson = sakaiPersonManager.getSakaiPerson(userId, sakaiPersonManager.getUserMutableType());
if(sakaiPerson != null) {
url = sakaiPerson.getPictureUrl();
}
//if null try system user type as a profile might have been created with this type
if(StringUtils.isBlank(url)) {
sakaiPerson = sakaiPersonManager.getSakaiPerson(userId, sakaiPersonManager.getSystemMutableType());
if(sakaiPerson != null) {
url = sakaiPerson.getPictureUrl();
}
}
} catch (Exception e) {
log.error("SakaiProxy.getSakaiPersonImageUrl(): Couldn't get SakaiPerson image URL for: " + userId + " : " + e.getClass() + " : " + e.getMessage());
}
return url;
}
/**
* {@inheritDoc}
*/
public SakaiPerson getSakaiPersonPrototype() {
SakaiPerson sakaiPerson = null;
try {
sakaiPerson = sakaiPersonManager.getPrototype();
} catch (Exception e) {
log.error("SakaiProxy.getSakaiPersonPrototype(): Couldn't get SakaiPerson prototype: " + e.getClass() + " : " + e.getMessage());
}
return sakaiPerson;
}
/**
* {@inheritDoc}
*/
public SakaiPerson createSakaiPerson(String userId) {
SakaiPerson sakaiPerson = null;
try {
sakaiPerson = sakaiPersonManager.create(userId, sakaiPersonManager.getUserMutableType());
} catch (Exception e) {
log.error("SakaiProxy.createSakaiPerson(): Couldn't create SakaiPerson: " + e.getClass() + " : " + e.getMessage());
}
return sakaiPerson;
}
/**
* {@inheritDoc}
*/
public boolean updateSakaiPerson(SakaiPerson sakaiPerson) {
//the save is void, so unless it throws an exception, its ok (?)
//I'd prefer a return value from sakaiPersonManager. this wraps it.
try {
sakaiPersonManager.save(sakaiPerson);
return true;
} catch (Exception e) {
log.error("SakaiProxy.updateSakaiPerson(): Couldn't update SakaiPerson: " + e.getClass() + " : " + e.getMessage());
e.printStackTrace();
}
return false;
}
/**
* {@inheritDoc}
*/
public int getMaxProfilePictureSize() {
return serverConfigurationService.getInt("profile2.picture.max", ProfileConstants.MAX_IMAGE_UPLOAD_SIZE);
}
private String getProfileGalleryPath(String userId) {
String slash = Entity.SEPARATOR;
StringBuilder path = new StringBuilder();
path.append(slash);
path.append("private");
path.append(slash);
path.append("profileGallery");
path.append(slash);
path.append(userId);
path.append(slash);
return path.toString();
}
/**
* {@inheritDoc}
*/
public String getProfileGalleryImagePath(String userId, String imageId) {
StringBuilder path = new StringBuilder(getProfileGalleryPath(userId));
path.append(ProfileConstants.GALLERY_IMAGE_MAIN);
path.append(Entity.SEPARATOR);
path.append(imageId);
return path.toString();
}
/**
* {@inheritDoc}
*/
public String getProfileGalleryThumbnailPath(String userId, String imageId) {
StringBuilder path = new StringBuilder(getProfileGalleryPath(userId));
path.append(ProfileConstants.GALLERY_IMAGE_THUMBNAILS);
path.append(Entity.SEPARATOR);
path.append(imageId);
return path.toString();
}
/**
* {@inheritDoc}
*/
public String getProfileImageResourcePath(String userId, int type) {
String slash = Entity.SEPARATOR;
StringBuilder path = new StringBuilder();
path.append(slash);
path.append("private");
path.append(slash);
path.append("profileImages");
path.append(slash);
path.append(userId);
path.append(slash);
path.append(type);
path.append(slash);
path.append(ProfileUtils.generateUuid());
return path.toString();
}
/**
* {@inheritDoc}
*/
public boolean saveFile(String fullResourceId, String userId, String fileName, String mimeType, byte[] fileData) {
ContentResourceEdit resource = null;
boolean result = true;
try {
enableSecurityAdvisor();
try {
resource = contentHostingService.addResource(fullResourceId);
resource.setContentType(mimeType);
resource.setContent(fileData);
ResourceProperties props = resource.getPropertiesEdit();
props.addProperty(ResourceProperties.PROP_CONTENT_TYPE, mimeType);
props.addProperty(ResourceProperties.PROP_DISPLAY_NAME, fileName);
props.addProperty(ResourceProperties.PROP_CREATOR, userId);
resource.getPropertiesEdit().set(props);
contentHostingService.commitResource(resource, NotificationService.NOTI_NONE);
result = true;
}
catch (IdUsedException e){
contentHostingService.cancelResource(resource);
log.error("SakaiProxy.saveFile(): id= " + fullResourceId + " is in use : " + e.getClass() + " : " + e.getMessage());
result = false;
}
catch (Exception e){
contentHostingService.cancelResource(resource);
log.error("SakaiProxy.saveFile(): failed: " + e.getClass() + " : " + e.getMessage());
result = false;
}
} catch (Exception e) {
log.error("SakaiProxy.saveFile():" + e.getClass() + ":" + e.getMessage());
result = false;
} finally {
disableSecurityAdvisor();
}
return result;
}
/**
* {@inheritDoc}
*/
public MimeTypeByteArray getResource(String resourceId) {
MimeTypeByteArray mtba = new MimeTypeByteArray();
if(StringUtils.isBlank(resourceId)) {
return null;
}
try {
enableSecurityAdvisor();
try {
ContentResource resource = contentHostingService.getResource(resourceId);
if(resource == null){
return null;
}
mtba.setBytes(resource.getContent());
mtba.setMimeType(resource.getContentType());
return mtba;
}
catch(Exception e){
log.error("SakaiProxy.getResource() failed for resourceId: " + resourceId + " : " + e.getClass() + " : " + e.getMessage());
}
} catch (Exception e) {
log.error("SakaiProxy.getResource():" + e.getClass() + ":" + e.getMessage());
}
finally {
disableSecurityAdvisor();
}
return null;
}
/**
* {@inheritDoc}
*/
public boolean removeResource(String resourceId) {
boolean result = false;
try {
enableSecurityAdvisor();
contentHostingService.removeResource(resourceId);
result = true;
} catch (Exception e) {
log.error("SakaiProxy.removeResource() failed for resourceId "
+ resourceId + ": " + e.getMessage());
return false;
} finally {
disableSecurityAdvisor();
}
return result;
}
/**
* {@inheritDoc}
*/
public List<User> searchUsers(String search) {
return userDirectoryService.searchUsers(search, ProfileConstants.FIRST_RECORD, ProfileConstants.MAX_RECORDS);
}
/**
* {@inheritDoc}
*/
public List<User> searchExternalUsers(String search) {
return userDirectoryService.searchExternalUsers(search, ProfileConstants.FIRST_RECORD, ProfileConstants.MAX_RECORDS);
}
/**
* {@inheritDoc}
*/
public void postEvent(String event,String reference,boolean modify) {
eventTrackingService.post(eventTrackingService.newEvent(event,reference,modify));
}
/**
* {@inheritDoc}
*/
public void sendEmail(final String userId, final String subject, String message) {
class EmailSender {
private String userId;
private String subject;
private String message;
public final String MULTIPART_BOUNDARY = "======sakai-multi-part-boundary======";
public final String BOUNDARY_LINE = "\n\n--"+MULTIPART_BOUNDARY+"\n";
public final String TERMINATION_LINE = "\n\n--"+MULTIPART_BOUNDARY+"--\n\n";
public final String MIME_ADVISORY = "This message is for MIME-compliant mail readers.";
public final String PLAIN_TEXT_HEADERS= "Content-Type: text/plain\n\n";
public final String HTML_HEADERS = "Content-Type: text/html; charset=ISO-8859-1\n\n";
public final String HTML_END = "\n </body>\n</html>\n";
public EmailSender(String userId, String subject, String message) {
this.userId = userId;
this.subject = subject;
this.message = message;
}
//do it!
public void send() {
try {
//get User to send to
User user = userDirectoryService.getUser(userId);
if (StringUtils.isBlank(user.getEmail())){
log.error("SakaiProxy.sendEmail() failed. No email for userId: " + userId);
return;
}
//do it
emailService.sendToUsers(Collections.singleton(user), getHeaders(user.getEmail(), subject), formatMessage(subject, message));
log.info("Email sent to: " + userId);
} catch (UserNotDefinedException e) {
log.error("SakaiProxy.sendEmail() failed for userId: " + userId + " : " + e.getClass() + " : " + e.getMessage());
}
}
/** helper methods for formatting the message */
private String formatMessage(String subject, String message) {
StringBuilder sb = new StringBuilder();
sb.append(MIME_ADVISORY);
sb.append(BOUNDARY_LINE);
sb.append(PLAIN_TEXT_HEADERS);
sb.append(StringEscapeUtils.escapeHtml(message));
sb.append(BOUNDARY_LINE);
sb.append(HTML_HEADERS);
sb.append(htmlPreamble(subject));
sb.append(message);
sb.append(HTML_END);
sb.append(TERMINATION_LINE);
return sb.toString();
}
private String htmlPreamble(String subject) {
StringBuilder sb = new StringBuilder();
sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n");
sb.append("\"http://www.w3.org/TR/html4/loose.dtd\">\n");
sb.append("<html>\n");
sb.append("<head><title>");
sb.append(subject);
sb.append("</title></head>\n");
sb.append("<body>\n");
return sb.toString();
}
private List<String> getHeaders(String emailTo, String subject){
List<String> headers = new ArrayList<String>();
headers.add("MIME-Version: 1.0");
headers.add("Content-Type: multipart/alternative; boundary=\""+MULTIPART_BOUNDARY+"\"");
headers.add(formatSubject(subject));
headers.add(getFrom());
if (StringUtils.isNotBlank(emailTo)) {
headers.add("To: " + emailTo);
}
return headers;
}
private String getFrom(){
StringBuilder sb = new StringBuilder();
sb.append("From: ");
sb.append(getServiceName());
sb.append(" <no-reply@");
sb.append(getServerName());
sb.append(">");
return sb.toString();
}
private String formatSubject(String subject) {
StringBuilder sb = new StringBuilder();
sb.append("Subject: ");
sb.append(subject);
return sb.toString();
}
}
//instantiate class to format, then send the mail
new EmailSender(userId, subject, message).send();
}
/**
* {@inheritDoc}
*/
public void sendEmail(List<String> userIds, final String emailTemplateKey, final Map<String,String> replacementValues) {
//get list of Users
final List<User> users = new ArrayList<User>(getUsers(userIds));
//only ever use one thread whether sending to one user or many users
Thread sendMailThread = new Thread() {
public void run() {
//get the rendered template for each user
RenderedTemplate template = null;
for(User user : users) {
log.info("SakaiProxy.sendEmail() attempting to send email to: " + user.getId());
try {
template = emailTemplateService.getRenderedTemplateForUser(emailTemplateKey, user.getReference(), replacementValues);
if (template == null) {
log.error("SakaiProxy.sendEmail() no template with key: " + emailTemplateKey);
return; //no template
}
}
catch (Exception e) {
log.error("SakaiProxy.sendEmail() error retrieving template for user: " + user.getId() + " with key: " + emailTemplateKey + " : " + e.getClass() + " : " + e.getMessage());
continue; //try next user
}
//send
sendEmail(user.getId(), template.getRenderedSubject(), template.getRenderedHtmlMessage());
}
}
};
sendMailThread.start();
}
/**
* {@inheritDoc}
*/
public void sendEmail(String userId, String emailTemplateKey, Map<String,String> replacementValues) {
sendEmail(Collections.singletonList(userId), emailTemplateKey, replacementValues);
}
/**
* {@inheritDoc}
*/
public String getServerName() {
return serverConfigurationService.getServerName();
}
/**
* {@inheritDoc}
*/
public String getPortalUrl() {
return serverConfigurationService.getPortalUrl();
}
/**
* {@inheritDoc}
*/
public String getServerUrl() {
return serverConfigurationService.getServerUrl();
}
/**
* {@inheritDoc}
*/
public String getFullPortalUrl() {
return getServerUrl() + getPortalPath();
}
/**
* {@inheritDoc}
*/
public String getPortalPath() {
return serverConfigurationService.getString("portalPath", "/portal");
}
/**
* {@inheritDoc}
*/
public boolean isUsingNormalPortal() {
return StringUtils.equals(getPortalPath(), "/portal");
}
/**
* {@inheritDoc}
*/
public String getUserHomeUrl() {
return serverConfigurationService.getUserHomeUrl();
}
/**
* {@inheritDoc}
*/
public String getServiceName() {
return serverConfigurationService.getString("ui.service", ProfileConstants.SAKAI_PROP_SERVICE_NAME);
}
/**
* {@inheritDoc}
*/
public void updateEmailForUser(String userId, String email) {
try {
UserEdit userEdit = null;
userEdit = userDirectoryService.editUser(userId);
userEdit.setEmail(email);
userDirectoryService.commitEdit(userEdit);
log.info("User email updated for: " + userId);
}
catch (Exception e) {
log.error("SakaiProxy.updateEmailForUser() failed for userId: " + userId + " : " + e.getClass() + " : " + e.getMessage());
}
}
/**
* {@inheritDoc}
*/
public void updateNameForUser(String userId, String firstName, String lastName) {
try {
UserEdit userEdit = null;
userEdit = userDirectoryService.editUser(userId);
userEdit.setFirstName(firstName);
userEdit.setLastName(lastName);
userDirectoryService.commitEdit(userEdit);
log.info("User name details updated for: " + userId);
}
catch (Exception e) {
log.error("SakaiProxy.updateNameForUser() failed for userId: " + userId + " : " + e.getClass() + " : " + e.getMessage());
}
}
/**
* {@inheritDoc}
*/
public String getDirectUrlToUserProfile(final String userId, final String extraParams) {
String portalUrl = getFullPortalUrl();
String siteId = getUserMyWorkspace(userId);
ToolConfiguration toolConfig = getFirstInstanceOfTool(siteId, ProfileConstants.TOOL_ID);
if(toolConfig == null) {
//if the user doesn't have the Profile2 tool installed in their My Workspace,
log.warn("SakaiProxy.getDirectUrlToUserProfile() failed to find " + ProfileConstants.TOOL_ID + " installed in My Workspace for userId: " + userId);
//just return a link to their My Workspace
StringBuilder url = new StringBuilder();
url.append(portalUrl);
url.append("/site/");
url.append(siteId);
return url.toString();
}
String pageId = toolConfig.getPageId();
String placementId = toolConfig.getId();
try {
StringBuilder url = new StringBuilder();
url.append(portalUrl);
url.append("/site/");
url.append(siteId);
url.append("/page/");
url.append(pageId);
//only if we have params to add
if(StringUtils.isNotBlank(extraParams)) {
url.append("?toolstate-");
url.append(placementId);
url.append("=");
url.append(URLEncoder.encode(extraParams,"UTF-8"));
}
return url.toString();
}
catch(Exception e) {
log.error("SakaiProxy.getDirectUrl():" + e.getClass() + ":" + e.getMessage());
return null;
}
}
/**
* {@inheritDoc}
*/
public boolean isAccountUpdateAllowed(String userId) {
try {
UserEdit edit = userDirectoryService.editUser(userId);
userDirectoryService.cancelEdit(edit);
return true;
}
catch (Exception e) {
log.info("SakaiProxy.isAccountUpdateAllowed() false for userId: " + userId);
return false;
}
}
/**
* {@inheritDoc}
*/
public boolean isBusinessProfileEnabled() {
return serverConfigurationService.getBoolean(
"profile2.profile.business.enabled",
ProfileConstants.SAKAI_PROP_PROFILE2_PROFILE_BUSINESS_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isSocialProfileEnabled() {
return serverConfigurationService.getBoolean(
"profile2.profile.social.enabled",
ProfileConstants.SAKAI_PROP_PROFILE2_PROFILE_SOCIAL_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isInterestsProfileEnabled() {
return serverConfigurationService.getBoolean(
"profile2.profile.interests.enabled",
ProfileConstants.SAKAI_PROP_PROFILE2_PROFILE_INTERESTS_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isStaffProfileEnabled() {
return serverConfigurationService.getBoolean(
"profile2.profile.staff.enabled",
ProfileConstants.SAKAI_PROP_PROFILE2_PROFILE_STAFF_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isStudentProfileEnabled() {
return serverConfigurationService.getBoolean(
"profile2.profile.student.enabled",
ProfileConstants.SAKAI_PROP_PROFILE2_PROFILE_STUDENT_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isWallEnabledGlobally() {
return serverConfigurationService.getBoolean(
"profile2.wall.enabled",
ProfileConstants.SAKAI_PROP_PROFILE2_WALL_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isWallDefaultProfilePage() {
return serverConfigurationService.getBoolean(
"profile2.wall.default",
ProfileConstants.SAKAI_PROP_PROFILE2_WALL_DEFAULT);
}
/**
* {@inheritDoc}
*/
public boolean isProfileConversionEnabled() {
return serverConfigurationService.getBoolean("profile2.convert", ProfileConstants.SAKAI_PROP_PROFILE2_CONVERSION_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isProfileImageImportEnabled() {
return serverConfigurationService.getBoolean("profile2.import.images", ProfileConstants.SAKAI_PROP_PROFILE2_IMPORT_IMAGES_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isProfileImportEnabled() {
return serverConfigurationService.getBoolean("profile2.import", ProfileConstants.SAKAI_PROP_PROFILE2_IMPORT_ENABLED);
}
/**
* {@inheritDoc}
*/
public String getProfileImportCsvPath() {
return serverConfigurationService.getString("profile2.import.csv", null);
}
/**
* {@inheritDoc}
*/
public boolean isTwitterIntegrationEnabledGlobally() {
return serverConfigurationService.getBoolean("profile2.integration.twitter.enabled", ProfileConstants.SAKAI_PROP_PROFILE2_TWITTER_INTEGRATION_ENABLED);
}
/**
* {@inheritDoc}
*/
public String getTwitterSource() {
return serverConfigurationService.getString("profile2.integration.twitter.source", ProfileConstants.SAKAI_PROP_PROFILE2_TWITTER_INTEGRATION_SOURCE);
}
/**
* {@inheritDoc}
*/
public boolean isProfileGalleryEnabledGlobally() {
return serverConfigurationService.getBoolean("profile2.gallery.enabled", ProfileConstants.SAKAI_PROP_PROFILE2_GALLERY_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isMessagingEnabledGlobally() {
return serverConfigurationService.getBoolean("profile2.messaging.enabled", true);
}
/**
* {@inheritDoc}
*/
public boolean isProfilePictureChangeEnabled() {
// PRFL-395: Ability to enable/disable profile picture change per user type
boolean globallyEnabled = serverConfigurationService.getBoolean("profile2.picture.change.enabled", ProfileConstants.SAKAI_PROP_PROFILE2_PICTURE_CHANGE_ENABLED);
String userType = getUserType(getCurrentUserId());
// return user type specific setting, defaulting to global one
return serverConfigurationService.getBoolean("profile2.picture.change." + userType + ".enabled", globallyEnabled);
}
/**
* {@inheritDoc}
*/
public int getProfilePictureType() {
String pictureType = serverConfigurationService.getString("profile2.picture.type", ProfileConstants.PICTURE_SETTING_UPLOAD_PROP);
//if 'upload'
if(pictureType.equals(ProfileConstants.PICTURE_SETTING_UPLOAD_PROP)) {
return ProfileConstants.PICTURE_SETTING_UPLOAD;
}
//if 'url'
else if(pictureType.equals(ProfileConstants.PICTURE_SETTING_URL_PROP)) {
return ProfileConstants.PICTURE_SETTING_URL;
}
//if 'official'
else if(pictureType.equals(ProfileConstants.PICTURE_SETTING_OFFICIAL_PROP)) {
return ProfileConstants.PICTURE_SETTING_OFFICIAL;
}
//gravatar is not an enforceable setting, hence no block here. it is purely a user preference.
//but can be disabled
//otherwise return default
else {
return ProfileConstants.PICTURE_SETTING_DEFAULT;
}
}
/**
* {@inheritDoc}
*/
public List<String> getAcademicEntityConfigurationSet() {
String configuration = serverConfigurationService.getString("profile2.profile.entity.set.academic", ProfileConstants.ENTITY_SET_ACADEMIC);
String[] parameters = StringUtils.split(configuration, ',');
List<String> tempList = Arrays.asList(parameters);
List<String> list = new ArrayList<String>(tempList);
return list;
}
/**
* {@inheritDoc}
*/
public List<String> getMinimalEntityConfigurationSet() {
String configuration = serverConfigurationService.getString("profile2.profile.entity.set.minimal", ProfileConstants.ENTITY_SET_MINIMAL);
String[] parameters = StringUtils.split(configuration, ',');
List<String> tempList = Arrays.asList(parameters);
List<String> list = new ArrayList<String>(tempList);
return list;
}
/**
* {@inheritDoc}
*/
public String ensureUuid(String userId) {
//check for userId
try {
User u = userDirectoryService.getUser(userId);
if(u != null){
return userId;
}
} catch (UserNotDefinedException e) {
//do nothing, this is fine, cotninue to next check
}
//check for eid
try {
User u = userDirectoryService.getUserByEid(userId);
if(u != null){
return u.getId();
}
} catch (UserNotDefinedException e) {
//do nothing, this is fine, continue
}
log.error("User: " + userId + " could not be found in any lookup by either id or eid");
return null;
}
/**
* {@inheritDoc}
*/
public boolean currentUserMatchesRequest(String userUuid) {
//get current user
String currentUserUuid = getCurrentUserId();
//check match
if(StringUtils.equals(currentUserUuid, userUuid)) {
return true;
}
return false;
}
/**
* {@inheritDoc}
*/
public boolean isPrivacyChangeAllowedGlobally() {
return serverConfigurationService.getBoolean("profile2.privacy.change.enabled", ProfileConstants.SAKAI_PROP_PROFILE2_PRIVACY_CHANGE_ENABLED);
}
/**
* {@inheritDoc}
*/
public HashMap<String, Object> getOverriddenPrivacySettings() {
HashMap<String, Object> props = new HashMap<String, Object>();
props.put("profileImage", serverConfigurationService.getInt("profile2.privacy.default.profileImage", ProfileConstants.DEFAULT_PRIVACY_OPTION_PROFILEIMAGE));
props.put("basicInfo", serverConfigurationService.getInt("profile2.privacy.default.basicInfo", ProfileConstants.DEFAULT_PRIVACY_OPTION_BASICINFO));
props.put("contactInfo", serverConfigurationService.getInt("profile2.privacy.default.contactInfo", ProfileConstants.DEFAULT_PRIVACY_OPTION_CONTACTINFO));
props.put("staffInfo", serverConfigurationService.getInt("profile2.privacy.default.staffInfo", ProfileConstants.DEFAULT_PRIVACY_OPTION_STAFFINFO));
props.put("studentInfo", serverConfigurationService.getInt("profile2.privacy.default.studentInfo", ProfileConstants.DEFAULT_PRIVACY_OPTION_STUDENTINFO));
props.put("personalInfo", serverConfigurationService.getInt("profile2.privacy.default.personalInfo", ProfileConstants.DEFAULT_PRIVACY_OPTION_PERSONALINFO));
props.put("birthYear", serverConfigurationService.getBoolean("profile2.privacy.default.birthYear", ProfileConstants.DEFAULT_BIRTHYEAR_VISIBILITY));
props.put("myFriends", serverConfigurationService.getInt("profile2.privacy.default.myFriends", ProfileConstants.DEFAULT_PRIVACY_OPTION_MYFRIENDS));
props.put("myStatus", serverConfigurationService.getInt("profile2.privacy.default.myStatus", ProfileConstants.DEFAULT_PRIVACY_OPTION_MYSTATUS));
props.put("myPictures", serverConfigurationService.getInt("profile2.privacy.default.myPictures", ProfileConstants.DEFAULT_PRIVACY_OPTION_MYPICTURES));
props.put("messages", serverConfigurationService.getInt("profile2.privacy.default.messages", ProfileConstants.DEFAULT_PRIVACY_OPTION_MESSAGES));
props.put("businessInfo", serverConfigurationService.getInt("profile2.privacy.default.businessInfo", ProfileConstants.DEFAULT_PRIVACY_OPTION_BUSINESSINFO));
props.put("myKudos", serverConfigurationService.getInt("profile2.privacy.default.myKudos", ProfileConstants.DEFAULT_PRIVACY_OPTION_MYKUDOS));
props.put("myWall", serverConfigurationService.getInt("profile2.privacy.default.myWall", ProfileConstants.DEFAULT_PRIVACY_OPTION_MYWALL));
props.put("socialInfo", serverConfigurationService.getInt("profile2.privacy.default.socialInfo", ProfileConstants.DEFAULT_PRIVACY_OPTION_SOCIALINFO));
props.put("onlineStatus", serverConfigurationService.getInt("profile2.privacy.default.onlineStatus", ProfileConstants.DEFAULT_PRIVACY_OPTION_ONLINESTATUS));
return props;
}
/**
* {@inheritDoc}
*/
public List<String> getInvisibleUsers() {
String config = serverConfigurationService.getString("profile2.invisible.users", ProfileConstants.SAKAI_PROP_INVISIBLE_USERS);
return ProfileUtils.getListFromString(config, ProfileConstants.SAKAI_PROP_LIST_SEPARATOR);
}
/**
* {@inheritDoc}
*/
public boolean isConnectionAllowedBetweenUserTypes(String requestingUserType, String targetUserType) {
if(isSuperUser()){
return true;
}
String configuration = serverConfigurationService.getString("profile2.allowed.connection.usertypes." + requestingUserType);
if(StringUtils.isBlank(configuration)) {
return true;
}
String[] values = StringUtils.split(configuration, ',');
List<String> valueList = Arrays.asList(values);
if(valueList.contains(targetUserType)){
return true;
}
return false;
}
/**
* {@inheritDoc}
*/
public boolean toggleProfileLocked(String userId, boolean locked) {
SakaiPerson sp = getSakaiPerson(userId);
if(sp == null) {
return false;
}
sp.setLocked(locked);
if(updateSakaiPerson(sp)){
return true;
}
return false;
}
/**
* {@inheritDoc}
*/
public boolean isOfficialImageEnabledGlobally() {
return serverConfigurationService.getBoolean("profile2.official.image.enabled", ProfileConstants.SAKAI_PROP_PROFILE2_OFFICIAL_IMAGE_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isUsingOfficialImageButAlternateSelectionEnabled() {
if(isOfficialImageEnabledGlobally() &&
getProfilePictureType() != ProfileConstants.PICTURE_SETTING_OFFICIAL &&
isProfilePictureChangeEnabled()) {
return true;
}
return false;
}
/**
* {@inheritDoc}
*/
public String getOfficialImageSource() {
return serverConfigurationService.getString("profile2.official.image.source", ProfileConstants.OFFICIAL_IMAGE_SETTING_DEFAULT);
}
/**
* {@inheritDoc}
*/
public String getOfficialImagesDirectory() {
return serverConfigurationService.getString("profile2.official.image.directory", "/official-photos");
}
/**
* {@inheritDoc}
*/
public String getOfficialImagesFileSystemPattern() {
return serverConfigurationService.getString("profile2.official.image.directory.pattern", "TWO_DEEP");
}
/**
* {@inheritDoc}
*/
public String getOfficialImageAttribute() {
return serverConfigurationService.getString("profile2.official.image.attribute", ProfileConstants.USER_PROPERTY_JPEG_PHOTO);
}
/**
* {@inheritDoc}
*/
public String createUuid() {
return idManager.createUuid();
}
/**
* {@inheritDoc}
*/
public boolean isUserActive(String userUuid) {
return activityService.isUserActive(userUuid);
}
/**
* {@inheritDoc}
*/
public List<String> getActiveUsers(List<String> userUuids){
return activityService.getActiveUsers(userUuids);
}
/**
* {@inheritDoc}
*/
public Long getLastEventTimeForUser(String userUuid) {
return activityService.getLastEventTimeForUser(userUuid);
}
/**
* {@inheritDoc}
*/
public Map<String, Long> getLastEventTimeForUsers(List<String> userUuids) {
return activityService.getLastEventTimeForUsers(userUuids);
}
/**
* {@inheritDoc}
*/
public String getServerConfigurationParameter(String key, String def) {
return serverConfigurationService.getString(key, def);
}
/**
* {@inheritDoc}
*/
public boolean isUserMyWorkspace(String siteId) {
return siteService.isUserSite(siteId);
}
/**
* {@inheritDoc}
*/
public boolean isUserAllowedInSite(String userId, String permission, String siteId) {
if(securityService.isSuperUser()) {
return true;
}
String siteRef = siteId;
if(siteId != null && !siteId.startsWith(SiteService.REFERENCE_ROOT)) {
siteRef = SiteService.REFERENCE_ROOT + Entity.SEPARATOR + siteId;
}
if(securityService.unlock(userId, permission, siteRef)) {
return true;
}
return false;
}
/**
* {@inheritDoc}
*/
public boolean checkForSite(String siteId) {
return siteService.siteExists(siteId);
}
/**
* {@inheritDoc}
*/
public int getMaxSearchResults() {
return serverConfigurationService.getInt(
"profile2.search.maxSearchResults",
ProfileConstants.DEFAULT_MAX_SEARCH_RESULTS);
}
/**
* {@inheritDoc}
*/
public int getMaxSearchResultsPerPage() {
return serverConfigurationService.getInt(
"profile2.search.maxSearchResultsPerPage",
ProfileConstants.DEFAULT_MAX_SEARCH_RESULTS_PER_PAGE);
}
/**
* {@inheritDoc}
*/
public boolean isGravatarImageEnabledGlobally() {
return serverConfigurationService.getBoolean("profile2.gravatar.image.enabled", ProfileConstants.SAKAI_PROP_PROFILE2_GRAVATAR_IMAGE_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isUserAllowedAddSite(String userUuid) {
return siteService.allowAddSite(userUuid);
}
/**
* {@inheritDoc}
*/
public Site addSite(String id, String type) {
Site site = null;
try {
site = siteService.addSite(id, type);
} catch (IdInvalidException e) {
e.printStackTrace();
} catch (IdUsedException e) {
e.printStackTrace();
} catch (PermissionException e) {
e.printStackTrace();
}
return site;
}
/**
* {@inheritDoc}
*/
public boolean saveSite(Site site) {
try {
siteService.save(site);
} catch (IdUnusedException e) {
e.printStackTrace();
return false;
} catch (PermissionException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* {@inheritDoc}
*/
public Site getSite(String siteId) {
try {
return siteService.getSite(siteId);
} catch (IdUnusedException e) {
e.printStackTrace();
return null;
}
}
/**
* {@inheritDoc}
*/
public List<Site> getUserSites() {
return siteService.getSites(SelectionType.ACCESS, null, null, null, SortType.TITLE_ASC, null);
}
/**
* {@inheritDoc}
*/
public Tool getTool(String id) {
return toolManager.getTool(id);
}
/**
* {@inheritDoc}
*/
public List<String> getToolsRequired(String category) {
return serverConfigurationService.getToolsRequired(category);
}
/**
* {@inheritDoc}
*/
public boolean isGoogleIntegrationEnabledGlobally() {
return serverConfigurationService.getBoolean("profile2.integration.google.enabled", ProfileConstants.SAKAI_PROP_PROFILE2_GOOGLE_INTEGRATION_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isLoggedIn() {
return StringUtils.isNotBlank(getCurrentUserId());
}
/**
* {@inheritDoc}
*/
public boolean isProfileFieldsEnabled() {
return serverConfigurationService.getBoolean("profile2.profile.fields.enabled", ProfileConstants.SAKAI_PROP_PROFILE2_PROFILE_FIELDS_ENABLED);
}
/**
* {@inheritDoc}
*/
public boolean isProfileStatusEnabled() {
return serverConfigurationService.getBoolean("profile2.profile.status.enabled", ProfileConstants.SAKAI_PROP_PROFILE2_PROFILE_STATUS_ENABLED);
}
// PRIVATE METHODS FOR SAKAIPROXY
/**
* Setup a security advisor for this transaction
*/
private void enableSecurityAdvisor() {
securityService.pushAdvisor(new SecurityAdvisor(){
public SecurityAdvice isAllowed(String userId, String function, String reference){
return SecurityAdvice.ALLOWED;
}
});
}
/**
* Remove security advisor from the stack
*/
private void disableSecurityAdvisor(){
securityService.popAdvisor();
}
/**
* Gets the siteId of the given user's My Workspace
* Generally ~userId but may not be
*
* @param userId
* @return
*/
private String getUserMyWorkspace(String userId) {
return siteService.getUserSiteId(userId);
}
/**
* Gets the ToolConfiguration of a page in a site containing a given tool
*
* @param siteId siteId
* @param toolId toolId ie sakai.profile2
* @return
*/
private ToolConfiguration getFirstInstanceOfTool(String siteId, String toolId) {
try {
return siteService.getSite(siteId).getToolForCommonId(toolId);
}
catch (IdUnusedException e){
log.error("SakaiProxy.getFirstInstanceOfTool() failed for siteId: " + siteId + " and toolId: " + toolId);
return null;
}
}
/**
* init
*/
public void init() {
log.info("Profile2 SakaiProxy init()");
//process the email templates
//the list is injected via Spring
emailTemplateService.processEmailTemplates(emailTemplates);
}
@Setter
private ToolManager toolManager;
@Setter
private SecurityService securityService;
@Setter
private SessionManager sessionManager;
@Setter
private SiteService siteService;
@Setter
private UserDirectoryService userDirectoryService;
@Setter
private SakaiPersonManager sakaiPersonManager;
@Setter
private ContentHostingService contentHostingService;
@Setter
private EventTrackingService eventTrackingService;
@Setter
private EmailService emailService;
@Setter
private ServerConfigurationService serverConfigurationService;
@Setter
private EmailTemplateService emailTemplateService;
@Setter
private IdManager idManager;
@Setter
private ActivityService activityService;
//INJECT OTHER RESOURCES
@Setter
private ArrayList<String> emailTemplates;
}