identityproviders.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package identity
  15. import (
  16. "fmt"
  17. "yunion.io/x/jsonutils"
  18. "yunion.io/x/pkg/errors"
  19. "yunion.io/x/pkg/util/shellutils"
  20. api "yunion.io/x/onecloud/pkg/apis/identity"
  21. "yunion.io/x/onecloud/pkg/httperrors"
  22. "yunion.io/x/onecloud/pkg/mcclient"
  23. modules "yunion.io/x/onecloud/pkg/mcclient/modules/identity"
  24. "yunion.io/x/onecloud/pkg/mcclient/options"
  25. "yunion.io/x/onecloud/pkg/util/fileutils2"
  26. )
  27. func init() {
  28. type IdentityProviderListOptions struct {
  29. options.BaseListOptions
  30. SsoDomain string `help:"Filter SSO IDP by domain" json:"sso_domain"`
  31. }
  32. R(&IdentityProviderListOptions{}, "idp-list", "List all identity provider", func(s *mcclient.ClientSession, args *IdentityProviderListOptions) error {
  33. params, err := options.ListStructToParams(args)
  34. if err != nil {
  35. return err
  36. }
  37. results, err := modules.IdentityProviders.List(s, params)
  38. if err != nil {
  39. return err
  40. }
  41. printList(results, modules.IdentityProviders.GetColumns(s))
  42. return nil
  43. })
  44. type IdentityProviderDetailOptions struct {
  45. ID string `help:"Id or name of identity provider to show"`
  46. }
  47. R(&IdentityProviderDetailOptions{}, "idp-show", "Show details of idp", func(s *mcclient.ClientSession, args *IdentityProviderDetailOptions) error {
  48. detail, err := modules.IdentityProviders.Get(s, args.ID, nil)
  49. if err != nil {
  50. return err
  51. }
  52. printObject(detail)
  53. return nil
  54. })
  55. type IdentityProviderUpdateOptions struct {
  56. ID string `help:"Id or name of identity provider to update" json:"-"`
  57. api.IdentityProviderUpdateInput
  58. }
  59. R(&IdentityProviderUpdateOptions{}, "idp-update", "Update a identity provider", func(s *mcclient.ClientSession, args *IdentityProviderUpdateOptions) error {
  60. resp, err := modules.IdentityProviders.Update(s, args.ID, jsonutils.Marshal(args))
  61. if err != nil {
  62. return err
  63. }
  64. printObject(resp)
  65. return nil
  66. })
  67. R(&IdentityProviderDetailOptions{}, "idp-config-show", "Show detail of a domain config", func(s *mcclient.ClientSession, args *IdentityProviderDetailOptions) error {
  68. conf, err := modules.IdentityProviders.GetSpecific(s, args.ID, "config", nil)
  69. if err != nil {
  70. return err
  71. }
  72. fmt.Println(conf.PrettyString())
  73. return nil
  74. })
  75. R(&IdentityProviderDetailOptions{}, "idp-enable", "Enable an identity provider", func(s *mcclient.ClientSession, args *IdentityProviderDetailOptions) error {
  76. idp, err := modules.IdentityProviders.PerformAction(s, args.ID, "enable", nil)
  77. if err != nil {
  78. return err
  79. }
  80. printObject(idp)
  81. return nil
  82. })
  83. R(&IdentityProviderDetailOptions{}, "idp-disable", "Disable an identity provider", func(s *mcclient.ClientSession, args *IdentityProviderDetailOptions) error {
  84. idp, err := modules.IdentityProviders.PerformAction(s, args.ID, "disable", nil)
  85. if err != nil {
  86. return err
  87. }
  88. printObject(idp)
  89. return nil
  90. })
  91. R(&IdentityProviderDetailOptions{}, "idp-delete", "Delete an identity provider", func(s *mcclient.ClientSession, args *IdentityProviderDetailOptions) error {
  92. idp, err := modules.IdentityProviders.Delete(s, args.ID, nil)
  93. if err != nil {
  94. return err
  95. }
  96. printObject(idp)
  97. return nil
  98. })
  99. R(&IdentityProviderDetailOptions{}, "idp-sync", "Sync an identity provider", func(s *mcclient.ClientSession, args *IdentityProviderDetailOptions) error {
  100. idp, err := modules.IdentityProviders.PerformAction(s, args.ID, "sync", nil)
  101. if err != nil {
  102. return err
  103. }
  104. printObject(idp)
  105. return nil
  106. })
  107. type IdentityProviderConfigLDAPOptions struct {
  108. ID string `help:"ID of idp to config" json:"-"`
  109. api.SLDAPIdpConfigOptions
  110. }
  111. R(&IdentityProviderConfigLDAPOptions{}, "idp-config-ldap", "Config an Identity provider with LDAP driver", func(s *mcclient.ClientSession, args *IdentityProviderConfigLDAPOptions) error {
  112. config := jsonutils.NewDict()
  113. config.Add(jsonutils.Marshal(args), "config", "ldap")
  114. nconf, err := modules.IdentityProviders.PerformAction(s, args.ID, "config", config)
  115. if err != nil {
  116. return err
  117. }
  118. fmt.Println(nconf.PrettyString())
  119. return nil
  120. })
  121. type IdentityProviderCreateLDAPOptions struct {
  122. NAME string `help:"name of identity provider" json:"-"`
  123. AutoCreateProject bool `help:"automatically create a default project when importing domain" json:"-"`
  124. NoAutoCreateProject bool `help:"do not create default project when importing domain" json:"-"`
  125. TargetDomain string `help:"target domain without creating new domain" json:"-"`
  126. api.SLDAPIdpConfigOptions
  127. }
  128. R(&IdentityProviderCreateLDAPOptions{}, "idp-create-ldap", "Create an identity provider with LDAP driver", func(s *mcclient.ClientSession, args *IdentityProviderCreateLDAPOptions) error {
  129. params := jsonutils.NewDict()
  130. params.Add(jsonutils.NewString(args.NAME), "name")
  131. if len(args.TargetDomain) > 0 {
  132. params.Add(jsonutils.NewString(args.TargetDomain), "target_domain")
  133. }
  134. if args.AutoCreateProject {
  135. params.Add(jsonutils.JSONTrue, "auto_create_project")
  136. } else if args.NoAutoCreateProject {
  137. params.Add(jsonutils.JSONFalse, "auto_create_project")
  138. }
  139. params.Add(jsonutils.NewString("ldap"), "driver")
  140. params.Add(jsonutils.Marshal(args), "config", "ldap")
  141. idp, err := modules.IdentityProviders.Create(s, params)
  142. if err != nil {
  143. return err
  144. }
  145. printObject(idp)
  146. return nil
  147. })
  148. type IdentityProviderConfigLDAPSingleDomainOptions struct {
  149. ID string `help:"ID of idp to config" json:"-"`
  150. api.SLDAPIdpConfigSingleDomainOptions
  151. }
  152. R(&IdentityProviderConfigLDAPSingleDomainOptions{}, "idp-config-ldap-single-domain", "Config an Identity provider with LDAP driver/single domain template", func(s *mcclient.ClientSession, args *IdentityProviderConfigLDAPSingleDomainOptions) error {
  153. config := jsonutils.NewDict()
  154. config.Add(jsonutils.Marshal(args), "config", "ldap")
  155. nconf, err := modules.IdentityProviders.PerformAction(s, args.ID, "config", config)
  156. if err != nil {
  157. return err
  158. }
  159. fmt.Println(nconf.PrettyString())
  160. return nil
  161. })
  162. type IdentityProviderCreateLDAPSingleDomainOptions struct {
  163. NAME string `help:"name of identity provider" json:"-"`
  164. TEMPLATE string `help:"configuration template name" choices:"msad_one_domain|openldap_one_domain" json:"-"`
  165. AutoCreateProject bool `help:"automatically create a default project when importing domain" json:"-"`
  166. NoAutoCreateProject bool `help:"do not create default project when importing domain" json:"-"`
  167. TargetDomain string `help:"target domain without creating new domain" json:"-"`
  168. api.SLDAPIdpConfigSingleDomainOptions
  169. }
  170. R(&IdentityProviderCreateLDAPSingleDomainOptions{}, "idp-create-ldap-single-domain", "Create an identity provider with LDAP driver/single domain template", func(s *mcclient.ClientSession, args *IdentityProviderCreateLDAPSingleDomainOptions) error {
  171. params := jsonutils.NewDict()
  172. params.Add(jsonutils.NewString(args.NAME), "name")
  173. params.Add(jsonutils.NewString("ldap"), "driver")
  174. params.Add(jsonutils.NewString(args.TEMPLATE), "template")
  175. if len(args.TargetDomain) > 0 {
  176. params.Add(jsonutils.NewString(args.TargetDomain), "target_domain")
  177. }
  178. if args.AutoCreateProject {
  179. params.Add(jsonutils.JSONTrue, "auto_create_project")
  180. } else if args.NoAutoCreateProject {
  181. params.Add(jsonutils.JSONFalse, "auto_create_project")
  182. }
  183. params.Add(jsonutils.Marshal(args), "config", "ldap")
  184. idp, err := modules.IdentityProviders.Create(s, params)
  185. if err != nil {
  186. return err
  187. }
  188. printObject(idp)
  189. return nil
  190. })
  191. type IdentityProviderConfigLDAPMultiDomainOptions struct {
  192. ID string `help:"ID of idp to config" json:"-"`
  193. api.SLDAPIdpConfigMultiDomainOptions
  194. }
  195. R(&IdentityProviderConfigLDAPMultiDomainOptions{}, "idp-config-ldap-multi-domain", "Config an Identity provider with LDAP driver/multi domain template", func(s *mcclient.ClientSession, args *IdentityProviderConfigLDAPMultiDomainOptions) error {
  196. config := jsonutils.NewDict()
  197. config.Add(jsonutils.Marshal(args), "config", "ldap")
  198. nconf, err := modules.IdentityProviders.PerformAction(s, args.ID, "config", config)
  199. if err != nil {
  200. return err
  201. }
  202. fmt.Println(nconf.PrettyString())
  203. return nil
  204. })
  205. type IdentityProviderCreateLDAPMultiDomainOptions struct {
  206. NAME string `help:"name of identity provider" json:"-"`
  207. TEMPLATE string `help:"configuration template name" choices:"msad_multi_domain" json:"-"`
  208. AutoCreateProject bool `help:"automatically create a default project when importing domain" json:"-"`
  209. NoAutoCreateProject bool `help:"do not create default project when importing domain" json:"-"`
  210. api.SLDAPIdpConfigMultiDomainOptions
  211. }
  212. R(&IdentityProviderCreateLDAPMultiDomainOptions{}, "idp-create-ldap-multi-domain", "Create an identity provider with LDAP driver/single domain template", func(s *mcclient.ClientSession, args *IdentityProviderCreateLDAPMultiDomainOptions) error {
  213. params := jsonutils.NewDict()
  214. params.Add(jsonutils.NewString(args.NAME), "name")
  215. params.Add(jsonutils.NewString("ldap"), "driver")
  216. params.Add(jsonutils.NewString(args.TEMPLATE), "template")
  217. if args.AutoCreateProject {
  218. params.Add(jsonutils.JSONTrue, "auto_create_project")
  219. } else if args.NoAutoCreateProject {
  220. params.Add(jsonutils.JSONFalse, "auto_create_project")
  221. }
  222. params.Add(jsonutils.Marshal(args), "config", "ldap")
  223. idp, err := modules.IdentityProviders.Create(s, params)
  224. if err != nil {
  225. return err
  226. }
  227. printObject(idp)
  228. return nil
  229. })
  230. type IdentityProviderCreateCASOptions struct {
  231. NAME string `help:"name of identity provider" json:"-"`
  232. AutoCreateProject bool `help:"automatically create a project if the default_project not exists" json:"-"`
  233. NoAutoCreateProject bool `help:"do not create default project when importing domain" json:"-"`
  234. AutoCreateUser bool `help:"automatically create a user" json:"-"`
  235. NoAutoCreateUser bool `help:"do not automatically create a user" json:"-"`
  236. TargetDomain string `help:"target domain without creating new domain" json:"-"`
  237. api.SCASIdpConfigOptions
  238. }
  239. R(&IdentityProviderCreateCASOptions{}, "idp-create-cas", "Create an identity provider with CAS driver", func(s *mcclient.ClientSession, args *IdentityProviderCreateCASOptions) error {
  240. params := jsonutils.NewDict()
  241. params.Add(jsonutils.NewString(args.NAME), "name")
  242. if len(args.TargetDomain) > 0 {
  243. params.Add(jsonutils.NewString(args.TargetDomain), "target_domain")
  244. }
  245. if args.AutoCreateProject {
  246. params.Add(jsonutils.JSONTrue, "auto_create_project")
  247. } else if args.NoAutoCreateProject {
  248. params.Add(jsonutils.JSONFalse, "auto_create_project")
  249. }
  250. if args.AutoCreateUser {
  251. params.Add(jsonutils.JSONTrue, "auto_create_user")
  252. } else if args.NoAutoCreateUser {
  253. params.Add(jsonutils.JSONFalse, "auto_create_user")
  254. }
  255. params.Add(jsonutils.NewString("cas"), "driver")
  256. params.Add(jsonutils.Marshal(args), "config", "cas")
  257. idp, err := modules.IdentityProviders.Create(s, params)
  258. if err != nil {
  259. return err
  260. }
  261. printObject(idp)
  262. return nil
  263. })
  264. type IdentityProviderConfigCASOptions struct {
  265. ID string `help:"ID of idp to config" json:"-"`
  266. api.SCASIdpConfigOptions
  267. }
  268. R(&IdentityProviderConfigCASOptions{}, "idp-config-cas", "Config an Identity provider with CAS driver", func(s *mcclient.ClientSession, args *IdentityProviderConfigCASOptions) error {
  269. config := jsonutils.NewDict()
  270. config.Add(jsonutils.Marshal(args), "config", "cas")
  271. nconf, err := modules.IdentityProviders.PerformAction(s, args.ID, "config", config)
  272. if err != nil {
  273. return err
  274. }
  275. fmt.Println(nconf.PrettyString())
  276. return nil
  277. })
  278. type IdentityProviderConfigEditOptions struct {
  279. IDP string `help:"identity provider name or ID"`
  280. }
  281. R(&IdentityProviderConfigEditOptions{}, "idp-config-edit", "Edit config yaml of an identity provider", func(s *mcclient.ClientSession, args *IdentityProviderConfigEditOptions) error {
  282. idp, err := modules.IdentityProviders.Get(s, args.IDP, nil)
  283. if err != nil {
  284. return err
  285. }
  286. enabled, _ := idp.GetString("enabled")
  287. if enabled != "false" {
  288. return errors.Wrap(httperrors.ErrInvalidStatus, "idp must be disabled")
  289. }
  290. params := jsonutils.NewDict()
  291. params.Add(jsonutils.JSONTrue, "sensitive")
  292. conf, err := modules.IdentityProviders.GetSpecific(s, args.IDP, "config", params)
  293. if err != nil {
  294. return err
  295. }
  296. confJson, err := conf.Get("config")
  297. if err != nil {
  298. return err
  299. }
  300. content, err := shellutils.Edit(confJson.YAMLString())
  301. if err != nil {
  302. return err
  303. }
  304. yamlJson, err := jsonutils.ParseYAML(content)
  305. if err != nil {
  306. return err
  307. }
  308. config := jsonutils.NewDict()
  309. config.Add(yamlJson, "config")
  310. nconf, err := modules.IdentityProviders.PerformAction(s, args.IDP, "config", config)
  311. if err != nil {
  312. return err
  313. }
  314. fmt.Println(nconf.PrettyString())
  315. return nil
  316. })
  317. type IdentityProviderCreateSAMLOptions struct {
  318. NAME string `help:"name of identity provider" json:"-"`
  319. AutoCreateProject bool `help:"automatically create a default project when importing domain" json:"-"`
  320. NoAutoCreateProject bool `help:"do not create default project when importing domain" json:"-"`
  321. TargetDomain string `help:"target domain without creating new domain" json:"-"`
  322. api.SSAMLIdpConfigOptions
  323. }
  324. R(&IdentityProviderCreateSAMLOptions{}, "idp-create-saml", "Create an identity provider with SAML driver", func(s *mcclient.ClientSession, args *IdentityProviderCreateSAMLOptions) error {
  325. params := jsonutils.NewDict()
  326. params.Add(jsonutils.NewString(args.NAME), "name")
  327. if len(args.TargetDomain) > 0 {
  328. params.Add(jsonutils.NewString(args.TargetDomain), "target_domain")
  329. }
  330. if args.AutoCreateProject {
  331. params.Add(jsonutils.JSONTrue, "auto_create_project")
  332. } else if args.NoAutoCreateProject {
  333. params.Add(jsonutils.JSONFalse, "auto_create_project")
  334. }
  335. params.Add(jsonutils.NewString("saml"), "driver")
  336. params.Add(jsonutils.Marshal(args), "config", "saml")
  337. idp, err := modules.IdentityProviders.Create(s, params)
  338. if err != nil {
  339. return err
  340. }
  341. printObject(idp)
  342. return nil
  343. })
  344. type IdentityProviderConfigSAMLOptions struct {
  345. ID string `help:"ID of idp to config" json:"-"`
  346. api.SSAMLIdpConfigOptions
  347. }
  348. R(&IdentityProviderConfigSAMLOptions{}, "idp-config-saml", "Config an Identity provider with SAML driver", func(s *mcclient.ClientSession, args *IdentityProviderConfigSAMLOptions) error {
  349. config := jsonutils.NewDict()
  350. config.Add(jsonutils.Marshal(args), "config", "saml")
  351. nconf, err := modules.IdentityProviders.PerformAction(s, args.ID, "config", config)
  352. if err != nil {
  353. return err
  354. }
  355. fmt.Println(nconf.PrettyString())
  356. return nil
  357. })
  358. type IdentityProviderGetSAMLMetadataOptions struct {
  359. ID string `help:"ID of idp to config" json:"-"`
  360. api.GetIdpSamlMetadataInput
  361. }
  362. R(&IdentityProviderGetSAMLMetadataOptions{}, "idp-saml-metadata", "Get SAML service provider metadata", func(s *mcclient.ClientSession, args *IdentityProviderGetSAMLMetadataOptions) error {
  363. nconf, err := modules.IdentityProviders.GetSpecific(s, args.ID, "saml-metadata", jsonutils.Marshal(args))
  364. if err != nil {
  365. return err
  366. }
  367. spMeta, _ := nconf.GetString("metadata")
  368. fmt.Println(spMeta)
  369. return nil
  370. })
  371. type IdentityProviderCreateSAMLTestOptions struct {
  372. NAME string `help:"name of identity provider" json:"-"`
  373. // TEMPLATE string `help:"configuration template name" choices:"msad_multi_domain" json:"-"`
  374. api.SSAMLTestIdpConfigOptions
  375. }
  376. R(&IdentityProviderCreateSAMLTestOptions{}, "idp-create-saml-test", "Create an identity provider with samltest.id (test only)", func(s *mcclient.ClientSession, args *IdentityProviderCreateSAMLTestOptions) error {
  377. params := jsonutils.NewDict()
  378. params.Add(jsonutils.NewString(args.NAME), "name")
  379. params.Add(jsonutils.NewString("saml"), "driver")
  380. params.Add(jsonutils.NewString(api.IdpTemplateSAMLTest), "template")
  381. params.Add(jsonutils.Marshal(args), "config", "saml")
  382. idp, err := modules.IdentityProviders.Create(s, params)
  383. if err != nil {
  384. return err
  385. }
  386. printObject(idp)
  387. return nil
  388. })
  389. type IdentityProviderCreateAzureADSAMLOptions struct {
  390. NAME string `help:"name of identity provider" json:"-"`
  391. // TEMPLATE string `help:"configuration template name" choices:"msad_multi_domain" json:"-"`
  392. api.SSAMLAzureADConfigOptions
  393. }
  394. R(&IdentityProviderCreateAzureADSAMLOptions{}, "idp-create-azure-ad-saml", "Create an identity provider with Azure AD SAML", func(s *mcclient.ClientSession, args *IdentityProviderCreateAzureADSAMLOptions) error {
  395. params := jsonutils.NewDict()
  396. params.Add(jsonutils.NewString(args.NAME), "name")
  397. params.Add(jsonutils.NewString("saml"), "driver")
  398. params.Add(jsonutils.NewString(api.IdpTemplateAzureADSAML), "template")
  399. params.Add(jsonutils.Marshal(args), "config", "saml")
  400. idp, err := modules.IdentityProviders.Create(s, params)
  401. if err != nil {
  402. return err
  403. }
  404. printObject(idp)
  405. return nil
  406. })
  407. type IdentityProviderCreateOIDCOptions struct {
  408. NAME string `help:"name of identity provider" json:"-"`
  409. AutoCreateProject bool `help:"automatically create a default project when importing domain" json:"-"`
  410. NoAutoCreateProject bool `help:"do not create default project when importing domain" json:"-"`
  411. AutoCreateUser bool `help:"automatically create a user" json:"-"`
  412. NoAutoCreateUser bool `help:"do not automatically create a user" json:"-"`
  413. TargetDomain string `help:"target domain without creating new domain" json:"-"`
  414. api.SOIDCIdpConfigOptions
  415. }
  416. R(&IdentityProviderCreateOIDCOptions{}, "idp-create-oidc", "Create an identity provider with OpenID connect driver", func(s *mcclient.ClientSession, args *IdentityProviderCreateOIDCOptions) error {
  417. params := jsonutils.NewDict()
  418. params.Add(jsonutils.NewString(args.NAME), "name")
  419. if len(args.TargetDomain) > 0 {
  420. params.Add(jsonutils.NewString(args.TargetDomain), "target_domain")
  421. }
  422. if args.AutoCreateProject {
  423. params.Add(jsonutils.JSONTrue, "auto_create_project")
  424. } else if args.NoAutoCreateProject {
  425. params.Add(jsonutils.JSONFalse, "auto_create_project")
  426. }
  427. if args.AutoCreateUser {
  428. params.Add(jsonutils.JSONTrue, "auto_create_user")
  429. } else if args.NoAutoCreateUser {
  430. params.Add(jsonutils.JSONFalse, "auto_create_user")
  431. }
  432. params.Add(jsonutils.NewString("oidc"), "driver")
  433. params.Add(jsonutils.Marshal(args), "config", "oidc")
  434. idp, err := modules.IdentityProviders.Create(s, params)
  435. if err != nil {
  436. return err
  437. }
  438. printObject(idp)
  439. return nil
  440. })
  441. type IdentityProviderConfigOIDCOptions struct {
  442. ID string `help:"ID of idp to config" json:"-"`
  443. api.SOIDCIdpConfigOptions
  444. }
  445. R(&IdentityProviderConfigOIDCOptions{}, "idp-config-oidc", "Config an Identity provider with OpenID connect driver", func(s *mcclient.ClientSession, args *IdentityProviderConfigOIDCOptions) error {
  446. config := jsonutils.NewDict()
  447. config.Add(jsonutils.Marshal(args), "config", "oidc")
  448. nconf, err := modules.IdentityProviders.PerformAction(s, args.ID, "config", config)
  449. if err != nil {
  450. return err
  451. }
  452. fmt.Println(nconf.PrettyString())
  453. return nil
  454. })
  455. type IdentityProviderCreateDexOIDCOptions struct {
  456. NAME string `help:"name of identity provider" json:"-"`
  457. api.SOIDCDexConfigOptions
  458. }
  459. R(&IdentityProviderCreateDexOIDCOptions{}, "idp-create-dex-oidc", "Create an identity provider with DEX OpenID Connect", func(s *mcclient.ClientSession, args *IdentityProviderCreateDexOIDCOptions) error {
  460. params := jsonutils.NewDict()
  461. params.Add(jsonutils.NewString(args.NAME), "name")
  462. params.Add(jsonutils.NewString("oidc"), "driver")
  463. params.Add(jsonutils.NewString(api.IdpTemplateDex), "template")
  464. params.Add(jsonutils.Marshal(args), "config", "oidc")
  465. idp, err := modules.IdentityProviders.Create(s, params)
  466. if err != nil {
  467. return err
  468. }
  469. printObject(idp)
  470. return nil
  471. })
  472. type IdentityProviderCreateCommonOptions struct {
  473. TargetDomainId string `help:"target domain id"`
  474. AutoCreateProject bool `help:"create project if no project presents" negative:"no-auto-create-project"`
  475. AutoCreateUser bool `help:"create user if no user presents" negative:"no-auto-create-user"`
  476. }
  477. type IdentityProviderCreateGithubOIDCOptions struct {
  478. NAME string `help:"name of identity provider" json:"name"`
  479. api.SOIDCGithubConfigOptions
  480. IdentityProviderCreateCommonOptions
  481. }
  482. R(&IdentityProviderCreateGithubOIDCOptions{}, "idp-create-github-oidc", "Create an identity provider with Github OpenID Connect", func(s *mcclient.ClientSession, args *IdentityProviderCreateGithubOIDCOptions) error {
  483. params := jsonutils.NewDict()
  484. // params.Add(jsonutils.NewString(args.NAME), "name")
  485. params.Add(jsonutils.NewString("oidc"), "driver")
  486. params.Add(jsonutils.NewString(api.IdpTemplateGithub), "template")
  487. params.Update(jsonutils.Marshal(args))
  488. params.Add(jsonutils.Marshal(args.SOIDCGithubConfigOptions), "config", "oidc")
  489. idp, err := modules.IdentityProviders.Create(s, params)
  490. if err != nil {
  491. return err
  492. }
  493. printObject(idp)
  494. return nil
  495. })
  496. type IdentityProviderCreateGoogleOIDCOptions struct {
  497. NAME string `help:"name of identity provider" json:"name"`
  498. api.SOIDCGoogleConfigOptions
  499. IdentityProviderCreateCommonOptions
  500. }
  501. R(&IdentityProviderCreateGoogleOIDCOptions{}, "idp-create-google-oidc", "Create an identity provider with Google OpenID Connect", func(s *mcclient.ClientSession, args *IdentityProviderCreateGoogleOIDCOptions) error {
  502. params := jsonutils.NewDict()
  503. params.Add(jsonutils.NewString("oidc"), "driver")
  504. params.Add(jsonutils.NewString(api.IdpTemplateGoogle), "template")
  505. params.Update(jsonutils.Marshal(args))
  506. params.Add(jsonutils.Marshal(args.SOIDCGoogleConfigOptions), "config", "oidc")
  507. idp, err := modules.IdentityProviders.Create(s, params)
  508. if err != nil {
  509. return err
  510. }
  511. printObject(idp)
  512. return nil
  513. })
  514. type IdentityProviderCreateAzureOIDCOptions struct {
  515. NAME string `help:"name of identity provider" json:"name"`
  516. api.SOIDCAzureConfigOptions
  517. IdentityProviderCreateCommonOptions
  518. }
  519. R(&IdentityProviderCreateAzureOIDCOptions{}, "idp-create-azure-oidc", "Create an identity provider with Azure AD OpenID Connect", func(s *mcclient.ClientSession, args *IdentityProviderCreateAzureOIDCOptions) error {
  520. params := jsonutils.NewDict()
  521. params.Add(jsonutils.NewString(args.NAME), "name")
  522. params.Add(jsonutils.NewString("oidc"), "driver")
  523. params.Add(jsonutils.NewString(api.IdpTemplateAzureOAuth2), "template")
  524. params.Update(jsonutils.Marshal(args))
  525. params.Add(jsonutils.Marshal(args.SOIDCAzureConfigOptions), "config", "oidc")
  526. idp, err := modules.IdentityProviders.Create(s, params)
  527. if err != nil {
  528. return err
  529. }
  530. printObject(idp)
  531. return nil
  532. })
  533. type IdentityProviderCreateAlipayOAuth2Options struct {
  534. NAME string `help:"name of identity provider"`
  535. APPID string `help:"Alipay app_id"`
  536. KEYFILE string `json:"Alipay app private key file"`
  537. }
  538. R(&IdentityProviderCreateAlipayOAuth2Options{}, "idp-create-alipay-oauth2", "Create an identity provider with Alipay OAuth2.0", func(s *mcclient.ClientSession, args *IdentityProviderCreateAlipayOAuth2Options) error {
  539. opts := api.SOAuth2IdpConfigOptions{}
  540. opts.AppId = args.APPID
  541. var err error
  542. opts.Secret, err = fileutils2.FileGetContents(args.KEYFILE)
  543. if err != nil {
  544. return err
  545. }
  546. params := jsonutils.NewDict()
  547. params.Add(jsonutils.NewString(args.NAME), "name")
  548. params.Add(jsonutils.NewString("oauth2"), "driver")
  549. params.Add(jsonutils.NewString(api.IdpTemplateAlipay), "template")
  550. params.Add(jsonutils.Marshal(opts), "config", "oauth2")
  551. idp, err := modules.IdentityProviders.Create(s, params)
  552. if err != nil {
  553. return err
  554. }
  555. printObject(idp)
  556. return nil
  557. })
  558. type IdentityProviderCreateFeishuOAuth2Options struct {
  559. NAME string `help:"name of identity provider" json:"name"`
  560. api.SOAuth2IdpConfigOptions
  561. IdentityProviderCreateCommonOptions
  562. }
  563. R(&IdentityProviderCreateFeishuOAuth2Options{}, "idp-create-feishu-oauth2", "Create an identity provider with Feishu OAuth2.0", func(s *mcclient.ClientSession, args *IdentityProviderCreateFeishuOAuth2Options) error {
  564. params := jsonutils.NewDict()
  565. // params.Add(jsonutils.NewString(args.NAME), "name")
  566. params.Add(jsonutils.NewString("oauth2"), "driver")
  567. params.Add(jsonutils.NewString(api.IdpTemplateFeishu), "template")
  568. params.Update(jsonutils.Marshal(args))
  569. params.Add(jsonutils.Marshal(args.SOAuth2IdpConfigOptions), "config", "oauth2")
  570. idp, err := modules.IdentityProviders.Create(s, params)
  571. if err != nil {
  572. return err
  573. }
  574. printObject(idp)
  575. return nil
  576. })
  577. type IdentityProviderCreateDingtalkOAuth2Options struct {
  578. NAME string `help:"name of identity provider"`
  579. api.SOAuth2IdpConfigOptions
  580. }
  581. R(&IdentityProviderCreateDingtalkOAuth2Options{}, "idp-create-dingtalk-oauth2", "Create an identity provider with Feishu OAuth2.0", func(s *mcclient.ClientSession, args *IdentityProviderCreateDingtalkOAuth2Options) error {
  582. params := jsonutils.NewDict()
  583. params.Add(jsonutils.NewString(args.NAME), "name")
  584. params.Add(jsonutils.NewString("oauth2"), "driver")
  585. params.Add(jsonutils.NewString(api.IdpTemplateDingtalk), "template")
  586. params.Add(jsonutils.Marshal(args), "config", "oauth2")
  587. idp, err := modules.IdentityProviders.Create(s, params)
  588. if err != nil {
  589. return err
  590. }
  591. printObject(idp)
  592. return nil
  593. })
  594. type IdentityProviderCreateWechatOAuth2Options struct {
  595. NAME string `help:"name of identity provider"`
  596. api.SOAuth2IdpConfigOptions
  597. }
  598. R(&IdentityProviderCreateWechatOAuth2Options{}, "idp-create-wechat-oauth2", "Create an identity provider with Wechat OAuth2.0", func(s *mcclient.ClientSession, args *IdentityProviderCreateWechatOAuth2Options) error {
  599. params := jsonutils.NewDict()
  600. params.Add(jsonutils.NewString(args.NAME), "name")
  601. params.Add(jsonutils.NewString("oauth2"), "driver")
  602. params.Add(jsonutils.NewString(api.IdpTemplateWechat), "template")
  603. params.Add(jsonutils.Marshal(args), "config", "oauth2")
  604. idp, err := modules.IdentityProviders.Create(s, params)
  605. if err != nil {
  606. return err
  607. }
  608. printObject(idp)
  609. return nil
  610. })
  611. type IdentityProviderCreateQywechatOAuth2Options struct {
  612. api.IdentityProviderCreateInput
  613. CorpId string `help:"corp id of qywechat"`
  614. AgentId string `help:"agent id of app"`
  615. Secret string `help:"secret of qywechat"`
  616. }
  617. R(&IdentityProviderCreateQywechatOAuth2Options{}, "idp-create-qywechat-oauth2", "Create an identity provider with Qiye Wechat OAuth2.0", func(s *mcclient.ClientSession, args *IdentityProviderCreateQywechatOAuth2Options) error {
  618. conf := api.SOAuth2IdpConfigOptions{
  619. AppId: fmt.Sprintf("%s/%s", args.CorpId, args.AgentId),
  620. Secret: args.Secret,
  621. }
  622. params := jsonutils.Marshal(args).(*jsonutils.JSONDict)
  623. params.Add(jsonutils.NewString("oauth2"), "driver")
  624. params.Add(jsonutils.NewString(api.IdpTemplateQywechat), "template")
  625. params.Add(jsonutils.Marshal(conf), "config", "oauth2")
  626. idp, err := modules.IdentityProviders.Create(s, params)
  627. if err != nil {
  628. return err
  629. }
  630. printObject(idp)
  631. return nil
  632. })
  633. type IdpGetRedirectUriOptions struct {
  634. ID string `help:"id or name of idp to query" json:"-"`
  635. api.GetIdpSsoRedirectUriInput
  636. }
  637. R(&IdpGetRedirectUriOptions{}, "idp-sso-url", "Get sso url of a SSO idp", func(s *mcclient.ClientSession, args *IdpGetRedirectUriOptions) error {
  638. result, err := modules.IdentityProviders.GetSpecific(s, args.ID, "sso-redirect-uri", jsonutils.Marshal(args))
  639. if err != nil {
  640. return err
  641. }
  642. printObject(result)
  643. return nil
  644. })
  645. type IdpGetCallbackUriOptions struct {
  646. ID string `help:"id or name of idp to query" json:"-"`
  647. api.GetIdpSsoCallbackUriInput
  648. }
  649. R(&IdpGetCallbackUriOptions{}, "idp-sso-callback-url", "Get sso callback url of a SSO idp", func(s *mcclient.ClientSession, args *IdpGetCallbackUriOptions) error {
  650. result, err := modules.IdentityProviders.GetSpecific(s, args.ID, "sso-callback-uri", jsonutils.Marshal(args))
  651. if err != nil {
  652. return err
  653. }
  654. printObject(result)
  655. return nil
  656. })
  657. type IdpSetDefaultSsoOptions struct {
  658. ID string `help:"id or name of idp to set default Sso" json:"-"`
  659. api.PerformDefaultSsoInput
  660. }
  661. R(&IdpSetDefaultSsoOptions{}, "idp-default-sso", "Enable/disable default SSO", func(s *mcclient.ClientSession, args *IdpSetDefaultSsoOptions) error {
  662. result, err := modules.IdentityProviders.PerformAction(s, args.ID, "default-sso", jsonutils.Marshal(args))
  663. if err != nil {
  664. return err
  665. }
  666. printObject(result)
  667. return nil
  668. })
  669. }