/engine/api/authentication/consumer_test.go

https://github.com/ovh/cds · Go · 494 lines · 406 code · 69 blank · 19 comment · 0 complexity · 17f6d4463858107a368efcb45de14977 MD5 · raw file

  1. package authentication_test
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/stretchr/testify/require"
  8. "github.com/ovh/cds/engine/api/authentication"
  9. "github.com/ovh/cds/engine/api/bootstrap"
  10. "github.com/ovh/cds/engine/api/test"
  11. "github.com/ovh/cds/engine/api/test/assets"
  12. "github.com/ovh/cds/engine/api/user"
  13. "github.com/ovh/cds/sdk"
  14. )
  15. // Given a consumer with two groups, if we invalidate one it should be invalidated and one warning should be set.
  16. func TestConsumerInvalidateGroupForUser_InvalidateOneConsumerGroup(t *testing.T) {
  17. db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
  18. assets.DeleteConsumers(t, db)
  19. u := sdk.AuthentifiedUser{
  20. Username: sdk.RandomString(10),
  21. }
  22. require.NoError(t, user.Insert(context.TODO(), db, &u))
  23. g1 := &sdk.Group{ID: 5, Name: "A"}
  24. g2 := &sdk.Group{ID: 10, Name: "B"}
  25. c := sdk.AuthConsumer{
  26. Name: sdk.RandomString(10),
  27. Description: sdk.RandomString(10),
  28. Type: sdk.ConsumerLocal,
  29. ScopeDetails: sdk.NewAuthConsumerScopeDetails(sdk.AuthConsumerScopeAdmin),
  30. GroupIDs: []int64{g1.ID, g2.ID},
  31. AuthentifiedUserID: u.ID,
  32. IssuedAt: time.Now(),
  33. }
  34. require.NoError(t, authentication.InsertConsumer(context.TODO(), db, &c))
  35. // Invalidate group 1 should move the group id to invalid slice and add a warning
  36. require.NoError(t, authentication.ConsumerInvalidateGroupForUser(context.TODO(), db, g1, &u))
  37. res, err := authentication.LoadConsumerByID(context.TODO(), db, c.ID)
  38. require.NoError(t, err)
  39. require.Len(t, res.GroupIDs, 1)
  40. assert.Equal(t, g2.ID, res.GroupIDs[0])
  41. require.Len(t, res.InvalidGroupIDs, 1)
  42. assert.Equal(t, g1.ID, res.InvalidGroupIDs[0])
  43. require.Len(t, res.Warnings, 1)
  44. assert.Equal(t, sdk.WarningGroupInvalid, res.Warnings[0].Type)
  45. assert.Equal(t, g1.ID, res.Warnings[0].GroupID)
  46. assert.Equal(t, g1.Name, res.Warnings[0].GroupName)
  47. }
  48. // Given a consumer with two groups, if we invalidate one it should not be invalidated if the user is an admin.
  49. func TestConsumerInvalidateGroupForUser_InvalidateOneConsumerGroupForAdmin(t *testing.T) {
  50. db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
  51. assets.DeleteConsumers(t, db)
  52. u := sdk.AuthentifiedUser{
  53. Username: sdk.RandomString(10),
  54. Ring: sdk.UserRingAdmin,
  55. }
  56. require.NoError(t, user.Insert(context.TODO(), db, &u))
  57. g1 := &sdk.Group{ID: 5, Name: "A"}
  58. g2 := &sdk.Group{ID: 10, Name: "B"}
  59. c := sdk.AuthConsumer{
  60. Name: sdk.RandomString(10),
  61. Description: sdk.RandomString(10),
  62. Type: sdk.ConsumerLocal,
  63. ScopeDetails: sdk.NewAuthConsumerScopeDetails(sdk.AuthConsumerScopeAdmin),
  64. GroupIDs: []int64{g1.ID, g2.ID},
  65. AuthentifiedUserID: u.ID,
  66. IssuedAt: time.Now(),
  67. }
  68. require.NoError(t, authentication.InsertConsumer(context.TODO(), db, &c))
  69. // Invalidate group 1 should move the group id to invalid slice and add a warning
  70. require.NoError(t, authentication.ConsumerInvalidateGroupForUser(context.TODO(), db, g1, &u))
  71. res, err := authentication.LoadConsumerByID(context.TODO(), db, c.ID)
  72. require.NoError(t, err)
  73. require.Len(t, res.GroupIDs, 2)
  74. assert.Equal(t, g1.ID, res.GroupIDs[0])
  75. assert.Equal(t, g2.ID, res.GroupIDs[1])
  76. require.Len(t, res.InvalidGroupIDs, 0)
  77. require.Len(t, res.Warnings, 0)
  78. }
  79. // Given a consumer with one group, if we invalidate the group it should disable the consumer and add two warnings.
  80. func TestConsumerInvalidateGroupForUser_InvalidateLastConsumerGroup(t *testing.T) {
  81. db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
  82. assets.DeleteConsumers(t, db)
  83. u := sdk.AuthentifiedUser{
  84. Username: sdk.RandomString(10),
  85. }
  86. require.NoError(t, user.Insert(context.TODO(), db, &u))
  87. g1 := &sdk.Group{ID: 5, Name: "A"}
  88. c := sdk.AuthConsumer{
  89. Name: sdk.RandomString(10),
  90. Description: sdk.RandomString(10),
  91. Type: sdk.ConsumerLocal,
  92. ScopeDetails: sdk.NewAuthConsumerScopeDetails(sdk.AuthConsumerScopeAdmin),
  93. GroupIDs: []int64{g1.ID},
  94. AuthentifiedUserID: u.ID,
  95. IssuedAt: time.Now(),
  96. }
  97. require.NoError(t, authentication.InsertConsumer(context.TODO(), db, &c))
  98. // Invalidate group 1 should move the group id to invalid slice, disable the consumer and add warnings
  99. require.NoError(t, authentication.ConsumerInvalidateGroupForUser(context.TODO(), db, g1, &u))
  100. res, err := authentication.LoadConsumerByID(context.TODO(), db, c.ID)
  101. require.NoError(t, err)
  102. assert.True(t, res.Disabled)
  103. require.Len(t, res.GroupIDs, 0)
  104. require.Len(t, res.InvalidGroupIDs, 1)
  105. assert.Equal(t, g1.ID, res.InvalidGroupIDs[0])
  106. require.Len(t, res.Warnings, 2)
  107. assert.Equal(t, sdk.WarningGroupInvalid, res.Warnings[0].Type)
  108. assert.Equal(t, g1.ID, res.Warnings[0].GroupID)
  109. assert.Equal(t, g1.Name, res.Warnings[0].GroupName)
  110. assert.Equal(t, sdk.WarningLastGroupRemoved, res.Warnings[1].Type)
  111. }
  112. // Given a consumer with two groups, if we remove one a warning should be set.
  113. func TestConsumerRemoveGroup_RemoveOneConsumerGroup(t *testing.T) {
  114. db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
  115. assets.DeleteConsumers(t, db)
  116. u := sdk.AuthentifiedUser{
  117. Username: sdk.RandomString(10),
  118. }
  119. require.NoError(t, user.Insert(context.TODO(), db, &u))
  120. g1 := &sdk.Group{ID: 5, Name: "A"}
  121. g2 := &sdk.Group{ID: 10, Name: "B"}
  122. c := sdk.AuthConsumer{
  123. Name: sdk.RandomString(10),
  124. Description: sdk.RandomString(10),
  125. Type: sdk.ConsumerLocal,
  126. ScopeDetails: sdk.NewAuthConsumerScopeDetails(sdk.AuthConsumerScopeAdmin),
  127. GroupIDs: []int64{g1.ID, g2.ID},
  128. AuthentifiedUserID: u.ID,
  129. IssuedAt: time.Now(),
  130. }
  131. require.NoError(t, authentication.InsertConsumer(context.TODO(), db, &c))
  132. // Remove group 1 should remove the group from the consumer, remove previous warning
  133. require.NoError(t, authentication.ConsumerRemoveGroup(context.TODO(), db, g1))
  134. res, err := authentication.LoadConsumerByID(context.TODO(), db, c.ID)
  135. require.NoError(t, err)
  136. assert.False(t, res.Disabled)
  137. require.Len(t, res.GroupIDs, 1)
  138. require.Len(t, res.InvalidGroupIDs, 0)
  139. require.Len(t, res.Warnings, 1)
  140. assert.Equal(t, sdk.WarningGroupRemoved, res.Warnings[0].Type)
  141. assert.Equal(t, g1.ID, res.Warnings[0].GroupID)
  142. assert.Equal(t, g1.Name, res.Warnings[0].GroupName)
  143. }
  144. // Given a consumer with a valid and an invalid group, if we remove the invalid one a warning should be set to replace previous warning.
  145. func TestConsumerRemoveGroup_RemoveOneInvalidConsumerGroup(t *testing.T) {
  146. db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
  147. assets.DeleteConsumers(t, db)
  148. u := sdk.AuthentifiedUser{
  149. Username: sdk.RandomString(10),
  150. }
  151. require.NoError(t, user.Insert(context.TODO(), db, &u))
  152. g1 := &sdk.Group{ID: 5, Name: "A"}
  153. g2 := &sdk.Group{ID: 10, Name: "B"}
  154. c := sdk.AuthConsumer{
  155. Name: sdk.RandomString(10),
  156. Description: sdk.RandomString(10),
  157. Type: sdk.ConsumerLocal,
  158. ScopeDetails: sdk.NewAuthConsumerScopeDetails(sdk.AuthConsumerScopeAdmin),
  159. GroupIDs: []int64{g2.ID},
  160. InvalidGroupIDs: []int64{g1.ID},
  161. AuthentifiedUserID: u.ID,
  162. IssuedAt: time.Now(),
  163. Warnings: sdk.AuthConsumerWarnings{{
  164. Type: sdk.WarningGroupInvalid,
  165. GroupID: g1.ID,
  166. GroupName: g1.Name,
  167. }},
  168. }
  169. require.NoError(t, authentication.InsertConsumer(context.TODO(), db, &c))
  170. // Remove group 1 should remove the group from the consumer, remove previous warning
  171. require.NoError(t, authentication.ConsumerRemoveGroup(context.TODO(), db, g1))
  172. res, err := authentication.LoadConsumerByID(context.TODO(), db, c.ID)
  173. require.NoError(t, err)
  174. assert.False(t, res.Disabled)
  175. require.Len(t, res.GroupIDs, 1)
  176. require.Len(t, res.InvalidGroupIDs, 0)
  177. require.Len(t, res.Warnings, 1)
  178. assert.Equal(t, sdk.WarningGroupRemoved, res.Warnings[0].Type)
  179. assert.Equal(t, g1.ID, res.Warnings[0].GroupID)
  180. assert.Equal(t, g1.Name, res.Warnings[0].GroupName)
  181. }
  182. // Given a consumer with one group, if we remove the group it should disable the consumer and add two warnings.
  183. func TestConsumerRemoveGroup_RemoveLastConsumerGroup(t *testing.T) {
  184. db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
  185. assets.DeleteConsumers(t, db)
  186. u := sdk.AuthentifiedUser{
  187. Username: sdk.RandomString(10),
  188. }
  189. require.NoError(t, user.Insert(context.TODO(), db, &u))
  190. g1 := &sdk.Group{ID: 5, Name: "A"}
  191. c := sdk.AuthConsumer{
  192. Name: sdk.RandomString(10),
  193. Description: sdk.RandomString(10),
  194. Type: sdk.ConsumerLocal,
  195. ScopeDetails: sdk.NewAuthConsumerScopeDetails(sdk.AuthConsumerScopeAdmin),
  196. GroupIDs: []int64{g1.ID},
  197. AuthentifiedUserID: u.ID,
  198. IssuedAt: time.Now(),
  199. }
  200. require.NoError(t, authentication.InsertConsumer(context.TODO(), db, &c))
  201. // Remove group 1 should remove the group from the consumer, remove previous warning
  202. require.NoError(t, authentication.ConsumerRemoveGroup(context.TODO(), db, g1))
  203. res, err := authentication.LoadConsumerByID(context.TODO(), db, c.ID)
  204. require.NoError(t, err)
  205. assert.True(t, res.Disabled)
  206. require.Len(t, res.GroupIDs, 0)
  207. require.Len(t, res.InvalidGroupIDs, 0)
  208. require.Len(t, res.Warnings, 2)
  209. assert.Equal(t, sdk.WarningGroupRemoved, res.Warnings[0].Type)
  210. assert.Equal(t, g1.ID, res.Warnings[0].GroupID)
  211. assert.Equal(t, g1.Name, res.Warnings[0].GroupName)
  212. assert.Equal(t, sdk.WarningLastGroupRemoved, res.Warnings[1].Type)
  213. }
  214. // Given a consumer with one invalid group, if we remove the group it should disable the consumer and add two warnings.
  215. func TestConsumerRemoveGroup_RemoveLastInvalidConsumerGroup(t *testing.T) {
  216. db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
  217. assets.DeleteConsumers(t, db)
  218. u := sdk.AuthentifiedUser{
  219. Username: sdk.RandomString(10),
  220. }
  221. require.NoError(t, user.Insert(context.TODO(), db, &u))
  222. g1 := &sdk.Group{ID: 5, Name: "A"}
  223. c := sdk.AuthConsumer{
  224. Name: sdk.RandomString(10),
  225. Description: sdk.RandomString(10),
  226. Type: sdk.ConsumerLocal,
  227. ScopeDetails: sdk.NewAuthConsumerScopeDetails(sdk.AuthConsumerScopeAdmin),
  228. InvalidGroupIDs: []int64{g1.ID},
  229. AuthentifiedUserID: u.ID,
  230. IssuedAt: time.Now(),
  231. Disabled: true,
  232. Warnings: sdk.AuthConsumerWarnings{
  233. {
  234. Type: sdk.WarningGroupInvalid,
  235. GroupID: g1.ID,
  236. GroupName: g1.Name,
  237. },
  238. {
  239. Type: sdk.WarningLastGroupRemoved,
  240. },
  241. },
  242. }
  243. require.NoError(t, authentication.InsertConsumer(context.TODO(), db, &c))
  244. // Remove group 1 should remove the group from the consumer, remove previous warning
  245. require.NoError(t, authentication.ConsumerRemoveGroup(context.TODO(), db, g1))
  246. res, err := authentication.LoadConsumerByID(context.TODO(), db, c.ID)
  247. require.NoError(t, err)
  248. assert.True(t, res.Disabled)
  249. require.Len(t, res.GroupIDs, 0)
  250. require.Len(t, res.InvalidGroupIDs, 0)
  251. require.Len(t, res.Warnings, 2)
  252. assert.Equal(t, sdk.WarningLastGroupRemoved, res.Warnings[0].Type)
  253. assert.Equal(t, sdk.WarningGroupRemoved, res.Warnings[1].Type)
  254. assert.Equal(t, g1.ID, res.Warnings[1].GroupID)
  255. assert.Equal(t, g1.Name, res.Warnings[1].GroupName)
  256. }
  257. // Given a consumer with a valid and an invalid group, restoring the invalid one should remove warning.
  258. func TestConsumerRestoreInvalidatedGroupForUser_RestoreInvalidatedGroup(t *testing.T) {
  259. db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
  260. assets.DeleteConsumers(t, db)
  261. u := sdk.AuthentifiedUser{
  262. Username: sdk.RandomString(10),
  263. }
  264. require.NoError(t, user.Insert(context.TODO(), db, &u))
  265. g1 := &sdk.Group{ID: 5, Name: "A"}
  266. g2 := &sdk.Group{ID: 10, Name: "B"}
  267. c := sdk.AuthConsumer{
  268. Name: sdk.RandomString(10),
  269. Description: sdk.RandomString(10),
  270. Type: sdk.ConsumerLocal,
  271. ScopeDetails: sdk.NewAuthConsumerScopeDetails(sdk.AuthConsumerScopeAdmin),
  272. GroupIDs: []int64{g2.ID},
  273. InvalidGroupIDs: []int64{g1.ID},
  274. AuthentifiedUserID: u.ID,
  275. IssuedAt: time.Now(),
  276. Warnings: sdk.AuthConsumerWarnings{
  277. {
  278. Type: sdk.WarningGroupInvalid,
  279. GroupID: g1.ID,
  280. GroupName: g1.Name,
  281. },
  282. },
  283. }
  284. require.NoError(t, authentication.InsertConsumer(context.TODO(), db, &c))
  285. // Restore group 1 should remove warnings then move group 1 to valid ones
  286. require.NoError(t, authentication.ConsumerRestoreInvalidatedGroupForUser(context.TODO(), db, g1.ID, u.ID))
  287. res, err := authentication.LoadConsumerByID(context.TODO(), db, c.ID)
  288. require.NoError(t, err)
  289. assert.False(t, res.Disabled)
  290. require.Len(t, res.GroupIDs, 2)
  291. assert.Equal(t, g2.ID, res.GroupIDs[0])
  292. assert.Equal(t, g1.ID, res.GroupIDs[1])
  293. require.Len(t, res.InvalidGroupIDs, 0)
  294. require.Len(t, res.Warnings, 0)
  295. }
  296. // Given a disabled consumer with an invalid group, restoring the group remove warning and re-enable the consumer.
  297. func TestConsumerLifecycle_RestoreInvalidatedLastGroup(t *testing.T) {
  298. db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
  299. assets.DeleteConsumers(t, db)
  300. u := sdk.AuthentifiedUser{
  301. Username: sdk.RandomString(10),
  302. }
  303. require.NoError(t, user.Insert(context.TODO(), db, &u))
  304. g1 := &sdk.Group{ID: 5, Name: "Five"}
  305. c := sdk.AuthConsumer{
  306. Name: sdk.RandomString(10),
  307. Description: sdk.RandomString(10),
  308. Type: sdk.ConsumerLocal,
  309. ScopeDetails: sdk.NewAuthConsumerScopeDetails(sdk.AuthConsumerScopeAdmin),
  310. InvalidGroupIDs: []int64{g1.ID},
  311. AuthentifiedUserID: u.ID,
  312. IssuedAt: time.Now(),
  313. Disabled: true,
  314. Warnings: sdk.AuthConsumerWarnings{
  315. {
  316. Type: sdk.WarningGroupInvalid,
  317. GroupID: g1.ID,
  318. GroupName: g1.Name,
  319. },
  320. {
  321. Type: sdk.WarningLastGroupRemoved,
  322. },
  323. },
  324. }
  325. require.NoError(t, authentication.InsertConsumer(context.TODO(), db, &c))
  326. // Restore group 1 should remove warnings then move group 1 to valid ones
  327. require.NoError(t, authentication.ConsumerRestoreInvalidatedGroupForUser(context.TODO(), db, g1.ID, u.ID))
  328. res, err := authentication.LoadConsumerByID(context.TODO(), db, c.ID)
  329. require.NoError(t, err)
  330. assert.False(t, res.Disabled)
  331. require.Len(t, res.GroupIDs, 1)
  332. assert.Equal(t, g1.ID, res.GroupIDs[0])
  333. require.Len(t, res.InvalidGroupIDs, 0)
  334. require.Len(t, res.Warnings, 0)
  335. }
  336. func TestConsumerInvalidateGroupsForUser_InvalidateLastGroups(t *testing.T) {
  337. db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
  338. assets.DeleteConsumers(t, db)
  339. u := sdk.AuthentifiedUser{
  340. Username: sdk.RandomString(10),
  341. }
  342. require.NoError(t, user.Insert(context.TODO(), db, &u))
  343. g1 := assets.InsertGroup(t, db)
  344. g2 := assets.InsertGroup(t, db)
  345. c := sdk.AuthConsumer{
  346. Name: sdk.RandomString(10),
  347. Description: sdk.RandomString(10),
  348. Type: sdk.ConsumerLocal,
  349. ScopeDetails: sdk.NewAuthConsumerScopeDetails(sdk.AuthConsumerScopeAdmin),
  350. GroupIDs: []int64{g1.ID},
  351. InvalidGroupIDs: []int64{g2.ID},
  352. AuthentifiedUserID: u.ID,
  353. IssuedAt: time.Now(),
  354. Warnings: sdk.AuthConsumerWarnings{
  355. {
  356. Type: sdk.WarningGroupInvalid,
  357. GroupID: g2.ID,
  358. GroupName: g2.Name,
  359. },
  360. },
  361. }
  362. require.NoError(t, authentication.InsertConsumer(context.TODO(), db, &c))
  363. // Should invalidate g2
  364. require.NoError(t, authentication.ConsumerInvalidateGroupsForUser(context.TODO(), db, u.ID, []int64{}))
  365. res, err := authentication.LoadConsumerByID(context.TODO(), db, c.ID)
  366. require.NoError(t, err)
  367. assert.True(t, res.Disabled)
  368. require.Len(t, res.GroupIDs, 0)
  369. require.Len(t, res.InvalidGroupIDs, 2)
  370. assert.Equal(t, g2.ID, res.InvalidGroupIDs[0])
  371. assert.Equal(t, g1.ID, res.InvalidGroupIDs[1])
  372. require.Len(t, res.Warnings, 3)
  373. assert.Equal(t, sdk.WarningGroupInvalid, res.Warnings[0].Type)
  374. assert.Equal(t, g2.ID, res.Warnings[0].GroupID)
  375. assert.Equal(t, g2.Name, res.Warnings[0].GroupName)
  376. assert.Equal(t, sdk.WarningGroupInvalid, res.Warnings[1].Type)
  377. assert.Equal(t, g1.ID, res.Warnings[1].GroupID)
  378. assert.Equal(t, g1.Name, res.Warnings[1].GroupName)
  379. assert.Equal(t, sdk.WarningLastGroupRemoved, res.Warnings[2].Type)
  380. }
  381. func TestConsumerRestoreInvalidatedGroupsForUser(t *testing.T) {
  382. db, _ := test.SetupPG(t, bootstrap.InitiliazeDB)
  383. assets.DeleteConsumers(t, db)
  384. u := sdk.AuthentifiedUser{
  385. Username: sdk.RandomString(10),
  386. }
  387. require.NoError(t, user.Insert(context.TODO(), db, &u))
  388. g1 := assets.InsertGroup(t, db)
  389. g2 := assets.InsertGroup(t, db)
  390. c := sdk.AuthConsumer{
  391. Name: sdk.RandomString(10),
  392. Description: sdk.RandomString(10),
  393. Type: sdk.ConsumerLocal,
  394. ScopeDetails: sdk.NewAuthConsumerScopeDetails(sdk.AuthConsumerScopeAdmin),
  395. InvalidGroupIDs: []int64{g1.ID, g2.ID},
  396. AuthentifiedUserID: u.ID,
  397. IssuedAt: time.Now(),
  398. Disabled: true,
  399. Warnings: sdk.AuthConsumerWarnings{
  400. {
  401. Type: sdk.WarningGroupInvalid,
  402. GroupID: g1.ID,
  403. GroupName: g1.Name,
  404. },
  405. {
  406. Type: sdk.WarningGroupInvalid,
  407. GroupID: g2.ID,
  408. GroupName: g2.Name,
  409. },
  410. {
  411. Type: sdk.WarningLastGroupRemoved,
  412. },
  413. },
  414. }
  415. require.NoError(t, authentication.InsertConsumer(context.TODO(), db, &c))
  416. require.NoError(t, authentication.ConsumerRestoreInvalidatedGroupsForUser(context.TODO(), db, u.ID))
  417. res, err := authentication.LoadConsumerByID(context.TODO(), db, c.ID)
  418. require.NoError(t, err)
  419. assert.False(t, res.Disabled)
  420. require.Len(t, res.GroupIDs, 2)
  421. assert.Equal(t, g1.ID, res.GroupIDs[0])
  422. assert.Equal(t, g2.ID, res.GroupIDs[1])
  423. require.Len(t, res.InvalidGroupIDs, 0)
  424. require.Len(t, res.Warnings, 0)
  425. }