final static String LOGIN_CONTEXT_SYSTEM = "SYSTEM";
final static String LOGIN_CONTEXT_SINGLE_USER = "SINGLE_USER";
- // HTTP
- @Deprecated
- final static String ACCESS_CONTROL_CONTEXT = "org.argeo.node.accessControlContext";
-
// RESERVED ROLES
public final static String ROLE_KERNEL = "OU=node";
public final static String ROLES_BASEDN = "ou=roles,ou=node";
// user U anonymous = everyone
public final static String ROLE_USER = "cn=user," + ROLES_BASEDN;
public final static String ROLE_ANONYMOUS = "cn=anonymous," + ROLES_BASEDN;
-
- // SHARED STATE KEYS
- //public final static String BUNDLE_CONTEXT_KEY = "org.argeo.security.bundleContext";
- //public final static String AUTHORIZATION_KEY = "org.argeo.security.authorization";
}
import java.io.IOException;
import java.util.Iterator;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.LanguageCallback;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.argeo.ArgeoException;
import org.argeo.cms.internal.kernel.Activator;
+import org.argeo.eclipse.ui.specific.UiContext;
import org.osgi.framework.BundleContext;
import org.osgi.service.http.HttpContext;
import org.osgi.service.useradmin.Authorization;
NameCallback nameCallback = new NameCallback("User");
PasswordCallback passwordCallback = new PasswordCallback(
"Password", false);
+ LanguageCallback langCallback = new LanguageCallback();
try {
callbackHandler.handle(new Callback[] { httpCallback,
- nameCallback, passwordCallback });
+ nameCallback, passwordCallback, langCallback });
} catch (IOException e) {
throw new LoginException("Cannot handle http callback: "
+ e.getMessage());
authorization = (Authorization) request.getSession()
.getAttribute(HttpContext.AUTHORIZATION);
}
- // if (authorization == null || authorization.getName() == null)
- // if (!isAnonymous) {
- // // ask for username and password
- // NameCallback nameCallback = new NameCallback("User");
- // PasswordCallback passwordCallback = new PasswordCallback(
- // "Password", false);
- //
- // // handle callbacks
- // try {
- // callbackHandler.handle(new Callback[] { nameCallback,
- // passwordCallback });
- // } catch (Exception e) {
- // throw new ArgeoException("Cannot handle callbacks", e);
- // }
+
+ // i18n
+ Locale locale = langCallback.getLocale();
+ if (locale == null)
+ locale = Locale.getDefault();
+ UiContext.setLocale(locale);
if (authorization == null) {
// create credentials
import java.util.ResourceBundle;
import org.argeo.cms.CmsException;
-import org.eclipse.rap.rwt.RWT;
+import org.argeo.eclipse.ui.specific.UiContext;
/** A single message to be internationalised. */
public class Msg {
/** When used as the first word of a sentence. */
public String lead() {
String raw = toString();
- return raw.substring(0, 1).toUpperCase(RWT.getLocale())
+ return raw.substring(0, 1).toUpperCase(UiContext.getLocale())
+ raw.substring(1);
}
int lastDot = key.lastIndexOf('.');
String className = key.substring(0, lastDot);
String fieldName = key.substring(lastDot + 1);
- Locale locale = RWT.getLocale();
+ Locale locale = UiContext.getLocale();
ResourceBundle rb = ResourceBundle.getBundle(className, locale,
msg.getClassLoader());
return rb.getString(fieldName);
import javax.security.auth.callback.UnsupportedCallbackException;
import org.argeo.ArgeoException;
-import org.argeo.util.LocaleCallback;
+import org.argeo.util.LocaleChoice;
/** Callback handler to be used with a command line UI. */
public class ConsoleCallbackHandler implements CallbackHandler {
char[] answer = console.readPassword();
callback.setPassword(answer);
Arrays.fill(answer, ' ');
- } else if (callbacks[i] instanceof LocaleCallback) {
- LocaleCallback callback = (LocaleCallback) callbacks[i];
- writer.write(callback.getPrompt());
+ } else if (callbacks[i] instanceof LocaleChoice) {
+ LocaleChoice callback = (LocaleChoice) callbacks[i];
+ writer.write("Language");
writer.write("\n");
for (int j = 0; j < callback.getAvailableLocales().size(); j++) {
Locale locale = callback.getAvailableLocales().get(j);
}
private static BundleContext bundleContext;
- private Kernel kernel;
+ private static Kernel kernel;
@Override
public void start(BundleContext context) throws Exception {
return bundleContext;
}
+ public static KernelHeader getKernelHeader() {
+ return kernel;
+ }
+
/**
* @return a String which is guaranteed to be unique between and constant
* within a Java static context (typically a VM launch)
* <li>OS access</li>
* </ul>
*/
-final class Kernel implements KernelConstants, ServiceListener {
+final class Kernel implements KernelHeader, KernelConstants, ServiceListener {
/*
* REGISTERED SERVICES
*/
}
private void doInit() {
+ long begin = System.currentTimeMillis();
+
+ // Use CMS bundle classloader
ClassLoader currentContextCl = Thread.currentThread()
.getContextClassLoader();
Thread.currentThread().setContextClassLoader(
Kernel.class.getClassLoader());
- long begin = System.currentTimeMillis();
-
// KernelUtils.logFrameworkProperties(log);
try {
final static String TRANSACTIONS_HOME = "argeo.node.transactions.home";
+ final static String I18N_AVAILABLE_LOCALES = "argeo.i18n.availableLocales";
+
// Node Security
final static String ROLES_URI = "argeo.node.roles.uri";
/** URI to an LDIF file or LDAP server used as initialization or backend */
--- /dev/null
+package org.argeo.cms.internal.kernel;
+
+public interface KernelHeader {
+
+}
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.LanguageCallback;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.argeo.cms.auth.CurrentUser;
import org.argeo.cms.auth.HttpRequestCallback;
import org.argeo.cms.util.CmsUtils;
+import org.argeo.util.LocaleChoice;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
public class CmsLogin implements CmsStyles, CallbackHandler {
private Text username, password;
private Composite credentialsBlock;
+ private LocaleChoice localeChoice = null;
private final CmsView cmsView;
.getTextChars());
else if (callback instanceof HttpRequestCallback)
((HttpRequestCallback) callback).setRequest(RWT.getRequest());
+ else if (callback instanceof LanguageCallback
+ && localeChoice != null)
+ ((LanguageCallback) callback).setLocale(localeChoice
+ .getSelectedLocale());
}
}
import javax.security.auth.callback.TextOutputCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
-import org.argeo.util.LocaleCallback;
+import org.argeo.util.LocaleChoice;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
* <p>
* Supported Argeo {@link Callback}s are:<br>
* <ul>
- * <li>{@link LocaleCallback}</li>
+ * <li>{@link LocaleChoice}</li>
* </ul>
* </p>
*/
if (callback instanceof TextOutputCallback
|| callback instanceof NameCallback
|| callback instanceof PasswordCallback
- || callback instanceof LocaleCallback) {
+ || callback instanceof LocaleChoice) {
return;
} else {
throw new UnsupportedCallbackException(callback);
createNameHandler(composite, (NameCallback) callback);
} else if (callback instanceof PasswordCallback) {
createPasswordHandler(composite, (PasswordCallback) callback);
- } else if (callback instanceof LocaleCallback) {
- createLocaleHandler(composite, (LocaleCallback) callback);
+ } else if (callback instanceof LocaleChoice) {
+ createLocaleHandler(composite, (LocaleChoice) callback);
}
}
}
}
protected Combo createLocaleHandler(Composite composite,
- final LocaleCallback callback) {
+ final LocaleChoice callback) {
String[] labels = callback.getSupportedLocalesLabels();
if (labels.length == 0)
return null;
Label label = new Label(composite, SWT.NONE);
- label.setText(callback.getPrompt());
+ label.setText("Language");
final Combo combo = new Combo(composite, SWT.READ_ONLY);
combo.setItems(labels);
package org.argeo.eclipse.ui.specific;
+import java.util.Locale;
+
import javax.servlet.http.HttpServletRequest;
import org.eclipse.rap.rwt.RWT;
return RWT.getRequest();
}
+ public static Locale getLocale() {
+ return RWT.getUISession().getLocale();
+ }
+
+ public static void setLocale(Locale locale) {
+ RWT.getUISession().setLocale(locale);
+ }
+
/** Can always be null */
@SuppressWarnings("unchecked")
public static <T> T getData(String key) {
*/
package org.argeo.security.ui.rap;
-import static org.argeo.cms.auth.AuthConstants.ACCESS_CONTROL_CONTEXT;
-
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.PrivilegedAction;
* subject.
*/
public class SecureEntryPoint implements EntryPoint {
+ final static String ACCESS_CONTROL_CONTEXT = "org.argeo.node.accessControlContext";
private final static Log log = LogFactory.getLog(SecureEntryPoint.class);
/**
HttpServletRequest httpRequest = RWT.getRequest();
final HttpSession httpSession = httpRequest.getSession();
AccessControlContext acc = (AccessControlContext) httpSession
- .getAttribute(AuthConstants.ACCESS_CONTROL_CONTEXT);
+ .getAttribute(ACCESS_CONTROL_CONTEXT);
final Subject subject;
if (acc != null
+++ /dev/null
-/*
- * Copyright (C) 2007-2012 Argeo GmbH
- *
- * Licensed 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.argeo.util;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-
-import javax.security.auth.callback.Callback;
-import javax.security.auth.callback.LanguageCallback;
-
-/** Choose in a list of locales. TODO: replace with {@link LanguageCallback} */
-public class LocaleCallback implements Callback {
- private List<Locale> availableLocales = new ArrayList<Locale>();
-
- private Integer selectedIndex = null;
- private Integer defaultIndex = null;
- private String prompt = "Language";
-
- public LocaleCallback(Integer defaultIndex, List<Locale> availableLocales) {
- this.availableLocales = Collections
- .unmodifiableList(new ArrayList<Locale>(availableLocales));
- this.defaultIndex = defaultIndex;
- this.selectedIndex = defaultIndex;
- }
-
- /**
- * Convenience constructor based on a comma separated list of iso codes (en,
- * en_US, fr_CA, etc.). Default selection is default locale.
- */
- public LocaleCallback(String locales) {
- if (locales == null || locales.trim().equals(""))
- return;
- String[] codes = locales.split(",");
- for (int i = 0; i < codes.length; i++) {
- String code = codes[i];
- // variant not supported
- int indexUnd = code.indexOf("_");
- Locale locale;
- if (indexUnd > 0) {
- String language = code.substring(0, indexUnd);
- String country = code.substring(indexUnd + 1);
- locale = new Locale(language, country);
- } else {
- locale = new Locale(code);
- }
- availableLocales.add(locale);
- if (locale.equals(Locale.getDefault()))
- defaultIndex = i;
- }
-
- if (defaultIndex == null)
- defaultIndex = 0;
-
- this.selectedIndex = defaultIndex;
- }
-
- public String[] getSupportedLocalesLabels() {
- String[] labels = new String[availableLocales.size()];
- for (int i = 0; i < availableLocales.size(); i++) {
- Locale locale = availableLocales.get(i);
- if (locale.getCountry().equals(""))
- labels[i] = locale.getDisplayLanguage(locale) + " ["
- + locale.getLanguage() + "]";
- else
- labels[i] = locale.getDisplayLanguage(locale) + " ("
- + locale.getDisplayCountry(locale) + ") ["
- + locale.getLanguage() + "_" + locale.getCountry()
- + "]";
-
- }
- return labels;
- }
-
- public Locale getSelectedLocale() {
- if (selectedIndex == null)
- return null;
- return availableLocales.get(selectedIndex);
- }
-
- public void setSelectedIndex(Integer selectedIndex) {
- this.selectedIndex = selectedIndex;
- }
-
- public Integer getDefaultIndex() {
- return defaultIndex;
- }
-
- public String getPrompt() {
- // TODO localize it?
- return prompt;
- }
-
- public void setPrompt(String prompt) {
- this.prompt = prompt;
- }
-
- public List<Locale> getAvailableLocales() {
- return availableLocales;
- }
-
- public static void main(String[] args) {
- for (String isoL : Locale.getISOLanguages()) {
- Locale locale = new Locale(isoL);
- System.out.println(isoL + "\t" + locale.getDisplayLanguage() + "\t"
- + locale.getDisplayLanguage(locale));
- }
- }
-
-}
--- /dev/null
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed 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.argeo.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import javax.security.auth.callback.LanguageCallback;
+
+/** Choose in a list of locales. TODO: replace with {@link LanguageCallback} */
+public class LocaleChoice {
+ private List<Locale> availableLocales = new ArrayList<Locale>();
+
+ private Integer selectedIndex = null;
+ private Integer defaultIndex = null;
+
+ // public LocaleCallback(Integer defaultIndex, List<Locale>
+ // availableLocales) {
+ // this.availableLocales = Collections
+ // .unmodifiableList(new ArrayList<Locale>(availableLocales));
+ // this.defaultIndex = defaultIndex;
+ // this.selectedIndex = defaultIndex;
+ // }
+
+ /**
+ * Convenience constructor based on a comma separated list of iso codes (en,
+ * en_US, fr_CA, etc.). Default selection is default locale.
+ */
+ public LocaleChoice(String locales, Locale defaultLocale) {
+ if (locales == null || locales.trim().equals(""))
+ return;
+ String[] codes = locales.split(",");
+ for (int i = 0; i < codes.length; i++) {
+ String code = codes[i];
+ // variant not supported
+ int indexUnd = code.indexOf("_");
+ Locale locale;
+ if (indexUnd > 0) {
+ String language = code.substring(0, indexUnd);
+ String country = code.substring(indexUnd + 1);
+ locale = new Locale(language, country);
+ } else {
+ locale = new Locale(code);
+ }
+ availableLocales.add(locale);
+ if (locale.equals(defaultLocale))
+ defaultIndex = i;
+ }
+
+ if (defaultIndex == null)
+ defaultIndex = 0;
+
+ this.selectedIndex = defaultIndex;
+ }
+
+ public String[] getSupportedLocalesLabels() {
+ String[] labels = new String[availableLocales.size()];
+ for (int i = 0; i < availableLocales.size(); i++) {
+ Locale locale = availableLocales.get(i);
+ if (locale.getCountry().equals(""))
+ labels[i] = locale.getDisplayLanguage(locale) + " ["
+ + locale.getLanguage() + "]";
+ else
+ labels[i] = locale.getDisplayLanguage(locale) + " ("
+ + locale.getDisplayCountry(locale) + ") ["
+ + locale.getLanguage() + "_" + locale.getCountry()
+ + "]";
+
+ }
+ return labels;
+ }
+
+ public Locale getSelectedLocale() {
+ if (selectedIndex == null)
+ return null;
+ return availableLocales.get(selectedIndex);
+ }
+
+ public void setSelectedIndex(Integer selectedIndex) {
+ this.selectedIndex = selectedIndex;
+ }
+
+ public Integer getDefaultIndex() {
+ return defaultIndex;
+ }
+
+ public List<Locale> getAvailableLocales() {
+ return availableLocales;
+ }
+
+ public Locale getDefaultLocale() {
+ return availableLocales.get(getDefaultIndex());
+ }
+
+ public static void main(String[] args) {
+ for (String isoL : Locale.getISOLanguages()) {
+ Locale locale = new Locale(isoL);
+ System.out.println(isoL + "\t" + locale.getDisplayLanguage() + "\t"
+ + locale.getDisplayLanguage(locale));
+ }
+ }
+
+}