api polish: change password (#834)

This commit is contained in:
Michael Quigley 2025-02-03 11:03:22 -05:00
parent 9f31112e1b
commit d13a47d1c0
No known key found for this signature in database
GPG Key ID: 9B60314A9DD20A62
15 changed files with 300 additions and 72 deletions

View File

@ -19,7 +19,7 @@ func newChangePasswordHandler(cfg *config.Config) *changePasswordHandler {
} }
func (handler *changePasswordHandler) Handle(params account.ChangePasswordParams, principal *rest_model_zrok.Principal) middleware.Responder { func (handler *changePasswordHandler) Handle(params account.ChangePasswordParams, principal *rest_model_zrok.Principal) middleware.Responder {
if params.Body == nil || params.Body.Email == "" || params.Body.OldPassword == "" || params.Body.NewPassword == "" { if params.Body.Email == "" || params.Body.OldPassword == "" || params.Body.NewPassword == "" {
logrus.Error("missing email, old, or new password") logrus.Error("missing email, old, or new password")
return account.NewChangePasswordUnauthorized() return account.NewChangePasswordUnauthorized()
} }

View File

@ -14,8 +14,6 @@ import (
"github.com/go-openapi/runtime" "github.com/go-openapi/runtime"
cr "github.com/go-openapi/runtime/client" cr "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt" "github.com/go-openapi/strfmt"
"github.com/openziti/zrok/rest_model_zrok"
) )
// NewChangePasswordParams creates a new ChangePasswordParams object, // NewChangePasswordParams creates a new ChangePasswordParams object,
@ -64,7 +62,7 @@ ChangePasswordParams contains all the parameters to send to the API endpoint
type ChangePasswordParams struct { type ChangePasswordParams struct {
// Body. // Body.
Body *rest_model_zrok.ChangePasswordRequest Body ChangePasswordBody
timeout time.Duration timeout time.Duration
Context context.Context Context context.Context
@ -120,13 +118,13 @@ func (o *ChangePasswordParams) SetHTTPClient(client *http.Client) {
} }
// WithBody adds the body to the change password params // WithBody adds the body to the change password params
func (o *ChangePasswordParams) WithBody(body *rest_model_zrok.ChangePasswordRequest) *ChangePasswordParams { func (o *ChangePasswordParams) WithBody(body ChangePasswordBody) *ChangePasswordParams {
o.SetBody(body) o.SetBody(body)
return o return o
} }
// SetBody adds the body to the change password params // SetBody adds the body to the change password params
func (o *ChangePasswordParams) SetBody(body *rest_model_zrok.ChangePasswordRequest) { func (o *ChangePasswordParams) SetBody(body ChangePasswordBody) {
o.Body = body o.Body = body
} }
@ -137,10 +135,8 @@ func (o *ChangePasswordParams) WriteToRequest(r runtime.ClientRequest, reg strfm
return err return err
} }
var res []error var res []error
if o.Body != nil { if err := r.SetBodyParam(o.Body); err != nil {
if err := r.SetBodyParam(o.Body); err != nil { return err
return err
}
} }
if len(res) > 0 { if len(res) > 0 {

View File

@ -6,11 +6,13 @@ package account
// Editing this file might prove futile when you re-run the swagger generate command // Editing this file might prove futile when you re-run the swagger generate command
import ( import (
"context"
"fmt" "fmt"
"io" "io"
"github.com/go-openapi/runtime" "github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt" "github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
"github.com/openziti/zrok/rest_model_zrok" "github.com/openziti/zrok/rest_model_zrok"
) )
@ -347,3 +349,47 @@ func (o *ChangePasswordInternalServerError) readResponse(response runtime.Client
return nil return nil
} }
/*
ChangePasswordBody change password body
swagger:model ChangePasswordBody
*/
type ChangePasswordBody struct {
// email
Email string `json:"email,omitempty"`
// new password
NewPassword string `json:"newPassword,omitempty"`
// old password
OldPassword string `json:"oldPassword,omitempty"`
}
// Validate validates this change password body
func (o *ChangePasswordBody) Validate(formats strfmt.Registry) error {
return nil
}
// ContextValidate validates this change password body based on context it is used
func (o *ChangePasswordBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (o *ChangePasswordBody) MarshalBinary() ([]byte, error) {
if o == nil {
return nil, nil
}
return swag.WriteJSON(o)
}
// UnmarshalBinary interface implementation
func (o *ChangePasswordBody) UnmarshalBinary(b []byte) error {
var res ChangePasswordBody
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*o = res
return nil
}

View File

@ -137,7 +137,17 @@ func init() {
"name": "body", "name": "body",
"in": "body", "in": "body",
"schema": { "schema": {
"$ref": "#/definitions/changePasswordRequest" "properties": {
"email": {
"type": "string"
},
"newPassword": {
"type": "string"
},
"oldPassword": {
"type": "string"
}
}
} }
} }
], ],
@ -1706,20 +1716,6 @@ func init() {
} }
} }
}, },
"changePasswordRequest": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"newPassword": {
"type": "string"
},
"oldPassword": {
"type": "string"
}
}
},
"configuration": { "configuration": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -2446,7 +2442,17 @@ func init() {
"name": "body", "name": "body",
"in": "body", "in": "body",
"schema": { "schema": {
"$ref": "#/definitions/changePasswordRequest" "properties": {
"email": {
"type": "string"
},
"newPassword": {
"type": "string"
},
"oldPassword": {
"type": "string"
}
}
} }
} }
], ],
@ -4017,20 +4023,6 @@ func init() {
} }
} }
}, },
"changePasswordRequest": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"newPassword": {
"type": "string"
},
"oldPassword": {
"type": "string"
}
}
},
"configuration": { "configuration": {
"type": "object", "type": "object",
"properties": { "properties": {

View File

@ -6,9 +6,12 @@ package account
// Editing this file might prove futile when you re-run the generate command // Editing this file might prove futile when you re-run the generate command
import ( import (
"context"
"net/http" "net/http"
"github.com/go-openapi/runtime/middleware" "github.com/go-openapi/runtime/middleware"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
"github.com/openziti/zrok/rest_model_zrok" "github.com/openziti/zrok/rest_model_zrok"
) )
@ -69,3 +72,46 @@ func (o *ChangePassword) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
o.Context.Respond(rw, r, route.Produces, route, res) o.Context.Respond(rw, r, route.Produces, route, res)
} }
// ChangePasswordBody change password body
//
// swagger:model ChangePasswordBody
type ChangePasswordBody struct {
// email
Email string `json:"email,omitempty"`
// new password
NewPassword string `json:"newPassword,omitempty"`
// old password
OldPassword string `json:"oldPassword,omitempty"`
}
// Validate validates this change password body
func (o *ChangePasswordBody) Validate(formats strfmt.Registry) error {
return nil
}
// ContextValidate validates this change password body based on context it is used
func (o *ChangePasswordBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (o *ChangePasswordBody) MarshalBinary() ([]byte, error) {
if o == nil {
return nil, nil
}
return swag.WriteJSON(o)
}
// UnmarshalBinary interface implementation
func (o *ChangePasswordBody) UnmarshalBinary(b []byte) error {
var res ChangePasswordBody
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*o = res
return nil
}

View File

@ -12,8 +12,6 @@ import (
"github.com/go-openapi/runtime" "github.com/go-openapi/runtime"
"github.com/go-openapi/runtime/middleware" "github.com/go-openapi/runtime/middleware"
"github.com/go-openapi/validate" "github.com/go-openapi/validate"
"github.com/openziti/zrok/rest_model_zrok"
) )
// NewChangePasswordParams creates a new ChangePasswordParams object // NewChangePasswordParams creates a new ChangePasswordParams object
@ -36,7 +34,7 @@ type ChangePasswordParams struct {
/* /*
In: body In: body
*/ */
Body *rest_model_zrok.ChangePasswordRequest Body ChangePasswordBody
} }
// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface // BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface
@ -50,7 +48,7 @@ func (o *ChangePasswordParams) BindRequest(r *http.Request, route *middleware.Ma
if runtime.HasBody(r) { if runtime.HasBody(r) {
defer r.Body.Close() defer r.Body.Close()
var body rest_model_zrok.ChangePasswordRequest var body ChangePasswordBody
if err := route.Consumer.Consume(r.Body, &body); err != nil { if err := route.Consumer.Consume(r.Body, &body); err != nil {
res = append(res, errors.NewParseError("body", "body", "", err)) res = append(res, errors.NewParseError("body", "body", "", err))
} else { } else {
@ -65,7 +63,7 @@ func (o *ChangePasswordParams) BindRequest(r *http.Request, route *middleware.Ma
} }
if len(res) == 0 { if len(res) == 0 {
o.Body = &body o.Body = body
} }
} }
} }

View File

@ -28,7 +28,7 @@ from zrok_api.models.access_request import AccessRequest
from zrok_api.models.access_response import AccessResponse from zrok_api.models.access_response import AccessResponse
from zrok_api.models.account_body import AccountBody from zrok_api.models.account_body import AccountBody
from zrok_api.models.auth_user import AuthUser from zrok_api.models.auth_user import AuthUser
from zrok_api.models.change_password_request import ChangePasswordRequest from zrok_api.models.change_password_body import ChangePasswordBody
from zrok_api.models.configuration import Configuration from zrok_api.models.configuration import Configuration
from zrok_api.models.create_frontend_request import CreateFrontendRequest from zrok_api.models.create_frontend_request import CreateFrontendRequest
from zrok_api.models.create_frontend_response import CreateFrontendResponse from zrok_api.models.create_frontend_response import CreateFrontendResponse

View File

@ -41,7 +41,7 @@ class AccountApi(object):
>>> result = thread.get() >>> result = thread.get()
:param async_req bool :param async_req bool
:param ChangePasswordRequest body: :param ChangePasswordBody body:
:return: None :return: None
If the method is called asynchronously, If the method is called asynchronously,
returns the request thread. returns the request thread.
@ -62,7 +62,7 @@ class AccountApi(object):
>>> result = thread.get() >>> result = thread.get()
:param async_req bool :param async_req bool
:param ChangePasswordRequest body: :param ChangePasswordBody body:
:return: None :return: None
If the method is called asynchronously, If the method is called asynchronously,
returns the request thread. returns the request thread.

View File

@ -18,7 +18,7 @@ from zrok_api.models.access_request import AccessRequest
from zrok_api.models.access_response import AccessResponse from zrok_api.models.access_response import AccessResponse
from zrok_api.models.account_body import AccountBody from zrok_api.models.account_body import AccountBody
from zrok_api.models.auth_user import AuthUser from zrok_api.models.auth_user import AuthUser
from zrok_api.models.change_password_request import ChangePasswordRequest from zrok_api.models.change_password_body import ChangePasswordBody
from zrok_api.models.configuration import Configuration from zrok_api.models.configuration import Configuration
from zrok_api.models.create_frontend_request import CreateFrontendRequest from zrok_api.models.create_frontend_request import CreateFrontendRequest
from zrok_api.models.create_frontend_response import CreateFrontendResponse from zrok_api.models.create_frontend_response import CreateFrontendResponse

View File

@ -0,0 +1,162 @@
# coding: utf-8
"""
zrok
zrok client access # noqa: E501
OpenAPI spec version: 1.0.0
Generated by: https://github.com/swagger-api/swagger-codegen.git
"""
import pprint
import re # noqa: F401
import six
class ChangePasswordBody(object):
"""NOTE: This class is auto generated by the swagger code generator program.
Do not edit the class manually.
"""
"""
Attributes:
swagger_types (dict): The key is attribute name
and the value is attribute type.
attribute_map (dict): The key is attribute name
and the value is json key in definition.
"""
swagger_types = {
'email': 'str',
'old_password': 'str',
'new_password': 'str'
}
attribute_map = {
'email': 'email',
'old_password': 'oldPassword',
'new_password': 'newPassword'
}
def __init__(self, email=None, old_password=None, new_password=None): # noqa: E501
"""ChangePasswordBody - a model defined in Swagger""" # noqa: E501
self._email = None
self._old_password = None
self._new_password = None
self.discriminator = None
if email is not None:
self.email = email
if old_password is not None:
self.old_password = old_password
if new_password is not None:
self.new_password = new_password
@property
def email(self):
"""Gets the email of this ChangePasswordBody. # noqa: E501
:return: The email of this ChangePasswordBody. # noqa: E501
:rtype: str
"""
return self._email
@email.setter
def email(self, email):
"""Sets the email of this ChangePasswordBody.
:param email: The email of this ChangePasswordBody. # noqa: E501
:type: str
"""
self._email = email
@property
def old_password(self):
"""Gets the old_password of this ChangePasswordBody. # noqa: E501
:return: The old_password of this ChangePasswordBody. # noqa: E501
:rtype: str
"""
return self._old_password
@old_password.setter
def old_password(self, old_password):
"""Sets the old_password of this ChangePasswordBody.
:param old_password: The old_password of this ChangePasswordBody. # noqa: E501
:type: str
"""
self._old_password = old_password
@property
def new_password(self):
"""Gets the new_password of this ChangePasswordBody. # noqa: E501
:return: The new_password of this ChangePasswordBody. # noqa: E501
:rtype: str
"""
return self._new_password
@new_password.setter
def new_password(self, new_password):
"""Sets the new_password of this ChangePasswordBody.
:param new_password: The new_password of this ChangePasswordBody. # noqa: E501
:type: str
"""
self._new_password = new_password
def to_dict(self):
"""Returns the model properties as a dict"""
result = {}
for attr, _ in six.iteritems(self.swagger_types):
value = getattr(self, attr)
if isinstance(value, list):
result[attr] = list(map(
lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
value
))
elif hasattr(value, "to_dict"):
result[attr] = value.to_dict()
elif isinstance(value, dict):
result[attr] = dict(map(
lambda item: (item[0], item[1].to_dict())
if hasattr(item[1], "to_dict") else item,
value.items()
))
else:
result[attr] = value
if issubclass(ChangePasswordBody, dict):
for key, value in self.items():
result[key] = value
return result
def to_str(self):
"""Returns the string representation of the model"""
return pprint.pformat(self.to_dict())
def __repr__(self):
"""For `print` and `pprint`"""
return self.to_str()
def __eq__(self, other):
"""Returns true if both objects are equal"""
if not isinstance(other, ChangePasswordBody):
return False
return self.__dict__ == other.__dict__
def __ne__(self, other):
"""Returns true if both objects are not equal"""
return not self == other

View File

@ -26,7 +26,13 @@ paths:
- name: body - name: body
in: body in: body
schema: schema:
$ref: '#/definitions/changePasswordRequest' properties:
email:
type: string
oldPassword:
type: string
newPassword:
type: string
responses: responses:
200: 200:
description: changed password description: changed password
@ -1062,16 +1068,6 @@ definitions:
password: password:
type: string type: string
changePasswordRequest:
type: object
properties:
email:
type: string
oldPassword:
type: string
newPassword:
type: string
configuration: configuration:
type: object type: object
properties: properties:

View File

@ -4,7 +4,7 @@ import * as gateway from './gateway'
/** /**
* @param {object} options Optional options * @param {object} options Optional options
* @param {module:types.changePasswordRequest} [options.body] * @param {object} [options.body]
* @return {Promise<object>} changed password * @return {Promise<object>} changed password
*/ */
export function changePassword(options) { export function changePassword(options) {

View File

@ -25,15 +25,6 @@
* @property {string} password * @property {string} password
*/ */
/**
* @typedef changePasswordRequest
* @memberof module:types
*
* @property {string} email
* @property {string} oldPassword
* @property {string} newPassword
*/
/** /**
* @typedef configuration * @typedef configuration
* @memberof module:types * @memberof module:types

View File

@ -32,8 +32,9 @@ const AccountPasswordChangeModal =({ close, isOpen, user }: AccountPasswordChang
newPassword: v.newPassword, newPassword: v.newPassword,
} }
}) })
.then(d => { .then(() => {
setBottomControl(<Typography>Your password has been changed!</Typography>); setBottomControl(<Typography>Your password has been changed!</Typography>);
setTimeout(() => { close() }, 3000);
}) })
.catch(e => { .catch(e => {
setErrorMessage(<Typography color="red">Password change failed! Check your current password!</Typography>); setErrorMessage(<Typography color="red">Password change failed! Check your current password!</Typography>);

View File

@ -92,7 +92,7 @@ const SharePanel = ({ share }: SharePanelProps) => {
<Grid2 display="flex" component="h4">{String(share.data.label)}</Grid2> <Grid2 display="flex" component="h4">{String(share.data.label)}</Grid2>
</Grid2> </Grid2>
<Grid2 container sx={{ flexGrow: 1, mt: 0, mb: 2 }} alignItems="center"> <Grid2 container sx={{ flexGrow: 1, mt: 0, mb: 2 }} alignItems="center">
<h5 style={{ margin: 0 }}>A {detail ? detail.shareMode : ''}{detail && detail.reserved ? ', reserved ' : ''} share with the token <code>{share.id}</code></h5> <h5 style={{ margin: 0 }}>A {detail ? detail.shareMode : ''}{detail && detail.reserved ? ', reserved ' : ''} {detail?.backendMode} share with the token <code>{share.id}</code></h5>
</Grid2> </Grid2>
<Grid2 container sx={{ flexGrow: 1, mb: 3 }} alignItems="left"> <Grid2 container sx={{ flexGrow: 1, mb: 3 }} alignItems="left">
<Tooltip title="Share Metrics"> <Tooltip title="Share Metrics">