When the current user is visiting his profile in a vre, an alert message appears and the profile itself is not editable

git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/social-profile@130538 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Costantino Perciante 2016-07-19 13:09:13 +00:00
parent a3f07223b4
commit 9f9f88590b
5 changed files with 94 additions and 48 deletions

View File

@ -18,6 +18,7 @@ import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window; import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.Location;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalPanel;
@ -57,6 +58,8 @@ public class SocialProfile implements EntryPoint {
displayProfile(); displayProfile();
//result contain the publicProfileLinkedInUrl //result contain the publicProfileLinkedInUrl
sendRefreshClientEvent(result); sendRefreshClientEvent(result);
// force refresh to reload updated content
setUrlBase();
} }
} }
@Override @Override
@ -109,6 +112,17 @@ public class SocialProfile implements EntryPoint {
} }
}); });
} }
/**
* Removes any get parameter (such as code, state)
*/
private void setUrlBase() {
String baseUrl = Window.Location.getHref().split("\\?")[0];
GWT.log(baseUrl);
Location.assign(baseUrl);
}
/** /**
* *
* @return the token if everything goers ok, null otherwise * @return the token if everything goers ok, null otherwise

View File

@ -10,6 +10,7 @@ import org.gcube.portlets.user.socialprofile.client.SocialServiceAsync;
import org.gcube.portlets.user.socialprofile.shared.UserContext; import org.gcube.portlets.user.socialprofile.shared.UserContext;
import org.gcube.portlets.widgets.wsmail.client.forms.MailForm; import org.gcube.portlets.widgets.wsmail.client.forms.MailForm;
import com.github.gwtbootstrap.client.ui.Alert;
import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.RunAsyncCallback; import com.google.gwt.core.client.RunAsyncCallback;
import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickEvent;
@ -37,7 +38,7 @@ public class DisplayProfile extends Composite {
protected final static String ISTI_ERROR = "Your Company please"; protected final static String ISTI_ERROR = "Your Company please";
private final static String OAUTH2_SERVICE = "https://www.linkedin.com/uas/oauth2/authorization?response_type=code"; private final static String OAUTH2_SERVICE = "https://www.linkedin.com/uas/oauth2/authorization?response_type=code";
private final static String D4S_APP_ID = "77n7r4c9nwuwk2"; private final static String D4S_APP_ID = "77n7r4c9nwuwk2";
private static DisplayProfileUiBinder uiBinder = GWT private static DisplayProfileUiBinder uiBinder = GWT
.create(DisplayProfileUiBinder.class); .create(DisplayProfileUiBinder.class);
@ -48,7 +49,7 @@ public class DisplayProfile extends Composite {
public static final String savingImage = GWT.getModuleBaseURL() + "../images/saving.gif"; public static final String savingImage = GWT.getModuleBaseURL() + "../images/saving.gif";
public static final String GET_OID_PARAMETER = "oid"; public static final String GET_OID_PARAMETER = "oid";
public static final String CONTROL_SEQUENCE_COOKIE = "CSRF-check-d4science"; public static final String CONTROL_SEQUENCE_COOKIE = "CSRF-check-d4science";
private final SocialServiceAsync socialService = GWT.create(SocialService.class); private final SocialServiceAsync socialService = GWT.create(SocialService.class);
@ -57,28 +58,29 @@ public class DisplayProfile extends Composite {
@UiField HTML userFullName; @UiField HTML userFullName;
@UiField TextBox headlineBox; @UiField TextBox headlineBox;
@UiField TextBox institutionBox; @UiField TextBox institutionBox;
@UiField HTML editHeadline; @UiField HTML editHeadline;
@UiField HTML editIsti; @UiField HTML editIsti;
@UiField HTML headlineLabel; @UiField HTML headlineLabel;
@UiField HTML institutionLabel; @UiField HTML institutionLabel;
@UiField Image savingHeadline; @UiField Image savingHeadline;
@UiField Button saveHead; @UiField Button saveHead;
@UiField Button cancelHead; @UiField Button cancelHead;
@UiField Button saveIsti; @UiField Button saveIsti;
@UiField Button cancelIsti; @UiField Button cancelIsti;
@UiField Button messageButton; @UiField Button messageButton;
@UiField Button editButton; @UiField Button editButton;
@UiField Button importButton; @UiField Button importButton;
@UiField Alert ownerSeeingProfileAsVreMemberAlert;
private String currHeadLine; private String currHeadLine;
private String currInstitution; private String currInstitution;
private UserInfo myUserInfo; private UserInfo myUserInfo;
private DisplaySummary summarySibling; private DisplaySummary summarySibling;
@ -93,46 +95,52 @@ public class DisplayProfile extends Composite {
* @param result * @param result
*/ */
public void show(UserContext result) { public void show(UserContext result) {
myUserInfo = result.getUserInfo(); myUserInfo = result.getUserInfo();
avatarImage.setUrl(myUserInfo.getAvatarId()); avatarImage.setUrl(myUserInfo.getAvatarId());
userFullName.setText(myUserInfo.getFullName()); userFullName.setText(myUserInfo.getFullName());
if (SocialProfile.getUserToShowId() == null || result.isOwner()) { //its him seeing his profile /*
* Here we check that:
* 1) the user is the owner of the profile;
* 2) if the current user to show is null or not (that is, the parameter GCubeSocialNetworking.USER_PROFILE_OID within the url);
* 3) if such parameter is equal to the current user we show the profile as if it belong to someone else
*/
if (showAsOwner(result)) {
String head = (result.getHeadline() == null || result.getHeadline().compareTo("") == 0) ? HEADLINE_TEXT : result.getHeadline(); String head = (result.getHeadline() == null || result.getHeadline().compareTo("") == 0) ? HEADLINE_TEXT : result.getHeadline();
String isti = (result.getInstitution() == null ||result.getInstitution().compareTo("") == 0) ? ISTI_TEXT : result.getInstitution(); String isti = (result.getInstitution() == null ||result.getInstitution().compareTo("") == 0) ? ISTI_TEXT : result.getInstitution();
headlineLabel.setText(head); headlineLabel.setText(head);
institutionLabel.setText(isti); institutionLabel.setText(isti);
editHeadline.setStyleName("editImage"); editHeadline.setStyleName("editImage");
editHeadline.setTitle("Edit your Professional Headline (e.g. Researcher at University of ..."); editHeadline.setTitle("Edit your Professional Headline (e.g. Researcher at University of ...");
editIsti.setStyleName("editImage"); editIsti.setStyleName("editImage");
editIsti.setTitle("Edit location or industry"); editIsti.setTitle("Edit location or industry");
headlineBox.setMaxLength(100); headlineBox.setMaxLength(100);
institutionBox.setMaxLength(100); institutionBox.setMaxLength(100);
messageButton.removeFromParent(); messageButton.removeFromParent();
currHeadLine = head; currHeadLine = head;
if (result.getHeadline() == null || result.getHeadline().compareTo("") == 0) { if (result.getHeadline() == null || result.getHeadline().compareTo("") == 0) {
headlineLabel.getElement().getStyle().setOpacity(0.5); headlineLabel.getElement().getStyle().setOpacity(0.5);
institutionLabel.getElement().getStyle().setOpacity(0.5); institutionLabel.getElement().getStyle().setOpacity(0.5);
} }
editButton.addStyleName("import-edit-buttons-style"); editButton.addStyleName("import-edit-buttons-style");
editButton.setVisible(true); editButton.setVisible(true);
editButton.addClickHandler(new ClickHandler() { editButton.addClickHandler(new ClickHandler() {
@Override @Override
public void onClick(ClickEvent event) { public void onClick(ClickEvent event) {
// enable editing // enable editing
summarySibling.enableEditing(); summarySibling.enableEditing();
} }
}); });
importButton.addStyleName("import-edit-buttons-style"); importButton.addStyleName("import-edit-buttons-style");
importButton.setVisible(true); importButton.setVisible(true);
importButton.addClickHandler(new ClickHandler() { importButton.addClickHandler(new ClickHandler() {
@ -140,30 +148,50 @@ public class DisplayProfile extends Composite {
@Override @Override
public void onClick(ClickEvent event) { public void onClick(ClickEvent event) {
String controlSequence = getRandomString(); String controlSequence = getRandomString();
//needed to prevent Cross Site Request Forgery attacks //needed to prevent Cross Site Request Forgery attacks
Cookies.setCookie(CONTROL_SEQUENCE_COOKIE, controlSequence); Cookies.setCookie(CONTROL_SEQUENCE_COOKIE, controlSequence);
String url = OAUTH2_SERVICE + "" String url = OAUTH2_SERVICE + ""
+ "&client_id="+D4S_APP_ID + "&client_id="+D4S_APP_ID
+ "&state="+controlSequence + "&state="+controlSequence
+ "&redirect_uri="+getRedirectURI(); + "&redirect_uri="+getRedirectURI();
Location.assign(url); Location.assign(url);
} }
}); });
} else { //its someone else } else { //its someone else
String head = (result.getHeadline() == null || result.getHeadline().compareTo("") == 0) ? "" : result.getHeadline(); String head = (result.getHeadline() == null || result.getHeadline().compareTo("") == 0) ? "" : result.getHeadline();
String isti = (result.getInstitution() == null || result.getInstitution().compareTo("") == 0) ? "" : result.getInstitution(); String isti = (result.getInstitution() == null || result.getInstitution().compareTo("") == 0) ? "" : result.getInstitution();
headlineLabel.setText(head); headlineLabel.setText(head);
institutionLabel.setText(isti); institutionLabel.setText(isti);
avatarImage.getElement().getParentElement().setAttribute("href", ""); avatarImage.getElement().getParentElement().setAttribute("href", "");
avatarImage.setTitle(myUserInfo.getFullName()); avatarImage.setTitle(myUserInfo.getFullName());
messageButton.setVisible(true); messageButton.setVisible(true);
// check if the current user is the owner but he is looking at his own profile as if it was the profile of another vre member
if(result.isOwner()){
// TODO get the address of the My Profile page and add a link to redirect the user
ownerSeeingProfileAsVreMemberAlert.setText("You are looking your profile as the other vre members see it.");
ownerSeeingProfileAsVreMemberAlert.setVisible(true);
}
} }
} }
/**
* Check if the profile must be shown as belonging to the user or not
* @param result
* @return
*/
private boolean showAsOwner(UserContext result) {
if((SocialProfile.getUserToShowId() == null && result.isOwner()))
return true;
return false;
}
/** /**
* *
* @return the redirect uri when authorized (or not) by LinkedIn via oAuth2 * @return the redirect uri when authorized (or not) by LinkedIn via oAuth2
@ -175,7 +203,7 @@ public class DisplayProfile extends Composite {
return redirectURI+"?gwt.codesvr=127.0.0.1:9997"; return redirectURI+"?gwt.codesvr=127.0.0.1:9997";
return redirectURI; return redirectURI;
} }
@UiHandler("editHeadline") @UiHandler("editHeadline")
void onEditHeadlineClick(ClickEvent e) { void onEditHeadlineClick(ClickEvent e) {
headlineLabel.setVisible(false); headlineLabel.setVisible(false);
@ -189,7 +217,7 @@ public class DisplayProfile extends Composite {
saveHead.setVisible(true); saveHead.setVisible(true);
cancelHead.setVisible(true); cancelHead.setVisible(true);
} }
@UiHandler("editIsti") @UiHandler("editIsti")
void onEditInstitutionClick(ClickEvent e) { void onEditInstitutionClick(ClickEvent e) {
institutionLabel.setVisible(false); institutionLabel.setVisible(false);
@ -203,18 +231,18 @@ public class DisplayProfile extends Composite {
saveIsti.setVisible(true); saveIsti.setVisible(true);
cancelIsti.setVisible(true); cancelIsti.setVisible(true);
} }
@UiHandler("cancelHead") @UiHandler("cancelHead")
void onCancelHeadlineClick(ClickEvent e) { void onCancelHeadlineClick(ClickEvent e) {
cancelHeadline(); cancelHeadline();
} }
@UiHandler("cancelIsti") @UiHandler("cancelIsti")
void onCancelIstiClick(ClickEvent e) { void onCancelIstiClick(ClickEvent e) {
cancelInsti(); cancelInsti();
} }
@UiHandler("saveHead") @UiHandler("saveHead")
void onSaveHeadlineClick(ClickEvent e) { void onSaveHeadlineClick(ClickEvent e) {
String toShare = escapeHtml(headlineBox.getText()); String toShare = escapeHtml(headlineBox.getText());
@ -244,10 +272,10 @@ public class DisplayProfile extends Composite {
savingHeadline.setVisible(false); savingHeadline.setVisible(false);
} }
}); });
} }
} }
@UiHandler("saveIsti") @UiHandler("saveIsti")
void onSaveInstitutionClick(ClickEvent e) { void onSaveInstitutionClick(ClickEvent e) {
String toShare = escapeHtml(institutionBox.getText()); String toShare = escapeHtml(institutionBox.getText());
@ -277,10 +305,10 @@ public class DisplayProfile extends Composite {
savingHeadline.setVisible(false); savingHeadline.setVisible(false);
} }
}); });
} }
} }
@UiHandler("messageButton") @UiHandler("messageButton")
void onSendPrivateMessageClick(ClickEvent e) { void onSendPrivateMessageClick(ClickEvent e) {
final List<String> listToLogin = new ArrayList<String>(); final List<String> listToLogin = new ArrayList<String>();
@ -295,7 +323,7 @@ public class DisplayProfile extends Composite {
} }
}); });
} }
private void cancelHeadline() { private void cancelHeadline() {
editHeadline.setVisible(true); editHeadline.setVisible(true);
saveHead.setVisible(false); saveHead.setVisible(false);
@ -303,7 +331,7 @@ public class DisplayProfile extends Composite {
headlineBox.setVisible(false); headlineBox.setVisible(false);
headlineLabel.setVisible(true); headlineLabel.setVisible(true);
} }
private void cancelInsti() { private void cancelInsti() {
editIsti.setVisible(true); editIsti.setVisible(true);
saveIsti.setVisible(false); saveIsti.setVisible(false);
@ -311,14 +339,14 @@ public class DisplayProfile extends Composite {
institutionBox.setVisible(false); institutionBox.setVisible(false);
institutionLabel.setVisible(true); institutionLabel.setVisible(true);
} }
public void showError(String message) { public void showError(String message) {
Window.alert("Failure: " + message); Window.alert("Failure: " + message);
avatarImage.setSize("100px", "100px"); avatarImage.setSize("100px", "100px");
avatarImage.setUrl(avatar_default); avatarImage.setUrl(avatar_default);
} }
/** /**
* Escape an html string. Escaping data received from the client helps to * Escape an html string. Escaping data received from the client helps to
* prevent cross-site script vulnerabilities. * prevent cross-site script vulnerabilities.
@ -333,15 +361,15 @@ public class DisplayProfile extends Composite {
return html.replaceAll("&", "&amp;").replaceAll("<", "&lt;") return html.replaceAll("&", "&amp;").replaceAll("<", "&lt;")
.replaceAll(">", "&gt;"); .replaceAll(">", "&gt;");
} }
private String getRandomString() { private String getRandomString() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (int i=0;i<20;i++) { for (int i=0;i<20;i++) {
sb.append('a'+Random.nextInt(26)); sb.append('a'+Random.nextInt(26));
} }
return sb.toString(); return sb.toString();
} }
/** /**
* Set the summary sibling object * Set the summary sibling object
* @param summary * @param summary
@ -349,5 +377,5 @@ public class DisplayProfile extends Composite {
public void setDisplaySummarySibling(DisplaySummary summary) { public void setDisplaySummarySibling(DisplaySummary summary) {
this.summarySibling = summary; this.summarySibling = summary;
} }
} }

View File

@ -1,7 +1,8 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"> xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:b="urn:import:com.github.gwtbootstrap.client.ui">
<g:HTMLPanel ui:field="mainPanel"> <g:HTMLPanel ui:field="mainPanel">
<b:Alert visible="false" animation="true" ui:field="ownerSeeingProfileAsVreMemberAlert"></b:Alert>
<table class=""> <table class="">
<tr> <tr>
<td width="110px;" align="middle"> <td width="110px;" align="middle">

View File

@ -471,9 +471,10 @@ public class SocialServiceImpl extends RemoteServiceServlet implements SocialSer
UserLocalServiceUtil.updatePortrait(user.getUserId(), pictureData); UserLocalServiceUtil.updatePortrait(user.getUserId(), pictureData);
} }
} }
//update the location/industry //update the location/industry
new LiferayUserManager().saveCustomAttr(user.getUserId(), CustomAttributeKeys.USER_LOCATION_INDUSTRY.getKeyName(), locationOrIndustry); if(locationOrIndustry != null)
new LiferayUserManager().saveCustomAttr(user.getUserId(), CustomAttributeKeys.USER_LOCATION_INDUSTRY.getKeyName(), locationOrIndustry);
if (toReturn) if (toReturn)
return publicProfileURL; return publicProfileURL;
else return null; else return null;

View File

@ -14,8 +14,10 @@
<inherits name="org.jsonmaker.gwt.Gwt_jsonmaker" /> <inherits name="org.jsonmaker.gwt.Gwt_jsonmaker" />
<inherits <inherits
name="net.eliasbalasis.tibcopagebus4gwt.testsubscriber.TestSubscriber" /> name="net.eliasbalasis.tibcopagebus4gwt.testsubscriber.TestSubscriber" />
<!-- Bootstrap import --> <!-- Bootstrap import -->
<inherits name="com.github.gwtbootstrap.Bootstrap" /> <inherits name="com.github.gwtbootstrap.Bootstrap" />
<!-- Specify the app entry point class. --> <!-- Specify the app entry point class. -->
<entry-point <entry-point
class='org.gcube.portlets.user.socialprofile.client.SocialProfile' /> class='org.gcube.portlets.user.socialprofile.client.SocialProfile' />