Commit Graph

32 Commits

Author SHA1 Message Date
Rémy Coutable aa54bb7e5a Fix logic in Users::CreateService broken by the fix for OAuth users
Signed-off-by: Rémy Coutable <remy@rymai.me>
2017-04-26 10:08:44 +02:00
Rémy Coutable fa01c37359 Ensures that OAuth/LDAP/SAML users don't need to be confirmed
Signed-off-by: Rémy Coutable <remy@rymai.me>
2017-04-26 10:08:44 +02:00
Douwe Maan d7e2ac7293 Fix OAuth, LDAP and SAML SSO when regular sign-ups are disabled 2017-04-24 19:27:39 -07:00
Timothy Andrew 133f00bedd Move records to the ghost user in a transaction.
- While deleting a user, some of the user's associated records are moved to the
  ghost user so they aren't deleted. The user is blocked before these records
  are moved, to prevent the user from creating new records while the migration
  is happening, and so preventing a data race.

- Previously, if the migration failed, the user would _remain_ blocked, which is
  not the expected behavior. On the other hand, we can't just stick the block +
  migration into a transaction, because we want the block to be committed before
  the migration starts (for the data race reason mentioned above).

- One solution (implemented in this commit) is to block the user in a parent
  transaction, migrate the associated records in a nested sub-transaction, and
  then unblock the user in the parent transaction if the sub-transaction fails.
2017-04-24 06:46:10 +00:00
Sean McGivern 40a972057d Merge branch 'usage-ping-port' into 'master'
Usage ping port

Closes #27750

See merge request !10481
2017-04-19 14:48:31 +00:00
Stan Hu 60eee739f0 Hard delete users' associated records deleted from AbuseReports
In the case of spammers, we really want a hard delete to avoid retaining spam.

Closes #31021
2017-04-16 08:36:33 -07:00
Rémy Coutable cfe19b795e Add a new Gitlab::UserActivities class to track user activities
This new class uses a Redis Hash instead of a Sorted Set.

Signed-off-by: Rémy Coutable <remy@rymai.me>
2017-04-14 15:20:55 +02:00
James Lopez 3cb84e06b7 Remove user activities table and use redis instead of PG for recording activities
Refactored specs and added a post deployment migration to remove the activity users table.
2017-04-14 15:20:55 +02:00
James Lopez 2951a8543e Add user activity service and spec. Also added relevant - NOT offline - migration
It uses a user activity table instead of a column in users.
Tested with mySQL and postgreSQL
2017-04-14 15:20:55 +02:00
geoandri defbff482d Implement Users::BuildService 2017-04-13 13:02:59 +03:00
blackst0ne 11aff97d88 Remove the User#is_admin? method 2017-04-09 13:20:57 +11:00
Douwe Maan bef1aca883 Merge branch '28695-move-all-associated-records-to-ghost-user' into 'master'
Resolve "Deleting a user shouldn't delete associated records"

Closes #28695 and #30514

See merge request !10467
2017-04-06 18:54:57 +00:00
Timothy Andrew 1c42505b02
Implement review comments from @DouweM for !10467.
1. Have `MigrateToGhostUser` be a service rather than a mixed-in module, to keep
   things explicit. Specs testing the behavior of this class are moved into a
   separate service spec file.

2. Add a `user.reported_abuse_reports` association to make the
   `migrate_abuse_reports` method more consistent with the other `migrate_`
   methods.
2017-04-06 22:39:40 +05:30
Timothy Andrew 72580f07af
Move a user's merge requests to the ghost user.
1. When the user is deleted.

2. Refactor out code relating to "migrating records to the ghost user" into a
   `MigrateToGhostUser` concern, which is tested using a shared example.
2017-04-06 18:58:57 +05:30
DJ Mountney a766f60a0b Inlude the password_automatically_check param as permitted config in the user create_service
This param is passed to service in two places, one is in the build_user for non ldap oauth users. And the other is in the initial production admin user seed data.

Without this change, when setting up GitLab in a production environment, you were not being given the option of setting the root password on initial setup in the UI.
2017-04-04 10:18:56 -07:00
Stan Hu 8a71d40e60 Fix race condition where a namespace would be deleted before a project was deleted
When deleting a user, the following sequence could happen:

1. Project `mygroup/myproject` is scheduled for deletion
2. The group `mygroup` is deleted
3. Sidekiq worker runs to delete `mygroup/myproject`, but the namespace and routes have
   been destroyed.

Closes #30334
2017-04-02 05:37:04 -07:00
Rémy Coutable 53ef1de4fc
Fix production admin fixture to use the new `Users::CreateService`
Signed-off-by: Rémy Coutable <remy@rymai.me>
2017-03-30 10:41:45 +02:00
George Andrinopoulos 7c74a0209b Implement new service for creating user 2017-03-27 09:37:24 +00:00
Douwe Maan 871bed7ac0 Use Enumerable#index_by where possible 2017-03-16 16:33:15 -06:00
Douwe Maan 05f331f3ce
Fix access to projects shared with a nested group
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
2017-02-28 14:18:20 +02:00
Timothy Andrew 6fdb17cbbe
Don't allow deleting a ghost user.
- Add a `destroy_user` ability. This didn't exist before, and was implicit in
  other abilities (only admins could access the admin area, so only they could
  destroy all users; a user can only access their own account page, and so can
  destroy only themselves).

