()
| 330 | } |
| 331 | |
| 332 | func (r *RootCmd) removeToken() *serpent.Command { |
| 333 | var deleteToken bool |
| 334 | cmd := &serpent.Command{ |
| 335 | Use: "remove <name|id|token>", |
| 336 | Aliases: []string{"delete"}, |
| 337 | Short: "Expire or delete a token", |
| 338 | Long: "Remove a token by expiring it. Use --delete to permanently hard-" + |
| 339 | "delete the token instead.", |
| 340 | Middleware: serpent.Chain( |
| 341 | serpent.RequireNArgs(1), |
| 342 | ), |
| 343 | Handler: func(inv *serpent.Invocation) error { |
| 344 | client, err := r.InitClient(inv) |
| 345 | if err != nil { |
| 346 | return err |
| 347 | } |
| 348 | |
| 349 | token, err := client.APIKeyByName(inv.Context(), codersdk.Me, inv.Args[0]) |
| 350 | if err != nil { |
| 351 | // If it's a token, we need to extract the ID. |
| 352 | maybeID := strings.Split(inv.Args[0], "-")[0] |
| 353 | token, err = client.APIKeyByID(inv.Context(), codersdk.Me, maybeID) |
| 354 | if err != nil { |
| 355 | return xerrors.Errorf("fetch api key by name or id: %w", err) |
| 356 | } |
| 357 | } |
| 358 | |
| 359 | if deleteToken { |
| 360 | err = client.DeleteAPIKey(inv.Context(), codersdk.Me, token.ID) |
| 361 | if err != nil { |
| 362 | return xerrors.Errorf("delete api key: %w", err) |
| 363 | } |
| 364 | cliui.Infof(inv.Stdout, "Token has been deleted.") |
| 365 | return nil |
| 366 | } |
| 367 | |
| 368 | err = client.ExpireAPIKey(inv.Context(), codersdk.Me, token.ID) |
| 369 | if err != nil { |
| 370 | return xerrors.Errorf("expire api key: %w", err) |
| 371 | } |
| 372 | cliui.Infof(inv.Stdout, "Token has been expired.") |
| 373 | return nil |
| 374 | }, |
| 375 | } |
| 376 | |
| 377 | cmd.Options = serpent.OptionSet{ |
| 378 | { |
| 379 | Flag: "delete", |
| 380 | Description: "Permanently delete the token instead of expiring it. This removes the audit trail.", |
| 381 | Value: serpent.BoolOf(&deleteToken), |
| 382 | }, |
| 383 | } |
| 384 | |
| 385 | return cmd |
| 386 | } |
no test coverage detected