user.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. // Copyright 2023 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 ksyun
  15. import (
  16. "time"
  17. api "yunion.io/x/cloudmux/pkg/apis/cloudid"
  18. "yunion.io/x/cloudmux/pkg/cloudprovider"
  19. "yunion.io/x/cloudmux/pkg/multicloud"
  20. "yunion.io/x/pkg/errors"
  21. )
  22. type SUser struct {
  23. multicloud.SBaseClouduser
  24. client *SKsyunClient
  25. UserId string
  26. Path string
  27. UserName string
  28. RealName string
  29. CreateDate time.Time
  30. Phone string
  31. CountryMobileCode string
  32. Email string
  33. PhoneVerified string
  34. EmailVerified string
  35. Remark string
  36. Krn string
  37. PasswordResetRequired bool
  38. EnableMFA int
  39. UpdateDate time.Time
  40. }
  41. func (user *SUser) GetGlobalId() string {
  42. return user.UserName
  43. }
  44. func (user *SUser) GetName() string {
  45. return user.UserName
  46. }
  47. func (user *SUser) GetEmailAddr() string {
  48. return user.Email
  49. }
  50. func (user *SUser) GetInviteUrl() string {
  51. return ""
  52. }
  53. func (user *SUser) Delete() error {
  54. return user.client.DeleteUser(user.UserName)
  55. }
  56. func (user *SUser) GetICloudgroups() ([]cloudprovider.ICloudgroup, error) {
  57. groups, err := user.client.ListGroupsForUser(user.UserName)
  58. if err != nil {
  59. return nil, err
  60. }
  61. ret := []cloudprovider.ICloudgroup{}
  62. for i := range groups {
  63. groups[i].client = user.client
  64. ret = append(ret, &groups[i])
  65. }
  66. return ret, nil
  67. }
  68. func (user *SUser) GetICloudpolicies() ([]cloudprovider.ICloudpolicy, error) {
  69. policies, err := user.client.ListAttachedUserPolicies(user.UserName)
  70. if err != nil {
  71. return nil, err
  72. }
  73. ret := []cloudprovider.ICloudpolicy{}
  74. for i := range policies {
  75. policies[i].client = user.client
  76. ret = append(ret, &policies[i])
  77. }
  78. return ret, nil
  79. }
  80. func (user *SUser) IsConsoleLogin() bool {
  81. profile, err := user.client.GetLoginProfile(user.UserName)
  82. if err != nil {
  83. return false
  84. }
  85. return profile.ConsoleLogin
  86. }
  87. func (user *SUser) ResetPassword(password string) error {
  88. return user.client.UpdateLoginProfile(user.UserName, password)
  89. }
  90. func (client *SKsyunClient) UpdateLoginProfile(name, password string) error {
  91. params := map[string]interface{}{
  92. "UserName": name,
  93. "Password": password,
  94. "ViewAllProject": "true",
  95. }
  96. _, err := client.iamRequest("", "UpdateLoginProfile", params)
  97. return err
  98. }
  99. type LoginProfile struct {
  100. PasswordResetRequired bool
  101. ConsoleLogin bool
  102. LastLoginDate time.Time
  103. }
  104. func (client *SKsyunClient) GetLoginProfile(name string) (*LoginProfile, error) {
  105. params := map[string]interface{}{
  106. "UserName": name,
  107. }
  108. resp, err := client.iamRequest("", "GetLoginProfile", params)
  109. if err != nil {
  110. return nil, err
  111. }
  112. ret := &LoginProfile{}
  113. err = resp.Unmarshal(ret, "LoginProfile")
  114. if err != nil {
  115. return nil, err
  116. }
  117. return ret, nil
  118. }
  119. func (user *SUser) AttachPolicy(policyName string, policyType api.TPolicyType) error {
  120. return user.client.AttachUserPolicy(user.UserName, policyName)
  121. }
  122. func (user *SUser) DetachPolicy(policyName string, policyType api.TPolicyType) error {
  123. return user.client.DetachUserPolicy(user.UserName, policyName)
  124. }
  125. func (client *SKsyunClient) GetUsers() ([]SUser, error) {
  126. params := map[string]interface{}{
  127. "MaxItems": "100",
  128. }
  129. ret := []SUser{}
  130. for {
  131. resp, err := client.iamRequest("", "ListUsers", params)
  132. if err != nil {
  133. return nil, err
  134. }
  135. part := struct {
  136. Users struct {
  137. Member []SUser
  138. }
  139. Marker string
  140. }{}
  141. err = resp.Unmarshal(&part)
  142. if err != nil {
  143. return nil, err
  144. }
  145. ret = append(ret, part.Users.Member...)
  146. if len(part.Users.Member) == 0 || len(part.Marker) == 0 {
  147. break
  148. }
  149. params["Marker"] = part.Marker
  150. }
  151. return ret, nil
  152. }
  153. func (client *SKsyunClient) DeleteUser(name string) error {
  154. params := map[string]interface{}{
  155. "UserName": name,
  156. }
  157. _, err := client.iamRequest("", "DeleteUser", params)
  158. return err
  159. }
  160. func (client *SKsyunClient) GetICloudusers() ([]cloudprovider.IClouduser, error) {
  161. users, err := client.GetUsers()
  162. if err != nil {
  163. return nil, err
  164. }
  165. ret := []cloudprovider.IClouduser{}
  166. for i := range users {
  167. users[i].client = client
  168. ret = append(ret, &users[i])
  169. }
  170. return ret, nil
  171. }
  172. func (client *SKsyunClient) CreateIClouduser(opts *cloudprovider.SClouduserCreateConfig) (cloudprovider.IClouduser, error) {
  173. user, err := client.CreateUser(opts)
  174. if err != nil {
  175. return nil, err
  176. }
  177. return user, nil
  178. }
  179. func (client *SKsyunClient) CreateUser(opts *cloudprovider.SClouduserCreateConfig) (*SUser, error) {
  180. params := map[string]interface{}{
  181. "UserName": opts.Name,
  182. "Remark": opts.Desc,
  183. "Email": opts.Email,
  184. "Phone": opts.MobilePhone,
  185. "Password": opts.Password,
  186. }
  187. resp, err := client.iamRequest("", "CreateUser", params)
  188. if err != nil {
  189. return nil, err
  190. }
  191. ret := &SUser{client: client}
  192. err = resp.Unmarshal(ret, "User")
  193. if err != nil {
  194. return nil, err
  195. }
  196. return ret, nil
  197. }
  198. func (client *SKsyunClient) ListGroupsForUser(name string) ([]SGroup, error) {
  199. params := map[string]interface{}{
  200. "UserName": name,
  201. "MaxItems": "100",
  202. }
  203. ret := []SGroup{}
  204. for {
  205. resp, err := client.iamRequest("", "ListGroupsForUser", params)
  206. if err != nil {
  207. return nil, err
  208. }
  209. part := struct {
  210. Groups struct {
  211. Memeber []SGroup
  212. }
  213. Marker string
  214. }{}
  215. err = resp.Unmarshal(&part)
  216. if err != nil {
  217. return nil, err
  218. }
  219. ret = append(ret, part.Groups.Memeber...)
  220. if len(part.Marker) == 0 || len(part.Groups.Memeber) == 0 {
  221. break
  222. }
  223. params["Marker"] = part.Marker
  224. }
  225. return ret, nil
  226. }
  227. func (client *SKsyunClient) ListAttachedUserPolicies(name string) ([]SPolicy, error) {
  228. params := map[string]interface{}{
  229. "UserName": name,
  230. "MaxItems": "100",
  231. }
  232. ret := []SPolicy{}
  233. for {
  234. resp, err := client.iamRequest("", "ListAttachedUserPolicies", params)
  235. if err != nil {
  236. return nil, err
  237. }
  238. part := struct {
  239. AttachedPolicies struct {
  240. Member []SPolicy
  241. }
  242. Marker string
  243. }{}
  244. err = resp.Unmarshal(&part)
  245. if err != nil {
  246. return nil, errors.Wrapf(err, "Unmarshal")
  247. }
  248. ret = append(ret, part.AttachedPolicies.Member...)
  249. if len(part.Marker) == 0 || len(part.AttachedPolicies.Member) == 0 {
  250. break
  251. }
  252. params["Marker"] = part.Marker
  253. }
  254. return ret, nil
  255. }
  256. func (client *SKsyunClient) AttachUserPolicy(name, policy string) error {
  257. params := map[string]interface{}{
  258. "UserName": name,
  259. "PolicyKrn": policy,
  260. }
  261. _, err := client.iamRequest("", "AttachUserPolicy", params)
  262. return err
  263. }
  264. func (client *SKsyunClient) DetachUserPolicy(name, policy string) error {
  265. params := map[string]interface{}{
  266. "UserName": name,
  267. "PolicyKrn": policy,
  268. }
  269. _, err := client.iamRequest("", "DetachUserPolicy", params)
  270. return err
  271. }
  272. func (client *SKsyunClient) GetIClouduserByName(name string) (cloudprovider.IClouduser, error) {
  273. user, err := client.GetUser(name)
  274. if err != nil {
  275. return nil, err
  276. }
  277. return user, nil
  278. }
  279. func (client *SKsyunClient) GetUser(name string) (*SUser, error) {
  280. params := map[string]interface{}{
  281. "UserName": name,
  282. }
  283. resp, err := client.iamRequest("", "GetUser", params)
  284. if err != nil {
  285. return nil, err
  286. }
  287. ret := &SUser{client: client}
  288. err = resp.Unmarshal(ret, "User")
  289. if err != nil {
  290. return nil, err
  291. }
  292. return ret, nil
  293. }