- Grant this ability to admins, and when the current user is trying to destroy
  themselves. Disallow destroying ghost users in all cases.

- Modify the `Users::DestroyService` to check this ability. Also check it in
  views to decide whether or not to show the "Delete User" button.

- Add a short summary of the Ghost User to the bio.
2017-02-24 16:50:20 +05:30
Timothy Andrew f2ed82fa84
Implement final review comments from @DouweM and @rymai
- Have `Uniquify` take a block instead of a Proc/function. This is more
  idiomatic than passing around a function in Ruby.

- Block a user before moving their issues to the ghost user. This avoids a data
  race where an issue is created after the issues are migrated to the ghost user,
  and before the destroy takes place.

- No need to migrate issues (to the ghost user) in a transaction, because
  we're using `update_all`

- Other minor changes
2017-02-24 16:50:20 +05:30
Timothy Andrew 53c34c7436
Implement review comments from @DouweM and @nick.thomas.
1. Use an advisory lock to guarantee the absence of concurrency in `User.ghost`,
to prevent data races from creating more than one ghost, or preventing the
creation of ghost users by causing validation errors.

2. Use `update_all` instead of updating issues one-by-one.
2017-02-24 16:50:19 +05:30
Timothy Andrew ff19bbd3b4
Deleting a user shouldn't delete associated issues.
- "Associated" issues are issues the user has created + issues that the
  user is assigned to.

- Issues that a user owns are transferred to a "Ghost User" (just a
  regular user with `state = 'ghost'` that is created when
  `User.ghost` is called).

- Issues that a user is assigned to are moved to the "Unassigned" state.

- Fix a spec failure in `profile_spec` — a spec was asserting that when a user
  is deleted, `User.count` decreases by 1. After this change, deleting a user
  creates (potentially) a ghost user, causing `User.count` not to change. The
  spec has been updated to look for the relevant user in the assertion.
2017-02-24 16:50:19 +05:30
Stan Hu e23c803769
Add user deletion permission check in `Users::DestroyService`
We saw from a recent incident that the `Users::DestroyService` would
attempt to delete a user over and over. Revoking the permissions
from the current user did not help. We should ensure that the
current user does, in fact, have permissions to delete the user.

Signed-off-by: Rémy Coutable <remy@rymai.me>
2017-02-20 17:19:11 +01:00
dixpac 0dacf3c169 Fix inconsistent naming for services that delete things
* Changed name of delete_user_service and worker to destroy
* Move and change delete_group_service to Groups::DestroyService
* Rename Notes::DeleteService to Notes::DestroyService
2017-02-08 09:16:43 +01:00
Dmitriy Zaporozhets 8a9597fc73 Merge branch 'dz-nested-groups-access-improvements' into 'master'
Nested groups feature improvemetns

See merge request !8448
2017-01-25 13:17:43 +00:00
Dmitriy Zaporozhets 52c5f9c97f
Add User#nested_groups and User#nested_projects methods
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
2017-01-25 13:43:15 +02:00
Yorick Peterse 6f88984b0d
Synchronize all project authorization refreshing
Previously a lease would only be obtained to update data. This could
lead to duplicate data being inserted, triggering a UNIQUE constraint
error. To work around this we now acquire a lease before performing
_any_ project authorization work, releasing it at the very end.

Fixes #25987
2017-01-16 16:37:48 -05:00
Yorick Peterse de321fbbb5
Remove the project_authorizations.id column
This column used to be a 32 bits integer, allowing for only a maximum of
2 147 483 647 rows. Given enough users one can hit this limit pretty
quickly, as was the case for GitLab.com.

Changing this type to bigint (= 64 bits) would give us more space, but
we'd eventually hit the same limit given enough users and projects. A
much more sustainable solution is to simply drop the "id" column.

There were only 2 lines of code depending on this column being present,
and neither truly required it to be present. Instead the code now uses
the "project_id" column combined with the "user_id" column. This means
that instead of something like this:

    DELETE FROM project_authorizations
    WHERE user_id = X
    AND id = Y;

We now run the following when removing rows:

    DELETE FROM project_authorizations
    WHERE user_id = X
    AND project_id = Y;

Since both user_id and project_id are indexed this should not slow down
the DELETE query.

This commit also removes the "dependent: destroy" clause from the
"project_authorizations" relation in the User and Project models.
Keeping this prevents Rails from being able to remove data as it relies
on an "id" column being present. Since the "project_authorizations"
table has proper foreign keys set up (with cascading removals) we don't
need to depend on any Rails logic.
2017-01-08 13:56:50 +01:00
Adam Niedzielski f0ba001877 Cache project authorizations even when user has access to zero projects 2016-12-28 14:41:30 +01:00
Yorick Peterse f73193c328
Smarter refreshing of authorized projects
Prior to this commit the refreshing of authorized projects was done in
two steps:

1. Remove existing authorizations
2. Insert a new list of all authorizations

This can lead to a high amount of dead tuples as every time all rows are
being replaced. For example, if a user with 100 authorizations is given
access to a new project this would lead to:

* 100 rows being removed
* 101 new rows being inserted

This commit changes the way this system works so it only removes/inserts
what is necessary. Using the above example this would lead to only 1 new
row being inserted, with the initial 100 being left untouched.

Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/25257
2016-12-19 17:11:03 +01:00