Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Sun Aug 21 17:20:41 2016 @@ -30,8 +30,6 @@ import static org.apache.openmeetings.we import static org.apache.openmeetings.web.app.Application.removeInvalidSession; import static org.apache.openmeetings.web.app.Application.removeOnlineUser; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; @@ -44,14 +42,17 @@ import java.util.Locale; import java.util.Set; import java.util.TimeZone; +import org.apache.commons.lang3.time.FastDateFormat; import org.apache.openmeetings.IWebSession; import org.apache.openmeetings.core.ldap.LdapLoginManagement; import org.apache.openmeetings.db.dao.basic.ConfigurationDao; import org.apache.openmeetings.db.dao.label.LabelDao; +import org.apache.openmeetings.db.dao.room.InvitationDao; import org.apache.openmeetings.db.dao.server.SOAPLoginDao; import org.apache.openmeetings.db.dao.server.SessiondataDao; import org.apache.openmeetings.db.dao.user.IUserManager; import org.apache.openmeetings.db.dao.user.UserDao; +import org.apache.openmeetings.db.entity.room.Invitation; import org.apache.openmeetings.db.entity.server.RemoteSessionObject; import org.apache.openmeetings.db.entity.server.SOAPLogin; import org.apache.openmeetings.db.entity.server.Sessiondata; @@ -60,6 +61,7 @@ import org.apache.openmeetings.db.entity import org.apache.openmeetings.db.entity.user.User.Type; import org.apache.openmeetings.db.util.TimezoneUtil; import org.apache.openmeetings.util.OmException; +import org.apache.openmeetings.web.pages.RecordingPage; import org.apache.openmeetings.web.pages.SwfPage; import org.apache.openmeetings.web.user.dashboard.MyRoomsWidget; import org.apache.openmeetings.web.user.dashboard.MyRoomsWidgetDescriptor; @@ -89,11 +91,12 @@ import org.wicketstuff.dashboard.web.Das public class WebSession extends AbstractAuthenticatedWebSession implements IWebSession { private static final long serialVersionUID = 1L; public static final int MILLIS_IN_MINUTE = 60000; - public static final String SECURE_HASH = "secureHash"; - public static final String INVITATION_HASH = "invitationHash"; public static final String ISO8601_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ssZ"; public static final List<String> AVAILABLE_TIMEZONES = Arrays.asList(TimeZone.getAvailableIDs()); public static final Set<String> AVAILABLE_TIMEZONE_SET = new LinkedHashSet<String>(AVAILABLE_TIMEZONES); + public static final String WICKET_ROOM_ID = "wicketroomid"; + static final String SECURE_HASH = "secureHash"; + static final String INVITATION_HASH = "invitationHash"; private Long userId = null; private Set<Right> rights = new HashSet<User.Right>(); //TODO renew somehow on user edit !!!! private long languageId = -1; //TODO renew somehow on user edit !!!! @@ -101,15 +104,17 @@ public class WebSession extends Abstract private OmUrlFragment area = null; private TimeZone tz; private TimeZone browserTz; - private DateFormat ISO8601FORMAT = new SimpleDateFormat(ISO8601_FORMAT_STRING); //FIXME not thread safe - private DateFormat sdf; + private FastDateFormat ISO8601FORMAT = null; + private FastDateFormat sdf = null; private UserDashboard dashboard; private Locale browserLocale = null; - private Long recordingId; + private Invitation i = null; + private Long roomId = null; + private Long recordingId = null; private Long loginError = null; private String externalType; private boolean kickedByAdmin = false; - + public WebSession(Request request) { super(request); browserLocale = getLocale(); @@ -122,7 +127,10 @@ public class WebSession extends Abstract userId = null; rights = new HashSet<User.Right>(); SID = null; + ISO8601FORMAT = null; sdf = null; + i = null; + roomId = null; recordingId = null; externalType = null; tz = null; @@ -130,36 +138,23 @@ public class WebSession extends Abstract loginError = null; browserLocale = null; } - - @Override - public Roles getRoles() { - //first of all will check hashes - try { - IRequestParameters params = RequestCycle.get().getRequest().getRequestParameters(); - StringValue secureHash = params.getParameterValue(SECURE_HASH); - StringValue invitationHash = params.getParameterValue(INVITATION_HASH); - if (!secureHash.isEmpty() || !invitationHash.isEmpty()) { - PageParameters pp = new PageParameters(); - for (String p : params.getParameterNames()) { - List<StringValue> vals = params.getParameterValues(p); - if (vals != null) { - for (StringValue sv : vals) { - if (!sv.isEmpty()) { - pp.add(p, sv.toString()); - } - } + + private PageParameters getParams(IRequestParameters params, PageParameters pp) { + for (String p : params.getParameterNames()) { + List<StringValue> vals = params.getParameterValues(p); + if (vals != null) { + for (StringValue sv : vals) { + if (!sv.isEmpty()) { + pp.add(p, sv.toString()); } } - if (isSignedIn()) { - invalidate(); - } - throw new RestartResponseAtInterceptPageException(SwfPage.class, pp); } - } catch (RestartResponseAtInterceptPageException e) { - throw e; - } catch (Exception e) { - //no-op, will continue to sign-in page } + return pp; + } + + @Override + public Roles getRoles() { if (rights.isEmpty()) { isSignedIn(); } @@ -193,6 +188,56 @@ public class WebSession extends Abstract return userId != null && userId.longValue() > 0; } + public void checkHashes(boolean redirect) { + IRequestParameters params = RequestCycle.get().getRequest().getRequestParameters(); + StringValue secureHash = params.getParameterValue(SECURE_HASH); + StringValue invitationHash = params.getParameterValue(INVITATION_HASH); + PageParameters pp = new PageParameters(); + try { + if (!secureHash.isEmpty()) { + if (isSignedIn()) { + invalidate(); + } + if (signIn(secureHash.toString(), false)) { + //TODO markUsed + } else { + //TODO redirect to error + } + } + if (!invitationHash.isEmpty()) { + if (isSignedIn()) { + invalidate(); + } + i = getBean(InvitationDao.class).getByHash(invitationHash.toString(), false, false); + if (i.isAllowEntry()) { + setUser(i.getInvitee()); + //TODO markUsed + if (i.getRoom() != null) { + roomId = i.getRoom().getId(); + } else if (i.getAppointment() != null && i.getAppointment().getRoom() != null) { + roomId = i.getAppointment().getRoom().getId(); + } else if (i.getRecording() != null) { + recordingId = i.getRecording().getId(); + } + } + } + if (!secureHash.isEmpty() || !invitationHash.isEmpty()) { + if (roomId != null) { + getParams(params, pp).add(WICKET_ROOM_ID, roomId); + if (redirect) { + throw new RestartResponseAtInterceptPageException(SwfPage.class, pp); + } + } else if (recordingId != null && redirect){ + throw new RestartResponseAtInterceptPageException(RecordingPage.class, pp); + } + } + } catch (RestartResponseAtInterceptPageException e) { + throw e; + } catch (Exception e) { + //no-op, will continue to sign-in page + } + } + public boolean signIn(String secureHash, boolean markUsed) { //FIXME code is duplicated from MainService, need to be unified SOAPLoginDao soapDao = getBean(SOAPLoginDao.class); @@ -234,6 +279,7 @@ public class WebSession extends Abstract } sessionDao.updateUser(SID, user.getId()); setUser(user); + roomId = soapLogin.getRoomId(); recordingId = soapLogin.getRecordingId(); return true; } @@ -241,7 +287,7 @@ public class WebSession extends Abstract } return false; } - + private void setUser(User u) { String _sid = SID; Long _recordingId = recordingId; @@ -257,10 +303,10 @@ public class WebSession extends Abstract languageId = u.getLanguageId(); externalType = u.getExternalType(); tz = getBean(TimezoneUtil.class).getTimeZone(u); - ISO8601FORMAT.setTimeZone(tz); + ISO8601FORMAT = FastDateFormat.getInstance(ISO8601_FORMAT_STRING, tz); setLocale(languageId == 3 ? Locale.GERMANY : LabelDao.languages.get(languageId)); //FIXMW locale need to be set by User language first - sdf = DateFormat.getDateTimeInstance(SHORT, SHORT, getLocale()); + sdf = FastDateFormat.getDateTimeInstance(SHORT, SHORT, getLocale()); } public boolean signIn(String login, String password, Type type, Long domainId) { @@ -353,15 +399,19 @@ public class WebSession extends Abstract checkIsInvalid(); return get().userId; } - + public static Long getRecordingId() { return get().recordingId; } - + + public Invitation getInvitation() { + return i; + } + public static String getExternalType() { return get().externalType; } - + public static TimeZone getUserTimeZone() { return get().tz; } @@ -374,11 +424,11 @@ public class WebSession extends Abstract return Calendar.getInstance(getClientTimeZone()); } - public static DateFormat getIsoDateFormat() { + public static FastDateFormat getIsoDateFormat() { return get().ISO8601FORMAT; } - public static DateFormat getDateFormat() { + public static FastDateFormat getDateFormat() { return get().sdf; }
Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/IUpdatable.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/IUpdatable.java?rev=1757068&view=auto ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/IUpdatable.java (added) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/IUpdatable.java Sun Aug 21 17:20:41 2016 @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache 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.apache.org/licenses/LICENSE-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.apache.openmeetings.web.common; + +import org.apache.wicket.ajax.AjaxRequestTarget; + +public interface IUpdatable { + void update(AjaxRequestTarget target); +} Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java Sun Aug 21 17:20:41 2016 @@ -29,7 +29,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.UUID; -import org.apache.openmeetings.db.dao.basic.ConfigurationDao; import org.apache.openmeetings.db.dao.room.InvitationDao; import org.apache.openmeetings.db.dao.user.UserDao; import org.apache.openmeetings.db.entity.room.Invitation; @@ -156,7 +155,7 @@ public abstract class InvitationForm ext i.setUpdated(null); i.setUsed(false); - i.setPassword(CryptProvider.get().hash(i.getPassword())); //FIXME should be hidden + i.setPassword(CryptProvider.get().hash(i.getPassword())); i.setValidFrom(getDate(from.getModelObject().minusMinutes(5), timeZoneId.getModelObject())); i.setValidTo(getDate(to.getModelObject(), timeZoneId.getModelObject())); @@ -209,7 +208,7 @@ public abstract class InvitationForm ext } else if (button.equals(dialog.generate)) { Invitation i = create(recipients.getModelObject().iterator().next()); setModelObject(i); - url.setModelObject(getInvitationLink(getBean(ConfigurationDao.class).getBaseUrl(), i)); + url.setModelObject(getInvitationLink(i)); target.add(url); } else if (button.equals(dialog.send)) { if (Strings.isEmpty(url.getModelObject())) { Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseInitedPage.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseInitedPage.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseInitedPage.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseInitedPage.java Sun Aug 21 17:20:41 2016 @@ -27,6 +27,15 @@ import org.apache.openmeetings.web.app.W public abstract class BaseInitedPage extends BasePage { private static final long serialVersionUID = 1L; + public BaseInitedPage() { + super(); + WebSession.get().checkHashes(getHashRedirect()); + } + + protected boolean getHashRedirect() { + return true; + } + @Override protected String getApplicationName() { return getBean(ConfigurationDao.class).getAppName(); Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java Sun Aug 21 17:20:41 2016 @@ -62,9 +62,9 @@ public abstract class BasePage extends A String code = getLanguageCode(); add(new TransparentWebMarkupContainer("html") - .add(new AttributeModifier("xml:lang", code)) - .add(new AttributeModifier("lang", code)) - .add(new AttributeModifier("dir", isRtl() ? "rtl" : "ltr"))); + .add(new AttributeModifier("xml:lang", code)) + .add(new AttributeModifier("lang", code)) + .add(new AttributeModifier("dir", isRtl() ? "rtl" : "ltr"))); add(new Label("pageTitle", appName)); add(header = new HeaderPanel("header", appName)); } Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.html URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.html?rev=1757068&view=auto ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.html (added) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.html Sun Aug 21 17:20:41 2016 @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache 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.apache.org/licenses/LICENSE-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. + +--> +<html xmlns:wicket="http://wicket.apache.org"> +<wicket:panel> + <form wicket:id="form"> + <div wicket:id="feedback"></div> + <label wicket:for="password"><wicket:message key="536"/></label> + <input wicket:id="password" type="password"/> + </form> +</wicket:panel> +</html> Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java?rev=1757068&view=auto ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java (added) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java Sun Aug 21 17:20:41 2016 @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache 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.apache.org/licenses/LICENSE-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.apache.openmeetings.web.pages; + +import java.util.Arrays; +import java.util.List; + +import org.apache.openmeetings.db.entity.room.Invitation; +import org.apache.openmeetings.util.crypt.CryptProvider; +import org.apache.openmeetings.web.app.Application; +import org.apache.openmeetings.web.app.WebSession; +import org.apache.openmeetings.web.common.IUpdatable; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.core.request.handler.IPartialPageRequestHandler; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.PasswordTextField; +import org.apache.wicket.model.Model; +import org.apache.wicket.validation.IValidatable; +import org.apache.wicket.validation.IValidator; +import org.apache.wicket.validation.ValidationError; + +import com.googlecode.wicket.jquery.core.JQueryBehavior; +import com.googlecode.wicket.jquery.core.Options; +import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog; +import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton; +import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel; + +public class InvitationPasswordDialog extends AbstractFormDialog<Invitation> { + private static final long serialVersionUID = 1L; + private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true)); + private final DialogButton check = new DialogButton("check", Application.getString(537)); + private final Form<Void> form = new Form<>("form"); + private final PasswordTextField password = new PasswordTextField("password", Model.of((String)null)); + private final IUpdatable comp; + + public InvitationPasswordDialog(String id, IUpdatable comp) { + super(id, Application.getString(524)); + this.comp = comp; + password.setLabel(Model.of(Application.getString(536))).add(new IValidator<String>(){ + private static final long serialVersionUID = 1L; + + @Override + public void validate(IValidatable<String> validatable) { + if (!CryptProvider.get().verify(validatable.getValue(), WebSession.get().getInvitation().getPassword())) { + validatable.error(new ValidationError(Application.getString(538L))); + } + } + }); + add(form.add(password, feedback.setOutputMarkupId(true))); + } + + @Override + public void onConfigure(JQueryBehavior behavior) { + super.onConfigure(behavior); + behavior.setOption("autoOpen", WebSession.get().getInvitation().isPasswordProtected()); + behavior.setOption("closeOnEscape", false); + behavior.setOption("dialogClass", Options.asString("no-close")); + behavior.setOption("resizable", false); + } + + @Override + protected void onOpen(IPartialPageRequestHandler handler) { + password.setModelObject(null); + } + + @Override + public DialogButton getSubmitButton() { + return check; + } + + @Override + protected List<DialogButton> getButtons() { + return Arrays.asList(check); + } + + @Override + public Form<Void> getForm() { + return form; + } + + @Override + protected void onError(AjaxRequestTarget target) { + target.add(feedback); + } + + @Override + protected void onSubmit(AjaxRequestTarget target) { + comp.update(target); + } + +} Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.html URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.html?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.html (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.html Sun Aug 21 17:20:41 2016 @@ -24,6 +24,7 @@ <div wicket:id="info"></div> <div wicket:id="player"></div> </div> + <div wicket:id="i-pass"></div> </wicket:extend> </html> Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java Sun Aug 21 17:20:41 2016 @@ -23,29 +23,55 @@ import static org.apache.openmeetings.we import org.apache.openmeetings.db.dao.record.RecordingDao; import org.apache.openmeetings.db.entity.record.Recording; +import org.apache.openmeetings.db.entity.room.Invitation; import org.apache.openmeetings.web.app.WebSession; +import org.apache.openmeetings.web.common.IUpdatable; import org.apache.openmeetings.web.user.record.VideoInfo; import org.apache.openmeetings.web.user.record.VideoPlayer; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.request.IRequestParameters; import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.util.string.StringValue; -public class RecordingPage extends BaseInitedPage { +public class RecordingPage extends BaseInitedPage implements IUpdatable { private static final long serialVersionUID = 1L; + private final VideoInfo vi = new VideoInfo("info", null); + private final VideoPlayer vp = new VideoPlayer("player", null); public RecordingPage(PageParameters p) { - String hash = p.get("hash").toString(); + StringValue hash = p.get("hash"); Recording r = null; - if (WebSession.get().signIn(hash, true)) { + WebSession ws = WebSession.get(); + if (!hash.isEmpty()) { + ws.signIn(hash.toString(), true); + } + Invitation i = ws.getInvitation(); + if (i != null && !i.isPasswordProtected()) { + r = i.getRecording(); + } else if (i == null) { Long recId = getRecordingId(); if (recId != null) { r = getBean(RecordingDao.class).get(recId); } } - add(new VideoInfo("info", r).setVisible(r != null), new VideoPlayer("player", r).setVisible(r != null)); + add(vi.setShowShare(false).update(null, r).setOutputMarkupPlaceholderTag(true).setVisible(r != null) + , vp.update(null, r).setOutputMarkupPlaceholderTag(true).setVisible(r != null) + , new InvitationPasswordDialog("i-pass", this)); + } + + @Override + protected boolean getHashRedirect() { + return false; } @Override protected void onParameterArrival(IRequestParameters requestParameters, AjaxRequestTarget target) { } + + @Override + public void update(AjaxRequestTarget target) { + Invitation i = WebSession.get().getInvitation(); + target.add(vi.update(target, i.getRecording()).setVisible(true) + , vp.update(target, i.getRecording()).setVisible(true)); + } } Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java Sun Aug 21 17:20:41 2016 @@ -20,6 +20,7 @@ package org.apache.openmeetings.web.room import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; import static org.apache.openmeetings.web.app.Application.getBean; +import static org.apache.openmeetings.web.app.WebSession.WICKET_ROOM_ID; import static org.apache.openmeetings.web.app.WebSession.getLanguage; import static org.apache.openmeetings.web.app.WebSession.getSid; import static org.apache.wicket.RuntimeConfigurationType.DEVELOPMENT; @@ -29,12 +30,9 @@ import java.util.List; import java.util.Map; import org.apache.openmeetings.core.session.SessionManager; -import org.apache.openmeetings.db.dao.room.InvitationDao; import org.apache.openmeetings.db.dao.room.RoomDao; -import org.apache.openmeetings.db.dao.server.SOAPLoginDao; import org.apache.openmeetings.db.dao.server.ServerDao; import org.apache.openmeetings.db.dao.server.SessiondataDao; -import org.apache.openmeetings.db.entity.server.SOAPLogin; import org.apache.openmeetings.db.entity.server.Server; import org.apache.openmeetings.web.app.Application; import org.apache.openmeetings.web.app.WebSession; @@ -61,7 +59,6 @@ import org.slf4j.Logger; public class SwfPanel extends BasePanel { private static final long serialVersionUID = 1L; private static final Logger log = Red5LoggerFactory.getLogger(SwfPanel.class, webAppRootKey); - private static final String WICKET_ROOM_ID = "wicketroomid"; public static final String PARAM_PUBLIC_SID = "publicSid"; public static final String PARAM_URL = "url"; public static final String SWF_TYPE_NETWORK = "network"; @@ -80,19 +77,8 @@ public class SwfPanel extends BasePanel //OK let's find the room try { StringValue room = pp.get(WICKET_ROOM_ID); - StringValue secureHash = pp.get(WebSession.SECURE_HASH); - StringValue invitationHash = pp.get(WebSession.INVITATION_HASH); if (!room.isEmpty()) { roomId = room.toLongObject(); - } else if (!secureHash.isEmpty()) { - if (WebSession.get().signIn(secureHash.toString(), false)) { - SOAPLogin soapLogin = getBean(SOAPLoginDao.class).get(secureHash.toString()); - roomId = soapLogin.getRoomId(); - pp = pp.mergeWith(SwfPanel.addServer(roomId, false)); - } - //TODO access denied - } else if (!invitationHash.isEmpty()) { - roomId = getBean(InvitationDao.class).getInvitationByHashCode(invitationHash.toString(), true).getRoom().getId(); } } catch (Exception e) { //no-op Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java Sun Aug 21 17:20:41 2016 @@ -33,7 +33,6 @@ import java.util.Date; import java.util.List; import org.apache.openmeetings.core.mail.MailHandler; -import org.apache.openmeetings.db.dao.basic.ConfigurationDao; import org.apache.openmeetings.db.dao.calendar.AppointmentDao; import org.apache.openmeetings.db.dao.room.IInvitationManager; import org.apache.openmeetings.db.dao.room.RoomDao; @@ -242,7 +241,7 @@ public class MessageDialog extends Abstr , CalendarHelper.getDate(start.getModelObject(), to.getTimeZoneId()) , CalendarHelper.getDate(end.getModelObject(), to.getTimeZoneId()), null); - invitation_link = getInvitationLink(getBean(ConfigurationDao.class).getBaseUrl(), i); + invitation_link = getInvitationLink(i); if (invitation_link == null) { invitation_link = ""; Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java Sun Aug 21 17:20:41 2016 @@ -18,12 +18,13 @@ */ package org.apache.openmeetings.web.user.record; +import org.apache.openmeetings.db.entity.record.Recording; import org.apache.openmeetings.web.common.InvitationForm; import org.apache.wicket.ajax.AjaxRequestTarget; public class RecordingInvitationForm extends InvitationForm { private static final long serialVersionUID = 1L; - private Long recordingId; + private Recording recording; public RecordingInvitationForm(String id) { super(id); @@ -33,11 +34,10 @@ public class RecordingInvitationForm ext @Override public void updateModel(AjaxRequestTarget target) { super.updateModel(target); - //Invitation i = getModelObject(); - //i.setReco + getModelObject().setRecording(recording); } - public void setRecordingId(Long recordingId) { - this.recordingId = recordingId; + public void setRecording(Recording recording) { + this.recording = recording; } } Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java Sun Aug 21 17:20:41 2016 @@ -63,14 +63,8 @@ public abstract class RecordingResourceR } catch (Exception e) { //no-op expected } - WebSession ws = WebSession.get(); - if (id != null && ws.isSignedIn()) { + if (id != null && WebSession.get().isSignedIn()) { return getRecording(id); - } else { - ws.invalidate(); - if (ws.signIn(_id.toString(), true)) { - return getRecording(getRecordingId()); - } } return null; } @@ -81,6 +75,9 @@ public abstract class RecordingResourceR if (r == null || r.getType() == Type.Folder || r.isDeleted()) { return null; } + if (id.equals(getRecordingId())) { + return r; + } //TODO should we check parentId here if (r.getOwnerId() == null && r.getGroupId() == null) { //public Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java Sun Aug 21 17:20:41 2016 @@ -89,7 +89,7 @@ public class VideoInfo extends Panel { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - rif.setRecordingId(rm.getObject().getId()); + rif.setRecording(rm.getObject()); invite.updateModel(target); invite.open(target); } @@ -226,4 +226,10 @@ public class VideoInfo extends Panel { }); return list; } + + public VideoInfo setShowShare(boolean visible) { + reConvert.setVisible(visible); + share.setVisible(visible); + return this; + } } Modified: openmeetings/application/branches/3.2.x/pom.xml URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/pom.xml?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/pom.xml (original) +++ openmeetings/application/branches/3.2.x/pom.xml Sun Aug 21 17:20:41 2016 @@ -658,6 +658,12 @@ <version>${tomcat.version}</version> <scope>provided</scope> </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>3.4</version> + <scope>provided</scope> + </dependency> </dependencies> </dependencyManagement> <dependencies> Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java (original) +++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java Sun Aug 21 17:20:41 2016 @@ -37,7 +37,7 @@ public interface IApplication { String getOmString(String key, long languageId); Client updateClient(Client rcl); String getOmContactsLink(); - String getOmInvitationLink(String baseUrl, Invitation i); + String getOmInvitationLink(Invitation i); String urlForActivatePage(PageParameters pp); void invalidateClient(Long userId, String sessionId); } Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java (original) +++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java Sun Aug 21 17:20:41 2016 @@ -18,9 +18,11 @@ */ package org.apache.openmeetings.db.dao.room; +import static org.apache.openmeetings.util.CalendarHelper.getZoneId; import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; import java.util.Date; +import java.util.List; import javax.persistence.EntityManager; import javax.persistence.NoResultException; @@ -28,9 +30,12 @@ import javax.persistence.PersistenceCont import javax.persistence.TypedQuery; import org.apache.openmeetings.db.entity.room.Invitation; +import org.apache.openmeetings.util.CalendarHelper; import org.red5.logging.Red5LoggerFactory; import org.slf4j.Logger; import org.springframework.transaction.annotation.Transactional; +import org.threeten.bp.LocalDateTime; +import org.threeten.bp.ZonedDateTime; @Transactional public class InvitationDao { @@ -67,20 +72,35 @@ public class InvitationDao { return null; } - public Invitation getInvitationByHashCode(String hashCode, boolean hidePass) { - try { - - TypedQuery<Invitation> query = em.createNamedQuery("getInvitationByHashCode", Invitation.class); - query.setParameter("hashCode", hashCode); - - try { - return query.getSingleResult(); - } catch (NoResultException ex) { + public Invitation getByHash(String hash, boolean hidePass, boolean markUsed) { + List<Invitation> list = em.createNamedQuery("getInvitationByHashCode", Invitation.class) + .setParameter("hashCode", hash).getResultList(); + Invitation i = list != null && list.size() == 1 ? list.get(0) : null; + if (i != null) { + switch (i.getValid()) { + case OneTime: + // one-time invitation + i.setAllowEntry(!i.isUsed()); + if (markUsed) { + i.setUsed(true); + update(i); + } + break; + case Period: + LocalDateTime now = ZonedDateTime.now(getZoneId(i.getInvitee().getTimeZoneId())).toLocalDateTime(); + LocalDateTime from = CalendarHelper.getDateTime(i.getValidFrom(), i.getInvitee().getTimeZoneId()); + LocalDateTime to = CalendarHelper.getDateTime(i.getValidTo(), i.getInvitee().getTimeZoneId()); + i.setAllowEntry(now.isAfter(from) && now.isBefore(to)); + break; + case Endless: + default: + i.setAllowEntry(true); + break; + } + if (hidePass) { + i.setPassword(null); } - - } catch (Exception e) { - log.error("getInvitationByHashCode : ", e); } - return null; + return i; } } Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java (original) +++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java Sun Aug 21 17:20:41 2016 @@ -39,6 +39,7 @@ import javax.persistence.Transient; import org.apache.openjpa.persistence.jdbc.ForeignKey; import org.apache.openmeetings.db.entity.IDataProviderEntity; import org.apache.openmeetings.db.entity.calendar.Appointment; +import org.apache.openmeetings.db.entity.record.Recording; import org.apache.openmeetings.db.entity.user.User; @Entity @@ -91,6 +92,11 @@ public class Invitation implements IData @ForeignKey(enabled = true) private Room room; + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "recording_id", nullable = true) + @ForeignKey(enabled = true) + private Recording recording; + // the hash for the link @Column(name = "hash") private String hash; @@ -139,6 +145,7 @@ public class Invitation implements IData updated = i.updated; deleted = i.deleted; room = i.room; + recording = i.recording; hash = i.hash; invitee = i.invitee; passwordProtected = i.passwordProtected; @@ -168,6 +175,14 @@ public class Invitation implements IData this.room = room; } + public Recording getRecording() { + return recording; + } + + public void setRecording(Recording recording) { + this.recording = recording; + } + public User getInvitedBy() { return invitedBy; } Modified: openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/room/InvitationManager.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/room/InvitationManager.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/room/InvitationManager.java (original) +++ openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/room/InvitationManager.java Sun Aug 21 17:20:41 2016 @@ -31,7 +31,6 @@ import java.util.Vector; import org.apache.openmeetings.IApplication; import org.apache.openmeetings.core.mail.MailHandler; import org.apache.openmeetings.core.mail.SMSHandler; -import org.apache.openmeetings.db.dao.basic.ConfigurationDao; import org.apache.openmeetings.db.dao.room.IInvitationManager; import org.apache.openmeetings.db.dao.room.InvitationDao; import org.apache.openmeetings.db.entity.basic.MailMessage; @@ -76,8 +75,6 @@ public class InvitationManager implement private SMSHandler smsHandler; @Autowired private TimezoneUtil timezoneUtil; - @Autowired - private ConfigurationDao configDao; /** * @author vasya @@ -115,7 +112,7 @@ public class InvitationManager implement String invitation_link = null; if (type != MessageType.Cancel) { IApplication app = ensureApplication(1L); - invitation_link = app.getOmInvitationLink(configDao.getBaseUrl(), i); + invitation_link = app.getOmInvitationLink(i); } User owner = i.getInvitedBy(); @@ -186,7 +183,7 @@ public class InvitationManager implement public Object getInvitationByHashCode(String hashCode, boolean hidePass) { try { log.debug("Invitation was requested by hashcode: " + hashCode); - Invitation i = invitationDao.getInvitationByHashCode(hashCode, hidePass); + Invitation i = invitationDao.getByHash(hashCode, hidePass, true); if (i == null) { // already deleted or does not exist @@ -196,48 +193,15 @@ public class InvitationManager implement case OneTime: // do this only if the user tries to get the Invitation, not // while checking the PWD - if (hidePass) { - // one-time invitation - if (i.isUsed()) { - // Invitation is of type *only-one-time* and was - // already used - return new Long(-32); - } else { - // set to true if this is the first time / a normal - // getInvitation-Query - i.setUsed(true); - invitationDao.update(i); - // invitation.setInvitationpass(null); - i.setAllowEntry(true); - } - } else { - i.setAllowEntry(true); + if (!i.isAllowEntry()) { + // Invitation is of type *only-one-time* and was + // already used + return new Long(-32); } break; case Period: - LocalDateTime now = ZonedDateTime.now(getZoneId(i.getInvitee().getTimeZoneId())).toLocalDateTime(); - LocalDateTime from = CalendarHelper.getDateTime(i.getValidFrom(), i.getInvitee().getTimeZoneId()); - LocalDateTime to = CalendarHelper.getDateTime(i.getValidTo(), i.getInvitee().getTimeZoneId()); - if (now.isAfter(from) && now.isBefore(to)) { - invitationDao.update(i); - // invitation.setInvitationpass(null); - i.setAllowEntry(true); - } else { - - // Invitation is of type *period* and is not valid - // anymore, this is an extra hook to display the time - // correctly - // in the method where it shows that the hash code does - // not work anymore - i.setAllowEntry(false); - } - break; case Endless: default: - invitationDao.update(i); - - i.setAllowEntry(true); - // invitation.setInvitationpass(null); break; } return i; Modified: openmeetings/application/trunk/openmeetings-web/pom.xml URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/pom.xml?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/pom.xml (original) +++ openmeetings/application/trunk/openmeetings-web/pom.xml Sun Aug 21 17:20:41 2016 @@ -656,6 +656,10 @@ </exclusion> </exclusions> </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + </dependency> <!-- Test dependencies --> <dependency> <groupId>org.seleniumhq.selenium</groupId> Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigForm.java Sun Aug 21 17:20:41 2016 @@ -40,6 +40,7 @@ import org.apache.wicket.model.Model; import org.apache.wicket.util.time.Duration; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.IValidator; +import org.apache.wicket.validation.ValidationError; /** * Handle {@link Configuration} items as list and form @@ -67,7 +68,7 @@ public class ConfigForm extends AdminBas public void validate(IValidatable<String> validatable) { Configuration c = getBean(ConfigurationDao.class).forceGet(validatable.getValue()); if (c != null && !c.isDeleted() && !c.getId().equals(ConfigForm.this.getModelObject().getId())) { - error(Application.getString(1544L)); + validatable.error(new ValidationError(Application.getString(1544L))); } } })); Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Sun Aug 21 17:20:41 2016 @@ -24,6 +24,7 @@ import static org.apache.openmeetings.we import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_MESSAGES; import static org.red5.logging.Red5LoggerFactory.getLogger; import static org.springframework.web.context.support.WebApplicationContextUtils.getWebApplicationContext; +import static org.apache.openmeetings.web.app.WebSession.INVITATION_HASH; import java.text.MessageFormat; import java.util.ArrayList; @@ -145,6 +146,7 @@ public class Application extends Authent mountPage("activate", ActivatePage.class); mountPage("reset", ResetPage.class); mountPage("/recording/${hash}", RecordingPage.class); + mountPage("/recording", RecordingPage.class); mountResource("/recordings/avi/${id}", new AviRecordingResourceReference()); mountResource("/recordings/flv/${id}", new FlvRecordingResourceReference()); mountResource("/recordings/mp4/${id}", new Mp4RecordingResourceReference()); @@ -451,11 +453,8 @@ public class Application extends Authent return getContactsLink(); } - public static String getInvitationLink(String baseUrl, Invitation i) { - String link = baseUrl; - if (link == null) { - return null; - } + public static String getInvitationLink(Invitation i) { + String link = ""; Room r = i.getRoom(); User u = i.getInvitee(); if (r != null) { @@ -464,21 +463,26 @@ public class Application extends Authent allowed = getBean(MainService.class).isRoomAllowedToUser(r, u); } if (!allowed) { - link += "?invitationHash=" + i.getHash(); - + PageParameters pp = new PageParameters(); + pp.add(INVITATION_HASH, i.getHash()); if (u.getLanguageId() > 0) { - link += "&language=" + u.getLanguageId(); + pp.add("language", u.getLanguageId()); } + link = urlForPage(MainPage.class, pp); } else { link = getRoomUrlFragment(r.getId()).getLink(); } } + Recording rec = i.getRecording(); + if (rec != null) { + link = urlForPage(RecordingPage.class, new PageParameters().add(INVITATION_HASH, i.getHash())); + } return link; } @Override - public String getOmInvitationLink(String baseUrl, Invitation i) { //FIXME hack for email templates support (should be in separate module for now - return getInvitationLink(baseUrl, i); + public String getOmInvitationLink(Invitation i) { //FIXME hack for email templates support (should be in separate module for now + return getInvitationLink(i); } public static String urlForPage(Class<? extends Page> clazz, PageParameters pp) { Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Sun Aug 21 17:20:41 2016 @@ -30,8 +30,6 @@ import static org.apache.openmeetings.we import static org.apache.openmeetings.web.app.Application.removeInvalidSession; import static org.apache.openmeetings.web.app.Application.removeOnlineUser; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; @@ -44,14 +42,17 @@ import java.util.Locale; import java.util.Set; import java.util.TimeZone; +import org.apache.commons.lang3.time.FastDateFormat; import org.apache.openmeetings.IWebSession; import org.apache.openmeetings.core.ldap.LdapLoginManagement; import org.apache.openmeetings.db.dao.basic.ConfigurationDao; import org.apache.openmeetings.db.dao.label.LabelDao; +import org.apache.openmeetings.db.dao.room.InvitationDao; import org.apache.openmeetings.db.dao.server.SOAPLoginDao; import org.apache.openmeetings.db.dao.server.SessiondataDao; import org.apache.openmeetings.db.dao.user.IUserManager; import org.apache.openmeetings.db.dao.user.UserDao; +import org.apache.openmeetings.db.entity.room.Invitation; import org.apache.openmeetings.db.entity.server.RemoteSessionObject; import org.apache.openmeetings.db.entity.server.SOAPLogin; import org.apache.openmeetings.db.entity.server.Sessiondata; @@ -60,6 +61,7 @@ import org.apache.openmeetings.db.entity import org.apache.openmeetings.db.entity.user.User.Type; import org.apache.openmeetings.db.util.TimezoneUtil; import org.apache.openmeetings.util.OmException; +import org.apache.openmeetings.web.pages.RecordingPage; import org.apache.openmeetings.web.pages.SwfPage; import org.apache.openmeetings.web.user.dashboard.MyRoomsWidget; import org.apache.openmeetings.web.user.dashboard.MyRoomsWidgetDescriptor; @@ -89,11 +91,12 @@ import org.wicketstuff.dashboard.web.Das public class WebSession extends AbstractAuthenticatedWebSession implements IWebSession { private static final long serialVersionUID = 1L; public static final int MILLIS_IN_MINUTE = 60000; - public static final String SECURE_HASH = "secureHash"; - public static final String INVITATION_HASH = "invitationHash"; public static final String ISO8601_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ssZ"; public static final List<String> AVAILABLE_TIMEZONES = Arrays.asList(TimeZone.getAvailableIDs()); public static final Set<String> AVAILABLE_TIMEZONE_SET = new LinkedHashSet<String>(AVAILABLE_TIMEZONES); + public static final String WICKET_ROOM_ID = "wicketroomid"; + static final String SECURE_HASH = "secureHash"; + static final String INVITATION_HASH = "invitationHash"; private Long userId = null; private Set<Right> rights = new HashSet<User.Right>(); //TODO renew somehow on user edit !!!! private long languageId = -1; //TODO renew somehow on user edit !!!! @@ -101,15 +104,17 @@ public class WebSession extends Abstract private OmUrlFragment area = null; private TimeZone tz; private TimeZone browserTz; - private DateFormat ISO8601FORMAT = new SimpleDateFormat(ISO8601_FORMAT_STRING); //FIXME not thread safe - private DateFormat sdf; + private FastDateFormat ISO8601FORMAT = null; + private FastDateFormat sdf = null; private UserDashboard dashboard; private Locale browserLocale = null; - private Long recordingId; + private Invitation i = null; + private Long roomId = null; + private Long recordingId = null; private Long loginError = null; private String externalType; private boolean kickedByAdmin = false; - + public WebSession(Request request) { super(request); browserLocale = getLocale(); @@ -122,7 +127,10 @@ public class WebSession extends Abstract userId = null; rights = new HashSet<User.Right>(); SID = null; + ISO8601FORMAT = null; sdf = null; + i = null; + roomId = null; recordingId = null; externalType = null; tz = null; @@ -130,36 +138,23 @@ public class WebSession extends Abstract loginError = null; browserLocale = null; } - - @Override - public Roles getRoles() { - //first of all will check hashes - try { - IRequestParameters params = RequestCycle.get().getRequest().getRequestParameters(); - StringValue secureHash = params.getParameterValue(SECURE_HASH); - StringValue invitationHash = params.getParameterValue(INVITATION_HASH); - if (!secureHash.isEmpty() || !invitationHash.isEmpty()) { - PageParameters pp = new PageParameters(); - for (String p : params.getParameterNames()) { - List<StringValue> vals = params.getParameterValues(p); - if (vals != null) { - for (StringValue sv : vals) { - if (!sv.isEmpty()) { - pp.add(p, sv.toString()); - } - } + + private PageParameters getParams(IRequestParameters params, PageParameters pp) { + for (String p : params.getParameterNames()) { + List<StringValue> vals = params.getParameterValues(p); + if (vals != null) { + for (StringValue sv : vals) { + if (!sv.isEmpty()) { + pp.add(p, sv.toString()); } } - if (isSignedIn()) { - invalidate(); - } - throw new RestartResponseAtInterceptPageException(SwfPage.class, pp); } - } catch (RestartResponseAtInterceptPageException e) { - throw e; - } catch (Exception e) { - //no-op, will continue to sign-in page } + return pp; + } + + @Override + public Roles getRoles() { if (rights.isEmpty()) { isSignedIn(); } @@ -193,6 +188,56 @@ public class WebSession extends Abstract return userId != null && userId.longValue() > 0; } + public void checkHashes(boolean redirect) { + IRequestParameters params = RequestCycle.get().getRequest().getRequestParameters(); + StringValue secureHash = params.getParameterValue(SECURE_HASH); + StringValue invitationHash = params.getParameterValue(INVITATION_HASH); + PageParameters pp = new PageParameters(); + try { + if (!secureHash.isEmpty()) { + if (isSignedIn()) { + invalidate(); + } + if (signIn(secureHash.toString(), false)) { + //TODO markUsed + } else { + //TODO redirect to error + } + } + if (!invitationHash.isEmpty()) { + if (isSignedIn()) { + invalidate(); + } + i = getBean(InvitationDao.class).getByHash(invitationHash.toString(), false, false); + if (i.isAllowEntry()) { + setUser(i.getInvitee()); + //TODO markUsed + if (i.getRoom() != null) { + roomId = i.getRoom().getId(); + } else if (i.getAppointment() != null && i.getAppointment().getRoom() != null) { + roomId = i.getAppointment().getRoom().getId(); + } else if (i.getRecording() != null) { + recordingId = i.getRecording().getId(); + } + } + } + if (!secureHash.isEmpty() || !invitationHash.isEmpty()) { + if (roomId != null) { + getParams(params, pp).add(WICKET_ROOM_ID, roomId); + if (redirect) { + throw new RestartResponseAtInterceptPageException(SwfPage.class, pp); + } + } else if (recordingId != null && redirect){ + throw new RestartResponseAtInterceptPageException(RecordingPage.class, pp); + } + } + } catch (RestartResponseAtInterceptPageException e) { + throw e; + } catch (Exception e) { + //no-op, will continue to sign-in page + } + } + public boolean signIn(String secureHash, boolean markUsed) { //FIXME code is duplicated from MainService, need to be unified SOAPLoginDao soapDao = getBean(SOAPLoginDao.class); @@ -234,6 +279,7 @@ public class WebSession extends Abstract } sessionDao.updateUser(SID, user.getId()); setUser(user); + roomId = soapLogin.getRoomId(); recordingId = soapLogin.getRecordingId(); return true; } @@ -241,7 +287,7 @@ public class WebSession extends Abstract } return false; } - + private void setUser(User u) { String _sid = SID; Long _recordingId = recordingId; @@ -257,10 +303,10 @@ public class WebSession extends Abstract languageId = u.getLanguageId(); externalType = u.getExternalType(); tz = getBean(TimezoneUtil.class).getTimeZone(u); - ISO8601FORMAT.setTimeZone(tz); + ISO8601FORMAT = FastDateFormat.getInstance(ISO8601_FORMAT_STRING, tz); setLocale(languageId == 3 ? Locale.GERMANY : LabelDao.languages.get(languageId)); //FIXMW locale need to be set by User language first - sdf = DateFormat.getDateTimeInstance(SHORT, SHORT, getLocale()); + sdf = FastDateFormat.getDateTimeInstance(SHORT, SHORT, getLocale()); } public boolean signIn(String login, String password, Type type, Long domainId) { @@ -353,15 +399,19 @@ public class WebSession extends Abstract checkIsInvalid(); return get().userId; } - + public static Long getRecordingId() { return get().recordingId; } - + + public Invitation getInvitation() { + return i; + } + public static String getExternalType() { return get().externalType; } - + public static TimeZone getUserTimeZone() { return get().tz; } @@ -374,11 +424,11 @@ public class WebSession extends Abstract return Calendar.getInstance(getClientTimeZone()); } - public static DateFormat getIsoDateFormat() { + public static FastDateFormat getIsoDateFormat() { return get().ISO8601FORMAT; } - public static DateFormat getDateFormat() { + public static FastDateFormat getDateFormat() { return get().sdf; } Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/IUpdatable.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/IUpdatable.java?rev=1757068&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/IUpdatable.java (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/IUpdatable.java Sun Aug 21 17:20:41 2016 @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache 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.apache.org/licenses/LICENSE-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.apache.openmeetings.web.common; + +import org.apache.wicket.ajax.AjaxRequestTarget; + +public interface IUpdatable { + void update(AjaxRequestTarget target); +} Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java Sun Aug 21 17:20:41 2016 @@ -29,7 +29,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.UUID; -import org.apache.openmeetings.db.dao.basic.ConfigurationDao; import org.apache.openmeetings.db.dao.room.InvitationDao; import org.apache.openmeetings.db.dao.user.UserDao; import org.apache.openmeetings.db.entity.room.Invitation; @@ -156,7 +155,7 @@ public abstract class InvitationForm ext i.setUpdated(null); i.setUsed(false); - i.setPassword(CryptProvider.get().hash(i.getPassword())); //FIXME should be hidden + i.setPassword(CryptProvider.get().hash(i.getPassword())); i.setValidFrom(getDate(from.getModelObject().minusMinutes(5), timeZoneId.getModelObject())); i.setValidTo(getDate(to.getModelObject(), timeZoneId.getModelObject())); @@ -209,7 +208,7 @@ public abstract class InvitationForm ext } else if (button.equals(dialog.generate)) { Invitation i = create(recipients.getModelObject().iterator().next()); setModelObject(i); - url.setModelObject(getInvitationLink(getBean(ConfigurationDao.class).getBaseUrl(), i)); + url.setModelObject(getInvitationLink(i)); target.add(url); } else if (button.equals(dialog.send)) { if (Strings.isEmpty(url.getModelObject())) { Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseInitedPage.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseInitedPage.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseInitedPage.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BaseInitedPage.java Sun Aug 21 17:20:41 2016 @@ -27,6 +27,15 @@ import org.apache.openmeetings.web.app.W public abstract class BaseInitedPage extends BasePage { private static final long serialVersionUID = 1L; + public BaseInitedPage() { + super(); + WebSession.get().checkHashes(getHashRedirect()); + } + + protected boolean getHashRedirect() { + return true; + } + @Override protected String getApplicationName() { return getBean(ConfigurationDao.class).getAppName(); Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.java Sun Aug 21 17:20:41 2016 @@ -62,9 +62,9 @@ public abstract class BasePage extends A String code = getLanguageCode(); add(new TransparentWebMarkupContainer("html") - .add(new AttributeModifier("xml:lang", code)) - .add(new AttributeModifier("lang", code)) - .add(new AttributeModifier("dir", isRtl() ? "rtl" : "ltr"))); + .add(new AttributeModifier("xml:lang", code)) + .add(new AttributeModifier("lang", code)) + .add(new AttributeModifier("dir", isRtl() ? "rtl" : "ltr"))); add(new Label("pageTitle", appName)); add(header = new HeaderPanel("header", appName)); } Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.html URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.html?rev=1757068&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.html (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.html Sun Aug 21 17:20:41 2016 @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache 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.apache.org/licenses/LICENSE-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. + +--> +<html xmlns:wicket="http://wicket.apache.org"> +<wicket:panel> + <form wicket:id="form"> + <div wicket:id="feedback"></div> + <label wicket:for="password"><wicket:message key="536"/></label> + <input wicket:id="password" type="password"/> + </form> +</wicket:panel> +</html> Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java?rev=1757068&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java Sun Aug 21 17:20:41 2016 @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache 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.apache.org/licenses/LICENSE-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.apache.openmeetings.web.pages; + +import java.util.Arrays; +import java.util.List; + +import org.apache.openmeetings.db.entity.room.Invitation; +import org.apache.openmeetings.util.crypt.CryptProvider; +import org.apache.openmeetings.web.app.Application; +import org.apache.openmeetings.web.app.WebSession; +import org.apache.openmeetings.web.common.IUpdatable; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.core.request.handler.IPartialPageRequestHandler; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.PasswordTextField; +import org.apache.wicket.model.Model; +import org.apache.wicket.validation.IValidatable; +import org.apache.wicket.validation.IValidator; +import org.apache.wicket.validation.ValidationError; + +import com.googlecode.wicket.jquery.core.JQueryBehavior; +import com.googlecode.wicket.jquery.core.Options; +import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog; +import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton; +import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel; + +public class InvitationPasswordDialog extends AbstractFormDialog<Invitation> { + private static final long serialVersionUID = 1L; + private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true)); + private final DialogButton check = new DialogButton("check", Application.getString(537)); + private final Form<Void> form = new Form<>("form"); + private final PasswordTextField password = new PasswordTextField("password", Model.of((String)null)); + private final IUpdatable comp; + + public InvitationPasswordDialog(String id, IUpdatable comp) { + super(id, Application.getString(524)); + this.comp = comp; + password.setLabel(Model.of(Application.getString(536))).add(new IValidator<String>(){ + private static final long serialVersionUID = 1L; + + @Override + public void validate(IValidatable<String> validatable) { + if (!CryptProvider.get().verify(validatable.getValue(), WebSession.get().getInvitation().getPassword())) { + validatable.error(new ValidationError(Application.getString(538L))); + } + } + }); + add(form.add(password, feedback.setOutputMarkupId(true))); + } + + @Override + public void onConfigure(JQueryBehavior behavior) { + super.onConfigure(behavior); + behavior.setOption("autoOpen", WebSession.get().getInvitation().isPasswordProtected()); + behavior.setOption("closeOnEscape", false); + behavior.setOption("dialogClass", Options.asString("no-close")); + behavior.setOption("resizable", false); + } + + @Override + protected void onOpen(IPartialPageRequestHandler handler) { + password.setModelObject(null); + } + + @Override + public DialogButton getSubmitButton() { + return check; + } + + @Override + protected List<DialogButton> getButtons() { + return Arrays.asList(check); + } + + @Override + public Form<Void> getForm() { + return form; + } + + @Override + protected void onError(AjaxRequestTarget target) { + target.add(feedback); + } + + @Override + protected void onSubmit(AjaxRequestTarget target) { + comp.update(target); + } + +} Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.html URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.html?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.html (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.html Sun Aug 21 17:20:41 2016 @@ -24,6 +24,7 @@ <div wicket:id="info"></div> <div wicket:id="player"></div> </div> + <div wicket:id="i-pass"></div> </wicket:extend> </html> Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/RecordingPage.java Sun Aug 21 17:20:41 2016 @@ -23,29 +23,55 @@ import static org.apache.openmeetings.we import org.apache.openmeetings.db.dao.record.RecordingDao; import org.apache.openmeetings.db.entity.record.Recording; +import org.apache.openmeetings.db.entity.room.Invitation; import org.apache.openmeetings.web.app.WebSession; +import org.apache.openmeetings.web.common.IUpdatable; import org.apache.openmeetings.web.user.record.VideoInfo; import org.apache.openmeetings.web.user.record.VideoPlayer; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.request.IRequestParameters; import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.util.string.StringValue; -public class RecordingPage extends BaseInitedPage { +public class RecordingPage extends BaseInitedPage implements IUpdatable { private static final long serialVersionUID = 1L; + private final VideoInfo vi = new VideoInfo("info", null); + private final VideoPlayer vp = new VideoPlayer("player", null); public RecordingPage(PageParameters p) { - String hash = p.get("hash").toString(); + StringValue hash = p.get("hash"); Recording r = null; - if (WebSession.get().signIn(hash, true)) { + WebSession ws = WebSession.get(); + if (!hash.isEmpty()) { + ws.signIn(hash.toString(), true); + } + Invitation i = ws.getInvitation(); + if (i != null && !i.isPasswordProtected()) { + r = i.getRecording(); + } else if (i == null) { Long recId = getRecordingId(); if (recId != null) { r = getBean(RecordingDao.class).get(recId); } } - add(new VideoInfo("info", r).setVisible(r != null), new VideoPlayer("player", r).setVisible(r != null)); + add(vi.setShowShare(false).update(null, r).setOutputMarkupPlaceholderTag(true).setVisible(r != null) + , vp.update(null, r).setOutputMarkupPlaceholderTag(true).setVisible(r != null) + , new InvitationPasswordDialog("i-pass", this)); + } + + @Override + protected boolean getHashRedirect() { + return false; } @Override protected void onParameterArrival(IRequestParameters requestParameters, AjaxRequestTarget target) { } + + @Override + public void update(AjaxRequestTarget target) { + Invitation i = WebSession.get().getInvitation(); + target.add(vi.update(target, i.getRecording()).setVisible(true) + , vp.update(target, i.getRecording()).setVisible(true)); + } } Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java Sun Aug 21 17:20:41 2016 @@ -33,7 +33,6 @@ import java.util.Date; import java.util.List; import org.apache.openmeetings.core.mail.MailHandler; -import org.apache.openmeetings.db.dao.basic.ConfigurationDao; import org.apache.openmeetings.db.dao.calendar.AppointmentDao; import org.apache.openmeetings.db.dao.room.IInvitationManager; import org.apache.openmeetings.db.dao.room.RoomDao; @@ -242,7 +241,7 @@ public class MessageDialog extends Abstr , CalendarHelper.getDate(start.getModelObject(), to.getTimeZoneId()) , CalendarHelper.getDate(end.getModelObject(), to.getTimeZoneId()), null); - invitation_link = getInvitationLink(getBean(ConfigurationDao.class).getBaseUrl(), i); + invitation_link = getInvitationLink(i); if (invitation_link == null) { invitation_link = ""; Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingInvitationForm.java Sun Aug 21 17:20:41 2016 @@ -18,12 +18,13 @@ */ package org.apache.openmeetings.web.user.record; +import org.apache.openmeetings.db.entity.record.Recording; import org.apache.openmeetings.web.common.InvitationForm; import org.apache.wicket.ajax.AjaxRequestTarget; public class RecordingInvitationForm extends InvitationForm { private static final long serialVersionUID = 1L; - private Long recordingId; + private Recording recording; public RecordingInvitationForm(String id) { super(id); @@ -33,11 +34,10 @@ public class RecordingInvitationForm ext @Override public void updateModel(AjaxRequestTarget target) { super.updateModel(target); - //Invitation i = getModelObject(); - //i.setReco + getModelObject().setRecording(recording); } - public void setRecordingId(Long recordingId) { - this.recordingId = recordingId; + public void setRecording(Recording recording) { + this.recording = recording; } } Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java Sun Aug 21 17:20:41 2016 @@ -63,14 +63,8 @@ public abstract class RecordingResourceR } catch (Exception e) { //no-op expected } - WebSession ws = WebSession.get(); - if (id != null && ws.isSignedIn()) { + if (id != null && WebSession.get().isSignedIn()) { return getRecording(id); - } else { - ws.invalidate(); - if (ws.signIn(_id.toString(), true)) { - return getRecording(getRecordingId()); - } } return null; } @@ -81,6 +75,9 @@ public abstract class RecordingResourceR if (r == null || r.getType() == Type.Folder || r.isDeleted()) { return null; } + if (id.equals(getRecordingId())) { + return r; + } //TODO should we check parentId here if (r.getOwnerId() == null && r.getGroupId() == null) { //public Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java Sun Aug 21 17:20:41 2016 @@ -89,7 +89,7 @@ public class VideoInfo extends Panel { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - rif.setRecordingId(rm.getObject().getId()); + rif.setRecording(rm.getObject()); invite.updateModel(target); invite.open(target); } @@ -226,4 +226,10 @@ public class VideoInfo extends Panel { }); return list; } + + public VideoInfo setShowShare(boolean visible) { + reConvert.setVisible(visible); + share.setVisible(visible); + return this; + } } Modified: openmeetings/application/trunk/openmeetings-webservice/pom.xml URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-webservice/pom.xml?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-webservice/pom.xml (original) +++ openmeetings/application/trunk/openmeetings-webservice/pom.xml Sun Aug 21 17:20:41 2016 @@ -93,6 +93,10 @@ <artifactId>cxf-rt-rs-extension-providers</artifactId> </dependency> <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-rt-rs-service-description</artifactId> + </dependency> + <dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> </dependency> Modified: openmeetings/application/trunk/pom.xml URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/pom.xml?rev=1757068&r1=1757067&r2=1757068&view=diff ============================================================================== --- openmeetings/application/trunk/pom.xml (original) +++ openmeetings/application/trunk/pom.xml Sun Aug 21 17:20:41 2016 @@ -599,6 +599,11 @@ <version>${cxf.version}</version> </dependency> <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-rt-rs-service-description</artifactId> + <version>${cxf.version}</version> + </dependency> + <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>${selenium.version}</version> @@ -653,6 +658,12 @@ <version>${tomcat.version}</version> <scope>provided</scope> </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>3.4</version> + <scope>provided</scope> + </dependency> </dependencies> </dependencyManagement> <dependencies>
