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>


Reply via email to