Attached Files |
email_validation_core_949.patch [^] (15,851 bytes) 2011-12-22 06:20
[Show Content]
Index: admin_templates/users/users_edit.tpl
===================================================================
--- admin_templates/users/users_edit.tpl (revision 14895)
+++ admin_templates/users/users_edit.tpl (working copy)
@@ -72,6 +72,7 @@
<inp2:m_RenderElement name="inp_edit_box" prefix="u" field="LastName"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="u" field="Company"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="u" field="Email"/>
+ <inp2:m_RenderElement name="inp_edit_checkbox" prefix="u" field="EmailVerified"/>
<inp2:m_RenderElement name="inp_edit_date" prefix="u" field="dob" title="la_prompt_birthday"/> <!-- OLD PHRASE, la_fld_BirthDate -->
<inp2:m_RenderElement name="inp_edit_box" prefix="u" field="Phone"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="u" field="Fax"/>
Index: install/english.lang
===================================================================
--- install/english.lang (revision 14895)
+++ install/english.lang (working copy)
@@ -1590,13 +1590,15 @@
<EVENT MessageType="html" Event="FORM.SUBMITTED" Type="0">U3ViamVjdDogVGhhbmsgWW91IGZvciBDb250YWN0aW5nIFVzIQoKPHA+VGhhbmsgeW91IGZvciBjb250YWN0aW5nIHVzLiBXZSdsbCBiZSBpbiB0b3VjaCB3aXRoIHlvdSBzaG9ydGx5ITwvcD4=</EVENT>
<EVENT MessageType="html" Event="FORM.SUBMITTED" Type="1">U3ViamVjdDogTmV3IGZvcm0gc3VibWlzc2lvbgoKPHA+Rm9ybSBoYXMgYmVlbiBzdWJtaXR0ZWQuIFBsZWFzZSBwcm9jZWVkIHRvIHRoZSBBZG1pbiBDb25zb2xlIHRvIHJldmlldyB0aGUgc3VibWlzc2lvbiE8L3A+</EVENT>
<EVENT MessageType="html" Event="ROOT.RESET.PASSWORD" Type="1">U3ViamVjdDogUm9vdCBSZXNldCBQYXNzd29yZAoKWW91ciBuZXcgcGFzc3dvcmQgaXM6IDxpbnAyOm1fUGFyYW0gbmFtZT0icGFzc3dvcmQiLz4=</EVENT>
- <EVENT MessageType="html" Event="USER.ADD" Type="0">U3ViamVjdDogSW4tcG9ydGFsIHJlZ2lzdHJhdGlvbgoKRGVhciA8aW5wMjp1X0ZpZWxkIG5hbWU9IkZpcnN0TmFtZSIgLz4gPGlucDI6dV9GaWVsZCBuYW1lPSJMYXN0TmFtZSIgLz4sDQoNClRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9CYXNlVXJsLz4uIFlvdXIgcmVnaXN0cmF0aW9uIGlzIG5vdyBhY3RpdmUu</EVENT>
- <EVENT MessageType="html" Event="USER.ADD" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+KQoKQSBuZXcgdXNlciAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIGJlZW4gYWRkZWQu</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD" Type="0">U3ViamVjdDogSW4tcG9ydGFsIHJlZ2lzdHJhdGlvbgoKRGVhciA8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9IkZpcnN0TmFtZSIgLz4gPGlucDI6dS5yZWdpc3Rlcl9GaWVsZCBuYW1lPSJMYXN0TmFtZSIgLz4sDQoNClRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9CYXNlVXJsLz4uIFlvdXIgcmVnaXN0cmF0aW9uIGlzIG5vdyBhY3RpdmUuDQo8aW5wMjptX2lmIGNoZWNrPSJ1LnJlZ2lzdGVyX0ZpZWxkIiBuYW1lPSJFbWFpbCI+DQo8YnIvPjxici8+DQpQbGVhc2UgY2xpY2sgaGVyZSB0byB2ZXJpZnkgeW91ciBFLW1haWwgYWRkcmVzczoNCjxhIGhyZWY9IjxpbnAyOnUucmVnaXN0ZXJfQ29uZmlybVBhc3N3b3JkTGluayB0PSJwbGF0Zm9ybS9teV9hY2NvdW50L3ZlcmlmeV9lbWFpbCIgbm9fYW1wPSIxIi8+Ij48aW5wMjp1LnJlZ2lzdGVyX0NvbmZpcm1QYXNzd29yZExpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC92ZXJpZnlfZW1haWwiIG5vX2FtcD0iMSIvPjwvYT48YnIvPjxici8+DQo8L2lucDI6bV9pZj4=</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+KQoKQSBuZXcgdXNlciAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIGJlZW4gYWRkZWQu</EVENT>
<EVENT MessageType="text" Event="USER.ADD.BYADMIN" Type="0">U3ViamVjdDogTmV3IHVzZXIgaGFzIGJlZW4gY3JlYXRlZAoKRGVhciA8aW5wMjp1X0ZpZWxkIG5hbWU9IkZpcnN0TmFtZSIvPiwNCg0KQSBuZXcgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGFuZCBhc3NpZ25lZCB0byB5b3UNCg0KTm93IHlvdSBjYW4gbG9naW4gdXNpbmcgdGhlIGZvbGxvd2luZyBjcmVkZW50aWFsczoNCg0KPGlucDI6bV9pZiBjaGVjaz0idV9GaWVsZCIgbmFtZT0iVXNlcm5hbWUiPlVzZXJuYW1lOiA8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+PGlucDI6bV9lbHNlLz5FLW1haWw6IDxpbnAyOnVfRmllbGQgbmFtZT0iRW1haWwiLz48L2lucDI6bV9pZj4gDQpQYXNzd29yZDogPGlucDI6dV9GaWVsZCBuYW1lPSJQYXNzd29yZF9wbGFpbiIvPiANCg==</EVENT>
- <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="0">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+PGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPiAtIEFjdGl2YXRpb24gRW1haWw8L2lucDI6bV9pZj4pCgpEZWFyIDxpbnAyOnVfRmllbGQgbmFtZT0iRmlyc3ROYW1lIiAvPiA8aW5wMjp1X0ZpZWxkIG5hbWU9Ikxhc3ROYW1lIiAvPiw8YnIgLz4NCjxiciAvPg0KPGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPiBUaGFuayB5b3UgZm9yIHJlZ2lzdGVyaW5nIG9uIDxpbnAyOm1fTGluayB0ZW1wbGF0ZT0iaW5kZXgiLz4gd2Vic2l0ZS4gVG8gYWN0aXZhdGUgeW91ciByZWdpc3RyYXRpb24gcGxlYXNlIGZvbGxvdyBsaW5rIGJlbG93LiA8aW5wMjp1X0FjdGl2YXRpb25MaW5rIHRlbXBsYXRlPSJwbGF0Zm9ybS9sb2dpbi9hY3RpdmF0ZV9jb25maXJtIi8+IDxpbnAyOm1fZWxzZS8+IFRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9MaW5rIHRlbXBsYXRlPSJpbmRleCIvPiB3ZWJzaXRlLiBZb3VyIHJlZ2lzdHJhdGlvbiB3aWxsIGJlIGFjdGl2ZSBhZnRlciBhcHByb3ZhbC4gPC9pbnAyOm1faWY+</EVENT>
- <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0ZXJlZAoKQSBuZXcgdXNlciAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIHJlZ2lzdGVyZWQgYW5kIGlzIHBlbmRpbmcgYWRtaW5pc3RyYXRpdmUgYXBwcm92YWwu</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="0">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+PGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPiAtIEFjdGl2YXRpb24gRW1haWw8L2lucDI6bV9pZj4pCgpEZWFyIDxpbnAyOnUucmVnaXN0ZXJfRmllbGQgbmFtZT0iRmlyc3ROYW1lIiAvPiA8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9Ikxhc3ROYW1lIiAvPiw8YnIgLz4NCjxiciAvPg0KPGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPiBUaGFuayB5b3UgZm9yIHJlZ2lzdGVyaW5nIG9uIDxpbnAyOm1fTGluayB0ZW1wbGF0ZT0iaW5kZXgiLz4gd2Vic2l0ZS4gVG8gYWN0aXZhdGUgeW91ciByZWdpc3RyYXRpb24gcGxlYXNlIGZvbGxvdyBsaW5rIGJlbG93LiA8aW5wMjp1LnJlZ2lzdGVyX0FjdGl2YXRpb25MaW5rIHRlbXBsYXRlPSJwbGF0Zm9ybS9sb2dpbi9hY3RpdmF0ZV9jb25maXJtIi8+IDxpbnAyOm1fZWxzZS8+IFRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9MaW5rIHRlbXBsYXRlPSJpbmRleCIvPiB3ZWJzaXRlLiBZb3VyIHJlZ2lzdHJhdGlvbiB3aWxsIGJlIGFjdGl2ZSBhZnRlciBhcHByb3ZhbC4gDQo8aW5wMjptX2lmIGNoZWNrPSJ1LnJlZ2lzdGVyX0ZpZWxkIiBuYW1lPSJFbWFpbCI+DQo8YnIvPjxici8+DQpQbGVhc2UgY2xpY2sgaGVyZSB0byB2ZXJpZnkgeW91ciBFLW1haWwgYWRkcmVzczoNCjxhIGhyZWY9IjxpbnAyOnUucmVnaXN0ZXJfQ29uZmlybVBhc3N3b3JkTGluayB0PSJwbGF0Zm9ybS9teV9hY2NvdW50L3ZlcmlmeV9lbWFpbCIgbm9fYW1wPSIxIi8+Ij48aW5wMjp1LnJlZ2lzdGVyX0NvbmZpcm1QYXNzd29yZExpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC92ZXJpZnlfZW1haWwiIG5vX2FtcD0iMSIvPjwvYT48YnIvPjxici8+DQo8L2lucDI6bV9pZj4NCjwvaW5wMjptX2lmPg0K</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0ZXJlZAoKQSBuZXcgdXNlciAiPGlucDI6dS5yZWdpc3Rlcl9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIHJlZ2lzdGVyZWQgYW5kIGlzIHBlbmRpbmcgYWRtaW5pc3RyYXRpdmUgYXBwcm92YWwu</EVENT>
<EVENT MessageType="html" Event="USER.APPROVE" Type="0">U3ViamVjdDogWW91ciBBY2NvdW50IGlzIEFjdGl2ZQoKV2VsY29tZSB0byA8aW5wMjptX0Jhc2VVcmwvPiENCg0KWW91ciB1c2VyIHJlZ2lzdHJhdGlvbiBoYXMgYmVlbiBhcHByb3ZlZC4gWW91ciB1c2VyIG5hbWUgaXM6ICI8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+Ii4=</EVENT>
<EVENT MessageType="html" Event="USER.APPROVE" Type="1">U3ViamVjdDogTmV3IFVzZXIgQWNjb3VudCAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgd2FzIEFwcHJvdmVkCgpVc2VyICI8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+IiBoYXMgYmVlbiBhcHByb3ZlZC4=</EVENT>
+ <EVENT MessageType="html" Event="USER.CHANGE.EMAIL.UNDO" Type="0">U3ViamVjdDogQ2hhbmdlZCBFLW1haWwgUm9sbGJhY2sKCkhlbGxvLDxici8+PGJyLz4NCg0KSXQgc2VlbXMgdGhhdCB5b3UgaGF2ZSBjaGFuZ2VkIGUtbWFpbCBpbiB5b3VyIEluLXBvcnRhbCBhY2NvdW50LiBZb3UgbWF5IHVuZG8gdGhpcyBjaGFuZ2UgYnkgY2xpY2tpbmcgb24gdGhlIGxpbmsgYmVsb3c6PGJyLz48YnIvPg0KDQo8YSBocmVmPSI8aW5wMjptX0xpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC9yZXN0b3JlX2VtYWlsIiBoYXNoPSIkaGFzaCIgbm9fYW1wPSIxIi8+Ij48aW5wMjptX0xpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC9yZXN0b3JlX2VtYWlsIiBoYXNoPSIkaGFzaCIgbm9fYW1wPSIxIi8+PC9hPjxici8+PGJyLz4NCg0KSWYgeW91IGJlbGlldmUgeW91IGhhdmUgcmVjZWl2ZWQgdGhpcyBlbWFpbCBpbiBlcnJvciwgcGxlYXNlIGlnbm9yZSB0aGlzIGVtYWlsLiBZb3VyIGFjY291bnQgd2lsbCBiZSBsaW5rZWQgdG8gYW5vdGhlciBlLW1haWwgdW5sZXNzIHlvdSBoYXZlIGNsaWNrZWQgb24gdGhlIGFib3ZlIGxpbmsuDQo=</EVENT>
+ <EVENT MessageType="html" Event="USER.CHANGE.EMAIL.VERIFY" Type="0">U3ViamVjdDogQ2hhbmdlZCBFLW1haWwgVmVyaWZpY2F0aW9uCgpIZWxsbyw8YnIvPjxici8+DQoNCkl0IHNlZW1zIHRoYXQgeW91IGhhdmUgY2hhbmdlZCBlLW1haWwgaW4geW91ciBJbi1wb3J0YWwgYWNjb3VudC4gUGxlYXNlIHZlcmlmeSB0aGlzIG5ldyBlLW1haWwgYnkgY2xpY2tpbmcgb24gdGhlIGxpbmsgYmVsb3c6PGJyLz48YnIvPg0KDQo8YSBocmVmPSI8aW5wMjp1X0NvbmZpcm1QYXNzd29yZExpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC92ZXJpZnlfZW1haWwiIG5vX2FtcD0iMSIvPiI+PGlucDI6dV9Db25maXJtUGFzc3dvcmRMaW5rIHQ9InBsYXRmb3JtL215X2FjY291bnQvdmVyaWZ5X2VtYWlsIiBub19hbXA9IjEiLz48L2E+PGJyLz48YnIvPg0KDQpJZiB5b3UgYmVsaWV2ZSB5b3UgaGF2ZSByZWNlaXZlZCB0aGlzIGVtYWlsIGluIGVycm9yLCBwbGVhc2UgaWdub3JlIHRoaXMgZW1haWwuIFlvdXIgZW1haWwgd2lsbCBub3QgZ2V0IHZlcmlmaWVkIHN0YXR1cyB1bmxlc3MgeW91IGhhdmUgY2xpY2tlZCBvbiB0aGUgYWJvdmUgbGluay4NCg==</EVENT>
<EVENT MessageType="html" Event="USER.DENY" Type="0">U3ViamVjdDogWW91ciBSZWdpc3RyYXRpb24gaGFzIGJlZW4gRGVuaWVkCgpZb3VyIHJlZ2lzdHJhdGlvbiBvbiA8YSBocmVmPSI8aW5wMjptX0Jhc2VVcmwvPiI+PGlucDI6bV9CYXNlVXJsLz48L2E+IHdlYnNpdGUgaGFzIGJlZW4gZGVuaWVkLg==</EVENT>
<EVENT MessageType="html" Event="USER.DENY" Type="1">U3ViamVjdDogVXNlciBSZWdpc3RyYXRpb24gZm9yICAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIGJlZW4gRGVuaWVkCgpVc2VyICI8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+IiBoYXMgYmVlbiBkZW5pZWQu</EVENT>
<EVENT MessageType="html" Event="USER.MEMBERSHIP.EXPIRATION.NOTICE" Type="0">U3ViamVjdDogTWVtYmVyc2hpcCBFeHBpcmF0aW9uIE5vdGljZQoKWW91ciBtZW1iZXJzaGlwIG9uIDxpbnAyOm1fQmFzZVVybC8+IHdlYnNpdGUgd2lsbCBzb29uIGV4cGlyZS4=</EVENT>
Index: install/install_schema.sql
===================================================================
--- install/install_schema.sql (revision 14895)
+++ install/install_schema.sql (working copy)
@@ -274,6 +274,8 @@
PrimaryGroupId int(11) DEFAULT NULL,
OldStyleLogin tinyint(4) NOT NULL,
IPRestrictions text,
+ EmailVerified tinyint(1) NOT NULL DEFAULT '0',
+ PrevEmails text,
PRIMARY KEY (PortalUserId),
UNIQUE KEY ResourceId (ResourceId),
KEY CreatedOn (CreatedOn),
Index: install/upgrades.sql
===================================================================
--- install/upgrades.sql (revision 14895)
+++ install/upgrades.sql (working copy)
@@ -2425,3 +2425,6 @@
KEY ItemPrefix (ItemPrefix),
KEY Enabled (Enabled)
);
+
+ALTER TABLE PortalUser ADD EmailVerified TINYINT( 1 ) NOT NULL DEFAULT '0',
+ADD PrevEmails TEXT;
\ No newline at end of file
Index: units/helpers/user_helper.php
===================================================================
--- units/helpers/user_helper.php (revision 14895)
+++ units/helpers/user_helper.php (working copy)
@@ -550,6 +550,61 @@
return 'code_expired';
}
+ $sql = 'UPDATE ' . TABLE_PREFIX . 'PortalUser
+ SET EmailVerified = 1
+ WHERE PortalUserId = '.$user_info['PortalUserId'].'
+ ';
+ $this->Conn->Query($sql);
+
return $user_info['PortalUserId'];
}
+
+ /**
+ * Restores user's email, returns error label, if error occured
+ *
+ * @param array $params
+ * @return string
+ */
+ public function restoreEmail($params)
+ {
+ $hash = $this->Application->GetVar('hash');
+
+ if (!preg_match('/^[a-f0-9]{32}$/', $hash)) {
+ return $params['invalid_hash'];
+ }
+
+ $sql = 'SELECT PortalUserId, PrevEmails FROM ' . TABLE_PREFIX . 'PortalUser
+ WHERE PrevEmails LIKE "%'.$hash.'%"
+ ';
+
+ $user_info = $this->Conn->GetRow($sql);
+
+ if ($user_info === false) {
+ return $params['invalid_hash'];
+ }
+
+ $prev_emails = unserialize($user_info['PrevEmails']);
+
+ if (!isset($prev_emails[$hash])) {
+ return $params['invalid_hash'];
+ }
+
+ $email_to_restore = $prev_emails[$hash];
+ unset($prev_emails[$hash]);
+
+ $object =& $this->Application->recallObject('u.restore', null, Array('skip_autoload' => true));
+
+ $object->Load($user_info['PortalUserId']);
+ /* @var $object UsersItem */
+
+ $object->SetDBField('PrevEmails', serialize($prev_emails));
+ $object->SetDBField('Email', $email_to_restore);
+ $object->SetDBField('EmailVerified', 1);
+
+ if (!$object->Update()) {
+ return $params['restore_impossible'];
+ }
+
+ return '';
+ }
}
Index: units/users/users_config.php
===================================================================
--- units/users/users_config.php (revision 14895)
+++ units/users/users_config.php (working copy)
@@ -415,6 +415,8 @@
'default' => 0
),
'IPRestrictions' => Array ('default' => NULL),
+ 'EmailVerified' => Array ('default' => 0),
+ 'PrevEmails' => Array ('default' => NULL),
),
'VirtualFields' => Array (
@@ -546,6 +548,8 @@
'PrimaryGroupId' => Array ('type' => 'int'),
'OldStyleLogin' => Array ('type' => 'int', 'not_null' => 1),
'IPRestrictions' => Array ('type' => 'string'),
+ 'EmailVerified' => Array ('type' => 'int', 'not_null' => 1),
+ 'PrevEmails' => Array ('type' => 'string'),
),
'VirtualFields' => Array (
Index: units/users/users_event_handler.php
===================================================================
--- units/users/users_event_handler.php (revision 14895)
+++ units/users/users_event_handler.php (working copy)
@@ -1280,6 +1280,10 @@
$object =& $event->getObject();
/* @var $object UsersItem */
+ if (!$this->Application->isAdmin) {
+ $this->sendEmailChangeEvent($event);
+ }
+
if (!$this->Application->isAdmin || $object->IsTempTable()) {
return ;
}
@@ -1427,6 +1431,55 @@
}
/**
+ * Sends restore/validation email event on user email change
+ *
+ * @param kEvent $event
+ */
+ function sendEmailChangeEvent(&$event)
+ {
+
+ $object =& $event->getObject();
+ /* @var $object UsersItem */
+
+ $prev_email = $object->GetOriginalField('Email');
+ $new_email = $object->GetDBField('Email');
+
+ if ($prev_email == $new_email) {
+ return;
+ }
+
+ if (!$new_email) {
+ return;
+ }
+
+ $fields_hash = Array (
+ 'PrevEmails' => serialize($prev_emails),
+ 'EmailVerified' => 0,
+ );
+
+ $user_id = $object->GetId();
+
+ if ($prev_email) {
+ $prev_emails = unserialize($object->GetDBField('PrevEmails'));
+ $hash = md5(adodb_mktime() + $user_id);
+ $prev_emails[$hash] = $prev_email;
+ $fields_hash['PrevEmails'] = serialize($prev_emails);
+ $this->Application->EmailEventUser('USER.CHANGE.EMAIL.UNDO', null, Array (
+ 'hash' => $hash,
+ 'to_email' => $prev_email,
+ 'to_name' => trim($object->GetDBField('FirstName') . ' ' . $object->GetDBField('LastName')),
+ ));
+ }
+
+ if ($new_email) {
+ $this->Application->EmailEventUser('USER.CHANGE.EMAIL.VERIFY', $user_id);
+ }
+
+ $table_name = $this->Application->getUnitOption($this->Prefix, 'TableName');
+ $this->Conn->doUpdate($fields_hash, $table_name, 'PortalUserId = '.$user_id);
+ }
+
+ /**
* OnAfterConfigRead for users
*
* @param kEvent $event
Index: units/users/users_tag_processor.php
===================================================================
--- units/users/users_tag_processor.php (revision 14895)
+++ units/users/users_tag_processor.php (working copy)
@@ -113,6 +113,25 @@
return true;
}
+ function RestoreEmail($params)
+ {
+ $user_helper =& $this->Application->recallObject('UserHelper');
+ /* @var $user_helper UserHelper */
+
+ $error_label = $user_helper->restoreEmail($params);
+
+ if ( $error_label ) {
+ $object =& $this->getObject( Array('skip_autoload' => true) );
+ /* @var $object UsersItem */
+
+ $object->SetError('PwResetConfirm', 'restore', $error_label);
+
+ return false;
+ }
+
+ return true;
+ }
+
/**
* Returns error message set by given code type
*
email_validation_theme_949.patch [^] (9,052 bytes) 2011-12-22 06:20
[Show Content]
Index: _install/english.lang
===================================================================
--- _install/english.lang (revision 14895)
+++ _install/english.lang (working copy)
@@ -106,8 +106,11 @@
<PHRASE Label="lu_error_alreadyadded" Module="Core" Type="0">Q2F0ZWdvcnkgYWxyZWFkeSBhZGRlZCE=</PHRASE>
<PHRASE Label="lu_error_AlreadyCommented" Module="Core" Type="0">QWxyZWFkeSBjb21tZW50ZWQ=</PHRASE>
<PHRASE Label="lu_error_categorylimitreached" Module="Core" Type="0">Q2F0ZWdvcnkgbGltaXQgcmVhY2hlZCE=</PHRASE>
+ <PHRASE Label="lu_error_EmailRestoreIsNotPossible" Module="Core" Type="0">RS1tYWlsIHJlc3RvcmUgaXMgbm90IHBvc3NpYmxl</PHRASE>
<PHRASE Label="lu_error_Required" Module="Core" Type="0">UmVxdWlyZWQ=</PHRASE>
+ <PHRASE Label="lu_error_RestoreCodeNotValid" Module="Core" Type="0">UmVzdG9yZSBjb2RlIG5vdCB2YWxpZA==</PHRASE>
<PHRASE Label="lu_error_UserNotFound" Module="Core" Type="0">VXNlciBOb3QgRm91bmQ=</PHRASE>
+ <PHRASE Label="lu_error_VerificationCodeExpired" Module="Core" Type="0">VmVyaWZpY2F0aW9uIGNvZGUgaGFzIGV4cGlyZWQ=</PHRASE>
<PHRASE Label="lu_favorite" Module="Core" Type="0">RmF2b3JpdGU=</PHRASE>
<PHRASE Label="lu_ferror_forgotpw_nodata" Module="Core" Type="0">WW91IG11c3QgZW50ZXIgYSBVc2VybmFtZSBvciBFbWFpbCBBZGRyZXNzIHRvIHJldHJpdmUgeW91ciBhY2NvdW50IGluZm9ybWF0aW9u</PHRASE>
<PHRASE Label="lu_ferror_reset_denied" Module="Core" Type="0">Tm90IHJlc2V0</PHRASE>
@@ -305,6 +308,8 @@
<PHRASE Label="lu_text_SuggestCategoryConfirm" Module="Core" Type="0">VGhhbmsgeW91IGZvciBzdWdnZXN0aW5nIHlvdXIgY2F0ZWdvcnku</PHRASE>
<PHRASE Label="lu_text_SuggestCategoryPendingConfirm" Module="Core" Type="0">U3VnZ2VzdGVkIGNhdGVnb3J5IGlzIHBlbmRpbmcgZm9yIEFkbWluaXN0cmF0aXZlIGFwcHJvdmFsIA==</PHRASE>
<PHRASE Label="lu_text_ThankYou" Module="Core" Type="0">VGhhbmsgeW91IGZvciBzdWJtaXR0aW5nIHlvdXIgcmVxdWVzdC4=</PHRASE>
+ <PHRASE Label="lu_text_YourEmailIsRestored" Module="Core" Type="0">WW91ciBlLW1haWwgaXMgcmVzdG9yZWQ=</PHRASE>
+ <PHRASE Label="lu_text_YourEmailIsVerified" Module="Core" Type="0">WW91ciBlLW1haWwgaXMgdmVyaWZpZWQ=</PHRASE>
<PHRASE Label="lu_ThankForSubscribing" Module="Core" Type="0">VGhhbmsgeW91IGZvciBzdWJzY3JpYmluZyB0byBvdXIgbWFpbGluZyBsaXN0</PHRASE>
<PHRASE Label="lu_ThanksForVoting" Module="Core" Type="0">VGhhbmtzIGZvciBWb3Rpbmch</PHRASE>
<PHRASE Label="lu_ThisCategory" Module="Core" Type="0">Q3VycmVudCBDYXRlZ29yeQ==</PHRASE>
@@ -316,6 +321,7 @@
<PHRASE Label="lu_title_CategorySearchResults" Module="Core" Type="0">Q2F0ZWdvcnkgU2VhcmNoIFJlc3VsdHM=</PHRASE>
<PHRASE Label="lu_title_DisabledAccountWarning" Module="Core" Type="0">UGVuZGluZyBvciBkaXNhYmxlZCB1c2VyIGFjY291bnQgd2FybmluZw==</PHRASE>
<PHRASE Label="lu_title_EditAddress" Module="Core" Type="0">RWRpdCBBZGRyZXNz</PHRASE>
+ <PHRASE Label="lu_title_EmailVerification" Module="Core" Type="0">RS1tYWlsIFZlcmlmaWNhdGlvbg==</PHRASE>
<PHRASE Label="lu_title_enhancementconfirmation" Module="Core" Type="0">WW91ciBGYXZvcml0ZSBJdGVtcw==</PHRASE>
<PHRASE Label="lu_title_Favorites" Module="Core" Type="0">WW91ciBGYXZvcml0ZXM=</PHRASE>
<PHRASE Label="lu_title_ForgotPassword" Module="Core" Type="0">Rm9yZ290IFBhc3N3b3Jk</PHRASE>
@@ -343,6 +349,7 @@
<PHRASE Label="lu_title_RelatedCategories" Module="Core" Type="0">UmVsYXRlZCBDYXRlZ29yaWVz</PHRASE>
<PHRASE Label="lu_title_RelatedItems" Module="Core" Type="0">UmVsYXRlZCBJdGVtcw==</PHRASE>
<PHRASE Label="lu_title_RelatedSearches" Module="Core" Type="0">UmVsYXRlZCBTZWFyY2hlcw==</PHRASE>
+ <PHRASE Label="lu_title_RestoreEmail" Module="Core" Type="0">UmVzdG9yZSBFLW1haWw=</PHRASE>
<PHRASE Label="lu_title_Reviews" Module="Core" Type="0">Q29tbWVudHM=</PHRASE>
<PHRASE Label="lu_title_SearchBox" Module="Core" Type="0">U2VhcmNoIEJveA==</PHRASE>
<PHRASE Label="lu_title_SearchResults" Module="Core" Type="0">U2VhcmNoIFJlc3VsdHM=</PHRASE>
Index: platform/my_account/restore_email.tpl
===================================================================
--- platform/my_account/restore_email.tpl (revision 0)
+++ platform/my_account/restore_email.tpl (revision 0)
@@ -0,0 +1,63 @@
+<!--##
+<NAME>Restore E-mail</NAME>
+<DESC></DESC>
+<SECTION>My Account</SECTION>
+##-->
+
+<!--## PAGE TITLE ELEMENT ##-->
+<inp2:m_DefineElement name="page_title">
+ <inp2:m_phrase name="lu_title_RestoreEmail" no_editing="1"/>
+</inp2:m_DefineElement>
+<!--## //PAGE TITLE ELEMENT ##-->
+
+<!--## SIDE-BAR ELEMENT ##-->
+<inp2:m_DefineElement name="sidebar">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/login.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/search.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/recommend_site.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/mailing_list.elm" design="blue_box"/>
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## //SIDE-BAR ELEMENT ##-->
+
+<!--## MAIN CONTENT ##-->
+<inp2:m_DefineElement name="content">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_include template="platform/elements/navigation_bar.elm" titles="lu_title_RestoreEmail" templates="platform/my_account/restore_email"/>
+ </div>
+ <div class="movable-element">
+ <!-- forgot password reset -->
+ <inp2:m_RenderElement design="content_box">
+ <inp2:m_Capture to_var="header">
+ <inp2:m_phrase name="lu_title_RestoreEmail"/>
+ </inp2:m_Capture>
+
+ <br /><br />
+
+ <inp2:m_if check="u_RestoreEmail" invalid_hash="lu_error_RestoreCodeNotValid" restore_impossible="lu_error_EmailRestoreIsNotPossible">
+ <inp2:m_Phrase label="lu_text_YourEmailIsRestored"/>
+ <inp2:m_else />
+ <span class="error"><inp2:u_Error field="PwResetConfirm"/></span>
+ <br /> <br />
+ <a href="<inp2:m_Link template="index" m_cat_id="0" m_cat_page="1"/>"><inp2:m_Phrase label="lu_ReturnToHome"/></a>
+ </inp2:m_if>
+ </inp2:m_RenderElement>
+ <!-- // forgot password reset -->
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## /MAIN CONTENT ##-->
+
+<!--## DESIGN TEMPLATE ##-->
+<inp2:m_include template="platform/designs/default_design.des" pass_params="1"/>
+<!--## /DESIGN TEMPLATE ##-->
\ No newline at end of file
Index: platform/my_account/verify_email.tpl
===================================================================
--- platform/my_account/verify_email.tpl (revision 0)
+++ platform/my_account/verify_email.tpl (revision 0)
@@ -0,0 +1,64 @@
+<!--##
+<NAME>E-mail Verification</NAME>
+<DESC></DESC>
+<SECTION>My Account</SECTION>
+##-->
+
+<!--## PAGE TITLE ELEMENT ##-->
+<inp2:m_DefineElement name="page_title">
+ <inp2:m_phrase name="lu_title_EmailVerification" no_editing="1"/>
+</inp2:m_DefineElement>
+<!--## //PAGE TITLE ELEMENT ##-->
+
+<!--## SIDE-BAR ELEMENT ##-->
+<inp2:m_DefineElement name="sidebar">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/login.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/search.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/recommend_site.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/mailing_list.elm" design="blue_box"/>
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## //SIDE-BAR ELEMENT ##-->
+
+<!--## MAIN CONTENT ##-->
+<inp2:m_DefineElement name="content">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_include template="platform/elements/navigation_bar.elm" titles="lu_title_EmailVerification" templates="platform/my_account/verify_email"/>
+ </div>
+ <div class="movable-element">
+ <!-- forgot password reset -->
+ <inp2:m_RenderElement design="content_box">
+ <inp2:m_Capture to_var="header">
+ <inp2:m_phrase name="lu_title_EmailVerification"/>
+ </inp2:m_Capture>
+
+ <br /><br />
+
+
+ <inp2:m_if check="u_TestCodeIsValid" code_type="custom" error_invalid="lu_error_VerificationCodeNotValid" error_expired="lu_error_VerificationCodeExpired">
+ <inp2:m_Phrase label="lu_text_YourEmailIsVerified"/>
+ <inp2:m_else />
+ <span class="error"><inp2:u_Error field="PwResetConfirm"/></span>
+ <br /> <br />
+ <a href="<inp2:m_Link template="index" m_cat_id="0" m_cat_page="1"/>"><inp2:m_Phrase label="lu_ReturnToHome"/></a>
+ </inp2:m_if>
+ </inp2:m_RenderElement>
+ <!-- // forgot password reset -->
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## /MAIN CONTENT ##-->
+
+<!--## DESIGN TEMPLATE ##-->
+<inp2:m_include template="platform/designs/default_design.des" pass_params="1"/>
+<!--## /DESIGN TEMPLATE ##-->
\ No newline at end of file
email_validation_core_v2_949.patch [^] (20,270 bytes) 2011-12-27 12:48
[Show Content]
Index: admin_templates/users/users_edit.tpl
===================================================================
--- admin_templates/users/users_edit.tpl (revision 14925)
+++ admin_templates/users/users_edit.tpl (working copy)
@@ -72,6 +72,7 @@
<inp2:m_RenderElement name="inp_edit_box" prefix="u" field="LastName"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="u" field="Company"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="u" field="Email"/>
+ <inp2:m_RenderElement name="inp_edit_checkbox" prefix="u" field="EmailVerified"/>
<inp2:m_RenderElement name="inp_edit_date" prefix="u" field="dob" title="la_prompt_birthday"/> <!-- OLD PHRASE, la_fld_BirthDate -->
<inp2:m_RenderElement name="inp_edit_box" prefix="u" field="Phone"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="u" field="Fax"/>
Index: install/english.lang
===================================================================
--- install/english.lang (revision 14925)
+++ install/english.lang (working copy)
@@ -1590,15 +1590,17 @@
<EVENT MessageType="html" Event="FORM.SUBMITTED" Type="0">U3ViamVjdDogVGhhbmsgWW91IGZvciBDb250YWN0aW5nIFVzIQoKPHA+VGhhbmsgeW91IGZvciBjb250YWN0aW5nIHVzLiBXZSdsbCBiZSBpbiB0b3VjaCB3aXRoIHlvdSBzaG9ydGx5ITwvcD4=</EVENT>
<EVENT MessageType="html" Event="FORM.SUBMITTED" Type="1">U3ViamVjdDogTmV3IGZvcm0gc3VibWlzc2lvbgoKPHA+Rm9ybSBoYXMgYmVlbiBzdWJtaXR0ZWQuIFBsZWFzZSBwcm9jZWVkIHRvIHRoZSBBZG1pbiBDb25zb2xlIHRvIHJldmlldyB0aGUgc3VibWlzc2lvbiE8L3A+</EVENT>
<EVENT MessageType="html" Event="ROOT.RESET.PASSWORD" Type="1">U3ViamVjdDogUm9vdCBSZXNldCBQYXNzd29yZAoKWW91ciBuZXcgcGFzc3dvcmQgaXM6IDxpbnAyOm1fUGFyYW0gbmFtZT0icGFzc3dvcmQiLz4=</EVENT>
- <EVENT MessageType="html" Event="USER.ADD" Type="0">U3ViamVjdDogSW4tcG9ydGFsIHJlZ2lzdHJhdGlvbgoKRGVhciA8aW5wMjp1X0ZpZWxkIG5hbWU9IkZpcnN0TmFtZSIgLz4gPGlucDI6dV9GaWVsZCBuYW1lPSJMYXN0TmFtZSIgLz4sDQoNClRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9CYXNlVXJsLz4uIFlvdXIgcmVnaXN0cmF0aW9uIGlzIG5vdyBhY3RpdmUu</EVENT>
- <EVENT MessageType="html" Event="USER.ADD" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+KQoKQSBuZXcgdXNlciAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIGJlZW4gYWRkZWQu</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD" Type="0">U3ViamVjdDogSW4tcG9ydGFsIHJlZ2lzdHJhdGlvbgoKRGVhciA8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9IkZpcnN0TmFtZSIgLz4gPGlucDI6dS5yZWdpc3Rlcl9GaWVsZCBuYW1lPSJMYXN0TmFtZSIgLz4sDQoNClRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9CYXNlVXJsLz4uIFlvdXIgcmVnaXN0cmF0aW9uIGlzIG5vdyBhY3RpdmUuDQo8aW5wMjptX2lmIGNoZWNrPSJ1LnJlZ2lzdGVyX0ZpZWxkIiBuYW1lPSJFbWFpbCI+DQo8YnIvPjxici8+DQpQbGVhc2UgY2xpY2sgaGVyZSB0byB2ZXJpZnkgeW91ciBFLW1haWwgYWRkcmVzczoNCjxhIGhyZWY9IjxpbnAyOnUucmVnaXN0ZXJfQ29uZmlybVBhc3N3b3JkTGluayB0PSJwbGF0Zm9ybS9teV9hY2NvdW50L3ZlcmlmeV9lbWFpbCIgbm9fYW1wPSIxIi8+Ij48aW5wMjp1LnJlZ2lzdGVyX0NvbmZpcm1QYXNzd29yZExpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC92ZXJpZnlfZW1haWwiIG5vX2FtcD0iMSIvPjwvYT48YnIvPjxici8+DQo8L2lucDI6bV9pZj4=</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+KQoKQSBuZXcgdXNlciAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIGJlZW4gYWRkZWQu</EVENT>
<EVENT MessageType="text" Event="USER.ADD.BYADMIN" Type="0">U3ViamVjdDogTmV3IHVzZXIgaGFzIGJlZW4gY3JlYXRlZAoKRGVhciA8aW5wMjp1X0ZpZWxkIG5hbWU9IkZpcnN0TmFtZSIvPiwNCg0KQSBuZXcgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGFuZCBhc3NpZ25lZCB0byB5b3UNCg0KTm93IHlvdSBjYW4gbG9naW4gdXNpbmcgdGhlIGZvbGxvd2luZyBjcmVkZW50aWFsczoNCg0KPGlucDI6bV9pZiBjaGVjaz0idV9GaWVsZCIgbmFtZT0iVXNlcm5hbWUiPlVzZXJuYW1lOiA8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+PGlucDI6bV9lbHNlLz5FLW1haWw6IDxpbnAyOnVfRmllbGQgbmFtZT0iRW1haWwiLz48L2lucDI6bV9pZj4gDQpQYXNzd29yZDogPGlucDI6dV9GaWVsZCBuYW1lPSJQYXNzd29yZF9wbGFpbiIvPiANCg==</EVENT>
- <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="0">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+PGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPiAtIEFjdGl2YXRpb24gRW1haWw8L2lucDI6bV9pZj4pCgpEZWFyIDxpbnAyOnVfRmllbGQgbmFtZT0iRmlyc3ROYW1lIiAvPiA8aW5wMjp1X0ZpZWxkIG5hbWU9Ikxhc3ROYW1lIiAvPiw8YnIgLz4NCjxiciAvPg0KPGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPiBUaGFuayB5b3UgZm9yIHJlZ2lzdGVyaW5nIG9uIDxpbnAyOm1fTGluayB0ZW1wbGF0ZT0iaW5kZXgiLz4gd2Vic2l0ZS4gVG8gYWN0aXZhdGUgeW91ciByZWdpc3RyYXRpb24gcGxlYXNlIGZvbGxvdyBsaW5rIGJlbG93LiA8aW5wMjp1X0FjdGl2YXRpb25MaW5rIHRlbXBsYXRlPSJwbGF0Zm9ybS9sb2dpbi9hY3RpdmF0ZV9jb25maXJtIi8+IDxpbnAyOm1fZWxzZS8+IFRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9MaW5rIHRlbXBsYXRlPSJpbmRleCIvPiB3ZWJzaXRlLiBZb3VyIHJlZ2lzdHJhdGlvbiB3aWxsIGJlIGFjdGl2ZSBhZnRlciBhcHByb3ZhbC4gPC9pbnAyOm1faWY+</EVENT>
- <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0ZXJlZAoKQSBuZXcgdXNlciAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIHJlZ2lzdGVyZWQgYW5kIGlzIHBlbmRpbmcgYWRtaW5pc3RyYXRpdmUgYXBwcm92YWwu</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="0">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+PGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPiAtIEFjdGl2YXRpb24gRW1haWw8L2lucDI6bV9pZj4pCgpEZWFyIDxpbnAyOnUucmVnaXN0ZXJfRmllbGQgbmFtZT0iRmlyc3ROYW1lIiAvPiA8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9Ikxhc3ROYW1lIiAvPiw8YnIgLz4NCjxiciAvPg0KPGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPiBUaGFuayB5b3UgZm9yIHJlZ2lzdGVyaW5nIG9uIDxpbnAyOm1fTGluayB0ZW1wbGF0ZT0iaW5kZXgiLz4gd2Vic2l0ZS4gVG8gYWN0aXZhdGUgeW91ciByZWdpc3RyYXRpb24gcGxlYXNlIGZvbGxvdyBsaW5rIGJlbG93LiA8aW5wMjp1LnJlZ2lzdGVyX0FjdGl2YXRpb25MaW5rIHRlbXBsYXRlPSJwbGF0Zm9ybS9sb2dpbi9hY3RpdmF0ZV9jb25maXJtIi8+IDxpbnAyOm1fZWxzZS8+IFRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9MaW5rIHRlbXBsYXRlPSJpbmRleCIvPiB3ZWJzaXRlLiBZb3VyIHJlZ2lzdHJhdGlvbiB3aWxsIGJlIGFjdGl2ZSBhZnRlciBhcHByb3ZhbC4gDQo8aW5wMjptX2lmIGNoZWNrPSJ1LnJlZ2lzdGVyX0ZpZWxkIiBuYW1lPSJFbWFpbCI+DQo8YnIvPjxici8+DQpQbGVhc2UgY2xpY2sgaGVyZSB0byB2ZXJpZnkgeW91ciBFLW1haWwgYWRkcmVzczoNCjxhIGhyZWY9IjxpbnAyOnUucmVnaXN0ZXJfQ29uZmlybVBhc3N3b3JkTGluayB0PSJwbGF0Zm9ybS9teV9hY2NvdW50L3ZlcmlmeV9lbWFpbCIgbm9fYW1wPSIxIi8+Ij48aW5wMjp1LnJlZ2lzdGVyX0NvbmZpcm1QYXNzd29yZExpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC92ZXJpZnlfZW1haWwiIG5vX2FtcD0iMSIvPjwvYT48YnIvPjxici8+DQo8L2lucDI6bV9pZj4NCjwvaW5wMjptX2lmPg0K</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0ZXJlZAoKQSBuZXcgdXNlciAiPGlucDI6dS5yZWdpc3Rlcl9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIHJlZ2lzdGVyZWQgYW5kIGlzIHBlbmRpbmcgYWRtaW5pc3RyYXRpdmUgYXBwcm92YWwu</EVENT>
<EVENT MessageType="html" Event="USER.APPROVE" Type="0">U3ViamVjdDogWW91ciBBY2NvdW50IGlzIEFjdGl2ZQoKV2VsY29tZSB0byA8aW5wMjptX0Jhc2VVcmwvPiENCg0KWW91ciB1c2VyIHJlZ2lzdHJhdGlvbiBoYXMgYmVlbiBhcHByb3ZlZC4gWW91ciB1c2VyIG5hbWUgaXM6ICI8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+Ii4=</EVENT>
<EVENT MessageType="html" Event="USER.APPROVE" Type="1">U3ViamVjdDogTmV3IFVzZXIgQWNjb3VudCAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgd2FzIEFwcHJvdmVkCgpVc2VyICI8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+IiBoYXMgYmVlbiBhcHByb3ZlZC4=</EVENT>
<EVENT MessageType="html" Event="USER.DENY" Type="0">U3ViamVjdDogWW91ciBSZWdpc3RyYXRpb24gaGFzIGJlZW4gRGVuaWVkCgpZb3VyIHJlZ2lzdHJhdGlvbiBvbiA8YSBocmVmPSI8aW5wMjptX0Jhc2VVcmwvPiI+PGlucDI6bV9CYXNlVXJsLz48L2E+IHdlYnNpdGUgaGFzIGJlZW4gZGVuaWVkLg==</EVENT>
<EVENT MessageType="html" Event="USER.DENY" Type="1">U3ViamVjdDogVXNlciBSZWdpc3RyYXRpb24gZm9yICAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIGJlZW4gRGVuaWVkCgpVc2VyICI8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+IiBoYXMgYmVlbiBkZW5pZWQu</EVENT>
+ <EVENT MessageType="html" Event="USER.EMAIL.CHANGE.UNDO" Type="0">U3ViamVjdDogQ2hhbmdlZCBFLW1haWwgUm9sbGJhY2sKCkhlbGxvLDxici8+PGJyLz4NCg0KSXQgc2VlbXMgdGhhdCB5b3UgaGF2ZSBjaGFuZ2VkIGUtbWFpbCBpbiB5b3VyIEluLXBvcnRhbCBhY2NvdW50LiBZb3UgbWF5IHVuZG8gdGhpcyBjaGFuZ2UgYnkgY2xpY2tpbmcgb24gdGhlIGxpbmsgYmVsb3c6PGJyLz48YnIvPg0KDQo8YSBocmVmPSI8aW5wMjptX0xpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC9yZXN0b3JlX2VtYWlsIiBoYXNoPSIkaGFzaCIgbm9fYW1wPSIxIi8+Ij48aW5wMjptX0xpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC9yZXN0b3JlX2VtYWlsIiBoYXNoPSIkaGFzaCIgbm9fYW1wPSIxIi8+PC9hPjxici8+PGJyLz4NCg0KSWYgeW91IGJlbGlldmUgeW91IGhhdmUgcmVjZWl2ZWQgdGhpcyBlbWFpbCBpbiBlcnJvciwgcGxlYXNlIGlnbm9yZSB0aGlzIGVtYWlsLiBZb3VyIGFjY291bnQgd2lsbCBiZSBsaW5rZWQgdG8gYW5vdGhlciBlLW1haWwgdW5sZXNzIHlvdSBoYXZlIGNsaWNrZWQgb24gdGhlIGFib3ZlIGxpbmsuDQo=</EVENT>
+ <EVENT MessageType="html" Event="USER.EMAIL.CHANGE.VERIFY" Type="0">U3ViamVjdDogQ2hhbmdlZCBFLW1haWwgVmVyaWZpY2F0aW9uCgpIZWxsbyw8YnIvPjxici8+DQoNCkl0IHNlZW1zIHRoYXQgeW91IGhhdmUgY2hhbmdlZCBlLW1haWwgaW4geW91ciBJbi1wb3J0YWwgYWNjb3VudC4gUGxlYXNlIHZlcmlmeSB0aGlzIG5ldyBlLW1haWwgYnkgY2xpY2tpbmcgb24gdGhlIGxpbmsgYmVsb3c6PGJyLz48YnIvPg0KDQo8YSBocmVmPSI8aW5wMjp1X0NvbmZpcm1QYXNzd29yZExpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC92ZXJpZnlfZW1haWwiIG5vX2FtcD0iMSIvPiI+PGlucDI6dV9Db25maXJtUGFzc3dvcmRMaW5rIHQ9InBsYXRmb3JtL215X2FjY291bnQvdmVyaWZ5X2VtYWlsIiBub19hbXA9IjEiLz48L2E+PGJyLz48YnIvPg0KDQpJZiB5b3UgYmVsaWV2ZSB5b3UgaGF2ZSByZWNlaXZlZCB0aGlzIGVtYWlsIGluIGVycm9yLCBwbGVhc2UgaWdub3JlIHRoaXMgZW1haWwuIFlvdXIgZW1haWwgd2lsbCBub3QgZ2V0IHZlcmlmaWVkIHN0YXR1cyB1bmxlc3MgeW91IGhhdmUgY2xpY2tlZCBvbiB0aGUgYWJvdmUgbGluay4NCg==</EVENT>
<EVENT MessageType="html" Event="USER.MEMBERSHIP.EXPIRATION.NOTICE" Type="0">U3ViamVjdDogTWVtYmVyc2hpcCBFeHBpcmF0aW9uIE5vdGljZQoKWW91ciBtZW1iZXJzaGlwIG9uIDxpbnAyOm1fQmFzZVVybC8+IHdlYnNpdGUgd2lsbCBzb29uIGV4cGlyZS4=</EVENT>
<EVENT MessageType="html" Event="USER.MEMBERSHIP.EXPIRATION.NOTICE" Type="1">U3ViamVjdDogTWVtYmVyc2hpcCBFeHBpcmF0aW9uIE5vdGljZSBmb3IgIjxpbnAyOnVfRmllbGQgbmFtZT0iVXNlcm5hbWUiLz4iIFNlbnQKClVzZXIgPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiBtZW1iZXJzaGlwIHdpbGwgZXhwaXJlIHNvb24u</EVENT>
<EVENT MessageType="html" Event="USER.MEMBERSHIP.EXPIRED" Type="0">U3ViamVjdDogWW91ciBNZW1iZXJzaGlwIEV4cGlyZWQKCllvdXIgbWVtYmVyc2hpcCBvbiA8aW5wMjptX0Jhc2VVcmwvPiB3ZWJzaXRlIGhhcyBleHBpcmVkLg==</EVENT>
Index: install/install_data.sql
===================================================================
--- install/install_data.sql (revision 14925)
+++ install/install_data.sql (working copy)
@@ -176,6 +176,8 @@
INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.NEW.PASSWORD', NULL, 1, 0, 'Core', 'Sends new password to an existing user', 0, 1, 0);
INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.ADD.BYADMIN', NULL, 1, 0, 'Core', 'Sends password to a new user', 0, 1, 0);
INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'ROOT.RESET.PASSWORD', NULL, 1, 0, 'Core', 'Root Reset Password', 1, 1, 0);
+INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.EMAIL.CHANGE.VERIFY', NULL, 1, 0, 'Core', 'Changed E-mail Verification', 0, 1, 1);
+INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.EMAIL.CHANGE.UNDO', NULL, 1, 0, 'Core', 'Changed E-mail Rollback', 0, 1, 1);
INSERT INTO IdGenerator VALUES ('100');
Index: install/install_schema.sql
===================================================================
--- install/install_schema.sql (revision 14925)
+++ install/install_schema.sql (working copy)
@@ -274,6 +274,8 @@
PrimaryGroupId int(11) DEFAULT NULL,
OldStyleLogin tinyint(4) NOT NULL,
IPRestrictions text,
+ EmailVerified tinyint(1) NOT NULL DEFAULT '0',
+ PrevEmails text,
PRIMARY KEY (PortalUserId),
UNIQUE KEY ResourceId (ResourceId),
KEY CreatedOn (CreatedOn),
Index: install/upgrades.sql
===================================================================
--- install/upgrades.sql (revision 14925)
+++ install/upgrades.sql (working copy)
@@ -2428,4 +2428,12 @@
UPDATE ConfigurationValues
SET HintLabel = CONCAT('hint:', Prompt)
-WHERE VariableName IN ('ForceModRewriteUrlEnding', 'PerformExactSearch');
\ No newline at end of file
+WHERE VariableName IN ('ForceModRewriteUrlEnding', 'PerformExactSearch');
+
+ALTER TABLE PortalUser ADD EmailVerified TINYINT( 1 ) NOT NULL DEFAULT '0',
+ADD PrevEmails TEXT;
+
+INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.EMAIL.CHANGE.VERIFY', NULL, 1, 0, 'Core', 'Changed E-mail Verification', 0, 1, 1);
+INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.EMAIL.CHANGE.UNDO', NULL, 1, 0, 'Core', 'Changed E-mail Rollback', 0, 1, 1);
+
+UPDATE PortalUser SET EmailVerified = 1;
Index: units/helpers/user_helper.php
===================================================================
--- units/helpers/user_helper.php (revision 14925)
+++ units/helpers/user_helper.php (working copy)
@@ -552,4 +552,54 @@
return $user_info['PortalUserId'];
}
+
+ /**
+ * Restores user's email, returns error label, if error occured
+ *
+ * @param array $params
+ * @return string
+ */
+ public function restoreEmail($params)
+ {
+ $hash = $this->Application->GetVar('hash');
+
+ if (!preg_match('/^[a-f0-9]{32}$/', $hash)) {
+ return $params['invalid_hash'];
+ }
+
+ $sql = 'SELECT PortalUserId, PrevEmails
+ FROM ' . TABLE_PREFIX . 'PortalUser
+ WHERE PrevEmails LIKE "%'.$hash.'%"
+ ';
+
+ $user_info = $this->Conn->GetRow($sql);
+
+ if ($user_info === false) {
+ return $params['invalid_hash'];
+ }
+
+ $prev_emails = unserialize($user_info['PrevEmails']);
+
+ if (!isset($prev_emails[$hash])) {
+ return $params['invalid_hash'];
+ }
+
+ $email_to_restore = $prev_emails[$hash];
+ unset($prev_emails[$hash]);
+
+ $object =& $this->Application->recallObject('u.restore', null, Array('skip_autoload' => true));
+
+ $object->Load($user_info['PortalUserId']);
+ /* @var $object UsersItem */
+
+ $object->SetDBField('PrevEmails', serialize($prev_emails));
+ $object->SetDBField('Email', $email_to_restore);
+ $object->SetDBField('EmailVerified', 1);
+
+ if (!$object->Update()) {
+ return $params['restore_impossible'];
+ }
+
+ return '';
+ }
}
Index: units/users/users_config.php
===================================================================
--- units/users/users_config.php (revision 14925)
+++ units/users/users_config.php (working copy)
@@ -415,6 +415,8 @@
'default' => 0
),
'IPRestrictions' => Array ('default' => NULL),
+ 'EmailVerified' => Array ('default' => 0),
+ 'PrevEmails' => Array ('default' => NULL),
),
'VirtualFields' => Array (
@@ -546,6 +548,8 @@
'PrimaryGroupId' => Array ('type' => 'int'),
'OldStyleLogin' => Array ('type' => 'int', 'not_null' => 1),
'IPRestrictions' => Array ('type' => 'string'),
+ 'EmailVerified' => Array ('type' => 'int', 'not_null' => 1),
+ 'PrevEmails' => Array ('type' => 'string'),
),
'VirtualFields' => Array (
Index: units/users/users_event_handler.php
===================================================================
--- units/users/users_event_handler.php (revision 14925)
+++ units/users/users_event_handler.php (working copy)
@@ -904,6 +904,12 @@
$object =& $event->getObject();
/* @var $object kDBItem */
+ if (!$this->Application->isAdminUser && !$this->Application->RecallVar('EmailVerifiedChangeIsAllowed')) {
+ $object->SetDBField('EmailVerified', $object->GetOriginalField('EmailVerified'));
+ }
+
+ $this->Application->RemoveVar('EmailVerifiedChangeIsAllowed');
+
if ($event->Special == 'forgot') {
$object->SetDBField('PwResetConfirm', '');
$object->SetDBField('PwRequestTime_date', NULL);
@@ -1280,6 +1286,10 @@
$object =& $event->getObject();
/* @var $object UsersItem */
+ if (!$this->Application->isAdmin) {
+ $this->sendEmailChangeEvent($event);
+ }
+
if (!$this->Application->isAdmin || $object->IsTempTable()) {
return ;
}
@@ -1427,6 +1437,55 @@
}
/**
+ * Sends restore/validation email event on user email change
+ *
+ * @param kEvent $event
+ */
+ function sendEmailChangeEvent(&$event)
+ {
+
+ $object =& $event->getObject();
+ /* @var $object UsersItem */
+
+ $prev_email = $object->GetOriginalField('Email');
+ $prev_emails = unserialize($object->GetDBField('PrevEmails'));
+ $new_email = $object->GetDBField('Email');
+
+ if ($prev_email == $new_email) {
+ return;
+ }
+
+ if (!$new_email) {
+ return;
+ }
+
+ $fields_hash = Array (
+ 'PrevEmails' => serialize($prev_emails),
+ 'EmailVerified' => 0,
+ );
+
+ $user_id = $object->GetId();
+
+ if ($prev_email) {
+ $hash = md5(adodb_mktime() + $user_id);
+ $prev_emails[$hash] = $prev_email;
+ $fields_hash['PrevEmails'] = serialize($prev_emails);
+ $this->Application->EmailEventUser('USER.EMAIL.CHANGE.UNDO', null, Array (
+ 'hash' => $hash,
+ 'to_email' => $prev_email,
+ 'to_name' => trim($object->GetDBField('FirstName') . ' ' . $object->GetDBField('LastName')),
+ ));
+ }
+
+ if ($new_email) {
+ $this->Application->EmailEventUser('USER.EMAIL.CHANGE.VERIFY', $user_id);
+ }
+
+ $table_name = $this->Application->getUnitOption($this->Prefix, 'TableName');
+ $this->Conn->doUpdate($fields_hash, $table_name, 'PortalUserId = '.$user_id);
+ }
+
+ /**
* OnAfterConfigRead for users
*
* @param kEvent $event
Index: units/users/users_tag_processor.php
===================================================================
--- units/users/users_tag_processor.php (revision 14925)
+++ units/users/users_tag_processor.php (working copy)
@@ -113,6 +113,25 @@
return true;
}
+ function RestoreEmail($params)
+ {
+ $user_helper =& $this->Application->recallObject('UserHelper');
+ /* @var $user_helper UserHelper */
+
+ $error_label = $user_helper->restoreEmail($params);
+
+ if ( $error_label ) {
+ $object =& $this->getObject( Array('skip_autoload' => true) );
+ /* @var $object UsersItem */
+
+ $object->SetError('PwResetConfirm', 'restore', $error_label);
+
+ return false;
+ }
+
+ return true;
+ }
+
/**
* Returns error message set by given code type
*
@@ -267,9 +286,34 @@
* Activates user using given code
*
* @param Array $params
+ * @access protected
*/
- function ActivateUser($params)
+ protected function ActivateUser($params)
{
+ $this->Application->StoreVar('EmailVerifiedChangeIsAllowed', 1);
+ $this->saveConfirmedValues(Array ('Status' => STATUS_ACTIVE, 'EmailVerified' => 1));
+ }
+
+ /**
+ * Marks user e-mail as verified using given code
+ *
+ * @param Array $params
+ * @access protected
+ */
+ protected function MarkUserEmailAsVerified($params)
+ {
+ $this->Application->StoreVar('EmailVerifiedChangeIsAllowed', 1);
+ $this->saveConfirmedValues(Array ('EmailVerified' => 1));
+ }
+
+ /**
+ * Activates user using given code
+ *
+ * @param Array $field_values
+ * @access private
+ */
+ private function saveConfirmedValues($confirmed_field_values)
+ {
$passed_key = trim($this->Application->GetVar('user_key'));
$user_helper =& $this->Application->recallObject('UserHelper');
@@ -282,7 +326,7 @@
return ;
}
- $user->SetDBField('Status', STATUS_ACTIVE);
+ $user->SetFieldsFromHash($confirmed_field_values);
$user->SetDBField('PwResetConfirm', '');
$user->SetDBField('PwRequestTime_date', NULL);
$user->SetDBField('PwRequestTime_time', NULL);
@@ -292,5 +336,4 @@
$user_helper->loginUserById( $user->GetID() );
}
}
-
}
\ No newline at end of file
email_validation_theme_v2_949.patch [^] (9,232 bytes) 2011-12-27 12:48
[Show Content]
Index: _install/english.lang
===================================================================
--- _install/english.lang (revision 14902)
+++ _install/english.lang (working copy)
@@ -106,8 +106,11 @@
<PHRASE Label="lu_error_alreadyadded" Module="Core" Type="0">Q2F0ZWdvcnkgYWxyZWFkeSBhZGRlZCE=</PHRASE>
<PHRASE Label="lu_error_AlreadyCommented" Module="Core" Type="0">QWxyZWFkeSBjb21tZW50ZWQ=</PHRASE>
<PHRASE Label="lu_error_categorylimitreached" Module="Core" Type="0">Q2F0ZWdvcnkgbGltaXQgcmVhY2hlZCE=</PHRASE>
+ <PHRASE Label="lu_error_EmailRestoreIsNotPossible" Module="Core" Type="0">RS1tYWlsIHJlc3RvcmUgaXMgbm90IHBvc3NpYmxl</PHRASE>
<PHRASE Label="lu_error_Required" Module="Core" Type="0">UmVxdWlyZWQ=</PHRASE>
+ <PHRASE Label="lu_error_RestoreCodeNotValid" Module="Core" Type="0">UmVzdG9yZSBjb2RlIG5vdCB2YWxpZA==</PHRASE>
<PHRASE Label="lu_error_UserNotFound" Module="Core" Type="0">VXNlciBOb3QgRm91bmQ=</PHRASE>
+ <PHRASE Label="lu_error_VerificationCodeExpired" Module="Core" Type="0">VmVyaWZpY2F0aW9uIGNvZGUgaGFzIGV4cGlyZWQ=</PHRASE>
<PHRASE Label="lu_favorite" Module="Core" Type="0">RmF2b3JpdGU=</PHRASE>
<PHRASE Label="lu_ferror_forgotpw_nodata" Module="Core" Type="0">WW91IG11c3QgZW50ZXIgYSBVc2VybmFtZSBvciBFbWFpbCBBZGRyZXNzIHRvIHJldHJpdmUgeW91ciBhY2NvdW50IGluZm9ybWF0aW9u</PHRASE>
<PHRASE Label="lu_ferror_reset_denied" Module="Core" Type="0">Tm90IHJlc2V0</PHRASE>
@@ -305,6 +308,8 @@
<PHRASE Label="lu_text_SuggestCategoryConfirm" Module="Core" Type="0">VGhhbmsgeW91IGZvciBzdWdnZXN0aW5nIHlvdXIgY2F0ZWdvcnku</PHRASE>
<PHRASE Label="lu_text_SuggestCategoryPendingConfirm" Module="Core" Type="0">U3VnZ2VzdGVkIGNhdGVnb3J5IGlzIHBlbmRpbmcgZm9yIEFkbWluaXN0cmF0aXZlIGFwcHJvdmFsIA==</PHRASE>
<PHRASE Label="lu_text_ThankYou" Module="Core" Type="0">VGhhbmsgeW91IGZvciBzdWJtaXR0aW5nIHlvdXIgcmVxdWVzdC4=</PHRASE>
+ <PHRASE Label="lu_text_YourEmailIsRestored" Module="Core" Type="0">WW91ciBlLW1haWwgaXMgcmVzdG9yZWQ=</PHRASE>
+ <PHRASE Label="lu_text_YourEmailIsVerified" Module="Core" Type="0">WW91ciBlLW1haWwgaXMgdmVyaWZpZWQ=</PHRASE>
<PHRASE Label="lu_ThankForSubscribing" Module="Core" Type="0">VGhhbmsgeW91IGZvciBzdWJzY3JpYmluZyB0byBvdXIgbWFpbGluZyBsaXN0</PHRASE>
<PHRASE Label="lu_ThanksForVoting" Module="Core" Type="0">VGhhbmtzIGZvciBWb3Rpbmch</PHRASE>
<PHRASE Label="lu_ThisCategory" Module="Core" Type="0">Q3VycmVudCBDYXRlZ29yeQ==</PHRASE>
@@ -316,6 +321,7 @@
<PHRASE Label="lu_title_CategorySearchResults" Module="Core" Type="0">Q2F0ZWdvcnkgU2VhcmNoIFJlc3VsdHM=</PHRASE>
<PHRASE Label="lu_title_DisabledAccountWarning" Module="Core" Type="0">UGVuZGluZyBvciBkaXNhYmxlZCB1c2VyIGFjY291bnQgd2FybmluZw==</PHRASE>
<PHRASE Label="lu_title_EditAddress" Module="Core" Type="0">RWRpdCBBZGRyZXNz</PHRASE>
+ <PHRASE Label="lu_title_EmailVerification" Module="Core" Type="0">RS1tYWlsIFZlcmlmaWNhdGlvbg==</PHRASE>
<PHRASE Label="lu_title_enhancementconfirmation" Module="Core" Type="0">WW91ciBGYXZvcml0ZSBJdGVtcw==</PHRASE>
<PHRASE Label="lu_title_Favorites" Module="Core" Type="0">WW91ciBGYXZvcml0ZXM=</PHRASE>
<PHRASE Label="lu_title_ForgotPassword" Module="Core" Type="0">Rm9yZ290IFBhc3N3b3Jk</PHRASE>
@@ -343,6 +349,7 @@
<PHRASE Label="lu_title_RelatedCategories" Module="Core" Type="0">UmVsYXRlZCBDYXRlZ29yaWVz</PHRASE>
<PHRASE Label="lu_title_RelatedItems" Module="Core" Type="0">UmVsYXRlZCBJdGVtcw==</PHRASE>
<PHRASE Label="lu_title_RelatedSearches" Module="Core" Type="0">UmVsYXRlZCBTZWFyY2hlcw==</PHRASE>
+ <PHRASE Label="lu_title_RestoreEmail" Module="Core" Type="0">UmVzdG9yZSBFLW1haWw=</PHRASE>
<PHRASE Label="lu_title_Reviews" Module="Core" Type="0">Q29tbWVudHM=</PHRASE>
<PHRASE Label="lu_title_SearchBox" Module="Core" Type="0">U2VhcmNoIEJveA==</PHRASE>
<PHRASE Label="lu_title_SearchResults" Module="Core" Type="0">U2VhcmNoIFJlc3VsdHM=</PHRASE>
Index: platform/my_account/restore_email.tpl
===================================================================
--- platform/my_account/restore_email.tpl (revision 0)
+++ platform/my_account/restore_email.tpl (revision 0)
@@ -0,0 +1,63 @@
+<!--##
+<NAME>Restore E-mail</NAME>
+<DESC></DESC>
+<SECTION>My Account</SECTION>
+##-->
+
+<!--## PAGE TITLE ELEMENT ##-->
+<inp2:m_DefineElement name="page_title">
+ <inp2:m_phrase name="lu_title_RestoreEmail" no_editing="1"/>
+</inp2:m_DefineElement>
+<!--## //PAGE TITLE ELEMENT ##-->
+
+<!--## SIDE-BAR ELEMENT ##-->
+<inp2:m_DefineElement name="sidebar">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/login.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/search.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/recommend_site.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/mailing_list.elm" design="blue_box"/>
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## //SIDE-BAR ELEMENT ##-->
+
+<!--## MAIN CONTENT ##-->
+<inp2:m_DefineElement name="content">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_include template="platform/elements/navigation_bar.elm" titles="lu_title_RestoreEmail" templates="platform/my_account/restore_email"/>
+ </div>
+ <div class="movable-element">
+ <!-- restore e-mail -->
+ <inp2:m_RenderElement design="content_box">
+ <inp2:m_Capture to_var="header">
+ <inp2:m_phrase name="lu_title_RestoreEmail"/>
+ </inp2:m_Capture>
+
+ <br /><br />
+
+ <inp2:m_if check="u_RestoreEmail" invalid_hash="lu_error_RestoreCodeNotValid" restore_impossible="lu_error_EmailRestoreIsNotPossible">
+ <inp2:m_Phrase label="lu_text_YourEmailIsRestored"/>
+ <inp2:m_else />
+ <span class="error"><inp2:u_Error field="PwResetConfirm"/></span>
+ <br /> <br />
+ <a href="<inp2:m_Link template="index" m_cat_id="0" m_cat_page="1"/>"><inp2:m_Phrase label="lu_ReturnToHome"/></a>
+ </inp2:m_if>
+ </inp2:m_RenderElement>
+ <!-- // restore e-mail -->
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## /MAIN CONTENT ##-->
+
+<!--## DESIGN TEMPLATE ##-->
+<inp2:m_include template="platform/designs/default_design.des" pass_params="1"/>
+<!--## /DESIGN TEMPLATE ##-->
Property changes on: platform\my_account\restore_email.tpl
___________________________________________________________________
Added: svn:eol-style
+ LF
Index: platform/my_account/verify_email.tpl
===================================================================
--- platform/my_account/verify_email.tpl (revision 0)
+++ platform/my_account/verify_email.tpl (revision 0)
@@ -0,0 +1,65 @@
+<!--##
+<NAME>E-mail Verification</NAME>
+<DESC></DESC>
+<SECTION>My Account</SECTION>
+##-->
+
+<!--## PAGE TITLE ELEMENT ##-->
+<inp2:m_DefineElement name="page_title">
+ <inp2:m_phrase name="lu_title_EmailVerification" no_editing="1"/>
+</inp2:m_DefineElement>
+<!--## //PAGE TITLE ELEMENT ##-->
+
+<!--## SIDE-BAR ELEMENT ##-->
+<inp2:m_DefineElement name="sidebar">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/login.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/search.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/recommend_site.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/mailing_list.elm" design="blue_box"/>
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## //SIDE-BAR ELEMENT ##-->
+
+<!--## MAIN CONTENT ##-->
+<inp2:m_DefineElement name="content">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_include template="platform/elements/navigation_bar.elm" titles="lu_title_EmailVerification" templates="platform/my_account/verify_email"/>
+ </div>
+ <div class="movable-element">
+ <!-- verify e-mail -->
+ <inp2:m_RenderElement design="content_box">
+ <inp2:m_Capture to_var="header">
+ <inp2:m_phrase name="lu_title_EmailVerification"/>
+ </inp2:m_Capture>
+
+ <br /><br />
+
+
+ <inp2:m_if check="u_TestCodeIsValid" code_type="custom" error_invalid="lu_error_VerificationCodeNotValid" error_expired="lu_error_VerificationCodeExpired">
+ <inp2:u_MarkUserEmailAsVerified/>
+ <inp2:m_Phrase label="lu_text_YourEmailIsVerified"/>
+ <inp2:m_else />
+ <span class="error"><inp2:u_Error field="PwResetConfirm"/></span>
+ <br /> <br />
+ <a href="<inp2:m_Link template="index" m_cat_id="0" m_cat_page="1"/>"><inp2:m_Phrase label="lu_ReturnToHome"/></a>
+ </inp2:m_if>
+ </inp2:m_RenderElement>
+ <!-- // verify e-mail -->
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## /MAIN CONTENT ##-->
+
+<!--## DESIGN TEMPLATE ##-->
+<inp2:m_include template="platform/designs/default_design.des" pass_params="1"/>
+<!--## /DESIGN TEMPLATE ##-->
email_validation_core_v3.patch [^] (26,907 bytes) 2012-01-03 11:00
[Show Content]
Index: admin/system_presets/simple/users_u.php
===================================================================
--- admin/system_presets/simple/users_u.php (revision 14949)
+++ admin/system_presets/simple/users_u.php (working copy)
@@ -70,7 +70,7 @@
// fields to hide
$hidden_fields = Array (
/* 'PortalUserId', 'Username', 'Password', 'FirstName','LastName', 'Company', 'Email', 'CreatedOn',
- 'Phone', 'Fax', 'Street', 'Street2', 'City', 'State' , 'Zip', 'Country', 'ResourceId', 'Status',
+ 'Phone', 'Fax', 'Street', 'Street2', 'City', 'State' , 'Zip', 'Country', 'ResourceId', 'Status', 'EmailVerified',
'Modified', 'dob', 'tz',*/ 'IPAddress', /*'IsBanned', 'PwResetConfirm', 'PwRequestTime',*/ 'IPRestrictions',
);
@@ -82,7 +82,7 @@
// fields to make required
$required_fields = Array (
/*'PortalUserId',*/ 'Username', /*'Password', 'FirstName', 'LastName', 'Company', */'Email', /*'CreatedOn',
- 'Phone', 'Fax', 'Street', 'Street2', 'City', 'State' , 'Zip', 'Country', 'ResourceId', 'Status',
+ 'Phone', 'Fax', 'Street', 'Street2', 'City', 'State' , 'Zip', 'Country', 'ResourceId', 'Status', 'EmailVerified',
'Modified', 'dob', 'tz', 'IPAddress', 'IsBanned', 'PwResetConfirm', 'PwRequestTime',*/
);
@@ -115,5 +115,5 @@
// 'Admins' => Array ('PortalUserId', 'Username', 'FirstName', 'LastName', 'Email'),
// users list; section: Users Management -> Users
- 'RegularUsers' => Array (/*'PortalUserId', 'Username', 'FirstName', 'LastName', 'Email',*/ 'PrimaryGroup', 'CreatedOn', 'Modified', /* 'Status',*/ 'IPAddress'),
+ 'RegularUsers' => Array (/*'PortalUserId', 'Username', 'FirstName', 'LastName', 'Email',*/ 'PrimaryGroup', 'CreatedOn', 'Modified', /* 'Status',*/ 'IPAddress', 'EmailVerified'),
);
Index: core/admin_templates/users/users_edit.tpl
===================================================================
--- core/admin_templates/users/users_edit.tpl (revision 14968)
+++ core/admin_templates/users/users_edit.tpl (working copy)
@@ -83,8 +83,9 @@
<inp2:m_RenderElement name="inp_edit_options" prefix="u" field="Country" has_empty="1"/>
<inp2:m_RenderElement name="inp_edit_multioptions" prefix="u" field="DisplayToPublic"/>
- <inp2:m_RenderElement name="subsection" prefix="u" fields="Status,FrontLanguage,CreatedOn,Modified,IPAddress,IPRestrictions" title="la_section_Properties"/>
+ <inp2:m_RenderElement name="subsection" prefix="u" fields="Status,EmailVerified,FrontLanguage,CreatedOn,Modified,IPAddress,IPRestrictions" title="la_section_Properties"/>
<inp2:m_RenderElement name="inp_edit_radio" prefix="u" field="Status"/>
+ <inp2:m_RenderElement name="inp_edit_checkbox" prefix="u" field="EmailVerified"/>
<inp2:m_RenderElement name="inp_edit_options" prefix="u" field="FrontLanguage" has_empty="1"/>
<inp2:m_RenderElement name="inp_edit_date_time" prefix="u" field="CreatedOn"/>
<inp2:m_RenderElement name="inp_edit_date_time" prefix="u" field="Modified"/>
Index: core/install/english.lang
===================================================================
--- core/install/english.lang (revision 14969)
+++ core/install/english.lang (working copy)
@@ -383,6 +383,7 @@
<PHRASE Label="la_fld_EmailsQueued" Module="Core" Type="1" Column="UXVldWU=">RW1haWxzIGluIFF1ZXVl</PHRASE>
<PHRASE Label="la_fld_EmailsSent" Module="Core" Type="1" Column="U2VudA==">RW1haWxzIFNlbnQ=</PHRASE>
<PHRASE Label="la_fld_EmailsTotal" Module="Core" Type="1" Column="VG90YWw=">RW1haWxzIFRvdGFs</PHRASE>
+ <PHRASE Label="la_fld_EmailVerified" Module="Core" Type="1" Column="RW1haWwgVmVyaWZpZWQ=">RW1haWwgVmVyaWZpZWQ=</PHRASE>
<PHRASE Label="la_fld_Enable" Module="Core" Type="1">RW5hYmxl</PHRASE>
<PHRASE Label="la_fld_Enabled" Module="Core" Type="1" Column="RW5hYmxlZA==">RW5hYmxlZA==</PHRASE>
<PHRASE Label="la_fld_EnablePageCache" Module="Core" Type="1">RW5hYmxlIENhY2hpbmcgZm9yIHRoaXMgU2VjdGlvbg==</PHRASE>
@@ -1586,15 +1587,17 @@
<EVENT MessageType="html" Event="FORM.SUBMITTED" Type="0">U3ViamVjdDogVGhhbmsgWW91IGZvciBDb250YWN0aW5nIFVzIQoKPHA+VGhhbmsgeW91IGZvciBjb250YWN0aW5nIHVzLiBXZSdsbCBiZSBpbiB0b3VjaCB3aXRoIHlvdSBzaG9ydGx5ITwvcD4=</EVENT>
<EVENT MessageType="html" Event="FORM.SUBMITTED" Type="1">U3ViamVjdDogTmV3IGZvcm0gc3VibWlzc2lvbgoKPHA+Rm9ybSBoYXMgYmVlbiBzdWJtaXR0ZWQuIFBsZWFzZSBwcm9jZWVkIHRvIHRoZSBBZG1pbiBDb25zb2xlIHRvIHJldmlldyB0aGUgc3VibWlzc2lvbiE8L3A+</EVENT>
<EVENT MessageType="html" Event="ROOT.RESET.PASSWORD" Type="1">U3ViamVjdDogUm9vdCBSZXNldCBQYXNzd29yZAoKWW91ciBuZXcgcGFzc3dvcmQgaXM6IDxpbnAyOm1fUGFyYW0gbmFtZT0icGFzc3dvcmQiLz4=</EVENT>
- <EVENT MessageType="html" Event="USER.ADD" Type="0">U3ViamVjdDogSW4tcG9ydGFsIHJlZ2lzdHJhdGlvbgoKRGVhciA8aW5wMjp1X0ZpZWxkIG5hbWU9IkZpcnN0TmFtZSIgLz4gPGlucDI6dV9GaWVsZCBuYW1lPSJMYXN0TmFtZSIgLz4sDQoNClRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9CYXNlVXJsLz4uIFlvdXIgcmVnaXN0cmF0aW9uIGlzIG5vdyBhY3RpdmUu</EVENT>
- <EVENT MessageType="html" Event="USER.ADD" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+KQoKQSBuZXcgdXNlciAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIGJlZW4gYWRkZWQu</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD" Type="0">U3ViamVjdDogSW4tcG9ydGFsIHJlZ2lzdHJhdGlvbgoKRGVhciA8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9IkZpcnN0TmFtZSIgLz4gPGlucDI6dS5yZWdpc3Rlcl9GaWVsZCBuYW1lPSJMYXN0TmFtZSIgLz4sDQoNClRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9CYXNlVXJsLz4uIFlvdXIgcmVnaXN0cmF0aW9uIGlzIG5vdyBhY3RpdmUuDQo8aW5wMjptX2lmIGNoZWNrPSJ1LnJlZ2lzdGVyX0ZpZWxkIiBuYW1lPSJFbWFpbCI+DQo8YnIvPjxici8+DQpQbGVhc2UgY2xpY2sgaGVyZSB0byB2ZXJpZnkgeW91ciBFLW1haWwgYWRkcmVzczoNCjxhIGhyZWY9IjxpbnAyOnUucmVnaXN0ZXJfQ29uZmlybVBhc3N3b3JkTGluayB0PSJwbGF0Zm9ybS9teV9hY2NvdW50L3ZlcmlmeV9lbWFpbCIgbm9fYW1wPSIxIi8+Ij48aW5wMjp1LnJlZ2lzdGVyX0NvbmZpcm1QYXNzd29yZExpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC92ZXJpZnlfZW1haWwiIG5vX2FtcD0iMSIvPjwvYT48YnIvPjxici8+DQo8L2lucDI6bV9pZj4=</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+KQoKQSBuZXcgdXNlciAiPGlucDI6dS5yZWdpc3Rlcl9GaWVsZCBuYW1lPSdVc2VybmFtZScvPiIgaGFzIGJlZW4gYWRkZWQu</EVENT>
<EVENT MessageType="text" Event="USER.ADD.BYADMIN" Type="0">U3ViamVjdDogTmV3IHVzZXIgaGFzIGJlZW4gY3JlYXRlZAoKRGVhciA8aW5wMjp1X0ZpZWxkIG5hbWU9IkZpcnN0TmFtZSIvPiwNCg0KQSBuZXcgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGFuZCBhc3NpZ25lZCB0byB5b3UNCg0KTm93IHlvdSBjYW4gbG9naW4gdXNpbmcgdGhlIGZvbGxvd2luZyBjcmVkZW50aWFsczoNCg0KPGlucDI6bV9pZiBjaGVjaz0idV9GaWVsZCIgbmFtZT0iVXNlcm5hbWUiPlVzZXJuYW1lOiA8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+PGlucDI6bV9lbHNlLz5FLW1haWw6IDxpbnAyOnVfRmllbGQgbmFtZT0iRW1haWwiLz48L2lucDI6bV9pZj4gDQpQYXNzd29yZDogPGlucDI6dV9GaWVsZCBuYW1lPSJQYXNzd29yZF9wbGFpbiIvPiANCg==</EVENT>
- <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="0">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+PGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPiAtIEFjdGl2YXRpb24gRW1haWw8L2lucDI6bV9pZj4pCgpEZWFyIDxpbnAyOnVfRmllbGQgbmFtZT0iRmlyc3ROYW1lIiAvPiA8aW5wMjp1X0ZpZWxkIG5hbWU9Ikxhc3ROYW1lIiAvPiw8YnIgLz4NCjxiciAvPg0KPGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPiBUaGFuayB5b3UgZm9yIHJlZ2lzdGVyaW5nIG9uIDxpbnAyOm1fTGluayB0ZW1wbGF0ZT0iaW5kZXgiLz4gd2Vic2l0ZS4gVG8gYWN0aXZhdGUgeW91ciByZWdpc3RyYXRpb24gcGxlYXNlIGZvbGxvdyBsaW5rIGJlbG93LiA8aW5wMjp1X0FjdGl2YXRpb25MaW5rIHRlbXBsYXRlPSJwbGF0Zm9ybS9sb2dpbi9hY3RpdmF0ZV9jb25maXJtIi8+IDxpbnAyOm1fZWxzZS8+IFRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9MaW5rIHRlbXBsYXRlPSJpbmRleCIvPiB3ZWJzaXRlLiBZb3VyIHJlZ2lzdHJhdGlvbiB3aWxsIGJlIGFjdGl2ZSBhZnRlciBhcHByb3ZhbC4gPC9pbnAyOm1faWY+</EVENT>
- <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0ZXJlZAoKQSBuZXcgdXNlciAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIHJlZ2lzdGVyZWQgYW5kIGlzIHBlbmRpbmcgYWRtaW5pc3RyYXRpdmUgYXBwcm92YWwu</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="0">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0cmF0aW9uICg8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+PGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPiAtIEFjdGl2YXRpb24gRW1haWw8L2lucDI6bV9pZj4pCgpEZWFyIDxpbnAyOnUucmVnaXN0ZXJfRmllbGQgbmFtZT0iRmlyc3ROYW1lIiAvPiA8aW5wMjp1LnJlZ2lzdGVyX0ZpZWxkIG5hbWU9Ikxhc3ROYW1lIiAvPiw8YnIgLz4NCjxiciAvPg0KPGlucDI6bV9pZiBjaGVjaz0ibV9HZXRDb25maWciIG5hbWU9IlVzZXJfQWxsb3dfTmV3IiBlcXVhbHNfdG89IjQiPg0KCVRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcgb24gPGlucDI6bV9MaW5rIHRlbXBsYXRlPSJpbmRleCIvPiB3ZWJzaXRlLiBUbyBhY3RpdmF0ZSB5b3VyIHJlZ2lzdHJhdGlvbiBwbGVhc2UgZm9sbG93IGxpbmsgYmVsb3cuIDxpbnAyOnUucmVnaXN0ZXJfQWN0aXZhdGlvbkxpbmsgdGVtcGxhdGU9InBsYXRmb3JtL2xvZ2luL2FjdGl2YXRlX2NvbmZpcm0iLz4NCjxpbnAyOm1fZWxzZS8+DQoJVGhhbmsgeW91IGZvciByZWdpc3RlcmluZyBvbiA8aW5wMjptX0xpbmsgdGVtcGxhdGU9ImluZGV4Ii8+IHdlYnNpdGUuIFlvdXIgcmVnaXN0cmF0aW9uIHdpbGwgYmUgYWN0aXZlIGFmdGVyIGFwcHJvdmFsLiANCgkNCgk8aW5wMjptX2lmIGNoZWNrPSJ1LnJlZ2lzdGVyX0ZpZWxkIiBuYW1lPSJFbWFpbCI+DQoJCTxici8+PGJyLz4NCgkJUGxlYXNlIGNsaWNrIGhlcmUgdG8gdmVyaWZ5IHlvdXIgRS1tYWlsIGFkZHJlc3M6DQoJCTxhIGhyZWY9IjxpbnAyOnUucmVnaXN0ZXJfQ29uZmlybVBhc3N3b3JkTGluayB0PSJwbGF0Zm9ybS9teV9hY2NvdW50L3ZlcmlmeV9lbWFpbCIgbm9fYW1wPSIxIi8+Ij48aW5wMjp1LnJlZ2lzdGVyX0NvbmZpcm1QYXNzd29yZExpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC92ZXJpZnlfZW1haWwiIG5vX2FtcD0iMSIvPjwvYT48YnIvPjxici8+DQoJPC9pbnAyOm1faWY+DQo8L2lucDI6bV9pZj4=</EVENT>
+ <EVENT MessageType="html" Event="USER.ADD.PENDING" Type="1">U3ViamVjdDogTmV3IFVzZXIgUmVnaXN0ZXJlZAoKQSBuZXcgdXNlciAiPGlucDI6dS5yZWdpc3Rlcl9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIHJlZ2lzdGVyZWQgYW5kIGlzIHBlbmRpbmcgYWRtaW5pc3RyYXRpdmUgYXBwcm92YWwu</EVENT>
<EVENT MessageType="html" Event="USER.APPROVE" Type="0">U3ViamVjdDogWW91ciBBY2NvdW50IGlzIEFjdGl2ZQoKV2VsY29tZSB0byA8aW5wMjptX0Jhc2VVcmwvPiENCg0KWW91ciB1c2VyIHJlZ2lzdHJhdGlvbiBoYXMgYmVlbiBhcHByb3ZlZC4gWW91ciB1c2VyIG5hbWUgaXM6ICI8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+Ii4=</EVENT>
<EVENT MessageType="html" Event="USER.APPROVE" Type="1">U3ViamVjdDogTmV3IFVzZXIgQWNjb3VudCAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgd2FzIEFwcHJvdmVkCgpVc2VyICI8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+IiBoYXMgYmVlbiBhcHByb3ZlZC4=</EVENT>
<EVENT MessageType="html" Event="USER.DENY" Type="0">U3ViamVjdDogWW91ciBSZWdpc3RyYXRpb24gaGFzIGJlZW4gRGVuaWVkCgpZb3VyIHJlZ2lzdHJhdGlvbiBvbiA8YSBocmVmPSI8aW5wMjptX0Jhc2VVcmwvPiI+PGlucDI6bV9CYXNlVXJsLz48L2E+IHdlYnNpdGUgaGFzIGJlZW4gZGVuaWVkLg==</EVENT>
<EVENT MessageType="html" Event="USER.DENY" Type="1">U3ViamVjdDogVXNlciBSZWdpc3RyYXRpb24gZm9yICAiPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiIgaGFzIGJlZW4gRGVuaWVkCgpVc2VyICI8aW5wMjp1X0ZpZWxkIG5hbWU9IlVzZXJuYW1lIi8+IiBoYXMgYmVlbiBkZW5pZWQu</EVENT>
+ <EVENT MessageType="html" Event="USER.EMAIL.CHANGE.UNDO" Type="0">U3ViamVjdDogQ2hhbmdlZCBFLW1haWwgUm9sbGJhY2sKCkhlbGxvLDxici8+PGJyLz4NCg0KSXQgc2VlbXMgdGhhdCB5b3UgaGF2ZSBjaGFuZ2VkIGUtbWFpbCBpbiB5b3VyIEluLXBvcnRhbCBhY2NvdW50LiBZb3UgbWF5IHVuZG8gdGhpcyBjaGFuZ2UgYnkgY2xpY2tpbmcgb24gdGhlIGxpbmsgYmVsb3c6PGJyLz48YnIvPg0KDQo8YSBocmVmPSI8aW5wMjp1X1VuZG9FbWFpbENoYW5nZUxpbmsgdGVtcGxhdGU9InBsYXRmb3JtL215X2FjY291bnQvcmVzdG9yZV9lbWFpbCIvPiI+PGlucDI6dV9VbmRvRW1haWxDaGFuZ2VMaW5rIHRlbXBsYXRlPSJwbGF0Zm9ybS9teV9hY2NvdW50L3Jlc3RvcmVfZW1haWwiLz48L2E+PGJyLz48YnIvPg0KDQpJZiB5b3UgYmVsaWV2ZSB5b3UgaGF2ZSByZWNlaXZlZCB0aGlzIGVtYWlsIGluIGVycm9yLCBwbGVhc2UgaWdub3JlIHRoaXMgZW1haWwuIFlvdXIgYWNjb3VudCB3aWxsIGJlIGxpbmtlZCB0byBhbm90aGVyIGUtbWFpbCB1bmxlc3MgeW91IGhhdmUgY2xpY2tlZCBvbiB0aGUgYWJvdmUgbGluay4=</EVENT>
+ <EVENT MessageType="html" Event="USER.EMAIL.CHANGE.VERIFY" Type="0">U3ViamVjdDogQ2hhbmdlZCBFLW1haWwgVmVyaWZpY2F0aW9uCgpIZWxsbyw8YnIvPjxici8+DQoNCkl0IHNlZW1zIHRoYXQgeW91IGhhdmUgY2hhbmdlZCBlLW1haWwgaW4geW91ciBJbi1wb3J0YWwgYWNjb3VudC4gUGxlYXNlIHZlcmlmeSB0aGlzIG5ldyBlLW1haWwgYnkgY2xpY2tpbmcgb24gdGhlIGxpbmsgYmVsb3c6PGJyLz48YnIvPg0KDQo8YSBocmVmPSI8aW5wMjp1X0NvbmZpcm1QYXNzd29yZExpbmsgdD0icGxhdGZvcm0vbXlfYWNjb3VudC92ZXJpZnlfZW1haWwiIG5vX2FtcD0iMSIvPiI+PGlucDI6dV9Db25maXJtUGFzc3dvcmRMaW5rIHQ9InBsYXRmb3JtL215X2FjY291bnQvdmVyaWZ5X2VtYWlsIiBub19hbXA9IjEiLz48L2E+PGJyLz48YnIvPg0KDQpJZiB5b3UgYmVsaWV2ZSB5b3UgaGF2ZSByZWNlaXZlZCB0aGlzIGVtYWlsIGluIGVycm9yLCBwbGVhc2UgaWdub3JlIHRoaXMgZW1haWwuIFlvdXIgZW1haWwgd2lsbCBub3QgZ2V0IHZlcmlmaWVkIHN0YXR1cyB1bmxlc3MgeW91IGhhdmUgY2xpY2tlZCBvbiB0aGUgYWJvdmUgbGluay4NCg==</EVENT>
<EVENT MessageType="html" Event="USER.MEMBERSHIP.EXPIRATION.NOTICE" Type="0">U3ViamVjdDogTWVtYmVyc2hpcCBFeHBpcmF0aW9uIE5vdGljZQoKWW91ciBtZW1iZXJzaGlwIG9uIDxpbnAyOm1fQmFzZVVybC8+IHdlYnNpdGUgd2lsbCBzb29uIGV4cGlyZS4=</EVENT>
<EVENT MessageType="html" Event="USER.MEMBERSHIP.EXPIRATION.NOTICE" Type="1">U3ViamVjdDogTWVtYmVyc2hpcCBFeHBpcmF0aW9uIE5vdGljZSBmb3IgIjxpbnAyOnVfRmllbGQgbmFtZT0iVXNlcm5hbWUiLz4iIFNlbnQKClVzZXIgPGlucDI6dV9GaWVsZCBuYW1lPSJVc2VybmFtZSIvPiBtZW1iZXJzaGlwIHdpbGwgZXhwaXJlIHNvb24u</EVENT>
<EVENT MessageType="html" Event="USER.MEMBERSHIP.EXPIRED" Type="0">U3ViamVjdDogWW91ciBNZW1iZXJzaGlwIEV4cGlyZWQKCllvdXIgbWVtYmVyc2hpcCBvbiA8aW5wMjptX0Jhc2VVcmwvPiB3ZWJzaXRlIGhhcyBleHBpcmVkLg==</EVENT>
Index: core/install/install_data.sql
===================================================================
--- core/install/install_data.sql (revision 14964)
+++ core/install/install_data.sql (working copy)
@@ -175,6 +175,8 @@
INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.NEW.PASSWORD', NULL, 1, 0, 'Core', 'Sends new password to an existing user', 0, 1, 0);
INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.ADD.BYADMIN', NULL, 1, 0, 'Core', 'Sends password to a new user', 0, 1, 0);
INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'ROOT.RESET.PASSWORD', NULL, 1, 0, 'Core', 'Root Reset Password', 1, 1, 0);
+INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.EMAIL.CHANGE.VERIFY', NULL, 1, 0, 'Core', 'Changed E-mail Verification', 0, 1, 1);
+INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.EMAIL.CHANGE.UNDO', NULL, 1, 0, 'Core', 'Changed E-mail Rollback', 0, 1, 1);
INSERT INTO IdGenerator VALUES ('100');
Index: core/install/install_schema.sql
===================================================================
--- core/install/install_schema.sql (revision 14968)
+++ core/install/install_schema.sql (working copy)
@@ -250,6 +250,7 @@
LastName varchar(255) NOT NULL DEFAULT '',
Company varchar(255) NOT NULL DEFAULT '',
Email varchar(255) NOT NULL DEFAULT '',
+ PrevEmails text,
CreatedOn int(11) DEFAULT NULL,
Phone varchar(255) NOT NULL DEFAULT '',
Fax varchar(255) NOT NULL DEFAULT '',
@@ -261,6 +262,7 @@
Country varchar(20) NOT NULL DEFAULT '',
ResourceId int(11) NOT NULL DEFAULT '0',
`Status` tinyint(4) NOT NULL DEFAULT '1',
+ EmailVerified tinyint(4) NOT NULL,
Modified int(11) DEFAULT NULL,
dob int(11) DEFAULT NULL,
tz int(11) DEFAULT NULL,
Index: core/install/upgrades.sql
===================================================================
--- core/install/upgrades.sql (revision 14968)
+++ core/install/upgrades.sql (working copy)
@@ -2509,4 +2509,13 @@
UPDATE PortalUser
SET FrontLanguage = 1
-WHERE UserType = 0;
\ No newline at end of file
+WHERE UserType = 0;
+
+ALTER TABLE PortalUser
+ ADD PrevEmails TEXT NULL AFTER Email,
+ ADD EmailVerified TINYINT NOT NULL AFTER `Status`;
+
+UPDATE PortalUser SET EmailVerified = 1;
+
+INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.EMAIL.CHANGE.VERIFY', NULL, 1, 0, 'Core', 'Changed E-mail Verification', 0, 1, 1);
+INSERT INTO Events (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'USER.EMAIL.CHANGE.UNDO', NULL, 1, 0, 'Core', 'Changed E-mail Rollback', 0, 1, 1);
Index: core/units/helpers/user_helper.php
===================================================================
--- core/units/helpers/user_helper.php (revision 14968)
+++ core/units/helpers/user_helper.php (working copy)
@@ -522,6 +522,7 @@
$expiration_timeouts = Array (
'forgot_password' => 'config:Users_AllowReset',
'activation' => 'config:UserEmailActivationTimeout',
+ 'verify_email' => 'config:Users_AllowReset',
'custom' => '',
);
@@ -550,4 +551,47 @@
return $user_info['PortalUserId'];
}
+
+ /**
+ * Restores user's email, returns error label, if error occurred
+ *
+ * @param string $hash
+ * @return string
+ * @access public
+ */
+ public function restoreEmail($hash)
+ {
+ if ( !preg_match('/^[a-f0-9]{32}$/', $hash) ) {
+ return 'invalid_hash';
+ }
+
+ $sql = 'SELECT PortalUserId, PrevEmails
+ FROM ' . TABLE_PREFIX . 'PortalUser
+ WHERE PrevEmails LIKE ' . $this->Conn->qstr('%' . $hash . '%');
+ $user_info = $this->Conn->GetRow($sql);
+
+ if ( $user_info === false ) {
+ return 'invalid_hash';
+ }
+
+ $prev_emails = $user_info['PrevEmails'];
+ $prev_emails = $prev_emails ? unserialize($prev_emails) : Array ();
+
+ if ( !isset($prev_emails[$hash]) ) {
+ return 'invalid_hash';
+ }
+
+ $email_to_restore = $prev_emails[$hash];
+ unset($prev_emails[$hash]);
+
+ $object =& $this->Application->recallObject('u.email-restore', null, Array ('skip_autoload' => true));
+ /* @var $object UsersItem */
+
+ $object->Load($user_info['PortalUserId']);
+ $object->SetDBField('PrevEmails', serialize($prev_emails));
+ $object->SetDBField('Email', $email_to_restore);
+ $object->SetDBField('EmailVerified', 1);
+
+ return $object->Update() ? '' : 'restore_impossible';
+ }
}
Index: core/units/users/users_config.php
===================================================================
--- core/units/users/users_config.php (revision 14968)
+++ core/units/users/users_config.php (working copy)
@@ -419,6 +419,11 @@
'default' => 0
),
'IPRestrictions' => Array ('default' => NULL),
+ 'EmailVerified' => Array (
+ 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
+ 'default' => 0
+ ),
+ 'PrevEmails' => Array ('default' => NULL),
),
'VirtualFields' => Array (
@@ -551,6 +556,8 @@
'PrimaryGroupId' => Array ('type' => 'int'),
'OldStyleLogin' => Array ('type' => 'int', 'not_null' => 1),
'IPRestrictions' => Array ('type' => 'string'),
+ 'EmailVerified' => Array ('type' => 'int', 'not_null' => 1),
+ 'PrevEmails' => Array ('type' => 'string'),
),
'VirtualFields' => Array (
@@ -644,6 +651,7 @@
'CreatedOn' => Array ('filter_block' => 'grid_date_range_filter', 'width' => 100),
'Modified' => Array ('filter_block' => 'grid_date_range_filter', 'width' => 100),
'IPAddress' => Array ('filter_block' => 'grid_date_range_filter', 'width' => 100, 'hidden' => 1),
+ 'EmailVerified' => Array ('filter_block' => 'grid_options_filter', 'width' => 100, 'hidden' => 1),
),
),
),
Index: core/units/users/users_event_handler.php
===================================================================
--- core/units/users/users_event_handler.php (revision 14971)
+++ core/units/users/users_event_handler.php (working copy)
@@ -910,18 +910,22 @@
$object =& $event->getObject();
/* @var $object kDBItem */
- if ($event->Special == 'forgot') {
+ if ( $event->Special == 'forgot' ) {
$object->SetDBField('PwResetConfirm', '');
$object->SetDBField('PwRequestTime_date', NULL);
$object->SetDBField('PwRequestTime_time', NULL);
}
- $changed_fields = array_keys( $object->GetChangedFields() );
+ $changed_fields = array_keys($object->GetChangedFields());
if ( $changed_fields && !in_array('Modified', $changed_fields) ) {
$object->SetDBField('Modified_date', adodb_mktime());
$object->SetDBField('Modified_time', adodb_mktime());
}
+
+ if ( !$this->Application->isAdmin && in_array('Email', $changed_fields) && ($event->Special != 'email-restore') ) {
+ $object->SetDBField('EmailVerified', 0);
+ }
}
/**
@@ -1286,10 +1290,14 @@
$object =& $event->getObject();
/* @var $object UsersItem */
- if (!$this->Application->isAdmin || $object->IsTempTable()) {
- return ;
+ if ( !$this->Application->isAdmin && ($event->Special != 'email-restore') ) {
+ $this->sendEmailChangeEvent($event);
}
+ if ( !$this->Application->isAdmin || $object->IsTempTable() ) {
+ return;
+ }
+
$this->sendStatusChangeEvent($object->GetID(), $object->GetOriginalField('Status'), $object->GetDBField('Status'));
}
@@ -1433,6 +1441,57 @@
}
/**
+ * Sends restore/validation email event on user email change
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function sendEmailChangeEvent(kEvent &$event)
+ {
+ $object =& $event->getObject();
+ /* @var $object UsersItem */
+
+ $new_email = $object->GetDBField('Email');
+ $prev_email = $object->GetOriginalField('Email');
+
+ if ( !$new_email || ($prev_email == $new_email) ) {
+ return;
+ }
+
+ $prev_emails = $object->GetDBField('PrevEmails');
+ $prev_emails = $prev_emails ? unserialize($prev_emails) : Array ();
+
+ $fields_hash = Array (
+ 'PrevEmails' => serialize($prev_emails),
+ 'EmailVerified' => 0,
+ );
+
+ $user_id = $object->GetID();
+
+ if ( $prev_email ) {
+ $hash = md5(TIMENOW + $user_id);
+ $prev_emails[$hash] = $prev_email;
+ $fields_hash['PrevEmails'] = serialize($prev_emails);
+
+ $send_params = Array (
+ 'hash' => $hash,
+ 'to_email' => $prev_email,
+ 'to_name' => trim($object->GetDBField('FirstName') . ' ' . $object->GetDBField('LastName')),
+ );
+
+ $this->Application->EmailEventUser('USER.EMAIL.CHANGE.UNDO', null, $send_params);
+ }
+
+ if ( $new_email ) {
+ $this->Application->EmailEventUser('USER.EMAIL.CHANGE.VERIFY', $user_id);
+ }
+
+ // direct DB update, since USER.EMAIL.CHANGE.VERIFY puts verification code in user record, that we don't want to loose
+ $this->Conn->doUpdate($fields_hash, $object->TableName, 'PortalUserId = ' . $user_id);
+ }
+
+ /**
* OnAfterConfigRead for users
*
* @param kEvent $event
Index: core/units/users/users_tag_processor.php
===================================================================
--- core/units/users/users_tag_processor.php (revision 14949)
+++ core/units/users/users_tag_processor.php (working copy)
@@ -114,6 +114,34 @@
}
/**
+ * Tries to restore user email
+ *
+ * @param Array $params
+ * @return bool
+ * @access protected
+ */
+ protected function RestoreEmail($params)
+ {
+ $user_helper =& $this->Application->recallObject('UserHelper');
+ /* @var $user_helper UserHelper */
+
+ $hash = $this->Application->GetVar('hash');
+ $error_code = $user_helper->restoreEmail($hash);
+
+ if ( $error_code ) {
+ // used for error reporting only -> rewrite code + theme (by Alex)
+ $object =& $this->getObject(Array ('skip_autoload' => true)); // TODO: change theme too
+ /* @var $object UsersItem */
+
+ $object->SetError('PwResetConfirm', 'restore', $params[$error_code]);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
* Returns error message set by given code type
*
* @param string $error_code
@@ -133,6 +161,11 @@
'code_is_not_valid' => 'lu_error_ActivationCodeNotValid',
'code_expired' => 'lu_error_ActivationCodeExpired',
),
+
+ 'verify_email' => Array (
+ 'code_is_not_valid' => 'lu_error_VerificationCodeNotValid',
+ 'code_expired' => 'lu_error_VerificationCodeExpired',
+ ),
);
if ($code_type == 'custom') {
@@ -264,33 +297,84 @@
}
/**
+ * Returns link to revert e-mail change in user record
+ *
+ * @param Array $params
+ * @return string
+ * @access protected
+ */
+ protected function UndoEmailChangeLink($params)
+ {
+ $params['hash'] = $this->Application->Parser->GetParam('hash');
+
+ if ( !$this->SelectParam($params, 'template,t') ) {
+ $params['template'] = $this->Application->GetVar('undo_email_template');
+ }
+
+ return $this->Application->ProcessParsedTag('m', 'Link', $params);
+ }
+
+ /**
* Activates user using given code
*
* @param Array $params
+ * @return string
+ * @access protected
*/
- function ActivateUser($params)
+ protected function ActivateUser($params)
{
- $passed_key = trim($this->Application->GetVar('user_key'));
+ $this->_updateAndLogin(Array ('Status' => STATUS_ACTIVE, 'EmailVerified' => 1));
+ return '';
+ }
+
+ /**
+ * Marks user e-mail as verified using given code
+ *
+ * @param Array $params
+ * @return string
+ * @access protected
+ */
+ protected function MarkUserEmailAsVerified($params)
+ {
+ $this->_updateAndLogin(Array ('EmailVerified' => 1));
+
+ return '';
+ }
+
+ /**
+ * Activates user using given code
+ *
+ * @param Array $fields_hash
+ * @return void
+ * @access protected
+ */
+ protected function _updateAndLogin($fields_hash)
+ {
$user_helper =& $this->Application->recallObject('UserHelper');
- /* @var $user_helper UserHelper */
+ /* @var $user_helper UserHelper */
- $user =& $user_helper->getUserObject();
- $user->Load($passed_key, 'PwResetConfirm');
+ $user =& $this->Application->recallObject($this->Prefix . '.activate', null, Array ('skip_autoload' => true));
+ /* @var $user UsersItem */
+
+ $user->Load(trim($this->Application->GetVar('user_key')), 'PwResetConfirm');
+
if ( !$user->isLoaded() ) {
return ;
}
- $user->SetDBField('Status', STATUS_ACTIVE);
+ $user->SetFieldsFromHash($fields_hash);
$user->SetDBField('PwResetConfirm', '');
$user->SetDBField('PwRequestTime_date', NULL);
$user->SetDBField('PwRequestTime_time', NULL);
$user->Update();
- if ( $user_helper->checkLoginPermission() ) {
- $user_helper->loginUserById( $user->GetID() );
+ $login_user =& $user_helper->getUserObject();
+ $login_user->Load( $user->GetID() );
+
+ if ( ($login_user->GetDBField('Status') == STATUS_ACTIVE) && $user_helper->checkLoginPermission() ) {
+ $user_helper->loginUserById( $login_user->GetID() );
}
}
-
}
\ No newline at end of file
email_validation_themes_v3.patch [^] (8,686 bytes) 2012-01-03 11:00
[Show Content]
Index: _install/english.lang
===================================================================
--- _install/english.lang (revision 14967)
+++ _install/english.lang (working copy)
@@ -1,5 +1,5 @@
-<LANGUAGES>
- <LANGUAGE PackName="English" Encoding="base64"><DATEFORMAT>m/d/Y</DATEFORMAT><TIMEFORMAT>g:i A</TIMEFORMAT><INPUTDATEFORMAT>m/d/Y</INPUTDATEFORMAT><INPUTTIMEFORMAT>g:i:s A</INPUTTIMEFORMAT><DECIMAL>.</DECIMAL><THOUSANDS>,</THOUSANDS><CHARSET>utf-8</CHARSET><DOCS_URL>http://docs.in-portal.org/eng/index.php</DOCS_URL><UNITSYSTEM>2</UNITSYSTEM>
+<LANGUAGES Version="4">
+ <LANGUAGE Encoding="base64" PackName="English" LocalName="English" DateFormat="m/d/Y" TimeFormat="g:i A" InputDateFormat="m/d/Y" InputTimeFormat="g:i:s A" DecimalPoint="." ThousandSep="," Charset="utf-8" UnitSystem="2" Locale="en-US" UserDocsUrl="http://docs.in-portal.org/eng/index.php">
<PHRASES>
<PHRASE Label="lu_add" Module="Core" Type="0">QWRk</PHRASE>
<PHRASE Label="lu_added" Module="Core" Type="0">QWRkZWQ=</PHRASE>
@@ -106,8 +106,12 @@
<PHRASE Label="lu_error_alreadyadded" Module="Core" Type="0">Q2F0ZWdvcnkgYWxyZWFkeSBhZGRlZCE=</PHRASE>
<PHRASE Label="lu_error_AlreadyCommented" Module="Core" Type="0">QWxyZWFkeSBjb21tZW50ZWQ=</PHRASE>
<PHRASE Label="lu_error_categorylimitreached" Module="Core" Type="0">Q2F0ZWdvcnkgbGltaXQgcmVhY2hlZCE=</PHRASE>
+ <PHRASE Label="lu_error_EmailRestoreCodeNotValid" Module="Core" Type="0">UmVzdG9yZSBjb2RlIG5vdCB2YWxpZA==</PHRASE>
+ <PHRASE Label="lu_error_EmailRestoreIsNotPossible" Module="Core" Type="0">RS1tYWlsIHJlc3RvcmUgaXMgbm90IHBvc3NpYmxl</PHRASE>
<PHRASE Label="lu_error_Required" Module="Core" Type="0">UmVxdWlyZWQ=</PHRASE>
<PHRASE Label="lu_error_UserNotFound" Module="Core" Type="0">VXNlciBOb3QgRm91bmQ=</PHRASE>
+ <PHRASE Label="lu_error_VerificationCodeExpired" Module="Core" Type="0">VmVyaWZpY2F0aW9uIGNvZGUgaGFzIGV4cGlyZWQ=</PHRASE>
+ <PHRASE Label="lu_error_VerificationCodeNotValid" Module="Core" Type="0">VmVyaWZpY2F0aW9uIGNvZGUgaXMgbm90IHZhbGlk</PHRASE>
<PHRASE Label="lu_favorite" Module="Core" Type="0">RmF2b3JpdGU=</PHRASE>
<PHRASE Label="lu_ferror_forgotpw_nodata" Module="Core" Type="0">WW91IG11c3QgZW50ZXIgYSBVc2VybmFtZSBvciBFbWFpbCBBZGRyZXNzIHRvIHJldHJpdmUgeW91ciBhY2NvdW50IGluZm9ybWF0aW9u</PHRASE>
<PHRASE Label="lu_ferror_reset_denied" Module="Core" Type="0">Tm90IHJlc2V0</PHRASE>
@@ -306,6 +310,8 @@
<PHRASE Label="lu_text_SuggestCategoryConfirm" Module="Core" Type="0">VGhhbmsgeW91IGZvciBzdWdnZXN0aW5nIHlvdXIgY2F0ZWdvcnku</PHRASE>
<PHRASE Label="lu_text_SuggestCategoryPendingConfirm" Module="Core" Type="0">U3VnZ2VzdGVkIGNhdGVnb3J5IGlzIHBlbmRpbmcgZm9yIEFkbWluaXN0cmF0aXZlIGFwcHJvdmFsIA==</PHRASE>
<PHRASE Label="lu_text_ThankYou" Module="Core" Type="0">VGhhbmsgeW91IGZvciBzdWJtaXR0aW5nIHlvdXIgcmVxdWVzdC4=</PHRASE>
+ <PHRASE Label="lu_text_YourEmailIsRestored" Module="Core" Type="0">WW91ciBlLW1haWwgaXMgcmVzdG9yZWQ=</PHRASE>
+ <PHRASE Label="lu_text_YourEmailIsVerified" Module="Core" Type="0">WW91ciBlLW1haWwgaXMgdmVyaWZpZWQ=</PHRASE>
<PHRASE Label="lu_ThankForSubscribing" Module="Core" Type="0">VGhhbmsgeW91IGZvciBzdWJzY3JpYmluZyB0byBvdXIgbWFpbGluZyBsaXN0</PHRASE>
<PHRASE Label="lu_ThanksForVoting" Module="Core" Type="0">VGhhbmtzIGZvciBWb3Rpbmch</PHRASE>
<PHRASE Label="lu_ThisCategory" Module="Core" Type="0">Q3VycmVudCBDYXRlZ29yeQ==</PHRASE>
@@ -384,4 +390,4 @@
<PHRASE Label="lu_ZipCode" Module="Core" Type="0">WklQIENvZGU=</PHRASE>
</PHRASES>
</LANGUAGE>
-</LANGUAGES>
+</LANGUAGES>
\ No newline at end of file
Index: platform/my_account/restore_email.tpl
===================================================================
--- platform/my_account/restore_email.tpl (revision 0)
+++ platform/my_account/restore_email.tpl (revision 0)
@@ -0,0 +1,61 @@
+<!--##
+<NAME>Restore E-mail</NAME>
+<DESC></DESC>
+<SECTION>My Account</SECTION>
+##-->
+
+<!--## PAGE TITLE ELEMENT ##-->
+<inp2:m_DefineElement name="page_title">
+ <inp2:st_PageInfo type="htmlhead_title"/>
+</inp2:m_DefineElement>
+<!--## //PAGE TITLE ELEMENT ##-->
+
+<!--## SIDE-BAR ELEMENT ##-->
+<inp2:m_DefineElement name="sidebar">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/login.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/search.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/recommend_site.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/mailing_list.elm" design="blue_box"/>
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## //SIDE-BAR ELEMENT ##-->
+
+<!--## MAIN CONTENT ##-->
+<inp2:m_DefineElement name="content">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_include template="platform/elements/navigation_bar.elm" titles="__page__" templates="platform/my_account/restore_email"/>
+ </div>
+ <div class="movable-element">
+ <!-- restore e-mail -->
+ <inp2:m_RenderElement design="content_box">
+ <inp2:m_Capture to_var="header">
+ <inp2:st_PageInfo type="title"/>
+ </inp2:m_Capture>
+
+ <inp2:m_if check="u_RestoreEmail" invalid_hash="lu_error_EmailRestoreCodeNotValid" restore_impossible="lu_error_EmailRestoreIsNotPossible">
+ <inp2:m_Phrase label="lu_text_YourEmailIsRestored"/>
+ <inp2:m_else />
+ <span class="error"><inp2:u_Error field="PwResetConfirm"/></span>
+ <br /> <br />
+ <a href="<inp2:m_Link template='index' m_cat_id='0' m_cat_page='1'/>"><inp2:m_Phrase label="lu_ReturnToHome"/></a>
+ </inp2:m_if>
+ </inp2:m_RenderElement>
+ <!-- // restore e-mail -->
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## /MAIN CONTENT ##-->
+
+<!--## DESIGN TEMPLATE ##-->
+<inp2:m_include template="platform/designs/default_design.des" pass_params="1"/>
+<!--## /DESIGN TEMPLATE ##-->
Property changes on: platform\my_account\restore_email.tpl
___________________________________________________________________
Added: svn:eol-style
+ LF
Index: platform/my_account/verify_email.tpl
===================================================================
--- platform/my_account/verify_email.tpl (revision 0)
+++ platform/my_account/verify_email.tpl (revision 0)
@@ -0,0 +1,62 @@
+<!--##
+<NAME>E-mail Verification</NAME>
+<DESC></DESC>
+<SECTION>My Account</SECTION>
+##-->
+
+<!--## PAGE TITLE ELEMENT ##-->
+<inp2:m_DefineElement name="page_title">
+ <inp2:st_PageInfo type="htmlhead_title"/>
+</inp2:m_DefineElement>
+<!--## //PAGE TITLE ELEMENT ##-->
+
+<!--## SIDE-BAR ELEMENT ##-->
+<inp2:m_DefineElement name="sidebar">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/login.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/search.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/recommend_site.elm" design="blue_box"/>
+ </div>
+ <div class="movable-element">
+ <inp2:m_RenderElement name="platform/elements/side_boxes/mailing_list.elm" design="blue_box"/>
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## //SIDE-BAR ELEMENT ##-->
+
+<!--## MAIN CONTENT ##-->
+<inp2:m_DefineElement name="content">
+ <div class="movable-area">
+ <div class="movable-element">
+ <inp2:m_include template="platform/elements/navigation_bar.elm" titles="__page__" templates="platform/my_account/verify_email"/>
+ </div>
+ <div class="movable-element">
+ <!-- verify e-mail -->
+ <inp2:m_RenderElement design="content_box">
+ <inp2:m_Capture to_var="header">
+ <inp2:st_PageInfo type="title"/>
+ </inp2:m_Capture>
+
+ <inp2:m_if check="u_TestCodeIsValid" code_type="verify_email">
+ <inp2:u_MarkUserEmailAsVerified/>
+ <inp2:m_Phrase label="lu_text_YourEmailIsVerified"/>
+ <inp2:m_else />
+ <span class="error"><inp2:u_Error field="PwResetConfirm"/></span>
+ <br /> <br />
+ <a href="<inp2:m_Link template="index" m_cat_id="0" m_cat_page="1"/>"><inp2:m_Phrase label="lu_ReturnToHome"/></a>
+ </inp2:m_if>
+ </inp2:m_RenderElement>
+ <!-- // verify e-mail -->
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## /MAIN CONTENT ##-->
+
+<!--## DESIGN TEMPLATE ##-->
+<inp2:m_include template="platform/designs/default_design.des" pass_params="1"/>
+<!--## /DESIGN TEMPLATE ##-->
|