driver.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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 huawei
  15. import (
  16. "context"
  17. "fmt"
  18. "net/url"
  19. "yunion.io/x/log"
  20. "yunion.io/x/pkg/errors"
  21. "yunion.io/x/pkg/util/samlutils"
  22. "yunion.io/x/onecloud/pkg/cloudid/models"
  23. "yunion.io/x/onecloud/pkg/httperrors"
  24. "yunion.io/x/onecloud/pkg/mcclient"
  25. "yunion.io/x/onecloud/pkg/util/samlutils/idp"
  26. )
  27. func (d *SHuaweiSAMLDriver) GetIdpInitiatedLoginData(ctx context.Context, userCred mcclient.TokenCredential, managerId string, sp *idp.SSAMLServiceProvider, redirectUrl string) (samlutils.SSAMLIdpInitiatedLoginData, error) {
  28. data := samlutils.SSAMLIdpInitiatedLoginData{}
  29. provider, err := models.CloudproviderManager.FetchProvier(managerId)
  30. if err != nil {
  31. return data, err
  32. }
  33. saml, err := provider.GetSamlProvider()
  34. if err != nil {
  35. return data, errors.Wrapf(err, "GetSamlProvider")
  36. }
  37. user, err := provider.GetSamlUser(userCred.GetUserId())
  38. if err != nil {
  39. return data, errors.Wrapf(err, "GetSamlUser")
  40. }
  41. group, err := user.GetCloudgroup()
  42. if err != nil {
  43. return data, errors.Wrapf(err, "GetCloudgroup")
  44. }
  45. uri := saml.AuthUrl
  46. if len(uri) == 0 {
  47. return data, httperrors.NewResourceNotReadyError("saml provider no auth url")
  48. }
  49. url, err := url.Parse(uri)
  50. if err != nil {
  51. return data, httperrors.NewInputParameterError("parse saml auth url %s error", uri)
  52. }
  53. domainId := url.Query().Get("domain_id")
  54. idpId := url.Query().Get("idp")
  55. if len(domainId) == 0 {
  56. return data, httperrors.NewInputParameterError("saml auth url %s missing domain_id", uri)
  57. }
  58. if len(idpId) == 0 {
  59. return data, httperrors.NewInputParameterError("saml auth url %s missing idp", uri)
  60. }
  61. data.NameId = userCred.GetUserName()
  62. data.NameIdFormat = samlutils.NAME_ID_FORMAT_TRANSIENT
  63. data.AudienceRestriction = sp.GetEntityId()
  64. for k, v := range map[string][]string{
  65. "UserName": {userCred.GetUserName()},
  66. "Groups": {group.Name},
  67. } {
  68. data.Attributes = append(data.Attributes, samlutils.SSAMLResponseAttribute{
  69. Name: k, FriendlyName: k,
  70. NameFormat: "urn:oasis:names:tc:SAML:2.0:attrname-format:uri",
  71. Values: v,
  72. })
  73. }
  74. data.Attributes = append(data.Attributes, samlutils.SSAMLResponseAttribute{
  75. Name: "IAM_SAML_Attributes_identityProviders", FriendlyName: "IAM_SAML_Attributes_identityProviders",
  76. NameFormat: "urn:oasis:names:tc:SAML:2.0:attrname-format:basic",
  77. Values: []string{fmt.Sprintf("iam::%s:identityProvider:%s", domainId, idpId)},
  78. })
  79. if len(redirectUrl) > 0 {
  80. data.Attributes = append(data.Attributes, samlutils.SSAMLResponseAttribute{
  81. Name: "IAM_SAML_Attributes_redirect_url", FriendlyName: "IAM_SAML_Attributes_redirect_url",
  82. NameFormat: "urn:oasis:names:tc:SAML:2.0:attrname-format:basic",
  83. Values: []string{redirectUrl},
  84. })
  85. }
  86. return data, nil
  87. }
  88. func (d *SHuaweiSAMLDriver) GetSpInitiatedLoginData(ctx context.Context, userCred mcclient.TokenCredential, managerId string, sp *idp.SSAMLServiceProvider) (samlutils.SSAMLSpInitiatedLoginData, error) {
  89. data := samlutils.SSAMLSpInitiatedLoginData{}
  90. provider, err := models.CloudproviderManager.FetchProvier(managerId)
  91. if err != nil {
  92. return data, err
  93. }
  94. user, err := provider.GetSamlUser(userCred.GetUserId())
  95. if err != nil {
  96. return data, errors.Wrapf(err, "GetSamlUser")
  97. }
  98. group, err := user.GetCloudgroup()
  99. if err != nil {
  100. return data, errors.Wrapf(err, "GetCloudgroup")
  101. }
  102. log.Errorf("group name: %s", group.Name)
  103. data.NameId = userCred.GetUserName()
  104. data.NameIdFormat = samlutils.NAME_ID_FORMAT_TRANSIENT
  105. data.AudienceRestriction = sp.GetEntityId()
  106. for k, v := range map[string][]string{
  107. "UserName": {userCred.GetUserName()},
  108. "Groups": {group.Name},
  109. } {
  110. data.Attributes = append(data.Attributes, samlutils.SSAMLResponseAttribute{
  111. Name: k, FriendlyName: k,
  112. NameFormat: "urn:oasis:names:tc:SAML:2.0:attrname-format:uri",
  113. Values: v,
  114. })
  115. }
  116. return data, nil
  117. }