CiviCRM
  1. CiviCRM
  2. CRM-9091

Fatal error occurs when account registration matches a contact with an existing account

    Details

    • Type: Bug Bug
    • Status: Reopened
    • Priority: Blocker Blocker
    • Resolution: Unresolved
    • Affects Version/s: 3.3.6, 3.4.alpha, 3.4.beta, 3.4.0, 3.4.1, 3.4.2, 3.4.3, 3.4.4, 3.4.5, 3.4.6, 3.4.7, 4.0.0, 4.0.1, 4.0.2, 4.0.3, 4.0.4, 4.0.5, 4.0.6, 4.0.7
    • Fix Version/s: 4.6
    • Component/s: Core CiviCRM
    • Labels:
      None
    • Is MIH?:
      No
    • Code Sprint:
      No

      Description

      We have identified this issue in 3.3.5 and the current drupal demo site.

      The general problem is - if when creating a drupal registration, the registration information provided matches a contact record that already has an associated drupal account, a fatal DB error occurs.
      .
      I'm guessing this is a primary key violation on contact id since none of the drupal account validations fail (email, username).

      I reproduced this on the current demo site as follows

      1 - find a contact with 2 email addresses
      2 - register using the first email address - verify that account is linked to contact
      3 - register using the second email address
      4 - error occurs

      Here is the error I received

      Database Error Code: Duplicate entry '27-1' for key 3, 1062
      Additional Details:

      Array
      (
          [callback] => Array
              (
                  [0] => CRM_Core_Error
                  [1] => handle
              )

          [code] => -5
          [message] => DB Error: already exists
          [mode] => 16
          [debug_info] => INSERT INTO civicrm_uf_match (domain_id , uf_id , uf_name , contact_id ) VALUES ( 1 , 47 , 'adamssam@indiatimes.co.pl' , 27 ) [nativecode=1062 ** Duplicate entry '27-1' for key 3]
          [type] => DB_Error
          [user_info] => INSERT INTO civicrm_uf_match (domain_id , uf_id , uf_name , contact_id ) VALUES ( 1 , 47 , 'adamssam@indiatimes.co.pl' , 27 ) [nativecode=1062 ** Duplicate entry '27-1' for key 3]
          [to_string] => [db_error: message="DB Error: already exists" code=-5 mode=callback callback=CRM_Core_Error::handle prefix="" info="INSERT INTO civicrm_uf_match (domain_id , uf_id , uf_name , contact_id ) VALUES ( 1 , 47 , 'adamssam@indiatimes.co.pl' , 27 ) [nativecode=1062 ** Duplicate entry '27-1' for key 3]"]
      )

      Here is the backtrace
      /var/www/drupal.civicrm.org/svn/civicrm34/CRM/Core/Error.php, backtrace, 159
      , handle,
      /var/www/drupal.civicrm.org/svn/civicrm34/packages/PEAR.php, call_user_func, 931
      /var/www/drupal.civicrm.org/svn/civicrm34/packages/DB.php, PEAR_Error, 968
      /var/www/drupal.civicrm.org/svn/civicrm34/packages/PEAR.php, DB_Error, 564
      /var/www/drupal.civicrm.org/svn/civicrm34/packages/DB/common.php, raiseError, 1903
      /var/www/drupal.civicrm.org/svn/civicrm34/packages/DB/mysql.php, raiseError, 898
      /var/www/drupal.civicrm.org/svn/civicrm34/packages/DB/mysql.php, mysqlRaiseError, 327
      /var/www/drupal.civicrm.org/svn/civicrm34/packages/DB/common.php, simpleQuery, 1216
      /var/www/drupal.civicrm.org/svn/civicrm34/packages/DB/DataObject.php, query, 2424
      /var/www/drupal.civicrm.org/svn/civicrm34/packages/DB/DataObject.php, _query, 1054
      /var/www/drupal.civicrm.org/svn/civicrm34/CRM/Core/DAO.php, insert, 288
      /var/www/drupal.civicrm.org/svn/civicrm34/CRM/Core/BAO/UFMatch.php, save, 194
      /var/www/drupal.civicrm.org/svn/civicrm34/drupal/civicrm.module, synchronize, 541
      /var/www/drupal.civicrm.org/svn/civicrm34/drupal/civicrm.module, civicrm_register_data, 402
      /var/www/drupal.civicrm.org/public/modules/user/user.module, civicrm_user, 21
      /var/www/drupal.civicrm.org/public/modules/user/user.module, user_module_invoke, 339
      /var/www/drupal.civicrm.org/public/modules/user/user.module, user_save, 2360
      /var/www/drupal.civicrm.org/public/includes/form.inc, user_register_submit, 781
      /var/www/drupal.civicrm.org/public/includes/form.inc, form_execute_handlers, 421
      /var/www/drupal.civicrm.org/public/includes/form.inc, drupal_process_form, 120
      , drupal_get_form,
      /var/www/drupal.civicrm.org/public/includes/menu.inc, call_user_func_array, 349
      /var/www/drupal.civicrm.org/public/index.php, menu_execute_active_handler, 17

      We are seeing this issue with clients that have contacts will multiple emails. The individual generally has a personal email and an organization related email.
      They often forget they have an existing account or can't follow the password reset process. So when they try and recreate the account with the first email and it failed because it is duplicate they then go and register again using their secondary email.

      It seems that there are few options for handling this

      1 - change the database constraint to allow the 2 account to be linked to the contact (there is probably some downside to this but none immediately come to mind)
      2 - display a message that this is a duplicate account and provide a link to request a password reset and somehow pre-pop the original email associated with the account)

      The only issue I see with option 2 is that we see a lot of environments where site use is sporadic (only once or twice a year) if the original email on the account is no longer valid there is no way for the user to correct it, so creating a second account is the only solution.


      I think sim

        Activity

        Dave Schafer created issue -
        Kurund Jalmi made changes -
        Field Original Value New Value
        Fix Version/s 4.1 [ 10630 ]
        Hide
        Donald A. Lobo added a comment -

        Resolved this by ensuring that if there is a match (and hence a violation), we create a new contacts and match it to the user record. The organization can then do a merge via the admin screen and sort out what needs to be done
        Show
        Donald A. Lobo added a comment - Resolved this by ensuring that if there is a match (and hence a violation), we create a new contacts and match it to the user record. The organization can then do a merge via the admin screen and sort out what needs to be done
        Donald A. Lobo made changes -
        Status Open [ 1 ] Closed [ 6 ]
        Resolution Fixed/Completed [ 1 ]
        Hide
        Dave Schafer added a comment -
        Lobo
        I'm not really sure the chosen approach is really the most viable.

        Our clients struggle continually with users creating duplicate contacts through various means, this is creating yet another opportunity for that to happen.

        In most cases we expose a lot of contact information via profiles and it could cause a lot of duplication and or support calls if all of a sudden it appeared that a users information was gone. (most user won't realize it is a new account / contact)

        I think it would be preferable to prevent the creation of the new account. The use could receive the message:

        "Sorry, this account cannot be created. The email address <insert new address here> is associated with a contact that has an existing account"

        Show
        Dave Schafer added a comment - Lobo I'm not really sure the chosen approach is really the most viable. Our clients struggle continually with users creating duplicate contacts through various means, this is creating yet another opportunity for that to happen. In most cases we expose a lot of contact information via profiles and it could cause a lot of duplication and or support calls if all of a sudden it appeared that a users information was gone. (most user won't realize it is a new account / contact) I think it would be preferable to prevent the creation of the new account. The use could receive the message: "Sorry, this account cannot be created. The email address <insert new address here> is associated with a contact that has an existing account"
        Donald A. Lobo made changes -
        Resolution Fixed/Completed [ 1 ]
        Status Closed [ 6 ] Reopened [ 4 ]
        Hide
        Donald A. Lobo added a comment -

        I did the fix at a lower level which might be called when synching contacts / login (if accounts were created before civi was installed etc). So I do think the fix makes sense where it is.

        Having a formRule that checks the condition and prevents the above case from happening is potentially a good solution. I took a quick look at the code and the fix is probably a bit more involved than what i patched. We can discuss when we chat next week.
        Show
        Donald A. Lobo added a comment - I did the fix at a lower level which might be called when synching contacts / login (if accounts were created before civi was installed etc). So I do think the fix makes sense where it is. Having a formRule that checks the condition and prevents the above case from happening is potentially a good solution. I took a quick look at the code and the fix is probably a bit more involved than what i patched. We can discuss when we chat next week.
        Donald A. Lobo made changes -
        Fix Version/s 4.2 [ 10680 ]
        Fix Version/s 4.1 [ 10630 ]
        Kurund Jalmi made changes -
        Fix Version/s 4.3 [ 10770 ]
        Fix Version/s 4.2 [ 10680 ]
        Hide
        Jamie Novick added a comment -
        Although not the same issue this is possibly linked:

        On one of our implementations Civi generates a DB error when a new user signs up through drupal to make a donation or personal campaign page (possibly in other scenarios) and where the email address used is already used by 2 or more contacts in CiviCRM. The system tries to link both of the contacts to the drupal user and an error is shown when the second link is unable to be made, then forces people to return to the home screen.

        Has anyone else encountered this issue?

        Although its not the perfect fix but we are intending to modify our code to:

        - On create a new user
        - Check whether the email address is used by more then one contact in civicrm
        - If so, create new contact rather then try and match
        - Admin can then deduplicate manually

        Any thoughts? Should this be raised as a separate bug? Apprecaite this doesnt help with the additional duplicates issue.
        Show
        Jamie Novick added a comment - Although not the same issue this is possibly linked: On one of our implementations Civi generates a DB error when a new user signs up through drupal to make a donation or personal campaign page (possibly in other scenarios) and where the email address used is already used by 2 or more contacts in CiviCRM. The system tries to link both of the contacts to the drupal user and an error is shown when the second link is unable to be made, then forces people to return to the home screen. Has anyone else encountered this issue? Although its not the perfect fix but we are intending to modify our code to: - On create a new user - Check whether the email address is used by more then one contact in civicrm - If so, create new contact rather then try and match - Admin can then deduplicate manually Any thoughts? Should this be raised as a separate bug? Apprecaite this doesnt help with the additional duplicates issue.
        Donald A. Lobo made changes -
        Fix Version/s 4.4 [ 10990 ]
        Fix Version/s 4.3 [ 10770 ]
        Kurund Jalmi made changes -
        Fix Version/s 4.5 [ 11894 ]
        Fix Version/s 4.4 [ 10990 ]
        Kurund Jalmi made changes -
        Fix Version/s 4.6 [ 12097 ]
        Fix Version/s 4.5 [ 11894 ]

          People

          • Assignee:
            Donald A. Lobo
            Reporter:
            Dave Schafer
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:

              Development