diff --git a/app/libs/Auth/User.php b/app/libs/Auth/User.php index 2aa940de..025e633e 100644 --- a/app/libs/Auth/User.php +++ b/app/libs/Auth/User.php @@ -76,6 +76,23 @@ class User extends BaseModelEloquent implements AuthenticatableContract, IOpenId $this->member = $member; } + public function getMember(){ + return $this->getAssociatedMember(); + } + + /** + * @return bool + */ + public function hasMember(){ + try{ + return $this->getMember() != null; + } + catch (EntityNotFoundException $ex){ + return false; + } + return false; + } + private function getAssociatedMember() { if (is_null($this->member)) { @@ -414,4 +431,14 @@ class User extends BaseModelEloquent implements AuthenticatableContract, IOpenId return $this->member->isEmailVerified(); } + + public function delete() + { + $this->access_tokens()->delete(); + $this->actions()->delete(); + $this->clients()->delete(); + $this->consents()->delete(); + $this->trusted_sites()->delete(); + return parent::delete(); + } } \ No newline at end of file diff --git a/app/libs/Auth/UserNameGeneratorService.php b/app/libs/Auth/UserNameGeneratorService.php index cdc9e0b0..272a419b 100644 --- a/app/libs/Auth/UserNameGeneratorService.php +++ b/app/libs/Auth/UserNameGeneratorService.php @@ -88,9 +88,9 @@ final class UserNameGeneratorService implements IUserNameGeneratorService */ public function generate(Member $member) { - $fname = self::normalizeChars($member->FirstName); - $lname = self::normalizeChars($member->Surname); - $user_name = strtolower + $fname = self::normalizeChars(trim($member->FirstName)); + $lname = self::normalizeChars(trim($member->Surname)); + $user_name = strtolower ( preg_replace('/[^\d\w_-]+/i', IUserNameGeneratorService::USER_NAME_INVALID_CHAR_REPLACEMENT, $fname) . IUserNameGeneratorService::USER_NAME_CHAR_CONNECTOR . diff --git a/database/migrations/2017_02_01_183719_fix_user_name_whitespace.php b/database/migrations/2017_02_01_183719_fix_user_name_whitespace.php new file mode 100644 index 00000000..51ad3da7 --- /dev/null +++ b/database/migrations/2017_02_01_183719_fix_user_name_whitespace.php @@ -0,0 +1,70 @@ +get(); + $generator = new UserNameGeneratorService(); + + foreach($users as $user_2_fix){ + try { + + $member = $user_2_fix->getMember(); + $fragment_nbr = 1; + $identifier = $original_identifier = $generator->generate($member); + + do { + $old_user = User::where('identifier', '=', $identifier)->where('id', '<>', $user_2_fix->id)->first(); + if (!is_null($old_user) && !$old_user->hasMember()){ + sprintf("deleting user id %s", $old_user->id).PHP_EOL; + $old_user->delete(); + $old_user = null; + } + if (!is_null($old_user)) { + echo sprintf("identifier %s collision with user id %s - member_id %s", $identifier, $old_user->id, $old_user->external_identifier).PHP_EOL; + $identifier = $original_identifier . \Auth\IUserNameGeneratorService::USER_NAME_CHAR_CONNECTOR . $fragment_nbr; + $fragment_nbr++; + continue; + } + $user_2_fix->identifier = $identifier; + break; + } while (1); + + $user_2_fix->save(); + } + catch (EntityNotFoundException $ex){ + echo sprintf("member not found for user id %s - identifier %s ... deleting it", $user_2_fix->id, $user_2_fix->identifier).PHP_EOL; + $user_2_fix->delete(); + } + } + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/database/seeds/TestSeeder.php b/database/seeds/TestSeeder.php index b03a634d..16ea470d 100644 --- a/database/seeds/TestSeeder.php +++ b/database/seeds/TestSeeder.php @@ -412,6 +412,28 @@ SQL; ) ); + Member::create( + array( + 'ID' => 8, + 'FirstName' => ' Sebastian German ', + 'Surname' => 'Marcet Gomez ', + 'Email' => 'smarcet@gmail.com', + 'Password' => '1qaz2wsx', + 'PasswordEncryption' => 'none', + 'Salt' => 'none', + 'Gender' => 'male', + 'Address' => 'Av. Siempre Viva 111', + 'Suburb' => 'Lanus Este', + 'State' => 'Buenos Aires', + 'City' => 'Lanus', + 'Postcode' => '1824', + 'Country' => 'AR', + 'Locale' => 'ESP', + 'Active' => 1, + 'EmailVerified' => 1, + ) + ); + DB::table('banned_ips')->delete(); DB::table('user_exceptions_trail')->delete(); DB::table('server_configuration')->delete(); diff --git a/tests/UserTest.php b/tests/UserTest.php index 706d85ca..21945840 100644 --- a/tests/UserTest.php +++ b/tests/UserTest.php @@ -4,7 +4,7 @@ use Auth\User; use Models\Member; use OpenId\Services\OpenIdServiceCatalog; use Illuminate\Support\Facades\App; - +use Auth\UserNameGeneratorService; /** * Class UserTest */ @@ -26,4 +26,17 @@ class UserTest extends TestCase $service = App::make(OpenIdServiceCatalog::UserService); $service->lockUser($user->id); } + + public function testUserNameGeneration(){ + $generator = new UserNameGeneratorService(); + $member6 = Member::findOrFail(6); + $member7 = Member::findOrFail(7); + $member8 = Member::findOrFail(8); + $id6 = $generator->generate($member6); + $this->assertTrue( $id6 == 'bharath.kumar.m.r'); + $id7 = $generator->generate($member7); + $this->assertTrue( $id7 == 'yuanying'); + $id8 = $generator->generate($member8); + $this->assertTrue( $id8 == 'sebastian.german.marcet.gomez'); + } } \ No newline at end of file