github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/api/uaa/user.go (about) 1 package uaa 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "net/http" 8 "net/url" 9 10 "code.cloudfoundry.org/cli/api/uaa/internal" 11 ) 12 13 // User represents an UAA user account. 14 type User struct { 15 ID string `json:"id"` 16 Username string `json:"userName,omitempty"` 17 Password string `json:"password,omitempty"` 18 Origin string `json:"origin,omitempty"` 19 Name UserName `json:"name"` 20 Emails []Email `json:"emails"` 21 Groups []Group `json:"groups,omitempty"` 22 } 23 24 type UserName struct { 25 FamilyName string `json:"familyName"` 26 GivenName string `json:"givenName"` 27 } 28 29 type Email struct { 30 Value string `json:"value"` 31 Primary bool `json:"primary"` 32 } 33 34 // CreateUser creates a new UAA user account with the provided password. 35 func (client *Client) CreateUser(user string, password string, origin string) (User, error) { 36 userRequest := User{ 37 Username: user, 38 Password: password, 39 Origin: origin, 40 Name: UserName{ 41 FamilyName: user, 42 GivenName: user, 43 }, 44 Emails: []Email{ 45 { 46 Value: user, 47 Primary: true, 48 }, 49 }, 50 } 51 52 bodyBytes, err := json.Marshal(userRequest) 53 if err != nil { 54 return User{}, err 55 } 56 57 request, err := client.newRequest(requestOptions{ 58 RequestName: internal.PostUserRequest, 59 Header: http.Header{ 60 "Content-Type": {"application/json"}, 61 }, 62 Body: bytes.NewBuffer(bodyBytes), 63 }) 64 if err != nil { 65 return User{}, err 66 } 67 68 var userResponse User 69 response := Response{ 70 Result: &userResponse, 71 } 72 73 err = client.connection.Make(request, &response) 74 if err != nil { 75 return User{}, err 76 } 77 78 return User(userResponse), nil 79 } 80 81 // CreateUser creates a new UAA user account with the provided object. 82 func (client *Client) CreateUserFromObject(user User) (User, error) { 83 bodyBytes, err := json.Marshal(user) 84 if err != nil { 85 return User{}, err 86 } 87 request, err := client.newRequest(requestOptions{ 88 RequestName: internal.PostUserRequest, 89 Header: http.Header{ 90 "Content-Type": {"application/json"}, 91 }, 92 Body: bytes.NewBuffer(bodyBytes), 93 }) 94 if err != nil { 95 return User{}, err 96 } 97 98 var userResponse User 99 response := Response{ 100 Result: &userResponse, 101 } 102 103 err = client.connection.Make(request, &response) 104 if err != nil { 105 return User{}, err 106 } 107 108 return User(userResponse), nil 109 } 110 111 // DeleteUser delete an UAA user account. 112 func (client *Client) DeleteUser(guid string) error { 113 request, err := client.newRequest(requestOptions{ 114 RequestName: internal.DeleteUserRequest, 115 Header: http.Header{ 116 "Content-Type": {"application/json"}, 117 }, 118 URIParams: internal.Params{"user_guid": guid}, 119 }) 120 if err != nil { 121 return err 122 } 123 124 var userResponse User 125 response := Response{ 126 Result: &userResponse, 127 } 128 129 err = client.connection.Make(request, &response) 130 if err != nil { 131 return err 132 } 133 134 return nil 135 } 136 137 // GetUser get an UAA user account by its id. 138 func (client *Client) GetUser(guid string) (User, error) { 139 request, err := client.newRequest(requestOptions{ 140 RequestName: internal.GetUserRequest, 141 Header: http.Header{ 142 "Content-Type": {"application/json"}, 143 }, 144 URIParams: internal.Params{"user_guid": guid}, 145 }) 146 if err != nil { 147 return User{}, err 148 } 149 150 var userResponse User 151 response := Response{ 152 Result: &userResponse, 153 } 154 155 err = client.connection.Make(request, &response) 156 if err != nil { 157 return User{}, err 158 } 159 160 return User(userResponse), nil 161 } 162 163 // UpdateUser update a UAA user account. 164 func (client *Client) UpdateUser(user User) (User, error) { 165 bodyBytes, err := json.Marshal(user) 166 if err != nil { 167 return User{}, err 168 } 169 fmt.Println(string(bodyBytes)) 170 request, err := client.newRequest(requestOptions{ 171 RequestName: internal.PutUserRequest, 172 Header: http.Header{ 173 "Content-Type": {"application/json"}, 174 "If-Match": {"*"}, 175 }, 176 Body: bytes.NewBuffer(bodyBytes), 177 URIParams: internal.Params{"user_guid": user.ID}, 178 }) 179 if err != nil { 180 return User{}, err 181 } 182 183 var userResponse User 184 response := Response{ 185 Result: &userResponse, 186 } 187 188 err = client.connection.Make(request, &response) 189 if err != nil { 190 return User{}, err 191 } 192 193 return User(userResponse), nil 194 } 195 196 // GetUsers get all UAA user account by its username. 197 func (client *Client) GetUsersByUsername(username string) ([]User, error) { 198 request, err := client.newRequest(requestOptions{ 199 RequestName: internal.GetUsersRequest, 200 Header: http.Header{ 201 "Content-Type": {"application/json"}, 202 }, 203 Query: url.Values{ 204 "attributes": []string{"id,userName"}, 205 "filter": []string{fmt.Sprintf(`userName Eq "%s"`, username)}, 206 }, 207 }) 208 if err != nil { 209 return []User{}, err 210 } 211 212 var usersResources struct { 213 Users []User `json:"resources"` 214 } 215 response := Response{ 216 Result: &usersResources, 217 } 218 219 err = client.connection.Make(request, &response) 220 if err != nil { 221 return []User{}, err 222 } 223 return usersResources.Users, err 224 } 225 226 // ChangeUserPassword change an user password by its id. 227 func (client *Client) ChangeUserPassword(guid, oldPass, newPass string) error { 228 changePassRequest := struct { 229 OldPassword string `json:"oldPassword"` 230 Password string `json:"password"` 231 }{ 232 OldPassword: oldPass, 233 Password: newPass, 234 } 235 bodyBytes, err := json.Marshal(changePassRequest) 236 if err != nil { 237 return err 238 } 239 request, err := client.newRequest(requestOptions{ 240 RequestName: internal.PutUserPasswordRequest, 241 Header: http.Header{ 242 "Content-Type": {"application/json"}, 243 }, 244 URIParams: internal.Params{"user_guid": guid}, 245 Body: bytes.NewBuffer(bodyBytes), 246 }) 247 if err != nil { 248 return err 249 } 250 251 response := Response{ 252 } 253 254 err = client.connection.Make(request, &response) 255 if err != nil { 256 return err 257 } 258 259 return nil 260 }