metadata.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  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 samlutils
  15. import (
  16. "encoding/xml"
  17. "yunion.io/x/pkg/errors"
  18. )
  19. func ParseMetadata(data []byte) (EntityDescriptor, error) {
  20. ed := EntityDescriptor{}
  21. err := xml.Unmarshal(data, &ed)
  22. if err != nil {
  23. return ed, errors.Wrap(err, "xml.Unmarshal")
  24. }
  25. return ed, nil
  26. }
  27. type SSAMLIdpMetadataInput struct {
  28. EntityId string
  29. CertString string
  30. RedirectLoginUrl string
  31. RedirectLogoutUrl string
  32. }
  33. func NewIdpMetadata(input SSAMLIdpMetadataInput) EntityDescriptor {
  34. desc := EntityDescriptor{
  35. XMLName: xml.Name{
  36. Space: XMLNS_MD,
  37. Local: "EntityDescriptor",
  38. },
  39. EntityId: input.EntityId,
  40. IDPSSODescriptor: &SSODescriptor{
  41. XMLName: xml.Name{
  42. Space: XMLNS_MD,
  43. Local: "IDPSSODescriptor",
  44. },
  45. ProtocolSupportEnumeration: PROTOCOL_SAML2,
  46. KeyDescriptors: []KeyDescriptor{
  47. {
  48. XMLName: xml.Name{
  49. Space: XMLNS_MD,
  50. Local: "KeyDescriptor",
  51. },
  52. Use: KEY_USE_SIGNING,
  53. KeyInfo: KeyInfo{
  54. XMLName: xml.Name{
  55. Space: XMLNS_DS,
  56. Local: "KeyInfo",
  57. },
  58. X509Data: &X509Data{
  59. XMLName: xml.Name{
  60. Space: XMLNS_DS,
  61. Local: "X509Data",
  62. },
  63. X509Certificate: X509Certificate{
  64. XMLName: xml.Name{
  65. Space: XMLNS_DS,
  66. Local: "X509Certificate",
  67. },
  68. Cert: input.CertString,
  69. },
  70. },
  71. },
  72. },
  73. {
  74. XMLName: xml.Name{
  75. Space: XMLNS_MD,
  76. Local: "KeyDescriptor",
  77. },
  78. Use: KEY_USE_ENCRYPTION,
  79. KeyInfo: KeyInfo{
  80. XMLName: xml.Name{
  81. Space: XMLNS_DS,
  82. Local: "KeyInfo",
  83. },
  84. X509Data: &X509Data{
  85. XMLName: xml.Name{
  86. Space: XMLNS_DS,
  87. Local: "X509Data",
  88. },
  89. X509Certificate: X509Certificate{
  90. XMLName: xml.Name{
  91. Space: XMLNS_DS,
  92. Local: "X509Certificate",
  93. },
  94. Cert: input.CertString,
  95. },
  96. },
  97. },
  98. },
  99. },
  100. SingleLogoutServices: []SSAMLService{
  101. {
  102. XMLName: xml.Name{
  103. Space: XMLNS_MD,
  104. Local: "SingleLogoutService",
  105. },
  106. Binding: BINDING_HTTP_REDIRECT,
  107. Location: input.RedirectLogoutUrl,
  108. },
  109. },
  110. NameIDFormat: []SSAMLNameIDFormat{
  111. {
  112. XMLName: xml.Name{
  113. Space: XMLNS_MD,
  114. Local: "NameIDFormat",
  115. },
  116. Format: NAME_ID_FORMAT_TRANSIENT,
  117. },
  118. },
  119. SingleSignOnServices: []SSAMLService{
  120. {
  121. XMLName: xml.Name{
  122. Space: XMLNS_MD,
  123. Local: "SingleSignOnService",
  124. },
  125. Binding: BINDING_HTTP_REDIRECT,
  126. Location: input.RedirectLoginUrl,
  127. },
  128. },
  129. },
  130. }
  131. return desc
  132. }
  133. type SSAMLSpMetadataInput struct {
  134. EntityId string
  135. CertString string
  136. AssertionConsumerUrl string
  137. ServiceName string
  138. RequestedAttributes []RequestedAttribute
  139. }
  140. func NewSpMetadata(input SSAMLSpMetadataInput) EntityDescriptor {
  141. strTrue := "true"
  142. strIndex := "1"
  143. reqAttrs := make([]RequestedAttribute, len(input.RequestedAttributes))
  144. for i := range input.RequestedAttributes {
  145. reqAttrs[i] = RequestedAttribute{
  146. XMLName: xml.Name{
  147. Space: XMLNS_MD,
  148. Local: "RequestedAttribute",
  149. },
  150. IsRequired: input.RequestedAttributes[i].IsRequired,
  151. Name: input.RequestedAttributes[i].Name,
  152. FriendlyName: input.RequestedAttributes[i].FriendlyName,
  153. }
  154. }
  155. desc := EntityDescriptor{
  156. XMLName: xml.Name{
  157. Space: XMLNS_MD,
  158. Local: "EntityDescriptor",
  159. },
  160. EntityId: input.EntityId,
  161. SPSSODescriptor: &SSODescriptor{
  162. XMLName: xml.Name{
  163. Space: XMLNS_MD,
  164. Local: "SPSSODescriptor",
  165. },
  166. ProtocolSupportEnumeration: PROTOCOL_SAML2,
  167. WantAssertionsSigned: &strTrue,
  168. KeyDescriptors: []KeyDescriptor{
  169. {
  170. XMLName: xml.Name{
  171. Space: XMLNS_MD,
  172. Local: "KeyDescriptor",
  173. },
  174. Use: KEY_USE_SIGNING,
  175. KeyInfo: KeyInfo{
  176. XMLName: xml.Name{
  177. Space: XMLNS_DS,
  178. Local: "KeyInfo",
  179. },
  180. X509Data: &X509Data{
  181. XMLName: xml.Name{
  182. Space: XMLNS_DS,
  183. Local: "X509Data",
  184. },
  185. X509Certificate: X509Certificate{
  186. XMLName: xml.Name{
  187. Space: XMLNS_DS,
  188. Local: "X509Certificate",
  189. },
  190. Cert: input.CertString,
  191. },
  192. },
  193. },
  194. },
  195. {
  196. XMLName: xml.Name{
  197. Space: XMLNS_MD,
  198. Local: "KeyDescriptor",
  199. },
  200. Use: KEY_USE_ENCRYPTION,
  201. KeyInfo: KeyInfo{
  202. XMLName: xml.Name{
  203. Space: XMLNS_DS,
  204. Local: "KeyInfo",
  205. },
  206. X509Data: &X509Data{
  207. XMLName: xml.Name{
  208. Space: XMLNS_DS,
  209. Local: "X509Data",
  210. },
  211. X509Certificate: X509Certificate{
  212. XMLName: xml.Name{
  213. Space: XMLNS_DS,
  214. Local: "X509Certificate",
  215. },
  216. Cert: input.CertString,
  217. },
  218. },
  219. },
  220. },
  221. },
  222. NameIDFormat: []SSAMLNameIDFormat{
  223. {
  224. XMLName: xml.Name{
  225. Space: XMLNS_MD,
  226. Local: "NameIDFormat",
  227. },
  228. Format: NAME_ID_FORMAT_TRANSIENT,
  229. },
  230. },
  231. AssertionConsumerServices: []SSAMLService{
  232. {
  233. XMLName: xml.Name{
  234. Space: XMLNS_MD,
  235. Local: "AssertionConsumerService",
  236. },
  237. Binding: BINDING_HTTP_POST,
  238. Location: input.AssertionConsumerUrl,
  239. Index: &strIndex,
  240. IsDefault: &strTrue,
  241. },
  242. },
  243. AttributeConsumingServices: []AttributeConsumingService{
  244. {
  245. XMLName: xml.Name{
  246. Space: XMLNS_MD,
  247. Local: "AttributeConsumingService",
  248. },
  249. Index: strIndex,
  250. ServiceName: SXMLText{
  251. XMLName: xml.Name{
  252. Space: XMLNS_MD,
  253. Local: "ServiceName",
  254. },
  255. Lang: "en",
  256. Text: input.ServiceName,
  257. },
  258. RequestedAttributes: reqAttrs,
  259. },
  260. },
  261. },
  262. }
  263. return desc
  264. }