r1018 - in xwiki/trunk/src: main/java/com/xpn/xwiki main/java/com/xpn/xwiki/user/impl/xwiki test/java/com/xpn/xwiki/test test/resources
Ludovic Dubost
ludovic at users.forge.objectweb.org
Fri Mar 31 00:00:13 CEST 2006
Author: ludovic
Date: 2006-03-30 23:59:59 +0200 (Thu, 30 Mar 2006)
New Revision: 1018
Modified:
xwiki/trunk/src/main/java/com/xpn/xwiki/XWiki.java
xwiki/trunk/src/main/java/com/xpn/xwiki/user/impl/xwiki/MyPersistentLoginManager.java
xwiki/trunk/src/test/java/com/xpn/xwiki/test/MyFormAuthentication.java
xwiki/trunk/src/test/resources/log4j.properties
xwiki/trunk/src/test/resources/xwiki.cfg
Log:
Added considering localhost as non virtual
Added log in MyPersistentLoginManager.java
Switch System.out to error log in MyPersistentLoginManager.java
Added log in MyFormAuthentication.java
Updated test log4j.properties
Updated test xwiki.cfg
Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/XWiki.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/XWiki.java 2006-03-30 01:03:57 UTC (rev 1017)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/XWiki.java 2006-03-30 21:59:59 UTC (rev 1018)
@@ -259,7 +259,7 @@
}
;
- if (host.equals(""))
+ if (host.equals("")||host.equals("localhost")||host.equals("127.0.0.1"))
return xwiki;
String appname = findWikiServer(host, context);
Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/user/impl/xwiki/MyPersistentLoginManager.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/user/impl/xwiki/MyPersistentLoginManager.java 2006-03-30 01:03:57 UTC (rev 1017)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/user/impl/xwiki/MyPersistentLoginManager.java 2006-03-30 21:59:59 UTC (rev 1018)
@@ -1,25 +1,25 @@
-/*
- * Copyright 2006, XpertNet SARL, and individual contributors as indicated
- * by the contributors.txt.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- *
- * @author ludovic
- * @author sdumitriu
- */
+/*
+ * Copyright 2006, XpertNet SARL, and individual contributors as indicated
+ * by the contributors.txt.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *
+ * @author ludovic
+ * @author sdumitriu
+ */
package com.xpn.xwiki.user.impl.xwiki;
@@ -66,67 +66,69 @@
* @param password the password that's being remembered
*/
public void rememberLogin(
- HttpServletRequest request,
- HttpServletResponse response,
- String username,
- String password
+ HttpServletRequest request,
+ HttpServletResponse response,
+ String username,
+ String password
) throws IOException, ServletException {
- if (protection.equals(PROTECTION_ALL) || protection.equals(PROTECTION_ENCRYPTION)) {
- username = encryptText(username);
- password = encryptText(password);
- if (username == null || password == null) {
- System.out.println("ERROR!!");
- System.out.println("There was a problem encrypting the username or password!!");
- System.out.println("Remember Me function will be disabled!!");
- return;
- }
- }
+ if (protection.equals(PROTECTION_ALL) || protection.equals(PROTECTION_ENCRYPTION)) {
+ username = encryptText(username);
+ password = encryptText(password);
+ if (username == null || password == null) {
+ System.out.println("ERROR!!");
+ System.out.println("There was a problem encrypting the username or password!!");
+ System.out.println("Remember Me function will be disabled!!");
+ return;
+ }
+ }
- String cookieDomain = getCookieDomain(request);
+ String cookieDomain = getCookieDomain(request);
// create client cookie to store username and password
- Cookie usernameCookie = new Cookie(COOKIE_USERNAME, username);
- usernameCookie.setMaxAge(60 * 60 * 24 * Integer.parseInt(cookieLife));
- usernameCookie.setPath(cookiePath);
- if (cookieDomain!=null)
- usernameCookie.setDomain(cookieDomain);
+ Cookie usernameCookie = new Cookie(COOKIE_USERNAME, username);
+ usernameCookie.setMaxAge(60 * 60 * 24 * Integer.parseInt(cookieLife));
+ usernameCookie.setPath(cookiePath);
+ if (cookieDomain!=null)
+ usernameCookie.setDomain(cookieDomain);
addCookie(response, usernameCookie);
Cookie passwdCookie = new Cookie(COOKIE_PASSWORD, password);
- passwdCookie.setMaxAge(60 * 60 * 24 * Integer.parseInt(cookieLife));
- passwdCookie.setPath(cookiePath);
+ passwdCookie.setMaxAge(60 * 60 * 24 * Integer.parseInt(cookieLife));
+ passwdCookie.setPath(cookiePath);
if (cookieDomain!=null)
- passwdCookie.setDomain(cookieDomain);
+ passwdCookie.setDomain(cookieDomain);
addCookie(response, passwdCookie);
Cookie rememberCookie = new Cookie(COOKIE_REMEMBERME, "true");
- rememberCookie.setMaxAge(60 * 60 * 24 * Integer.parseInt(cookieLife));
- rememberCookie.setPath(cookiePath);
- if (cookieDomain!=null)
- rememberCookie.setDomain(cookieDomain);
+ rememberCookie.setMaxAge(60 * 60 * 24 * Integer.parseInt(cookieLife));
+ rememberCookie.setPath(cookiePath);
+ if (cookieDomain!=null)
+ rememberCookie.setDomain(cookieDomain);
addCookie(response, rememberCookie);
if (protection.equals(PROTECTION_ALL) || protection.equals(PROTECTION_VALIDATION)) {
- String validationHash = getValidationHash(username, password, request.getRemoteAddr());
- if (validationHash != null) {
- Cookie validationCookie = new Cookie(COOKIE_VALIDATION, validationHash);
- validationCookie.setMaxAge(60 * 60 * 24 * Integer.parseInt(cookieLife));
- validationCookie.setPath(cookiePath);
- if (cookieDomain!=null)
- validationCookie.setDomain(cookieDomain);
- addCookie(response, validationCookie);
- } else {
- System.out.println("WARNING!!! WARNING!!!");
- System.out.println("PROTECTION=ALL or PROTECTION=VALIDATION was specified");
- System.out.println("but Validation Hash could NOT be generated");
- System.out.println("Validation has been disabled!!!!");
- }
- }
- return;
+ String validationHash = getValidationHash(username, password, request.getRemoteAddr());
+ if (validationHash != null) {
+ Cookie validationCookie = new Cookie(COOKIE_VALIDATION, validationHash);
+ validationCookie.setMaxAge(60 * 60 * 24 * Integer.parseInt(cookieLife));
+ validationCookie.setPath(cookiePath);
+ if (cookieDomain!=null)
+ validationCookie.setDomain(cookieDomain);
+ addCookie(response, validationCookie);
+ } else {
+ if (log.isErrorEnabled()) {
+ log.error("WARNING!!! WARNING!!!");
+ log.error("PROTECTION=ALL or PROTECTION=VALIDATION was specified");
+ log.error("but Validation Hash could NOT be generated");
+ log.error("Validation has been disabled!!!!");
+ }
+ }
+ }
+ return;
}
private void addCookie(HttpServletResponse response, Cookie cookie) {
if (log.isDebugEnabled())
- log.debug("Adding cookie: " + cookie.getDomain() + " " + cookie.getPath() + " " + cookie.getName() + " " + cookie.getValue());
+ log.debug("Adding cookie: " + cookie.getDomain() + " " + cookie.getPath() + " " + cookie.getName() + " " + cookie.getValue());
response.addCookie(cookie);
}
@@ -135,12 +137,14 @@
if (cookieDomains!=null) {
String servername = request.getServerName();
for (int i=0;i<cookieDomains.length;i++) {
- if (servername.indexOf(cookieDomains[i])!=-1) {
- cookieDomain = cookieDomains[i];
- break;
- }
+ if (servername.indexOf(cookieDomains[i])!=-1) {
+ cookieDomain = cookieDomains[i];
+ break;
+ }
}
}
+ if (log.isDebugEnabled())
+ log.debug("Cookie domain is:" + cookieDomain);
return cookieDomain;
}
@@ -153,46 +157,50 @@
* @return validation hash
*/
private String getValidationHash(String username, String password, String clientIP) {
- if (validationKey == null) {
- System.out.println("ERROR! >> validationKey not spcified....");
- System.out.println("ERROR! >> you are REQUIRED to specify the validatonkey in the config xml");
- return null;
- }
- MessageDigest md5 = null;
- StringBuffer sbValueBeforeMD5 = new StringBuffer();
+ if (validationKey == null) {
+ if (log.isErrorEnabled()) {
+ log.error("ERROR! >> validationKey not spcified....");
+ log.error("ERROR! >> you are REQUIRED to specify the validatonkey in the config xml");
+ }
+ return null;
+ }
+ MessageDigest md5 = null;
+ StringBuffer sbValueBeforeMD5 = new StringBuffer();
- try {
- md5 = MessageDigest.getInstance("MD5");
- } catch (NoSuchAlgorithmException e) {
- System.out.println("Error: " + e);
- }
+ try {
+ md5 = MessageDigest.getInstance("MD5");
+ } catch (NoSuchAlgorithmException e) {
+ if (log.isErrorEnabled())
+ log.error("Error: " + e);
+ }
- try {
- sbValueBeforeMD5.append(username.toString());
- sbValueBeforeMD5.append(":");
- sbValueBeforeMD5.append(password.toString());
- sbValueBeforeMD5.append(":");
- if (useIP.equals("true")) {
- sbValueBeforeMD5.append(clientIP.toString());
- sbValueBeforeMD5.append(":");
- }
- sbValueBeforeMD5.append(validationKey.toString());
+ try {
+ sbValueBeforeMD5.append(username.toString());
+ sbValueBeforeMD5.append(":");
+ sbValueBeforeMD5.append(password.toString());
+ sbValueBeforeMD5.append(":");
+ if (useIP.equals("true")) {
+ sbValueBeforeMD5.append(clientIP.toString());
+ sbValueBeforeMD5.append(":");
+ }
+ sbValueBeforeMD5.append(validationKey.toString());
- valueBeforeMD5 = sbValueBeforeMD5.toString();
- md5.update(valueBeforeMD5.getBytes());
+ valueBeforeMD5 = sbValueBeforeMD5.toString();
+ md5.update(valueBeforeMD5.getBytes());
- byte[] array = md5.digest();
- StringBuffer sb = new StringBuffer();
- for (int j = 0; j < array.length; ++j) {
- int b = array[j] & 0xFF;
- if (b < 0x10) sb.append('0');
- sb.append(Integer.toHexString(b));
- }
- valueAfterMD5 = sb.toString();
- } catch (Exception e) {
- System.out.println("Error:" + e);
- }
- return valueAfterMD5;
+ byte[] array = md5.digest();
+ StringBuffer sb = new StringBuffer();
+ for (int j = 0; j < array.length; ++j) {
+ int b = array[j] & 0xFF;
+ if (b < 0x10) sb.append('0');
+ sb.append(Integer.toHexString(b));
+ }
+ valueAfterMD5 = sb.toString();
+ } catch (Exception e) {
+ if (log.isErrorEnabled())
+ log.error("Error:" + e);
+ }
+ return valueAfterMD5;
}
/**
@@ -202,80 +210,83 @@
* @return clearText, encrypted
*/
public String encryptText(String clearText) {
- sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
- try {
- Cipher c1 = Cipher.getInstance(cipherParameters);
- if (secretKey != null) {
- c1.init(Cipher.ENCRYPT_MODE, secretKey);
- byte clearTextBytes[];
- clearTextBytes = clearText.getBytes();
- byte encryptedText[] = c1.doFinal(clearTextBytes);
- String encryptedEncodedText = encoder.encode(encryptedText);
- return encryptedEncodedText;
- } else {
- System.out.println("ERROR! >> SecretKey not generated ....");
- System.out.println("ERROR! >> you are REQUIRED to specify the encryptionKey in the config xml");
- return null;
- }
- } catch (Exception e) {
- System.out.println("Error: " + e);
- e.printStackTrace();
- return null;
- }
+ sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
+ try {
+ Cipher c1 = Cipher.getInstance(cipherParameters);
+ if (secretKey != null) {
+ c1.init(Cipher.ENCRYPT_MODE, secretKey);
+ byte clearTextBytes[];
+ clearTextBytes = clearText.getBytes();
+ byte encryptedText[] = c1.doFinal(clearTextBytes);
+ String encryptedEncodedText = encoder.encode(encryptedText);
+ return encryptedEncodedText;
+ } else {
+ if (log.isErrorEnabled()) {
+ log.error("ERROR! >> SecretKey not generated ....");
+ log.error("ERROR! >> you are REQUIRED to specify the encryptionKey in the config xml");
+ }
+ return null;
+ }
+ } catch (Exception e) {
+ if (log.isErrorEnabled())
+ log.error("Error: " + e);
+ e.printStackTrace();
+ return null;
+ }
}
- /**
- * Forget a login
- *
- * @param request the servlet request
- * @param response the servlet response
- */
- public void forgetLogin(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- ((SecurityRequestWrapper)request).setUserPrincipal(null);
- removeCookie(request, response, COOKIE_USERNAME);
- removeCookie(request, response, COOKIE_PASSWORD);
- removeCookie(request, response, COOKIE_REMEMBERME);
- removeCookie(request, response, COOKIE_VALIDATION);
- return;
- }
+ /**
+ * Forget a login
+ *
+ * @param request the servlet request
+ * @param response the servlet response
+ */
+ public void forgetLogin(HttpServletRequest request, HttpServletResponse response)
+ throws IOException, ServletException {
+ ((SecurityRequestWrapper)request).setUserPrincipal(null);
+ removeCookie(request, response, COOKIE_USERNAME);
+ removeCookie(request, response, COOKIE_PASSWORD);
+ removeCookie(request, response, COOKIE_REMEMBERME);
+ removeCookie(request, response, COOKIE_VALIDATION);
+ return;
+ }
- /**
- * Given an array of cookies and a name, this method tries
- * to find and return the cookie from the array that has
- * the given name. If there is no cookie matching the name
- * in the array, null is returned.
- */
+ /**
+ * Given an array of cookies and a name, this method tries
+ * to find and return the cookie from the array that has
+ * the given name. If there is no cookie matching the name
+ * in the array, null is returned.
+ */
private static Cookie getCookie(Cookie[] cookies, String cookieName) {
- if (cookies != null) {
- for (int i = 0; i < cookies.length; i++) {
- Cookie cookie = cookies[i];
- if (cookieName.equals(cookie.getName())) {
- return (cookie);
+ if (cookies != null) {
+ for (int i = 0; i < cookies.length; i++) {
+ Cookie cookie = cookies[i];
+ if (cookieName.equals(cookie.getName())) {
+ return (cookie);
+ }
}
- }
- }
- return null;
- }
+ }
+ return null;
+ }
/**
- * Remove a cookie.
- *
- * @param request
- * @param response
- * @param cookieName
- */
- private void removeCookie(HttpServletRequest request, HttpServletResponse response, String cookieName) {
- Cookie cookie = getCookie(request.getCookies(), cookieName);
- if (cookie != null) {
- cookie.setMaxAge(0);
- cookie.setPath(cookiePath);
- String cookieDomain = getCookieDomain(request);
- if (cookieDomain!=null)
- cookie.setDomain(cookieDomain);
- addCookie(response, cookie);
- }
- }
+ * Remove a cookie.
+ *
+ * @param request
+ * @param response
+ * @param cookieName
+ */
+ private void removeCookie(HttpServletRequest request, HttpServletResponse response, String cookieName) {
+ Cookie cookie = getCookie(request.getCookies(), cookieName);
+ if (cookie != null) {
+ cookie.setMaxAge(0);
+ cookie.setPath(cookiePath);
+ String cookieDomain = getCookieDomain(request);
+ if (cookieDomain!=null)
+ cookie.setDomain(cookieDomain);
+ addCookie(response, cookie);
+ }
+ }
}
Modified: xwiki/trunk/src/test/java/com/xpn/xwiki/test/MyFormAuthentication.java
===================================================================
--- xwiki/trunk/src/test/java/com/xpn/xwiki/test/MyFormAuthentication.java 2006-03-30 01:03:57 UTC (rev 1017)
+++ xwiki/trunk/src/test/java/com/xpn/xwiki/test/MyFormAuthentication.java 2006-03-30 21:59:59 UTC (rev 1018)
@@ -1,27 +1,27 @@
-/*
- * Copyright 2006, XpertNet SARL, and individual contributors as indicated
- * by the contributors.txt.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- *
- * @author ludovic
- * @author erwan
- * @author vmassol
- * @author sdumitriu
- */
+/*
+ * Copyright 2006, XpertNet SARL, and individual contributors as indicated
+ * by the contributors.txt.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *
+ * @author ludovic
+ * @author erwan
+ * @author vmassol
+ * @author sdumitriu
+ */
package com.xpn.xwiki.test;
@@ -257,10 +257,11 @@
int equalsChar = nameValue.indexOf("=");
String name = nameValue.substring(0, equalsChar);
String value = nameValue.substring(equalsChar + 1);
+ String host = theConnection.getURL().getHost();
+ System.out.println("Found cookie: name=" + name + " value=" + value + " for host " + host);
if (name.equalsIgnoreCase(theTarget))
{
- String host = theConnection.getURL().getHost();
- System.out.println("Found cookie: name=" + name + " value=" + value + " for host " + host);
+ System.out.println("Found matching cookie: name=" + name + " value=" + value + " for host " + host);
Cookie cookie = new Cookie(host, name, value);
cookie.setPath("/");
return cookie;
Modified: xwiki/trunk/src/test/resources/log4j.properties
===================================================================
--- xwiki/trunk/src/test/resources/log4j.properties 2006-03-30 01:03:57 UTC (rev 1017)
+++ xwiki/trunk/src/test/resources/log4j.properties 2006-03-30 21:59:59 UTC (rev 1018)
@@ -2,20 +2,28 @@
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %X{url} %c{1}:%M:%L - %m%n
+log4j.appender.file=org.apache.log4j.RollingFileAppender
+log4j.appender.file.File=xwiki.log
+log4j.appender.file.MaxFileSize=10MB
+log4j.appender.file.MaxBackupIndex=50
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %X{url} %c{1}:%M:%L - %m%n
+
### root logger option ###
log4j.rootLogger=warn, stdout
### Hibernate logging options ###
-log4j.logger.net.sf.hibernate.SQL=debug
-log4j.logger.net.sf.hibernate=warn
-log4j.logger.net.sf.hibernate.type=warn
-log4j.logger.net.sf.hibernate.ps.PreparedStatementCache=warn
+log4j.logger.org.hibernate.SQL=warn
+log4j.logger.org.hibernate=warn
+log4j.logger.org.hibernate.type=warn
+log4j.logger.org.hibernate.ps.PreparedStatementCache=warn
### log XWiki
log4j.logger.com.xpn.xwiki=warn
log4j.logger.com.xpn.xwiki.render.XWikiRadeoxRenderEngine=warn
-log4j.logger.com.xpn.xwiki.monitor=debug
log4j.logger.org.radeox.macro.BaseLocaleMacro=error
-log4j.logger.com.xpn.xwiki.store.XWikiCacheStore=debug
+
+### Deactive struts warning
+log4j.logger.org.apache.struts.util.RequestUtils=error
\ No newline at end of file
Modified: xwiki/trunk/src/test/resources/xwiki.cfg
===================================================================
--- xwiki/trunk/src/test/resources/xwiki.cfg 2006-03-30 01:03:57 UTC (rev 1017)
+++ xwiki/trunk/src/test/resources/xwiki.cfg 2006-03-30 21:59:59 UTC (rev 1018)
@@ -5,11 +5,24 @@
xwiki.store.class=com.xpn.xwiki.store.XWikiHibernateStore
xwiki.store.hibernate.path=hibernate-test.cfg.xml
xwiki.store.cache=1
+xwiki.store.hibernate.updateschema=1
+xwiki.store.hibernate.custommapping=1
+xwiki.store.hibernate.custommapping.dynamic=1
+xwiki.encoding=ISO-8859-1
xwiki.virtual=1
xwiki.render.macromapping=1
xwiki.backlinks=1
-xwiki.store.hibernate.updateschema=1
-xwiki.store.hibernate.custommapping=1
-xwiki.store.hibernate.custommapping.dynamic=1
+# Stats configuration allows to globally activate/deactivate stats module
+# it is also possible to choose a different stats service to record
+# statistics separately from XWiki
+xwiki.stats=1
+xwiki.stats.default=1
+xwiki.stats.class=com.xpn.xwiki.stats.impl.XWikiStatsServiceImpl
+
+xwiki.authentication=form
+xwiki.authentication.validationKey=totototototototototototototototo
+xwiki.authentication.encryptionKey=titititititititititititititititi
+xwiki.authentication.cookiedomains=xwiki.com,wiki.fr
+
More information about the Xwiki-notifications
mailing list