From: INOPIAE Date: Fri, 12 Aug 2016 17:27:19 +0000 (+0200) Subject: add: residence country for user account X-Git-Url: https://code.wpia.club/?p=gigi.git;a=commitdiff_plain;h=ff18b96af5b8d9b2a57e9f01ed54b414147d065b add: residence country for user account fixes issue #79 Change-Id: I8fc77689a6a0effcf27e2621b9802b8b04e15cb1 --- diff --git a/doc/Data.uxf b/doc/Data.uxf index 225ae2d2..0c554642 100644 --- a/doc/Data.uxf +++ b/doc/Data.uxf @@ -96,6 +96,7 @@ administers> -primaryEmail: String -locale: Locale -Name +-country: varchar(2) -- +hasPassedCATS(): boolean +isInGroup(:Group): boolean diff --git a/src/org/cacert/gigi/database/DatabaseConnection.java b/src/org/cacert/gigi/database/DatabaseConnection.java index d9febb08..b5684edd 100644 --- a/src/org/cacert/gigi/database/DatabaseConnection.java +++ b/src/org/cacert/gigi/database/DatabaseConnection.java @@ -122,7 +122,7 @@ public class DatabaseConnection { } - public static final int CURRENT_SCHEMA_VERSION = 22; + public static final int CURRENT_SCHEMA_VERSION = 23; public static final int CONNECTION_TIMEOUT = 24 * 60 * 60; diff --git a/src/org/cacert/gigi/database/tableStructure.sql b/src/org/cacert/gigi/database/tableStructure.sql index a8d92f57..947b09ed 100644 --- a/src/org/cacert/gigi/database/tableStructure.sql +++ b/src/org/cacert/gigi/database/tableStructure.sql @@ -16,6 +16,7 @@ CREATE TABLE "users" ( "dob" date NOT NULL, "verified" boolean NOT NULL DEFAULT 'false', "language" varchar(5) NOT NULL DEFAULT '', + "country" varchar(2) NULL, PRIMARY KEY ("id") ); CREATE INDEX ON "users" ("email"); @@ -373,7 +374,7 @@ CREATE TABLE "schemeVersion" ( "version" smallint NOT NULL, PRIMARY KEY ("version") ); -INSERT INTO "schemeVersion" (version) VALUES(22); +INSERT INTO "schemeVersion" (version) VALUES(23); DROP TABLE IF EXISTS `passwordResetTickets`; CREATE TABLE `passwordResetTickets` ( diff --git a/src/org/cacert/gigi/database/upgrade/from_22.sql b/src/org/cacert/gigi/database/upgrade/from_22.sql new file mode 100644 index 00000000..14623b89 --- /dev/null +++ b/src/org/cacert/gigi/database/upgrade/from_22.sql @@ -0,0 +1 @@ +ALTER TABLE "users" ADD COLUMN "country" varchar(2) NULL; \ No newline at end of file diff --git a/src/org/cacert/gigi/dbObjects/User.java b/src/org/cacert/gigi/dbObjects/User.java index a6e1d3f1..83a89fa6 100644 --- a/src/org/cacert/gigi/dbObjects/User.java +++ b/src/org/cacert/gigi/dbObjects/User.java @@ -66,6 +66,8 @@ public class User extends CertificateOwner { private Name preferredName; + private CountryCode residenceCountry; + protected User(GigiResultSet rs) { super(rs.getInt("id")); updateName(rs); @@ -76,6 +78,14 @@ public class User extends CertificateOwner { email = rs.getString("email"); preferredName = Name.getById(rs.getInt("preferredName")); + try { + if (rs.getString("Country") != null) { + residenceCountry = CountryCode.getCountryCode(rs.getString("Country"), CountryCode.CountryCodeType.CODE_2_CHARS); + } + } catch (GigiApiException e) { + throw new Error(e); + } + String localeStr = rs.getString("language"); if (localeStr == null || localeStr.equals("")) { locale = Locale.getDefault(); @@ -94,18 +104,19 @@ public class User extends CertificateOwner { } } - public User(String email, String password, DayDate dob, Locale locale, NamePart... preferred) throws GigiApiException { + public User(String email, String password, DayDate dob, Locale locale, CountryCode residenceCountry, NamePart... preferred) throws GigiApiException { this.email = email; this.dob = dob; this.locale = locale; this.preferredName = new Name(this, preferred); - try (GigiPreparedStatement query = new GigiPreparedStatement("INSERT INTO `users` SET `email`=?, `password`=?, `dob`=?, `language`=?, id=?, `preferredName`=?")) { + try (GigiPreparedStatement query = new GigiPreparedStatement("INSERT INTO `users` SET `email`=?, `password`=?, `dob`=?, `language`=?, id=?, `preferredName`=?, `country` = ?")) { query.setString(1, email); query.setString(2, PasswordHash.hash(password)); query.setDate(3, dob.toSQLDate()); query.setString(4, locale.toString()); query.setInt(5, getId()); query.setInt(6, preferredName.getId()); + query.setString(7, residenceCountry == null ? null : residenceCountry.getCountryCode()); query.execute(); } new EmailAddress(this, email, locale); @@ -617,4 +628,20 @@ public class User extends CertificateOwner { private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {} + public CountryCode getResidenceCountry() { + return residenceCountry; + } + + public void setResidenceCountry(CountryCode residenceCountry) { + this.residenceCountry = residenceCountry; + rawUpdateCountryData(); + } + + private void rawUpdateCountryData() { + try (GigiPreparedStatement update = new GigiPreparedStatement("UPDATE users SET country=? WHERE id=?")) { + update.setString(1, residenceCountry == null ? null : residenceCountry.getCountryCode()); + update.setInt(2, getId()); + update.executeUpdate(); + } + } } diff --git a/src/org/cacert/gigi/pages/account/MyDetailsForm.java b/src/org/cacert/gigi/pages/account/MyDetailsForm.java index fd329ffd..a8ca49fc 100644 --- a/src/org/cacert/gigi/pages/account/MyDetailsForm.java +++ b/src/org/cacert/gigi/pages/account/MyDetailsForm.java @@ -10,6 +10,7 @@ import org.cacert.gigi.dbObjects.Name; import org.cacert.gigi.dbObjects.User; import org.cacert.gigi.localisation.Language; import org.cacert.gigi.output.ArrayIterable; +import org.cacert.gigi.output.CountrySelector; import org.cacert.gigi.output.DateSelector; import org.cacert.gigi.output.NameInput; import org.cacert.gigi.output.template.Form; @@ -30,12 +31,20 @@ public class MyDetailsForm extends Form { private NameInput ni; + private CountrySelector cs; + public MyDetailsForm(HttpServletRequest hsr, User target) { super(hsr); this.target = target; ni = new NameInput(); this.ds = new DateSelector("day", "month", "year", target.getDoB()); + + if (target.getResidenceCountry() == null) { + this.cs = new CountrySelector("residenceCountry", true); + } else { + this.cs = new CountrySelector("residenceCountry", true, target.getResidenceCountry()); + } } @Override @@ -82,6 +91,10 @@ public class MyDetailsForm extends Form { ds.update(req); target.setDoB(ds.getDate()); } + if ("updateResidenceCountry".equals(action)) { + cs.update(req); + target.setResidenceCountry(cs.getCountry()); + } } catch (GigiApiException e) { e.format(out, Page.getLanguage(req)); return false; @@ -119,6 +132,7 @@ public class MyDetailsForm extends Form { }); vars.put("name", ni); names.output(out, l, vars); + vars.put("residenceCountry", cs); if (target.getReceivedAssurances().length == 0) { vars.put("DoB", ds); templ.output(out, l, vars); diff --git a/src/org/cacert/gigi/pages/account/MyDetailsForm.templ b/src/org/cacert/gigi/pages/account/MyDetailsForm.templ index 55b91628..aa6191e2 100644 --- a/src/org/cacert/gigi/pages/account/MyDetailsForm.templ +++ b/src/org/cacert/gigi/pages/account/MyDetailsForm.templ @@ -5,4 +5,11 @@ +
+
+
+ + +
+
diff --git a/src/org/cacert/gigi/pages/account/MyDetailsFormAssured.templ b/src/org/cacert/gigi/pages/account/MyDetailsFormAssured.templ index 904e04b5..0b436d66 100644 --- a/src/org/cacert/gigi/pages/account/MyDetailsFormAssured.templ +++ b/src/org/cacert/gigi/pages/account/MyDetailsFormAssured.templ @@ -4,4 +4,11 @@ +
+
+
+ + +
+
diff --git a/src/org/cacert/gigi/pages/main/Signup.java b/src/org/cacert/gigi/pages/main/Signup.java index a10a68d7..819bfd5b 100644 --- a/src/org/cacert/gigi/pages/main/Signup.java +++ b/src/org/cacert/gigi/pages/main/Signup.java @@ -13,6 +13,7 @@ import org.cacert.gigi.database.GigiResultSet; import org.cacert.gigi.dbObjects.User; import org.cacert.gigi.email.EmailProvider; import org.cacert.gigi.localisation.Language; +import org.cacert.gigi.output.CountrySelector; import org.cacert.gigi.output.DateSelector; import org.cacert.gigi.output.NameInput; import org.cacert.gigi.output.template.Form; @@ -36,9 +37,12 @@ public class Signup extends Form { private boolean general = true, country = true, regional = true, radius = true; + private CountrySelector cs; + public Signup(HttpServletRequest hsr) { super(hsr); ni = new NameInput(); + cs = new CountrySelector("residenceCountry", true); } private DateSelector myDoB = new DateSelector("day", "month", "year"); @@ -56,6 +60,7 @@ public class Signup extends Form { vars.put("helpOnNames", String.format(l.getTranslation("Help on Names %sin the wiki%s"), "", "")); vars.put("csrf", getCSRFToken()); vars.put("dobmin", User.MINIMUM_AGE + ""); + vars.put("countryCode", cs); t.output(out, l, vars); } @@ -78,9 +83,13 @@ public class Signup extends Form { } catch (GigiApiException e) { problems.mergeInto(e); } + + cs.update(r); + if ( !problems.isEmpty()) { throw problems; } + } @Override @@ -178,7 +187,7 @@ public class Signup extends Form { } private void run(HttpServletRequest req, String password) throws GigiApiException { - User u = new User(email, password, myDoB.getDate(), Page.getLanguage(req).getLocale(), ni.getNameParts()); + User u = new User(email, password, myDoB.getDate(), Page.getLanguage(req).getLocale(), cs.getCountry(), ni.getNameParts()); try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `alerts` SET `memid`=?," + " `general`=?, `country`=?, `regional`=?, `radius`=?")) { ps.setInt(1, u.getId()); @@ -189,6 +198,6 @@ public class Signup extends Form { ps.execute(); } Notary.writeUserAgreement(u, "ToS", "account creation", "", true, 0); - } + } diff --git a/src/org/cacert/gigi/pages/main/Signup.templ b/src/org/cacert/gigi/pages/main/Signup.templ index a078f5b8..f590e458 100644 --- a/src/org/cacert/gigi/pages/main/Signup.templ +++ b/src/org/cacert/gigi/pages/main/Signup.templ @@ -4,21 +4,29 @@ + : + -
+ :
() -   + - : + : + + + + + + : @@ -28,6 +36,7 @@   + *: diff --git a/tests/org/cacert/gigi/testUtils/BusinessTest.java b/tests/org/cacert/gigi/testUtils/BusinessTest.java index b78b3726..cc095e30 100644 --- a/tests/org/cacert/gigi/testUtils/BusinessTest.java +++ b/tests/org/cacert/gigi/testUtils/BusinessTest.java @@ -119,7 +119,7 @@ public abstract class BusinessTest extends ConfiguredTest { c.set(1950, 1, 1, 0, 0, 0); c.set(Calendar.MILLISECOND, 0); - User u = new User(createUniqueName() + "@email.com", TEST_PASSWORD, new DayDate(c.getTimeInMillis()), Locale.ENGLISH, // + User u = new User(createUniqueName() + "@email.com", TEST_PASSWORD, new DayDate(c.getTimeInMillis()), Locale.ENGLISH, null, // new NamePart(NamePartType.FIRST_NAME, "a"), new NamePart(NamePartType.FIRST_NAME, "m"), new NamePart(NamePartType.LAST_NAME, "c")); InVMEmail.getInstance().mails.poll().verify(); return u; @@ -140,7 +140,7 @@ public abstract class BusinessTest extends ConfiguredTest { c.set(1950, 1, 1, 0, 0, 0); c.set(Calendar.MILLISECOND, 0); - User u = new User(mail, pw, new DayDate(c.getTimeInMillis()), Locale.ENGLISH,// + User u = new User(mail, pw, new DayDate(c.getTimeInMillis()), Locale.ENGLISH, null, // new NamePart(NamePartType.FIRST_NAME, f), new NamePart(NamePartType.LAST_NAME, l)); return u; } diff --git a/util-testing/org/cacert/gigi/pages/Manager.java b/util-testing/org/cacert/gigi/pages/Manager.java index f599fcd6..52d25be6 100644 --- a/util-testing/org/cacert/gigi/pages/Manager.java +++ b/util-testing/org/cacert/gigi/pages/Manager.java @@ -227,7 +227,7 @@ public class Manager extends Page { Calendar gc = GregorianCalendar.getInstance(); gc.setTimeInMillis(0); gc.set(1990, 0, 1); - User u = new User(email, "xvXV12°§", new DayDate(gc.getTime().getTime()), Locale.ENGLISH, // + User u = new User(email, "xvXV12°§", new DayDate(gc.getTime().getTime()), Locale.ENGLISH, null, // new NamePart(NamePartType.FIRST_NAME, "Först"), new NamePart(NamePartType.FIRST_NAME, "Müddle"),// new NamePart(NamePartType.LAST_NAME, "Läst"), new NamePart(NamePartType.SUFFIX, "Süffix")); EmailAddress ea = u.getEmails()[0];