The User management REST API allows restricted fields of synced accounts to be modified if the account becomes unverified

XMLWordPrintable

    • Severity 3 - Minor

      Issue Summary

      For synced accounts, many profile fields — including Full name, Email, Job title, Department, and Organization — are restricted from editing locally and should only be updated via user provisioning. However, these restricted fields can currently be modified via the User management REST API if the account's verification status changes to Unverified.

      Steps to Reproduce

      1. Sync an account via user provisioning (SCIM, Google Workspaces integration, or Azure AD sync for nested groups integration)
      2. Make a change that updates the account's status to Unverified.
        • Current research seems to indicate that this may occur intermittently when the account's email is updated via user provisioning.
      3. Call Get user management permissions against the synced account.
      4. Call Set email against the synced account to update its email.
      5. Call Update profile against the synced account to update the name value.

      Expected Results

      Step 3: Get user management permissions

      The response body matches the below:

      {
          "email.set": {
              "allowed": false,
              "reason": {
                  "key": "externalDirectory.scim"
              }
          },
          "lifecycle.enablement": {
              "allowed": false,
              "reason": {
                  "key": "externalDirectory.scim"
              }
          },
          "lifecycle.delete": {
              "allowed": false
          },
          "profile": {
              "name": {
                  "allowed": false,
                  "reason": {
                      "key": "externalDirectory.scim"
                  }
              },
              "nickname": {
                  "allowed": true
              },
              "zoneinfo": {
                  "allowed": true
              },
              "locale": {
                  "allowed": true
              },
              "extended_profile.phone_number": {
                  "allowed": true
              },
              "extended_profile.job_title": {
                  "allowed": false,
                  "reason": {
                      "key": "externalDirectory.scim"
                  }
              },
              "extended_profile.organization": {
                  "allowed": false,
                  "reason": {
                      "key": "externalDirectory.scim"
                  }
              },
              "extended_profile.department": {
                  "allowed": false,
                  "reason": {
                      "key": "externalDirectory.scim"
                  }
              },
              "extended_profile.location": {
                  "allowed": true
              },
              "extended_profile.team_type": {
                  "allowed": true
              }
          },
          "profile.write": {
              "name": {
                  "allowed": false,
                  "reason": {
                      "key": "externalDirectory.scim"
                  }
              },
              "nickname": {
                  "allowed": true
              },
              "zoneinfo": {
                  "allowed": true
              },
              "locale": {
                  "allowed": true
              },
              "extended_profile.phone_number": {
                  "allowed": true
              },
              "extended_profile.job_title": {
                  "allowed": false,
                  "reason": {
                      "key": "externalDirectory.scim"
                  }
              },
              "extended_profile.organization": {
                  "allowed": false,
                  "reason": {
                      "key": "externalDirectory.scim"
                  }
              },
              "extended_profile.department": {
                  "allowed": false,
                  "reason": {
                      "key": "externalDirectory.scim"
                  }
              },
              "extended_profile.location": {
                  "allowed": true
              },
              "extended_profile.team_type": {
                  "allowed": true
              }
          },
          "profile.read": {
              "allowed": true
          },
          "linkedAccounts.read": {
              "allowed": true
          },
          "apiToken.read": {
              "allowed": true
          },
          "apiToken.create": {
              "allowed": false,
              "reason": {
                  "key": "myselfOnly"
              }
          },
          "apiToken.delete": {
              "allowed": true
          },
          "avatar": {
              "allowed": true
          },
          "privacy.set": {
              "allowed": false,
              "reason": {
                  "key": "myselfOnly"
              }
          },
          "session.read": {
              "allowed": true
          },
          "session.delete": {
              "allowed": true
          },
          "refreshToken.delete": {
              "allowed": true
          }
      }
      • Note: It is expected that lifecycle.delete will return "allowed": true if the account_status is inactive.

      Step 4: Set email

      The email update attempt fails with the below response body:

      {
          "key": "forbidden.action",
          "context": {
              "allowed": false,
              "reason": {
                  "key": "externalDirectory.scim"
              }
          },
          "errorKey": "forbidden.action",
          "errorDetail": {
              "allowed": false,
              "reason": {
                  "key": "externalDirectory.scim"
              }
          }
      }

      Step 5: Update profile

      The profile update attempt fails with the below response body:

      {
          "key": "forbidden.fieldMutation",
          "context": {
              "name": {
                  "allowed": false,
                  "reason": {
                      "key": "externalDirectory.scim"
                  }
              }
          },
          "errorKey": "forbidden.field-mutation",
          "errorDetail": {
              "name": {
                  "allowed": false,
                  "reason": {
                      "key": "externalDirectory.scim"
                  }
              }
          }
      }

      Actual Results

      Step 3: Get user management permissions

      The response body matches the below:

      {
          "email.set": {
              "allowed": true
          },
          "lifecycle.enablement": {
              "allowed": true
          },
          "lifecycle.delete": {
              "allowed": false
          },
          "profile": {
              "name": {
                  "allowed": true
              },
              "nickname": {
                  "allowed": true
              },
              "zoneinfo": {
                  "allowed": true
              },
              "locale": {
                  "allowed": true
              },
              "extended_profile.phone_number": {
                  "allowed": true
              },
              "extended_profile.job_title": {
                  "allowed": true
              },
              "extended_profile.organization": {
                  "allowed": true
              },
              "extended_profile.department": {
                  "allowed": true
              },
              "extended_profile.location": {
                  "allowed": true
              },
              "extended_profile.team_type": {
                  "allowed": true
              }
          },
          "profile.write": {
              "name": {
                  "allowed": true
              },
              "nickname": {
                  "allowed": true
              },
              "zoneinfo": {
                  "allowed": true
              },
              "locale": {
                  "allowed": true
              },
              "extended_profile.phone_number": {
                  "allowed": true
              },
              "extended_profile.job_title": {
                  "allowed": true
              },
              "extended_profile.organization": {
                  "allowed": true
              },
              "extended_profile.department": {
                  "allowed": true
              },
              "extended_profile.location": {
                  "allowed": true
              },
              "extended_profile.team_type": {
                  "allowed": true
              }
          },
          "profile.read": {
              "allowed": true
          },
          "linkedAccounts.read": {
              "allowed": true
          },
          "apiToken.read": {
              "allowed": true
          },
          "apiToken.create": {
              "allowed": false,
              "reason": {
                  "key": "myselfOnly"
              }
          },
          "apiToken.delete": {
              "allowed": true
          },
          "avatar": {
              "allowed": true
          },
          "privacy.set": {
              "allowed": false,
              "reason": {
                  "key": "myselfOnly"
              }
          },
          "session.read": {
              "allowed": true
          },
          "session.delete": {
              "allowed": true
          },
          "refreshToken.delete": {
              "allowed": true
          }
      }

      Step 4: Set email

      The account's email is updated successfully.

      Step 5: Update profile

      The account's Full name (name attribute) is updated successfully.

      Workaround

      Currently there is no known workaround for this behavior. A workaround will be added here when available

            Assignee:
            Morgan Green
            Reporter:
            John A [Atlassian Support]
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: