You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

user.yml 13KB

Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
4 years ago
Template Repositories (#8768) * Start work on templates Signed-off-by: jolheiser <john.olheiser@gmail.com> * Continue work Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix IsTemplate vs IsGenerated Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix tabs vs spaces * Tabs vs Spaces * Add templates to API & start adding tests Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix integration tests Signed-off-by: jolheiser <john.olheiser@gmail.com> * Remove unused User Signed-off-by: jolheiser <john.olheiser@gmail.com> * Move template tests to existing repos Signed-off-by: jolheiser <john.olheiser@gmail.com> * Minor re-check updates and cleanup Signed-off-by: jolheiser <john.olheiser@gmail.com> * make fmt Signed-off-by: jolheiser <john.olheiser@gmail.com> * Test cleanup Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix optionalbool Signed-off-by: jolheiser <john.olheiser@gmail.com> * make fmt Signed-off-by: jolheiser <john.olheiser@gmail.com> * Test fixes and icon change Signed-off-by: jolheiser <john.olheiser@gmail.com> * Add new user and repo for tests Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix tests (finally) Signed-off-by: jolheiser <john.olheiser@gmail.com> * Update meta repo with env variables Signed-off-by: jolheiser <john.olheiser@gmail.com> * Move generation to create page Combine with repo create template Modify API search to prioritize owner for repo Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix tests and coverage Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix swagger and JS lint Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix API searching for own private repos Signed-off-by: jolheiser <john.olheiser@gmail.com> * Change wording Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix repo search test. User had a private repo that didn't show up Signed-off-by: jolheiser <john.olheiser@gmail.com> * Another search test fix Signed-off-by: jolheiser <john.olheiser@gmail.com> * Clarify git content Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> * Feedback updates Signed-off-by: jolheiser <john.olheiser@gmail.com> * Add topics WIP Signed-off-by: jolheiser <john.olheiser@gmail.com> * Finish adding topics Signed-off-by: jolheiser <john.olheiser@gmail.com> * Update locale Signed-off-by: jolheiser <john.olheiser@gmail.com>
4 years ago
Template Repositories (#8768) * Start work on templates Signed-off-by: jolheiser <john.olheiser@gmail.com> * Continue work Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix IsTemplate vs IsGenerated Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix tabs vs spaces * Tabs vs Spaces * Add templates to API & start adding tests Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix integration tests Signed-off-by: jolheiser <john.olheiser@gmail.com> * Remove unused User Signed-off-by: jolheiser <john.olheiser@gmail.com> * Move template tests to existing repos Signed-off-by: jolheiser <john.olheiser@gmail.com> * Minor re-check updates and cleanup Signed-off-by: jolheiser <john.olheiser@gmail.com> * make fmt Signed-off-by: jolheiser <john.olheiser@gmail.com> * Test cleanup Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix optionalbool Signed-off-by: jolheiser <john.olheiser@gmail.com> * make fmt Signed-off-by: jolheiser <john.olheiser@gmail.com> * Test fixes and icon change Signed-off-by: jolheiser <john.olheiser@gmail.com> * Add new user and repo for tests Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix tests (finally) Signed-off-by: jolheiser <john.olheiser@gmail.com> * Update meta repo with env variables Signed-off-by: jolheiser <john.olheiser@gmail.com> * Move generation to create page Combine with repo create template Modify API search to prioritize owner for repo Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix tests and coverage Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix swagger and JS lint Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix API searching for own private repos Signed-off-by: jolheiser <john.olheiser@gmail.com> * Change wording Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix repo search test. User had a private repo that didn't show up Signed-off-by: jolheiser <john.olheiser@gmail.com> * Another search test fix Signed-off-by: jolheiser <john.olheiser@gmail.com> * Clarify git content Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> * Feedback updates Signed-off-by: jolheiser <john.olheiser@gmail.com> * Add topics WIP Signed-off-by: jolheiser <john.olheiser@gmail.com> * Finish adding topics Signed-off-by: jolheiser <john.olheiser@gmail.com> * Update locale Signed-off-by: jolheiser <john.olheiser@gmail.com>
4 years ago
[RFC] Make archival asynchronous (#11296) * Make archival asynchronous The prime benefit being sought here is for large archives to not clog up the rendering process and cause unsightly proxy timeouts. As a secondary benefit, archive-in-progress is moved out of the way into a /tmp file so that new archival requests for the same commit will not get fulfilled based on an archive that isn't yet finished. This asynchronous system is fairly primitive; request comes in, we'll spawn off a new goroutine to handle it, then we'll mark it as done. Status requests will see if the file exists in the final location, and report the archival as done when it exists. Fixes #11265 * Archive links: drop initial delay to three-quarters of a second Some, or perhaps even most, archives will not take all that long to archive. The archive process starts as soon as the download button is initially clicked, so in theory they could be done quite quickly. Drop the initial delay down to three-quarters of a second to make it more responsive in the common case of the archive being quickly created. * archiver: restructure a little bit to facilitate testing This introduces two sync.Cond pointers to the archiver package. If they're non-nil when we go to process a request, we'll wait until signalled (at all) to proceed. The tests will then create the sync.Cond so that it can signal at-will and sanity-check the state of the queue at different phases. The author believes that nil-checking these two sync.Cond pointers on every archive processing will introduce minimal overhead with no impact on maintainability. * gofmt nit: no space around binary + operator * services: archiver: appease golangci-lint, lock queueMutex Locking/unlocking the queueMutex is allowed, but not required, for Cond.Signal() and Cond.Broadcast(). The magic at play here is just a little too much for golangci-lint, as we take the address of queueMutex and this is mostly used in archiver.go; the variable still gets flagged as unused. * archiver: tests: fix several timing nits Once we've signaled a cond var, it may take some small amount of time for the goroutines released to hit the spot we're wanting them to be at. Give them an appropriate amount of time. * archiver: tests: no underscore in var name, ungh * archiver: tests: Test* is run in a separate context than TestMain We must setup the mutex/cond variables at the beginning of any test that's going to use it, or else these will be nil when the test is actually ran. * archiver: tests: hopefully final tweak Things got shuffled around such that we carefully build up and release requests from the queue, so we can validate the state of the queue at each step. Fix some assertions that no longer hold true as fallout. * repo: Download: restore some semblance of previous behavior When archival was made async, the GET endpoint was only useful if a previous POST had initiated the download. This commit restores the previous behavior, to an extent; we'll now submit the archive request there and return a "202 Accepted" to indicate that it's processing if we didn't manage to complete the request within ~2 seconds of submission. This lets a client directly GET the archive, and gives them some indication that they may attempt to GET it again at a later time. * archiver: tests: simplify a bit further We don't need to risk failure and use time.ParseDuration to get 2 * time.Second. else if isn't really necessary if the conditions are simple enough and lead to the same result. * archiver: tests: resolve potential source of flakiness Increase all timeouts to 10 seconds; these aren't hard-coded sleeps, so there's no guarantee we'll actually take that long. If we need longer to not have a false-positive, then so be it. While here, various assert.{Not,}Equal arguments are flipped around so that the wording in error output reflects reality, where the expected argument is second and actual third. * archiver: setup infrastructure for notifying consumers of completion This API will *not* allow consumers to subscribe to specific requests being completed, just *any* request being completed. The caller is responsible for determining if their request is satisfied and waiting again if needed. * repo: archive: make GET endpoint synchronous again If the request isn't complete, this endpoint will now submit the request and wait for completion using the new API. This may still be susceptible to timeouts for larger repos, but other endpoints now exist that the web interface will use to negotiate its way through larger archive processes. * archiver: tests: amend test to include WaitForCompletion() This is a trivial one, so go ahead and include it. * archiver: tests: fix test by calling NewContext() The mutex is otherwise uninitialized, so we need to ensure that we're actually initializing it if we plan to test it. * archiver: tests: integrate new WaitForCompletion a little better We can use this to wait for archives to come in, rather than spinning and hoping with a timeout. * archiver: tests: combine numQueued declaration with next-instruction assignment * routers: repo: reap unused archiving flag from DownloadStatus() This had some planned usage before, indicating whether this request initiated the archival process or not. After several rounds of refactoring, this use was deemed not necessary for much of anything and got boiled down to !complete in all cases. * services: archiver: restructure to use a channel We now offer two forms of waiting for a request: - WaitForCompletion: wait for completion with no timeout - TimedWaitForCompletion: wait for completion with timeout In both cases, we wait for the given request's cchan to close; in the latter case, we do so with the caller-provided timeout. This completely removes the need for busy-wait loops in Download/InitiateDownload, as it's fairly clean to wait on a channel with timeout. * services: archiver: use defer to unlock now that we can This previously carried the lock into the goroutine, but an intermediate step just added the request to archiveInProgress outside of the new goroutine and removed the need for the goroutine to start out with it. * Revert "archiver: tests: combine numQueued declaration with next-instruction assignment" This reverts commit bcc52140238e16680f2e05e448e9be51372afdf5. Revert "archiver: tests: integrate new WaitForCompletion a little better" This reverts commit 9fc8bedb5667d24d3a3c7843dc28a229efffb1e6. Revert "archiver: tests: fix test by calling NewContext()" This reverts commit 709c35685eaaf261ebbb7d3420e3376a4ee8e7f2. Revert "archiver: tests: amend test to include WaitForCompletion()" This reverts commit 75261f56bc05d1fa8ff7e81dcbc0ccd93fdc9d50. * archiver: tests: first attempt at WaitForCompletion() tests * archiver: tests: slight improvement, less busy-loop Just wait for the requests to complete in order, instead of busy-waiting with a timeout. This is slightly less fragile. While here, reverse the arguments of a nearby assert.Equal() so that expected/actual are correct in any test output. * archiver: address lint nits * services: archiver: only close the channel once * services: archiver: use a struct{} for the wait channel This makes it obvious that the channel is only being used as a signal, rather than anything useful being piped through it. * archiver: tests: fix expectations Move the close of the channel into doArchive() itself; notably, before these goroutines move on to waiting on the Release cond. The tests are adjusted to reflect that we can't WaitForCompletion() after they've already completed, as WaitForCompletion() doesn't indicate that they've been released from the queue yet. * archiver: tests: set cchan to nil for comparison * archiver: move ctx.Error's back into the route handlers We shouldn't be setting this in a service, we should just be validating the request that we were handed. * services: archiver: use regex to match a hash This makes sure we don't try and use refName as a hash when it's clearly not one, e.g. heads/pull/foo. * routers: repo: remove the weird /archive/status endpoint We don't need to do this anymore, we can just continue POSTing to the archive/* endpoint until we're told the download's complete. This avoids a potential naming conflict, where a ref could start with "status/" * archiver: tests: bump reasonable timeout to 15s * archiver: tests: actually release timedReq * archiver: tests: run through inFlight instead of manually checking While we're here, add a test for manually re-processing an archive that's already been complete. Re-open the channel and mark it incomplete, so that doArchive can just mark it complete again. * initArchiveLinks: prevent default behavior from clicking * archiver: alias gitea's context, golang context import pending * archiver: simplify logic, just reconstruct slices While the previous logic was perhaps slightly more efficient, the new variant's readability is much improved. * archiver: don't block shutdown on waiting for archive The technique established launches a goroutine to do the wait, which will close a wait channel upon termination. For the timeout case, we also send back a value indicating whether the timeout was hit or not. The timeouts are expected to be relatively small, but still a multi- second delay to shutdown due to this could be unfortunate. * archiver: simplify shutdown logic We can just grab the shutdown channel from the graceful manager instead of constructing a channel to halt the caller and/or pass a result back. * Style issues * Fix mis-merge Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: Lauris BH <lauris@nix.lv>
3 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
4 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. # NOTE: all users should have a password of "password"
  2. - # NOTE: this user (id=1) is the admin
  3. id: 1
  4. lower_name: user1
  5. name: user1
  6. full_name: User One
  7. email: user1@example.com
  8. email_notifications_preference: enabled
  9. passwd_hash_algo: argon2
  10. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  11. type: 0 # individual
  12. salt: ZogKvWdyEx
  13. is_admin: true
  14. avatar: avatar1
  15. avatar_email: user1@example.com
  16. num_repos: 0
  17. is_active: true
  18. -
  19. id: 2
  20. lower_name: user2
  21. name: user2
  22. full_name: " < U<se>r Tw<o > >< "
  23. email: user2@example.com
  24. keep_email_private: true
  25. email_notifications_preference: enabled
  26. passwd_hash_algo: argon2
  27. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  28. type: 0 # individual
  29. salt: ZogKvWdyEx
  30. is_admin: false
  31. avatar: avatar2
  32. avatar_email: user2@example.com
  33. num_repos: 9
  34. num_stars: 2
  35. num_followers: 2
  36. num_following: 1
  37. is_active: true
  38. -
  39. id: 3
  40. lower_name: user3
  41. name: user3
  42. full_name: " <<<< >> >> > >> > >>> >> "
  43. email: user3@example.com
  44. email_notifications_preference: onmention
  45. passwd_hash_algo: argon2
  46. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  47. type: 1 # organization
  48. salt: ZogKvWdyEx
  49. is_admin: false
  50. avatar: avatar3
  51. avatar_email: user3@example.com
  52. num_repos: 3
  53. num_members: 3
  54. num_teams: 4
  55. -
  56. id: 4
  57. lower_name: user4
  58. name: user4
  59. full_name: " "
  60. email: user4@example.com
  61. email_notifications_preference: onmention
  62. passwd_hash_algo: argon2
  63. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  64. type: 0 # individual
  65. salt: ZogKvWdyEx
  66. is_admin: false
  67. avatar: avatar4
  68. avatar_email: user4@example.com
  69. num_repos: 0
  70. num_following: 1
  71. is_active: true
  72. -
  73. id: 5
  74. lower_name: user5
  75. name: user5
  76. full_name: User Five
  77. email: user5@example.com
  78. email_notifications_preference: enabled
  79. passwd_hash_algo: argon2
  80. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  81. type: 0 # individual
  82. salt: ZogKvWdyEx
  83. is_admin: false
  84. avatar: avatar5
  85. avatar_email: user5@example.com
  86. num_repos: 1
  87. allow_create_organization: false
  88. is_active: true
  89. num_following: 0
  90. -
  91. id: 6
  92. lower_name: user6
  93. name: user6
  94. full_name: User Six
  95. email: user6@example.com
  96. email_notifications_preference: enabled
  97. passwd_hash_algo: argon2
  98. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  99. type: 1 # organization
  100. salt: ZogKvWdyEx
  101. is_admin: false
  102. avatar: avatar6
  103. avatar_email: user6@example.com
  104. num_repos: 0
  105. num_members: 2
  106. num_teams: 2
  107. -
  108. id: 7
  109. lower_name: user7
  110. name: user7
  111. full_name: User Seven
  112. email: user7@example.com
  113. email_notifications_preference: disabled
  114. passwd_hash_algo: argon2
  115. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  116. type: 1 # organization
  117. salt: ZogKvWdyEx
  118. is_admin: false
  119. avatar: avatar7
  120. avatar_email: user7@example.com
  121. num_repos: 0
  122. num_members: 1
  123. num_teams: 1
  124. -
  125. id: 8
  126. lower_name: user8
  127. name: user8
  128. full_name: User Eight
  129. email: user8@example.com
  130. email_notifications_preference: enabled
  131. passwd_hash_algo: argon2
  132. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  133. type: 0 # individual
  134. salt: ZogKvWdyEx
  135. is_admin: false
  136. avatar: avatar8
  137. avatar_email: user8@example.com
  138. num_repos: 0
  139. is_active: true
  140. num_followers: 1
  141. num_following: 1
  142. -
  143. id: 9
  144. lower_name: user9
  145. name: user9
  146. full_name: User Nine
  147. email: user9@example.com
  148. email_notifications_preference: onmention
  149. passwd_hash_algo: argon2
  150. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  151. type: 0 # individual
  152. salt: ZogKvWdyEx
  153. is_admin: false
  154. avatar: avatar9
  155. avatar_email: user9@example.com
  156. num_repos: 0
  157. is_active: false
  158. -
  159. id: 10
  160. lower_name: user10
  161. name: user10
  162. full_name: User Ten
  163. email: user10@example.com
  164. passwd_hash_algo: argon2
  165. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  166. type: 0 # individual
  167. salt: ZogKvWdyEx
  168. is_admin: false
  169. avatar: avatar10
  170. avatar_email: user10@example.com
  171. num_repos: 3
  172. is_active: true
  173. -
  174. id: 11
  175. lower_name: user11
  176. name: user11
  177. full_name: User Eleven
  178. email: user11@example.com
  179. passwd_hash_algo: argon2
  180. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  181. type: 0 # individual
  182. salt: ZogKvWdyEx
  183. is_admin: false
  184. avatar: avatar11
  185. avatar_email: user11@example.com
  186. num_repos: 1
  187. is_active: true
  188. -
  189. id: 12
  190. lower_name: user12
  191. name: user12
  192. full_name: User 12
  193. email: user12@example.com
  194. passwd_hash_algo: argon2
  195. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  196. type: 0 # individual
  197. salt: ZogKvWdyEx
  198. is_admin: false
  199. avatar: avatar12
  200. avatar_email: user12@example.com
  201. num_repos: 1
  202. is_active: true
  203. -
  204. id: 13
  205. lower_name: user13
  206. name: user13
  207. full_name: User 13
  208. email: user13@example.com
  209. passwd_hash_algo: argon2
  210. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  211. type: 0 # individual
  212. salt: ZogKvWdyEx
  213. is_admin: false
  214. avatar: avatar13
  215. avatar_email: user13@example.com
  216. num_repos: 1
  217. is_active: true
  218. -
  219. id: 14
  220. lower_name: user14
  221. name: user14
  222. full_name: User 14
  223. email: user14@example.com
  224. passwd_hash_algo: argon2
  225. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  226. type: 0 # individual
  227. salt: ZogKvWdyEx
  228. is_admin: false
  229. avatar: avatar14
  230. avatar_email: user13@example.com
  231. num_repos: 3
  232. is_active: true
  233. -
  234. id: 15
  235. lower_name: user15
  236. name: user15
  237. full_name: User 15
  238. email: user15@example.com
  239. passwd_hash_algo: argon2
  240. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  241. type: 0 # individual
  242. salt: ZogKvWdyEx
  243. is_admin: false
  244. avatar: avatar15
  245. avatar_email: user15@example.com
  246. num_repos: 4
  247. is_active: true
  248. -
  249. id: 16
  250. lower_name: user16
  251. name: user16
  252. full_name: User 16
  253. email: user16@example.com
  254. passwd_hash_algo: argon2
  255. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  256. type: 0 # individual
  257. salt: ZogKvWdyEx
  258. is_admin: false
  259. avatar: avatar16
  260. avatar_email: user16@example.com
  261. num_repos: 2
  262. is_active: true
  263. -
  264. id: 17
  265. lower_name: user17
  266. name: user17
  267. full_name: User 17
  268. email: user17@example.com
  269. passwd_hash_algo: argon2
  270. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  271. type: 1 # organization
  272. salt: ZogKvWdyEx
  273. is_admin: false
  274. avatar: avatar17
  275. avatar_email: user17@example.com
  276. num_repos: 2
  277. is_active: true
  278. num_members: 3
  279. num_teams: 3
  280. -
  281. id: 18
  282. lower_name: user18
  283. name: user18
  284. full_name: User 18
  285. email: user18@example.com
  286. passwd_hash_algo: argon2
  287. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  288. type: 0 # individual
  289. salt: ZogKvWdyEx
  290. is_admin: false
  291. avatar: avatar18
  292. avatar_email: user18@example.com
  293. num_repos: 0
  294. is_active: true
  295. -
  296. id: 19
  297. lower_name: user19
  298. name: user19
  299. full_name: User 19
  300. email: user19@example.com
  301. passwd_hash_algo: argon2
  302. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  303. type: 1 # organization
  304. salt: ZogKvWdyEx
  305. is_admin: false
  306. avatar: avatar19
  307. avatar_email: user19@example.com
  308. num_repos: 2
  309. is_active: true
  310. num_members: 1
  311. num_teams: 1
  312. -
  313. id: 20
  314. lower_name: user20
  315. name: user20
  316. full_name: User 20
  317. email: user20@example.com
  318. passwd_hash_algo: argon2
  319. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  320. type: 0 # individual
  321. salt: ZogKvWdyEx
  322. is_admin: false
  323. avatar: avatar20
  324. avatar_email: user20@example.com
  325. num_repos: 4
  326. is_active: true
  327. -
  328. id: 21
  329. lower_name: user21
  330. name: user21
  331. full_name: User 21
  332. email: user21@example.com
  333. passwd_hash_algo: argon2
  334. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  335. type: 0 # individual
  336. salt: ZogKvWdyEx
  337. is_admin: false
  338. avatar: avatar21
  339. avatar_email: user21@example.com
  340. num_repos: 2
  341. is_active: true
  342. -
  343. id: 22
  344. lower_name: limited_org
  345. name: limited_org
  346. full_name: Limited Org
  347. email: limited_org@example.com
  348. passwd_hash_algo: argon2
  349. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  350. type: 1 # organization
  351. salt: ZogKvWdyEx
  352. is_admin: false
  353. avatar: avatar22
  354. avatar_email: limited_org@example.com
  355. num_repos: 2
  356. is_active: true
  357. num_members: 0
  358. num_teams: 0
  359. visibility: 1
  360. -
  361. id: 23
  362. lower_name: privated_org
  363. name: privated_org
  364. full_name: Privated Org
  365. email: privated_org@example.com
  366. passwd_hash_algo: argon2
  367. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  368. type: 1 # organization
  369. salt: ZogKvWdyEx
  370. is_admin: false
  371. avatar: avatar23
  372. avatar_email: privated_org@example.com
  373. num_repos: 2
  374. is_active: true
  375. num_members: 0
  376. num_teams: 0
  377. visibility: 2
  378. -
  379. id: 24
  380. lower_name: user24
  381. name: user24
  382. full_name: "user24"
  383. email: user24@example.com
  384. keep_email_private: true
  385. passwd_hash_algo: argon2
  386. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  387. type: 0 # individual
  388. salt: ZogKvWdyEx
  389. is_admin: false
  390. avatar: avatar24
  391. avatar_email: user24@example.com
  392. num_repos: 0
  393. num_stars: 0
  394. num_followers: 0
  395. num_following: 0
  396. is_active: true
  397. -
  398. id: 25
  399. lower_name: org25
  400. name: org25
  401. full_name: "org25"
  402. email: org25@example.com
  403. passwd_hash_algo: argon2
  404. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  405. type: 1 # organization
  406. salt: ZogKvWdyEx
  407. is_admin: false
  408. avatar: avatar25
  409. avatar_email: org25@example.com
  410. num_repos: 0
  411. num_members: 1
  412. num_teams: 1
  413. -
  414. id: 26
  415. lower_name: org26
  416. name: org26
  417. full_name: "Org26"
  418. email: org26@example.com
  419. email_notifications_preference: onmention
  420. passwd_hash_algo: argon2
  421. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  422. type: 1 # organization
  423. salt: ZogKvWdyEx
  424. is_admin: false
  425. avatar: avatar26
  426. avatar_email: org26@example.com
  427. num_repos: 4
  428. num_members: 0
  429. num_teams: 1
  430. repo_admin_change_team_access: true
  431. -
  432. id: 27
  433. lower_name: user27
  434. name: user27
  435. full_name: User Twenty-Seven
  436. email: user27@example.com
  437. email_notifications_preference: enabled
  438. passwd_hash_algo: argon2
  439. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  440. type: 0 # individual
  441. salt: ZogKvWdyEx
  442. is_admin: false
  443. avatar: avatar27
  444. avatar_email: user27@example.com
  445. num_repos: 3
  446. -
  447. id: 28
  448. lower_name: user28
  449. name: user28
  450. full_name: "user27"
  451. email: user28@example.com
  452. keep_email_private: true
  453. passwd_hash_algo: argon2
  454. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  455. type: 0 # individual
  456. salt: ZogKvWdyEx
  457. is_admin: false
  458. avatar: avatar28
  459. avatar_email: user28@example.com
  460. num_repos: 0
  461. num_stars: 0
  462. num_followers: 0
  463. num_following: 0
  464. is_active: true
  465. -
  466. id: 29
  467. lower_name: user29
  468. name: user29
  469. full_name: User 29
  470. email: user29@example.com
  471. passwd_hash_algo: argon2
  472. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  473. type: 0 # individual
  474. salt: ZogKvWdyEx
  475. is_admin: false
  476. is_restricted: true
  477. avatar: avatar29
  478. avatar_email: user29@example.com
  479. num_repos: 0
  480. is_active: true
  481. -
  482. id: 30
  483. lower_name: user30
  484. name: user30
  485. full_name: User Thirty
  486. email: user30@example.com
  487. passwd_hash_algo: argon2
  488. passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
  489. type: 0 # individual
  490. salt: ZogKvWdyEx
  491. is_admin: false
  492. is_restricted: true
  493. avatar: avatar29
  494. avatar_email: user30@example.com
  495. num_repos: 2
  496. is_active: true