import java.util.Calendar;
import java.util.HashMap;
import java.util.LinkedList;
+import java.util.Locale;
import java.util.Map;
import java.util.Properties;
about.addItem(new SimpleMenuItem("//lists.cacert.org/wws", "Mailing Lists"));
about.addItem(new SimpleMenuItem("//blog.CAcert.org/feed", "RSS News Feed"));
+ Menu languages = new Menu("Translations");
+ for (Locale l : Language.getSupportedLocales()) {
+ languages.addItem(new SimpleMenuItem("?lang=" + l.toString(), l.getDisplayName(l)));
+ }
+ categories.add(languages);
for (Menu menu : categories) {
menu.prepare();
rootMenu.addItem(menu);
// return;
// }
HttpSession hs = req.getSession();
+ if (req.getParameter("lang") != null) {
+ Locale l = Language.getLocaleFromString(req.getParameter("lang"));
+ Language lu = Language.getInstance(l);
+ req.getSession().setAttribute(Language.SESSION_ATTRIB_NAME, lu.getLocale());
+ }
final Page p = getPage(req.getPathInfo());
if (p != null) {
</div>
<div id="pageNav">
<?=$menu?>
- <div>
- <h3 class="pointer">+ <?=_Translations?></h3>
- <ul class="menu hidden" id="trans">
- <li><a href="/index.php?id=0&lang=ar">العربية</a></li>
- <li><a href="/index.php?id=0&lang=bg">Български</a></li>
- <li><a href="/index.php?id=0&lang=cs">Čeština</a></li>
- <li><a href="/index.php?id=0&lang=da">Dansk</a></li>
- <li><a href="/index.php?id=0&lang=de">Deutsch</a></li>
- <li><a href="/index.php?id=0&lang=el">Ελληνικά</a></li>
- <li><a href="/index.php?id=0&lang=en">English</a></li>
- <li><a href="/index.php?id=0&lang=es">Español</a></li>
- <li><a href="/index.php?id=0&lang=fi">Suomi</a></li>
- <li><a href="/index.php?id=0&lang=fr">Français</a></li>
- <li><a href="/index.php?id=0&lang=hu">Magyar</a></li>
- <li><a href="/index.php?id=0&lang=it">Italiano</a></li>
- <li><a href="/index.php?id=0&lang=ja">日本語</a></li>
- <li><a href="/index.php?id=0&lang=lv">Latviešu</a></li>
- <li><a href="/index.php?id=0&lang=nl">Nederlands</a></li>
- <li><a href="/index.php?id=0&lang=pl">Polski</a></li>
- <li><a href="/index.php?id=0&lang=pt">Português</a></li>
- <li><a href="/index.php?id=0&lang=pt-br">Português
- Brasileiro</a></li>
- <li><a href="/index.php?id=0&lang=ru">Русский</a></li>
- <li><a href="/index.php?id=0&lang=sv">Svenska</a></li>
- <li><a href="/index.php?id=0&lang=tr">Türkçe</a></li>
- <li><a href="/index.php?id=0&lang=zh-cn">中文(简体)</a></li>
- <li><a href="/index.php?id=0&lang=zh-tw">中文(臺灣)</a></li>
- </ul>
- </div>
<div>
<h3 class="pointer"><?=_Advertising?></h3>
<ul class="menu hidden" id="recom"></ul>
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.util.List;
+import java.util.Locale;
import java.util.Properties;
import java.util.TimeZone;
public class Launcher {
public static void main(String[] args) throws Exception {
+ Locale.setDefault(Locale.ENGLISH);
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
GigiConfig conf = GigiConfig.parse(System.in);
ServerConstants.init(conf.getMainProps());
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
+import java.util.Locale;
import org.cacert.gigi.database.DatabaseConnection;
import org.cacert.gigi.localisation.Language;
private Assurance[] receivedAssurances, madeAssurances;
+ private Locale locale;
+
public User(int id) {
this.id = id;
updateName(id);
private void updateName(int id) {
try {
- PreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `fname`, `lname`,`mname`, `suffix`, `dob`, `email` FROM `users` WHERE id=?");
+ PreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `fname`, `lname`,`mname`, `suffix`, `dob`, `email`, `language` FROM `users` WHERE id=?");
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
name = new Name(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
dob = rs.getDate(5);
email = rs.getString(6);
+ String localeStr = rs.getString(7);
+ if (localeStr == null || localeStr.equals("")) {
+ locale = Locale.getDefault();
+ } else {
+ locale = Language.getLocaleFromString(localeStr);
+ }
}
rs.close();
} catch (SQLException e) {
if (id != 0) {
throw new Error("refusing to insert");
}
- PreparedStatement query = DatabaseConnection.getInstance().prepare("insert into `users` set `email`=?, `password`=?, " + "`fname`=?, `mname`=?, `lname`=?, " + "`suffix`=?, `dob`=?, `created`=NOW(), locked=0");
+ PreparedStatement query = DatabaseConnection.getInstance().prepare("insert into `users` set `email`=?, `password`=?, " + "`fname`=?, `mname`=?, `lname`=?, " + "`suffix`=?, `dob`=?, `created`=NOW(), locked=0, `language`=?");
query.setString(1, email);
query.setString(2, PasswordHash.hash(password));
query.setString(3, name.fname);
query.setString(5, name.lname);
query.setString(6, name.suffix);
query.setDate(7, new java.sql.Date(dob.getTime()));
+ query.setString(8, locale.toString());
query.execute();
id = DatabaseConnection.lastInsertId(query);
}
}
}
- public Language getPrefferedLanguage() {
- return Language.getInstance("de");
+ public Locale getPreferredLocale() {
+ return locale;
+ }
+
+ public void setPreferredLocale(Locale locale) {
+ this.locale = locale;
+
}
public boolean wantsDirectoryListing() throws SQLException {
update.setInt(2, getId());
update.executeUpdate();
}
+
}
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.Locale;
import javax.xml.parsers.DocumentBuilder;
public class Language {
+ public static final String SESSION_ATTRIB_NAME = "lang";
+
+ private static Locale[] supportedLocales;
+
+ static {
+ LinkedList<Locale> supported = new LinkedList<>();
+ File locales = new File("locale");
+ for (File f : locales.listFiles()) {
+ if ( !f.getName().endsWith(".xml")) {
+ continue;
+ }
+ String language = f.getName().split("\\.", 2)[0];
+ supported.add(getLocaleFromString(language));
+ }
+ supportedLocales = supported.toArray(new Locale[supported.size()]);
+ }
+
+ public static Locale getLocaleFromString(String language) {
+ if (language.contains("_")) {
+ String[] parts = language.split("_", 2);
+ return new Locale(parts[0], parts[1]);
+
+ } else {
+ return new Locale(language);
+ }
+ }
+
+ public static Locale[] getSupportedLocales() {
+ return supportedLocales;
+ }
+
private static HashMap<String, Language> langs = new HashMap<String, Language>();
private HashMap<String, String> translations = new HashMap<String, String>();
private Locale l;
- protected Language(String language) throws ParserConfigurationException, IOException, SAXException {
- if (language.contains("_")) {
- String[] parts = language.split("_");
- l = new Locale(parts[0], parts[1]);
- } else {
- l = new Locale(language);
+ private static Locale project(Locale l) {
+ if (l == null) {
+ return Locale.getDefault();
+ }
+ File file = new File("locale", l.toString() + ".xml");
+ if ( !file.exists()) {
+ return new Locale(l.getLanguage());
}
+ return l;
+ }
+ protected Language(Locale loc) throws ParserConfigurationException, IOException, SAXException {
+ File file = new File("locale", loc.toString() + ".xml");
+ l = loc;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
- Document d = db.parse(new FileInputStream(new File("locale", language + ".xml")));
+ Document d = db.parse(new FileInputStream(file));
NodeList nl = d.getDocumentElement().getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
if ( !(nl.item(i) instanceof Element)) {
return string;
}
- public static Language getInstance(String language) {
- Language l = langs.get(language);
+ public static Language getInstance(Locale language) {
+ language = project(language);
+ File file = new File("locale", language.toString() + ".xml");
+ if ( !file.exists()) {
+ return null;
+ }
+ Language l = langs.get(language.toString());
if (l == null) {
try {
l = new Language(language);
- langs.put(language, l);
+ langs.put(language.toString(), l);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
import org.cacert.gigi.User;
import org.cacert.gigi.database.DatabaseConnection;
+import org.cacert.gigi.localisation.Language;
import org.cacert.gigi.util.PasswordHash;
public class LoginPage extends Page {
ResultSet rs = ps.executeQuery();
if (rs.next()) {
if (PasswordHash.verifyHash(pw, rs.getString(1))) {
- req.getSession().invalidate();
- HttpSession hs = req.getSession();
- hs.setAttribute(LOGGEDIN, true);
- hs.setAttribute(USER, new User(rs.getInt(2)));
+ loginSession(req, new User(rs.getInt(2)));
}
}
rs.close();
ps.setString(1, serial);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
- req.getSession().invalidate();
- HttpSession hs = req.getSession();
- hs.setAttribute(LOGGEDIN, true);
- hs.setAttribute(USER, new User(rs.getInt(1)));
+ loginSession(req, new User(rs.getInt(1)));
}
rs.close();
} catch (SQLException e) {
}
}
+ private void loginSession(HttpServletRequest req, User user) {
+ req.getSession().invalidate();
+ HttpSession hs = req.getSession();
+ hs.setAttribute(LOGGEDIN, true);
+ hs.setAttribute(Language.SESSION_ATTRIB_NAME, user.getPreferredLocale());
+ hs.setAttribute(USER, user);
+ }
+
@Override
public boolean isPermitted(User u) {
return u == null;
import java.io.IOException;
import java.net.URL;
+import java.util.Enumeration;
+import java.util.Locale;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
import org.cacert.gigi.PermissionCheckable;
import org.cacert.gigi.User;
}
public static Language getLanguage(ServletRequest req) {
- return Language.getInstance("de");
+ HttpSession session = ((HttpServletRequest) req).getSession();
+ Locale sessval = (Locale) session.getAttribute(Language.SESSION_ATTRIB_NAME);
+ if (sessval != null) {
+ Language l = Language.getInstance(sessval);
+ if (l != null) {
+ return l;
+ }
+ }
+ Enumeration<Locale> langs = req.getLocales();
+ while (langs.hasMoreElements()) {
+ Locale c = langs.nextElement();
+ Language l = Language.getInstance(c);
+ if (l != null) {
+ session.setAttribute(Language.SESSION_ATTRIB_NAME, l.getLocale());
+ return l;
+ }
+ }
+ session.setAttribute(Language.SESSION_ATTRIB_NAME, Locale.ENGLISH);
+ return Language.getInstance(Locale.ENGLISH);
}
public static String translate(ServletRequest req, String string) {
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Enumeration;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
private void run(HttpServletRequest req, String password) throws SQLException {
try {
DatabaseConnection.getInstance().beginTransaction();
-
+ Enumeration<Locale> locales = req.getLocales();
+ buildup.setPreferredLocale(Page.getLanguage(req).getLocale());
buildup.setDob(myDoB.getDate());
buildup.insert(password);
int memid = buildup.getId();
package org.cacert.gigi.ping;
import java.io.IOException;
+
import org.cacert.gigi.Domain;
import org.cacert.gigi.User;
import org.cacert.gigi.email.MailProbe;
+import org.cacert.gigi.localisation.Language;
public class EmailPinger extends DomainPinger {
String[] parts = configuration.split(":", 2);
String mail = parts[0] + "@" + domain.getSuffix();
try {
- MailProbe.sendMailProbe(u.getPrefferedLanguage(), "domain", domain.getId(), parts[1], mail);
+ MailProbe.sendMailProbe(Language.getInstance(u.getPreferredLocale()), "domain", domain.getId(), parts[1], mail);
} catch (IOException e) {
e.printStackTrace();
return "Mail connection interrupted";
package org.cacert.gigi;
import java.sql.SQLException;
+import java.util.Locale;
import org.cacert.gigi.localisation.Language;
import org.cacert.gigi.testUtils.ManagedTest;
u.setLname("last");
u.setMname("");
u.setSuffix("");
+ u.setPreferredLocale(Locale.ENGLISH);
long dob = System.currentTimeMillis();
dob -= dob % (1000 * 60 * 60 * 24);
u.setDob(new java.sql.Date(dob));
int id = createVerifiedUser("aä", "b", uq + "a@email.org", TEST_PASSWORD);
User u = new User(id);
- new EmailAddress(uq + "b@email.org", u).insert(Language.getInstance("de"));
- new EmailAddress(uq + "c@email.org", u).insert(Language.getInstance("de"));
+ new EmailAddress(uq + "b@email.org", u).insert(Language.getInstance(Locale.ENGLISH));
+ new EmailAddress(uq + "c@email.org", u).insert(Language.getInstance(Locale.ENGLISH));
new Domain(u, uq + "a.testdomain.org").insert();
new Domain(u, uq + "b.testdomain.org").insert();
new Domain(u, uq + "c.testdomain.org").insert();
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URLEncoder;
+import java.util.Locale;
import org.cacert.gigi.EmailAddress;
import org.cacert.gigi.GigiApiException;
@Test
public void testMailSetDefaultWebUnverified() throws MalformedURLException, UnsupportedEncodingException, IOException, InterruptedException, GigiApiException {
EmailAddress adrr = new EmailAddress(createUniqueName() + "test@test.tld", u);
- adrr.insert(Language.getInstance("en"));
+ adrr.insert(Language.getInstance(Locale.ENGLISH));
assertNotNull(executeBasicWebInteraction(cookie, path, "makedefault&emailid=" + adrr.getId()));
assertNotEquals(User.getById(u.getId()).getEmail(), adrr.getAddress());
getMailReciever().clearMails();
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Locale;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public static EmailAddress createVerifiedEmail(User u) throws InterruptedException, GigiApiException {
EmailAddress adrr = new EmailAddress(createUniqueName() + "test@test.tld", u);
- adrr.insert(Language.getInstance("en"));
+ adrr.insert(Language.getInstance(Locale.ENGLISH));
TestMail testMail = getMailReciever().recieve();
assertTrue(adrr.getAddress().equals(testMail.getTo()));
String hash = testMail.extractLink().substring(testMail.extractLink().lastIndexOf('=') + 1);