Compare commits

...

32 Commits

Author SHA1 Message Date
Cesar N
6625d54d67 Release v1.3.0 (#3313) 2024-04-24 18:15:13 -07:00
Cesar N
ee6d1ed586 Upgrade superagent package to fix vulnerability (#3314) 2024-04-24 17:27:42 -07:00
Cesar N
6de1d88e11 Use url-safe base64 encoding for download-shared-object api (#3305) 2024-04-23 08:36:30 -07:00
jinapurapu
de19b6f17b Make prefix field optional for adding tier (#3301) 2024-04-18 23:51:13 -06:00
jinapurapu
226a90be1d Adds ExpireDeleteMarker status to bucketLifecycleRule UI display (#3302) 2024-04-18 18:36:00 -06:00
Prakash Senthil Vel
6cfb6ff06a add user agent in admin client to display console in audit logs (#3297) 2024-04-17 10:49:15 -06:00
Alex
649c3d74b8 Release v1.2.0 (#3292)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2024-04-10 13:06:18 -06:00
Alex
662ce3b2f5 Update console dependencies to fix vulnerabilities (#3291)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2024-04-10 11:52:15 -06:00
dependabot[bot]
0292bc154d Bump express from 4.18.3 to 4.19.2 in /web-app (#3277)
Bumps [express](https://github.com/expressjs/express) from 4.18.3 to 4.19.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.3...4.19.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Alex <33497058+bexsoft@users.noreply.github.com>
2024-04-10 11:40:56 -06:00
Cesar N
ceee83f03a Use Console as proxy for share object logic (#3284) 2024-04-10 11:16:17 -06:00
Prakash Senthil Vel
144904f0f6 fix ux for keys permissions (#3280) 2024-04-05 10:14:29 -07:00
Alex
963c8f1221 Added missing permissions validation to rewind button (#3282)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2024-04-04 23:41:20 -06:00
Shireesh Anjal
6c50c38f83 fix health report upload error (#3275) 2024-04-04 13:50:22 -06:00
Shireesh Anjal
3aac62cc81 Reuse GetClusterRegInfo from mc (#3270) 2024-04-01 09:14:54 -07:00
Cesar N
78a05d39c4 Log error if it exists while serving APIs (#3276)
Co-authored-by: cesnietor <>
2024-03-27 13:06:42 -07:00
dependabot[bot]
79bec3880e Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /web-app (#3273) 2024-03-24 05:39:34 +01:00
Alex
bdf7bd6309 Changed Bucket Access Policy default value from n/a to private (#3267)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2024-03-19 18:28:18 -06:00
dependabot[bot]
4ce1ba999b Bump follow-redirects from 1.15.5 to 1.15.6 in /web-app (#3266) 2024-03-14 21:05:39 -06:00
Alex
d01501703b Release v1.1.1 (#3265)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2024-03-14 16:34:57 -07:00
Cesar N
6a38a09462 Fix folder download (#3264) 2024-03-14 15:07:15 -06:00
Alex
78990e354f Release v1.1.0 (#3261)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2024-03-12 11:22:55 -06:00
Harshavardhana
3189ebdfef Update all go-deps (#3259) 2024-03-12 01:47:35 -06:00
Shubhendu
39bf627b0a Enable console to set expired-object-all-versions (#3226)
Signed-off-by: Shubhendu Ram Tripathi <shubhendu@minio.io>
2024-03-11 14:25:06 -06:00
Alex
a838c763ea Release v1.0.0 (#3252)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2024-02-29 13:45:03 -08:00
Aditya Manthramurthy
0afea63994 Fix: handling of no inline policy for service acc. (#3221) 2024-02-29 14:51:12 -06:00
Phillip Schichtel
0df9487527 Check the blob size instead of the progress reports (#3249) 2024-02-29 08:33:26 -08:00
Victor Bayas
9274ee72ad Fix URL of inspect object API (#3247) 2024-02-28 20:51:09 -06:00
Prakash Senthil Vel
2b6c3debb4 clean up text preview support which was removed earlier (#3251) 2024-02-28 09:00:41 -08:00
Victor Bayas
8dd6dd4e7f Use native WebSocket API (#3248) 2024-02-27 13:34:06 -08:00
dependabot[bot]
5e64c96497 Bump ip from 1.1.8 to 1.1.9 in /web-app (#3241)
Bumps [ip](https://github.com/indutny/node-ip) from 1.1.8 to 1.1.9.
- [Commits](https://github.com/indutny/node-ip/compare/v1.1.8...v1.1.9)

---
updated-dependencies:
- dependency-name: ip
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Alex <33497058+bexsoft@users.noreply.github.com>
2024-02-26 13:45:16 -08:00
jinapurapu
54c0b4b8a2 Add bucket replication screen (#3040) 2024-02-26 13:44:55 -08:00
Prakash Senthil Vel
31056e12ba No preview message UI (#3244) 2024-02-26 11:34:21 -06:00
392 changed files with 4048 additions and 2841 deletions

View File

@@ -22,7 +22,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v3
with:
go-version: 1.21.7
go-version: 1.21.9
check-latest: true
- name: Get official govulncheck
run: go install golang.org/x/vuln/cmd/govulncheck@latest
@@ -36,7 +36,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
go-version: [ 1.21.7 ]
go-version: [ 1.21.8 ]
os: [ ubuntu-latest ]
steps:
- name: Check out code

View File

@@ -2,6 +2,61 @@
# Changelog
## Release v1.3.0
Features:
- Adds ExpireDeleteMarker status to BucketLifecycleRule UI
Bug Fix:
- Fixed vulnerability
- Used URL-safe base64 enconding for Share API
- Made Prefix field optional when Adding Tier
- Added Console user agent in MinIO Admin Client
## Release v1.2.0
Features:
- Updated file share logic to work as Proxy
Bug Fix:
- Updated project dependencies
- Fixed Key Permissions UX
- Added permissions validation to rewind button
- Fixed Health report upload to SUBNET
- Misc Cosmetic fixes
## Release v1.1.1
Bug Fix:
- Fixed folder download issue
## Release v1.1.0
Features:
- Added Set Expired object all versions selector
Bug Fix:
- Updated Go Dependencies
## Release v1.0.0
Features:
- Updated Preview message alert
Bug Fix:
- Updated Websocket API
- Fixed issues with download manager
- Fixed policies issues
## Release v0.46.0
Features:
@@ -22,7 +77,7 @@ Deprecated:
Features:
- Updated tines on menus & pages
- Updated tines on menus & pages
Bug Fix:

265
CREDITS
View File

@@ -14566,33 +14566,6 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice
the Mozilla Public License, v. 2.0.
================================================================
github.com/sirupsen/logrus
https://github.com/sirupsen/logrus
----------------------------------------------------------------
The MIT License (MIT)
Copyright (c) 2014 Simon Eskildsen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================================
github.com/stretchr/testify
@@ -16418,214 +16391,6 @@ https://google.golang.org/appengine
================================================================
google.golang.org/genproto
https://google.golang.org/genproto
----------------------------------------------------------------
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================================
google.golang.org/genproto/googleapis/api
https://google.golang.org/genproto/googleapis/api
----------------------------------------------------------------
@@ -17314,36 +17079,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================================
gopkg.in/h2non/filetype.v1
https://gopkg.in/h2non/filetype.v1
----------------------------------------------------------------
The MIT License
Copyright (c) Tomas Aparicio
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
================================================================
gopkg.in/ini.v1
https://gopkg.in/ini.v1
----------------------------------------------------------------

View File

@@ -33,6 +33,10 @@ lint:
@GO111MODULE=on ${GOPATH}/bin/golangci-lint cache clean
@GO111MODULE=on ${GOPATH}/bin/golangci-lint run --timeout=5m --config ./.golangci.yml
lint-fix: getdeps ## runs golangci-lint suite of linters with automatic fixes
@echo "Running $@ check"
@GO111MODULE=on ${GOPATH}/bin/golangci-lint run --timeout=5m --config ./.golangci.yml --fix
install: console
@echo "Installing console binary to '$(GOPATH)/bin/console'"
@mkdir -p $(GOPATH)/bin && cp -f $(PWD)/console $(GOPATH)/bin/console

View File

@@ -80,7 +80,7 @@ var (
minioSetUserStatusMock func(accessKey string, status madmin.AccountStatus) error
minioAccountInfoMock func(ctx context.Context) (madmin.AccountInfo, error)
minioAddServiceAccountMock func(ctx context.Context, policy *iampolicy.Policy, user string, accessKey string, secretKey string, description string, name string, expiry *time.Time, status string) (madmin.Credentials, error)
minioAddServiceAccountMock func(ctx context.Context, policy string, user string, accessKey string, secretKey string, description string, name string, expiry *time.Time, status string) (madmin.Credentials, error)
minioListServiceAccountsMock func(ctx context.Context, user string) (madmin.ListServiceAccountsResp, error)
minioDeleteServiceAccountMock func(ctx context.Context, serviceAccount string) error
minioInfoServiceAccountMock func(ctx context.Context, serviceAccount string) (madmin.InfoServiceAccountResp, error)
@@ -377,7 +377,7 @@ func (ac AdminClientMock) AccountInfo(ctx context.Context) (madmin.AccountInfo,
return minioAccountInfoMock(ctx)
}
func (ac AdminClientMock) addServiceAccount(ctx context.Context, policy *iampolicy.Policy, user string, accessKey string, secretKey string, description string, name string, expiry *time.Time, status string) (madmin.Credentials, error) {
func (ac AdminClientMock) addServiceAccount(ctx context.Context, policy string, user string, accessKey string, secretKey string, description string, name string, expiry *time.Time, status string) (madmin.Credentials, error) {
return minioAddServiceAccountMock(ctx, policy, user, accessKey, secretKey, description, name, expiry, status)
}

View File

@@ -17,22 +17,22 @@
package api
import (
"bytes"
"context"
b64 "encoding/base64"
"encoding/json"
"errors"
"fmt"
"net/http"
"strings"
"net/url"
"os"
"time"
"github.com/minio/console/pkg/logger"
"github.com/minio/console/pkg/utils"
"github.com/klauspost/compress/gzip"
xhttp "github.com/minio/console/pkg/http"
subnet "github.com/minio/console/pkg/subnet"
"github.com/minio/madmin-go/v3"
mc "github.com/minio/mc/cmd"
"github.com/minio/websocket"
)
@@ -63,7 +63,7 @@ func startHealthInfo(ctx context.Context, conn WSConn, client MinioAdmin, deadli
return err
}
compressedDiag, err := tarGZ(healthInfo, version)
compressedDiag, err := mc.TarGZHealthInfo(healthInfo, version)
if err != nil {
return err
}
@@ -75,11 +75,11 @@ func startHealthInfo(ctx context.Context, conn WSConn, client MinioAdmin, deadli
}
ctx = context.WithValue(ctx, utils.ContextClientIP, conn.remoteAddress())
subnetResp, err := sendHealthInfoToSubnet(ctx, healthInfo, client)
err = sendHealthInfoToSubnet(ctx, healthInfo, client)
report := messageReport{
Encoded: encodedDiag,
ServerHealthInfo: healthInfo,
SubnetResponse: subnetResp,
SubnetResponse: mc.SubnetBaseURL() + "/health",
}
if err != nil {
report.SubnetResponse = fmt.Sprintf("Error: %s", err.Error())
@@ -94,31 +94,6 @@ func startHealthInfo(ctx context.Context, conn WSConn, client MinioAdmin, deadli
return conn.writeMessage(websocket.TextMessage, message)
}
// compress and tar MinIO diagnostics output
func tarGZ(healthInfo interface{}, version string) ([]byte, error) {
buffer := bytes.NewBuffer(nil)
gzWriter := gzip.NewWriter(buffer)
enc := json.NewEncoder(gzWriter)
header := struct {
Version string `json:"version"`
}{Version: version}
if err := enc.Encode(header); err != nil {
return nil, err
}
if err := enc.Encode(healthInfo); err != nil {
return nil, err
}
err := gzWriter.Close()
if err != nil {
return nil, err
}
return buffer.Bytes(), nil
}
// getHealthInfoOptionsFromReq gets duration for startHealthInfo request
// path come as : `/health-info?deadline=2h`
func getHealthInfoOptionsFromReq(req *http.Request) (*time.Duration, error) {
@@ -129,16 +104,27 @@ func getHealthInfoOptionsFromReq(req *http.Request) (*time.Duration, error) {
return &deadlineDuration, nil
}
func sendHealthInfoToSubnet(ctx context.Context, healthInfo interface{}, client MinioAdmin) (string, error) {
filename := fmt.Sprintf("health_%d.json", time.Now().Unix())
func updateMcGlobals(subnetTokenConfig subnet.LicenseTokenConfig) error {
mc.GlobalDevMode = getConsoleDevMode()
if len(subnetTokenConfig.Proxy) > 0 {
proxyURL, e := url.Parse(subnetTokenConfig.Proxy)
if e != nil {
return e
}
mc.GlobalSubnetProxyURL = proxyURL
}
return nil
}
clientIP := utils.ClientIPFromContext(ctx)
subnetUploadURL := subnet.UploadURL("health", filename)
subnetHTTPClient := &xhttp.Client{Client: GetConsoleHTTPClient("", clientIP)}
func sendHealthInfoToSubnet(ctx context.Context, healthInfo interface{}, client MinioAdmin) error {
filename := fmt.Sprintf("health_%d.json.gz", time.Now().Unix())
subnetTokenConfig, e := GetSubnetKeyFromMinIOConfig(ctx, client)
if e != nil {
return "", e
return e
}
e = updateMcGlobals(*subnetTokenConfig)
if e != nil {
return e
}
var apiKey string
if len(subnetTokenConfig.APIKey) != 0 {
@@ -146,32 +132,41 @@ func sendHealthInfoToSubnet(ctx context.Context, healthInfo interface{}, client
} else {
apiKey, e = subnet.GetSubnetAPIKeyUsingLicense(subnetTokenConfig.License)
if e != nil {
return "", e
return e
}
}
headers := subnet.UploadAuthHeaders(apiKey)
uploadInfo, formDataType, e := subnet.ProcessUploadInfo(healthInfo, "health", filename)
compressedHealthInfo, e := mc.TarGZHealthInfo(healthInfo, madmin.HealthInfoVersion)
if e != nil {
return "", e
return e
}
e = os.WriteFile(filename, compressedHealthInfo, 0o666)
if e != nil {
return e
}
headers := mc.SubnetAPIKeyAuthHeaders(apiKey)
resp, e := (&mc.SubnetFileUploader{
FilePath: filename,
ReqURL: mc.SubnetUploadURL("health"),
Headers: headers,
DeleteAfterUpload: true,
}).UploadFileToSubnet()
if e != nil {
// file gets deleted only if upload is successful
// so we delete explicitly here as we already have the bytes
logger.LogIf(ctx, os.Remove(filename))
return e
}
resp, e := subnet.UploadFileToSubnet(uploadInfo, subnetHTTPClient, subnetUploadURL, headers, formDataType)
if e != nil {
return "", e
}
type SubnetResponse struct {
ClusterURL string `json:"cluster_url,omitempty"`
LicenseV2 string `json:"license_v2,omitempty"`
APIKey string `json:"api_key,omitempty"`
}
var subnetResp SubnetResponse
e = json.Unmarshal([]byte(resp), &subnetResp)
if e != nil {
return "", e
}
if len(subnetResp.ClusterURL) != 0 {
subnetClusterURL := strings.ReplaceAll(subnetResp.ClusterURL, "%2f", "/")
return subnetClusterURL, nil
return e
}
return "", ErrSubnetUploadFail
return nil
}

View File

@@ -27,6 +27,8 @@ import (
"strings"
"time"
"github.com/minio/console/pkg"
"github.com/minio/console/pkg/utils"
"github.com/minio/console/models"
@@ -70,7 +72,7 @@ type MinioAdmin interface {
heal(ctx context.Context, bucket, prefix string, healOpts madmin.HealOpts, clientToken string,
forceStart, forceStop bool) (healStart madmin.HealStartSuccess, healTaskStatus madmin.HealTaskStatus, err error)
// Service Accounts
addServiceAccount(ctx context.Context, policy *iampolicy.Policy, user string, accessKey string, secretKey string, name string, description string, expiry *time.Time, comment string) (madmin.Credentials, error)
addServiceAccount(ctx context.Context, policy string, user string, accessKey string, secretKey string, name string, description string, expiry *time.Time, comment string) (madmin.Credentials, error)
listServiceAccounts(ctx context.Context, user string) (madmin.ListServiceAccountsResp, error)
deleteServiceAccount(ctx context.Context, serviceAccount string) error
infoServiceAccount(ctx context.Context, serviceAccount string) (madmin.InfoServiceAccountResp, error)
@@ -305,13 +307,9 @@ func (ac AdminClient) getLogs(ctx context.Context, node string, lineCnt int, log
}
// implements madmin.AddServiceAccount()
func (ac AdminClient) addServiceAccount(ctx context.Context, policy *iampolicy.Policy, user string, accessKey string, secretKey string, name string, description string, expiry *time.Time, comment string) (madmin.Credentials, error) {
buf, err := json.Marshal(policy)
if err != nil {
return madmin.Credentials{}, err
}
func (ac AdminClient) addServiceAccount(ctx context.Context, policy string, user string, accessKey string, secretKey string, name string, description string, expiry *time.Time, comment string) (madmin.Credentials, error) {
return ac.Client.AddServiceAccount(ctx, madmin.AddServiceAccountReq{
Policy: buf,
Policy: []byte(policy),
TargetUser: user,
AccessKey: accessKey,
SecretKey: secretKey,
@@ -453,6 +451,7 @@ func NewMinioAdminClient(ctx context.Context, sessionClaims *models.Principal) (
if err != nil {
return nil, err
}
adminClient.SetAppInfo(globalAppName, pkg.Version)
return adminClient, nil
}
@@ -468,6 +467,7 @@ func newAdminFromClaims(claims *models.Principal, clientIP string) (*madmin.Admi
if err != nil {
return nil, err
}
adminClient.SetAppInfo(globalAppName, pkg.Version)
adminClient.SetCustomTransport(GetConsoleHTTPClient(getMinIOServer(), clientIP).Transport)
return adminClient, nil
}
@@ -481,7 +481,7 @@ func newAdminFromCreds(accessKey, secretKey, endpoint string, tlsEnabled bool) (
if err != nil {
return nil, err
}
minioClient.SetAppInfo(globalAppName, pkg.Version)
return minioClient, nil
}

View File

@@ -278,7 +278,8 @@ func (c mcClient) list(ctx context.Context, opts mc.ListOptions) <-chan *mc.Clie
}
func (c mcClient) get(ctx context.Context, opts mc.GetOptions) (io.ReadCloser, *probe.Error) {
return c.client.Get(ctx, opts)
rd, _, err := c.client.Get(ctx, opts)
return rd, err
}
func (c mcClient) shareDownload(ctx context.Context, versionID string, expires time.Duration) (string, *probe.Error) {

View File

@@ -170,6 +170,8 @@ func configureAPI(api *operations.ConsoleAPI) http.Handler {
registerReleasesHandlers(api)
registerPublicObjectsHandlers(api)
api.PreServerShutdown = func() {}
api.ServerShutdown = func() {}
@@ -506,7 +508,7 @@ func replaceBaseInIndex(indexPageBytes []byte, basePath string) []byte {
func replaceLicense(indexPageBytes []byte) []byte {
indexPageStr := string(indexPageBytes)
newPlan := fmt.Sprintf("<meta name=\"minio-license\" content=\"%s\" />", InstanceLicensePlan.String())
indexPageStr = strings.Replace(indexPageStr, "<meta name=\"minio-license\" content=\"apgl\"/>", newPlan, 1)
indexPageStr = strings.Replace(indexPageStr, "<meta name=\"minio-license\" content=\"agpl\"/>", newPlan, 1)
indexPageBytes = []byte(indexPageStr)
return indexPageBytes
}

View File

@@ -2743,6 +2743,41 @@ func init() {
}
}
},
"/download-shared-object/{url}": {
"get": {
"security": [],
"produces": [
"application/octet-stream"
],
"tags": [
"Public"
],
"summary": "Downloads an object from a presigned url",
"operationId": "DownloadSharedObject",
"parameters": [
{
"type": "string",
"name": "url",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"type": "file"
}
},
"default": {
"description": "Generic error response.",
"schema": {
"$ref": "#/definitions/ApiError"
}
}
}
}
},
"/group/{name}": {
"get": {
"tags": [
@@ -5373,6 +5408,10 @@ func init() {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
},
"expired_object_delete_all": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
},
"expired_object_delete_marker": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
@@ -5475,6 +5514,10 @@ func init() {
"type": "string"
}
},
"expired_object_delete_all": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
},
"expired_object_delete_marker": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
@@ -6180,6 +6223,9 @@ func init() {
"type": "integer",
"format": "int64"
},
"delete_all": {
"type": "boolean"
},
"delete_marker": {
"type": "boolean"
},
@@ -8838,6 +8884,10 @@ func init() {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
},
"expired_object_delete_all": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
},
"expired_object_delete_marker": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
@@ -11913,6 +11963,41 @@ func init() {
}
}
},
"/download-shared-object/{url}": {
"get": {
"security": [],
"produces": [
"application/octet-stream"
],
"tags": [
"Public"
],
"summary": "Downloads an object from a presigned url",
"operationId": "DownloadSharedObject",
"parameters": [
{
"type": "string",
"name": "url",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"type": "file"
}
},
"default": {
"description": "Generic error response.",
"schema": {
"$ref": "#/definitions/ApiError"
}
}
}
}
},
"/group/{name}": {
"get": {
"tags": [
@@ -14729,6 +14814,10 @@ func init() {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
},
"expired_object_delete_all": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
},
"expired_object_delete_marker": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
@@ -14831,6 +14920,10 @@ func init() {
"type": "string"
}
},
"expired_object_delete_all": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
},
"expired_object_delete_marker": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
@@ -15531,6 +15624,9 @@ func init() {
"type": "integer",
"format": "int64"
},
"delete_all": {
"type": "boolean"
},
"delete_marker": {
"type": "boolean"
},
@@ -18172,6 +18268,10 @@ func init() {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
},
"expired_object_delete_all": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"
},
"expired_object_delete_marker": {
"description": "Non required, toggle to disable or enable rule",
"type": "boolean"

View File

@@ -72,7 +72,6 @@ var (
ErrEncryptionConfigNotFound = errors.New("encryption configuration not found")
ErrPolicyNotFound = errors.New("policy does not exist")
ErrLoginNotAllowed = errors.New("login not allowed")
ErrSubnetUploadFail = errors.New("SUBNET upload failed")
ErrHealthReportFail = errors.New("failure to generate Health report")
)

View File

@@ -49,6 +49,7 @@ import (
"github.com/minio/console/api/operations/object"
"github.com/minio/console/api/operations/policy"
"github.com/minio/console/api/operations/profile"
"github.com/minio/console/api/operations/public"
"github.com/minio/console/api/operations/release"
"github.com/minio/console/api/operations/service"
"github.com/minio/console/api/operations/service_account"
@@ -211,6 +212,9 @@ func NewConsoleAPI(spec *loads.Document) *ConsoleAPI {
ObjectDownloadMultipleObjectsHandler: object.DownloadMultipleObjectsHandlerFunc(func(params object.DownloadMultipleObjectsParams, principal *models.Principal) middleware.Responder {
return middleware.NotImplemented("operation object.DownloadMultipleObjects has not yet been implemented")
}),
PublicDownloadSharedObjectHandler: public.DownloadSharedObjectHandlerFunc(func(params public.DownloadSharedObjectParams) middleware.Responder {
return middleware.NotImplemented("operation public.DownloadSharedObject has not yet been implemented")
}),
TieringEditTierCredentialsHandler: tiering.EditTierCredentialsHandlerFunc(func(params tiering.EditTierCredentialsParams, principal *models.Principal) middleware.Responder {
return middleware.NotImplemented("operation tiering.EditTierCredentials has not yet been implemented")
}),
@@ -704,6 +708,8 @@ type ConsoleAPI struct {
ObjectDownloadObjectHandler object.DownloadObjectHandler
// ObjectDownloadMultipleObjectsHandler sets the operation handler for the download multiple objects operation
ObjectDownloadMultipleObjectsHandler object.DownloadMultipleObjectsHandler
// PublicDownloadSharedObjectHandler sets the operation handler for the download shared object operation
PublicDownloadSharedObjectHandler public.DownloadSharedObjectHandler
// TieringEditTierCredentialsHandler sets the operation handler for the edit tier credentials operation
TieringEditTierCredentialsHandler tiering.EditTierCredentialsHandler
// BucketEnableBucketEncryptionHandler sets the operation handler for the enable bucket encryption operation
@@ -1150,6 +1156,9 @@ func (o *ConsoleAPI) Validate() error {
if o.ObjectDownloadMultipleObjectsHandler == nil {
unregistered = append(unregistered, "object.DownloadMultipleObjectsHandler")
}
if o.PublicDownloadSharedObjectHandler == nil {
unregistered = append(unregistered, "public.DownloadSharedObjectHandler")
}
if o.TieringEditTierCredentialsHandler == nil {
unregistered = append(unregistered, "tiering.EditTierCredentialsHandler")
}
@@ -1769,6 +1778,10 @@ func (o *ConsoleAPI) initHandlerCache() {
o.handlers["POST"] = make(map[string]http.Handler)
}
o.handlers["POST"]["/buckets/{bucket_name}/objects/download-multiple"] = object.NewDownloadMultipleObjects(o.context, o.ObjectDownloadMultipleObjectsHandler)
if o.handlers["GET"] == nil {
o.handlers["GET"] = make(map[string]http.Handler)
}
o.handlers["GET"]["/download-shared-object/{url}"] = public.NewDownloadSharedObject(o.context, o.PublicDownloadSharedObjectHandler)
if o.handlers["PUT"] == nil {
o.handlers["PUT"] = make(map[string]http.Handler)
}

View File

@@ -0,0 +1,73 @@
// Code generated by go-swagger; DO NOT EDIT.
// This file is part of MinIO Console Server
// Copyright (c) 2023 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
package public
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the generate command
import (
"net/http"
"github.com/go-openapi/runtime/middleware"
)
// DownloadSharedObjectHandlerFunc turns a function with the right signature into a download shared object handler
type DownloadSharedObjectHandlerFunc func(DownloadSharedObjectParams) middleware.Responder
// Handle executing the request and returning a response
func (fn DownloadSharedObjectHandlerFunc) Handle(params DownloadSharedObjectParams) middleware.Responder {
return fn(params)
}
// DownloadSharedObjectHandler interface for that can handle valid download shared object params
type DownloadSharedObjectHandler interface {
Handle(DownloadSharedObjectParams) middleware.Responder
}
// NewDownloadSharedObject creates a new http.Handler for the download shared object operation
func NewDownloadSharedObject(ctx *middleware.Context, handler DownloadSharedObjectHandler) *DownloadSharedObject {
return &DownloadSharedObject{Context: ctx, Handler: handler}
}
/*
DownloadSharedObject swagger:route GET /download-shared-object/{url} Public downloadSharedObject
Downloads an object from a presigned url
*/
type DownloadSharedObject struct {
Context *middleware.Context
Handler DownloadSharedObjectHandler
}
func (o *DownloadSharedObject) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
route, rCtx, _ := o.Context.RouteInfo(r)
if rCtx != nil {
*r = *rCtx
}
var Params = NewDownloadSharedObjectParams()
if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params
o.Context.Respond(rw, r, route.Produces, route, err)
return
}
res := o.Handler.Handle(Params) // actually handle the request
o.Context.Respond(rw, r, route.Produces, route, res)
}

View File

@@ -0,0 +1,88 @@
// Code generated by go-swagger; DO NOT EDIT.
// This file is part of MinIO Console Server
// Copyright (c) 2023 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
package public
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"net/http"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime/middleware"
"github.com/go-openapi/strfmt"
)
// NewDownloadSharedObjectParams creates a new DownloadSharedObjectParams object
//
// There are no default values defined in the spec.
func NewDownloadSharedObjectParams() DownloadSharedObjectParams {
return DownloadSharedObjectParams{}
}
// DownloadSharedObjectParams contains all the bound params for the download shared object operation
// typically these are obtained from a http.Request
//
// swagger:parameters DownloadSharedObject
type DownloadSharedObjectParams struct {
// HTTP Request Object
HTTPRequest *http.Request `json:"-"`
/*
Required: true
In: path
*/
URL string
}
// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface
// for simple values it will use straight method calls.
//
// To ensure default values, the struct must have been initialized with NewDownloadSharedObjectParams() beforehand.
func (o *DownloadSharedObjectParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error {
var res []error
o.HTTPRequest = r
rURL, rhkURL, _ := route.Params.GetOK("url")
if err := o.bindURL(rURL, rhkURL, route.Formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
// bindURL binds and validates parameter URL from path.
func (o *DownloadSharedObjectParams) bindURL(rawData []string, hasKey bool, formats strfmt.Registry) error {
var raw string
if len(rawData) > 0 {
raw = rawData[len(rawData)-1]
}
// Required: true
// Parameter is provided by construction from the route
o.URL = raw
return nil
}

View File

@@ -0,0 +1,134 @@
// Code generated by go-swagger; DO NOT EDIT.
// This file is part of MinIO Console Server
// Copyright (c) 2023 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
package public
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"io"
"net/http"
"github.com/go-openapi/runtime"
"github.com/minio/console/models"
)
// DownloadSharedObjectOKCode is the HTTP code returned for type DownloadSharedObjectOK
const DownloadSharedObjectOKCode int = 200
/*
DownloadSharedObjectOK A successful response.
swagger:response downloadSharedObjectOK
*/
type DownloadSharedObjectOK struct {
/*
In: Body
*/
Payload io.ReadCloser `json:"body,omitempty"`
}
// NewDownloadSharedObjectOK creates DownloadSharedObjectOK with default headers values
func NewDownloadSharedObjectOK() *DownloadSharedObjectOK {
return &DownloadSharedObjectOK{}
}
// WithPayload adds the payload to the download shared object o k response
func (o *DownloadSharedObjectOK) WithPayload(payload io.ReadCloser) *DownloadSharedObjectOK {
o.Payload = payload
return o
}
// SetPayload sets the payload to the download shared object o k response
func (o *DownloadSharedObjectOK) SetPayload(payload io.ReadCloser) {
o.Payload = payload
}
// WriteResponse to the client
func (o *DownloadSharedObjectOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {
rw.WriteHeader(200)
payload := o.Payload
if err := producer.Produce(rw, payload); err != nil {
panic(err) // let the recovery middleware deal with this
}
}
/*
DownloadSharedObjectDefault Generic error response.
swagger:response downloadSharedObjectDefault
*/
type DownloadSharedObjectDefault struct {
_statusCode int
/*
In: Body
*/
Payload *models.APIError `json:"body,omitempty"`
}
// NewDownloadSharedObjectDefault creates DownloadSharedObjectDefault with default headers values
func NewDownloadSharedObjectDefault(code int) *DownloadSharedObjectDefault {
if code <= 0 {
code = 500
}
return &DownloadSharedObjectDefault{
_statusCode: code,
}
}
// WithStatusCode adds the status to the download shared object default response
func (o *DownloadSharedObjectDefault) WithStatusCode(code int) *DownloadSharedObjectDefault {
o._statusCode = code
return o
}
// SetStatusCode sets the status to the download shared object default response
func (o *DownloadSharedObjectDefault) SetStatusCode(code int) {
o._statusCode = code
}
// WithPayload adds the payload to the download shared object default response
func (o *DownloadSharedObjectDefault) WithPayload(payload *models.APIError) *DownloadSharedObjectDefault {
o.Payload = payload
return o
}
// SetPayload sets the payload to the download shared object default response
func (o *DownloadSharedObjectDefault) SetPayload(payload *models.APIError) {
o.Payload = payload
}
// WriteResponse to the client
func (o *DownloadSharedObjectDefault) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {
rw.WriteHeader(o._statusCode)
if o.Payload != nil {
payload := o.Payload
if err := producer.Produce(rw, payload); err != nil {
panic(err) // let the recovery middleware deal with this
}
}
}

View File

@@ -0,0 +1,116 @@
// Code generated by go-swagger; DO NOT EDIT.
// This file is part of MinIO Console Server
// Copyright (c) 2023 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
package public
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the generate command
import (
"errors"
"net/url"
golangswaggerpaths "path"
"strings"
)
// DownloadSharedObjectURL generates an URL for the download shared object operation
type DownloadSharedObjectURL struct {
URL string
_basePath string
// avoid unkeyed usage
_ struct{}
}
// WithBasePath sets the base path for this url builder, only required when it's different from the
// base path specified in the swagger spec.
// When the value of the base path is an empty string
func (o *DownloadSharedObjectURL) WithBasePath(bp string) *DownloadSharedObjectURL {
o.SetBasePath(bp)
return o
}
// SetBasePath sets the base path for this url builder, only required when it's different from the
// base path specified in the swagger spec.
// When the value of the base path is an empty string
func (o *DownloadSharedObjectURL) SetBasePath(bp string) {
o._basePath = bp
}
// Build a url path and query string
func (o *DownloadSharedObjectURL) Build() (*url.URL, error) {
var _result url.URL
var _path = "/download-shared-object/{url}"
url := o.URL
if url != "" {
_path = strings.Replace(_path, "{url}", url, -1)
} else {
return nil, errors.New("url is required on DownloadSharedObjectURL")
}
_basePath := o._basePath
if _basePath == "" {
_basePath = "/api/v1"
}
_result.Path = golangswaggerpaths.Join(_basePath, _path)
return &_result, nil
}
// Must is a helper function to panic when the url builder returns an error
func (o *DownloadSharedObjectURL) Must(u *url.URL, err error) *url.URL {
if err != nil {
panic(err)
}
if u == nil {
panic("url can't be nil")
}
return u
}
// String returns the string representation of the path with query string
func (o *DownloadSharedObjectURL) String() string {
return o.Must(o.Build()).String()
}
// BuildFull builds a full url with scheme, host, path and query string
func (o *DownloadSharedObjectURL) BuildFull(scheme, host string) (*url.URL, error) {
if scheme == "" {
return nil, errors.New("scheme is required for a full url on DownloadSharedObjectURL")
}
if host == "" {
return nil, errors.New("host is required for a full url on DownloadSharedObjectURL")
}
base, err := o.Build()
if err != nil {
return nil, err
}
base.Scheme = scheme
base.Host = host
return base, nil
}
// StringFull returns the string representation of a complete url
func (o *DownloadSharedObjectURL) StringFull(scheme, host string) string {
return o.Must(o.BuildFull(scheme, host)).String()
}

125
api/public_objects.go Normal file
View File

@@ -0,0 +1,125 @@
// This file is part of MinIO Console Server
// Copyright (c) 2024 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package api
import (
b64 "encoding/base64"
"fmt"
"io"
"net/http"
"net/url"
"strings"
"github.com/go-openapi/runtime"
"github.com/go-openapi/runtime/middleware"
"github.com/go-openapi/swag"
"github.com/minio/console/api/operations"
"github.com/minio/console/api/operations/public"
xnet "github.com/minio/pkg/v2/net"
)
func registerPublicObjectsHandlers(api *operations.ConsoleAPI) {
api.PublicDownloadSharedObjectHandler = public.DownloadSharedObjectHandlerFunc(func(params public.DownloadSharedObjectParams) middleware.Responder {
resp, err := getDownloadPublicObjectResponse(params)
if err != nil {
return public.NewDownloadSharedObjectDefault(err.Code).WithPayload(err.APIError)
}
return resp
})
}
func getDownloadPublicObjectResponse(params public.DownloadSharedObjectParams) (middleware.Responder, *CodedAPIError) {
ctx := params.HTTPRequest.Context()
inputURLDecoded, err := b64toMinIOStringURL(params.URL)
if err != nil {
return nil, ErrorWithContext(ctx, err)
}
if inputURLDecoded == nil {
return nil, ErrorWithContext(ctx, ErrDefault, fmt.Errorf("decoded url is null"))
}
req, err := http.NewRequest(http.MethodGet, *inputURLDecoded, nil)
if err != nil {
return nil, ErrorWithContext(ctx, err)
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, ErrorWithContext(ctx, err)
}
return middleware.ResponderFunc(func(rw http.ResponseWriter, _ runtime.Producer) {
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
http.Error(rw, resp.Status, resp.StatusCode)
return
}
urlObj, err := url.Parse(*inputURLDecoded)
if err != nil {
http.Error(rw, "Internal Server Error", http.StatusInternalServerError)
return
}
// Add the filename
_, objectName := url2BucketAndObject(urlObj)
escapedName := url.PathEscape(objectName)
rw.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", escapedName))
_, err = io.Copy(rw, resp.Body)
if err != nil {
http.Error(rw, "Internal Server Error", http.StatusInternalServerError)
return
}
}), nil
}
// b64toMinIOStringURL decodes url and validates is a MinIO url endpoint
func b64toMinIOStringURL(inputEncodedURL string) (*string, error) {
inputURLDecoded, err := b64.StdEncoding.DecodeString(inputEncodedURL)
if err != nil {
return nil, err
}
// Validate input URL
inputURL, err := xnet.ParseHTTPURL(string(inputURLDecoded))
if err != nil {
return nil, err
}
// Ensure incoming url points to MinIO Server
minIOHost := getMinIOEndpoint()
if inputURL.Host != minIOHost {
return nil, ErrForbidden
}
return swag.String(string(inputURLDecoded)), nil
}
func url2BucketAndObject(u *url.URL) (bucketName, objectName string) {
tokens := splitStr(u.Path, "/", 3)
return tokens[1], tokens[2]
}
// splitStr splits a string into n parts, empty strings are added
// if we are not able to reach n elements
func splitStr(path, sep string, n int) []string {
splits := strings.SplitN(path, sep, n)
// Add empty strings if we found elements less than nr
for i := n - len(splits); i > 0; i-- {
splits = append(splits, "")
}
return splits
}

103
api/public_objects_test.go Normal file
View File

@@ -0,0 +1,103 @@
// This file is part of MinIO Console Server
// Copyright (c) 2024 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package api
import (
"testing"
"github.com/go-openapi/swag"
"github.com/stretchr/testify/assert"
)
func Test_b64toMinIOStringURL(t *testing.T) {
tAssert := assert.New(t)
type args struct {
encodedURL string
}
tests := []struct {
test string
args args
wantError *string
expected *string
}{
{
test: "valid encoded minIO URL returns decoded URL string", // http://localhost:9000/...
args: args{
encodedURL: "aHR0cDovL2xvY2FsaG9zdDo5MDAwL2J1Y2tldDEyMy9BdWRpbyUyMGljb24lMjgxJTI5LnN2Zz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPVVCTzFMMUM3VTg3UDFCUDI1MVRTJTJGMjAyNDA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNDA1VDIxMDEzM1omWC1BbXotRXhwaXJlcz00MzIwMCZYLUFtei1TZWN1cml0eS1Ub2tlbj1leUpoYkdjaU9pSklVelV4TWlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKaFkyTmxjM05MWlhraU9pSlZRazh4VERGRE4xVTROMUF4UWxBeU5URlVVeUlzSW1WNGNDSTZNVGN4TWpNNU5EQTRPU3dpY0dGeVpXNTBJam9pYldsdWFXOWhaRzFwYmlKOS5WLUtEZ3JMTVVCbG5KSEtYNlZ4SGw5LUFfLVBGRVdvazJkcFRxLTQ2YmxMbUxzdWVUeHNoVmFZNERad0dmb200VFQ1azhwaFVmZ2pjUWFuc25icmtlQSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmdmVyc2lvbklkPW51bGwmWC1BbXotU2lnbmF0dXJlPTA3Y2FkM2ViMmE2NzIyYjViYWVkMDljNmYxZmU0YTcwMWJmMTJmNDhlMTYyOGI5ZDQ1YzAxMWQ1OTU1Njc4NDU=",
},
wantError: nil,
expected: swag.String("http://localhost:9000/bucket123/Audio%20icon%281%29.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=UBO1L1C7U87P1BP251TS%2F20240405%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240405T210133Z&X-Amz-Expires=43200&X-Amz-Security-Token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NLZXkiOiJVQk8xTDFDN1U4N1AxQlAyNTFUUyIsImV4cCI6MTcxMjM5NDA4OSwicGFyZW50IjoibWluaW9hZG1pbiJ9.V-KDgrLMUBlnJHKX6VxHl9-A_-PFEWok2dpTq-46blLmLsueTxshVaY4DZwGfom4TT5k8phUfgjcQansnbrkeA&X-Amz-SignedHeaders=host&versionId=null&X-Amz-Signature=07cad3eb2a6722b5baed09c6f1fe4a701bf12f48e1628b9d45c011d595567845"),
},
{
test: "valid encoded url but not coming from MinIO server returns forbidden error", // http://non-minio-host:9000/...
args: args{
encodedURL: "aHR0cDovL25vbi1taW5pby1ob3N0OjkwMDAvYnVja2V0MTIzL0F1ZGlvJTIwaWNvbiUyODElMjkuc3ZnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9VUJPMUwxQzdVODdQMUJQMjUxVFMlMkYyMDI0MDQwNSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA0MDVUMjEwMTMzWiZYLUFtei1FeHBpcmVzPTQzMjAwJlgtQW16LVNlY3VyaXR5LVRva2VuPWV5SmhiR2NpT2lKSVV6VXhNaUlzSW5SNWNDSTZJa3BYVkNKOS5leUpoWTJObGMzTkxaWGtpT2lKVlFrOHhUREZETjFVNE4xQXhRbEF5TlRGVVV5SXNJbVY0Y0NJNk1UY3hNak01TkRBNE9Td2ljR0Z5Wlc1MElqb2liV2x1YVc5aFpHMXBiaUo5LlYtS0RnckxNVUJsbkpIS1g2VnhIbDktQV8tUEZFV29rMmRwVHEtNDZibExtTHN1ZVR4c2hWYVk0RFp3R2ZvbTRUVDVrOHBoVWZnamNRYW5zbmJya2VBJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZ2ZXJzaW9uSWQ9bnVsbCZYLUFtei1TaWduYXR1cmU9MDdjYWQzZWIyYTY3MjJiNWJhZWQwOWM2ZjFmZTRhNzAxYmYxMmY0OGUxNjI4YjlkNDVjMDExZDU5NTU2Nzg0NQ==",
},
wantError: swag.String("403 Forbidden"),
expected: nil,
},
{
test: "valid encoded url but not coming from MinIO server port returns forbidden error", // other port http://localhost:8902/...
args: args{
encodedURL: "aHR0cDovL2xvY2FsaG9zdDo4OTAyL2J1Y2tldDEyMy9BdWRpbyUyMGljb24lMjgxJTI5LnN2Zz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPVVCTzFMMUM3VTg3UDFCUDI1MVRTJTJGMjAyNDA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNDA1VDIxMDEzM1omWC1BbXotRXhwaXJlcz00MzIwMCZYLUFtei1TZWN1cml0eS1Ub2tlbj1leUpoYkdjaU9pSklVelV4TWlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKaFkyTmxjM05MWlhraU9pSlZRazh4VERGRE4xVTROMUF4UWxBeU5URlVVeUlzSW1WNGNDSTZNVGN4TWpNNU5EQTRPU3dpY0dGeVpXNTBJam9pYldsdWFXOWhaRzFwYmlKOS5WLUtEZ3JMTVVCbG5KSEtYNlZ4SGw5LUFfLVBGRVdvazJkcFRxLTQ2YmxMbUxzdWVUeHNoVmFZNERad0dmb200VFQ1azhwaFVmZ2pjUWFuc25icmtlQSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmdmVyc2lvbklkPW51bGwmWC1BbXotU2lnbmF0dXJlPTA3Y2FkM2ViMmE2NzIyYjViYWVkMDljNmYxZmU0YTcwMWJmMTJmNDhlMTYyOGI5ZDQ1YzAxMWQ1OTU1Njc4NDU=",
},
wantError: swag.String("403 Forbidden"),
expected: nil,
},
{
test: "valid url but with invalid schema returns error",
args: args{
encodedURL: "cG9zdGdyZXM6Ly9wb3N0Z3JlczoxMjM0NTZAMTI3LjAuMC4xOjU0MzIvZHVtbXk=", // postgres://postgres:123456@127.0.0.1:5432/dummy
},
wantError: swag.String("unexpected scheme found postgres"),
expected: nil,
},
{
test: "invalid url returns error",
args: args{
encodedURL: "YXNkc2Fkc2Rh", // asdsadsda
},
wantError: swag.String("unexpected scheme found "),
expected: nil,
},
}
for _, tt := range tests {
t.Run(tt.test, func(_ *testing.T) {
url, err := b64toMinIOStringURL(tt.args.encodedURL)
if tt.wantError != nil {
if err != nil {
if err.Error() != *tt.wantError {
t.Errorf("b64toMinIOStringURL() error: `%v`, wantErr: `%s`", err, *tt.wantError)
return
}
} else {
t.Errorf("b64toMinIOStringURL() error: `%v`, wantErr: `%s`", err, *tt.wantError)
return
}
} else {
if err != nil {
t.Errorf("b64toMinIOStringURL() error: `%s`, wantErr: `%v`", err, tt.wantError)
return
}
tAssert.Equal(*tt.expected, *url)
}
})
}
}

View File

@@ -17,11 +17,9 @@
package api
import (
"bytes"
"context"
"encoding/json"
"errors"
"strings"
"time"
"github.com/go-openapi/runtime/middleware"
@@ -123,36 +121,17 @@ func registerServiceAccountsHandlers(api *operations.ConsoleAPI) {
// createServiceAccount adds a service account to the userClient and assigns a policy to him if defined.
func createServiceAccount(ctx context.Context, userClient MinioAdmin, policy string, name string, description string, expiry *time.Time, comment string) (*models.ServiceAccountCreds, error) {
// By default a nil policy will be used so the service account inherit the parent account policy, otherwise
// we override with the user provided iam policy
var iamPolicy *iampolicy.Policy
if strings.TrimSpace(policy) != "" {
iamp, err := iampolicy.ParseConfig(bytes.NewReader([]byte(policy)))
if err != nil {
return nil, err
}
iamPolicy = iamp
}
creds, err := userClient.addServiceAccount(ctx, iamPolicy, "", "", "", name, description, expiry, comment)
creds, err := userClient.addServiceAccount(ctx, policy, "", "", "", name, description, expiry, comment)
if err != nil {
return nil, err
}
return &models.ServiceAccountCreds{AccessKey: creds.AccessKey, SecretKey: creds.SecretKey, URL: getMinIOServer()}, nil
}
// createServiceAccount adds a service account with the given credentials to the userClient and assigns a policy to him if defined.
// createServiceAccount adds a service account with the given credentials to the
// userClient and assigns a policy to him if defined.
func createServiceAccountCreds(ctx context.Context, userClient MinioAdmin, policy string, accessKey string, secretKey string, name string, description string, expiry *time.Time, comment string) (*models.ServiceAccountCreds, error) {
// By default a nil policy will be used so the service account inherit the parent account policy, otherwise
// we override with the user provided iam policy
var iamPolicy *iampolicy.Policy
if strings.TrimSpace(policy) != "" {
iamp, err := iampolicy.ParseConfig(bytes.NewReader([]byte(policy)))
if err != nil {
return nil, err
}
iamPolicy = iamp
}
creds, err := userClient.addServiceAccount(ctx, iamPolicy, "", accessKey, secretKey, name, description, expiry, comment)
creds, err := userClient.addServiceAccount(ctx, policy, "", accessKey, secretKey, name, description, expiry, comment)
if err != nil {
return nil, err
}
@@ -190,18 +169,7 @@ func getCreateServiceAccountResponse(session *models.Principal, params saApi.Cre
// createServiceAccount adds a service account to a given user and assigns a policy to him if defined.
func createAUserServiceAccount(ctx context.Context, userClient MinioAdmin, policy string, user string, name string, description string, expiry *time.Time, comment string) (*models.ServiceAccountCreds, error) {
// By default a nil policy will be used so the service account inherit the parent account policy, otherwise
// we override with the user provided iam policy
var iamPolicy *iampolicy.Policy
if strings.TrimSpace(policy) != "" {
iamp, err := iampolicy.ParseConfig(bytes.NewReader([]byte(policy)))
if err != nil {
return nil, err
}
iamPolicy = iamp
}
creds, err := userClient.addServiceAccount(ctx, iamPolicy, user, "", "", name, description, expiry, comment)
creds, err := userClient.addServiceAccount(ctx, policy, user, "", "", name, description, expiry, comment)
if err != nil {
return nil, err
}
@@ -209,18 +177,7 @@ func createAUserServiceAccount(ctx context.Context, userClient MinioAdmin, polic
}
func createAUserServiceAccountCreds(ctx context.Context, userClient MinioAdmin, policy string, user string, accessKey string, secretKey string, name string, description string, expiry *time.Time, comment string) (*models.ServiceAccountCreds, error) {
// By default a nil policy will be used so the service account inherit the parent account policy, otherwise
// we override with the user provided iam policy
var iamPolicy *iampolicy.Policy
if strings.TrimSpace(policy) != "" {
iamp, err := iampolicy.ParseConfig(bytes.NewReader([]byte(policy)))
if err != nil {
return nil, err
}
iamPolicy = iamp
}
creds, err := userClient.addServiceAccount(ctx, iamPolicy, user, accessKey, secretKey, name, description, expiry, comment)
creds, err := userClient.addServiceAccount(ctx, policy, user, accessKey, secretKey, name, description, expiry, comment)
if err != nil {
return nil, err
}

View File

@@ -24,7 +24,6 @@ import (
"time"
"github.com/minio/madmin-go/v3"
iampolicy "github.com/minio/pkg/v2/policy"
"github.com/stretchr/testify/assert"
)
@@ -41,7 +40,7 @@ func TestAddServiceAccount(t *testing.T) {
AccessKey: "minio",
SecretKey: "minio123",
}
minioAddServiceAccountMock = func(_ context.Context, _ *iampolicy.Policy, _ string, _ string, _ string, _ string, _ string, _ *time.Time, _ string) (madmin.Credentials, error) {
minioAddServiceAccountMock = func(_ context.Context, _ string, _ string, _ string, _ string, _ string, _ string, _ *time.Time, _ string) (madmin.Credentials, error) {
return mockResponse, nil
}
saCreds, err := createServiceAccount(ctx, client, policyDefinition, "", "", nil, "")
@@ -51,25 +50,13 @@ func TestAddServiceAccount(t *testing.T) {
assert.Equal(mockResponse.AccessKey, saCreds.AccessKey, fmt.Sprintf("Failed on %s:, error occurred: AccessKey differ", function))
assert.Equal(mockResponse.SecretKey, saCreds.SecretKey, fmt.Sprintf("Failed on %s:, error occurred: SecretKey differ", function))
// Test-2: if an invalid policy is assigned to the service account, this will raise an error
policyDefinition = "invalid policy"
mockResponse = madmin.Credentials{
AccessKey: "minio",
SecretKey: "minio123",
}
minioAddServiceAccountMock = func(_ context.Context, _ *iampolicy.Policy, _ string, _ string, _ string, _ string, _ string, _ *time.Time, _ string) (madmin.Credentials, error) {
return mockResponse, nil
}
_, err = createServiceAccount(ctx, client, policyDefinition, "", "", nil, "")
assert.Error(err)
// Test-3: if an error occurs on server while creating service account (valid policy), handle it
// Test-2: if an error occurs on server while creating service account (valid policy), handle it
policyDefinition = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":[\"s3:GetBucketLocation\",\"s3:GetObject\",\"s3:ListAllMyBuckets\"],\"Resource\":[\"arn:aws:s3:::bucket1/*\"]}]}"
mockResponse = madmin.Credentials{
AccessKey: "minio",
SecretKey: "minio123",
}
minioAddServiceAccountMock = func(_ context.Context, _ *iampolicy.Policy, _ string, _ string, _ string, _ string, _ string, _ *time.Time, _ string) (madmin.Credentials, error) {
minioAddServiceAccountMock = func(_ context.Context, _ string, _ string, _ string, _ string, _ string, _ string, _ *time.Time, _ string) (madmin.Credentials, error) {
return madmin.Credentials{}, errors.New("error")
}
_, err = createServiceAccount(ctx, client, policyDefinition, "", "", nil, "")

View File

@@ -117,6 +117,7 @@ func getBucketLifecycle(ctx context.Context, client MinioClient, bucketName stri
Date: rule.Expiration.Date.Format(time.RFC3339),
Days: int64(rule.Expiration.Days),
DeleteMarker: rule.Expiration.DeleteMarker.IsEnabled(),
DeleteAll: bool(rule.Expiration.DeleteAll),
NoncurrentExpirationDays: int64(rule.NoncurrentVersionExpiration.NoncurrentDays),
NewerNoncurrentExpirationVersions: int64(rule.NoncurrentVersionExpiration.NewerNoncurrentVersions),
},
@@ -188,6 +189,7 @@ func addBucketLifecycle(ctx context.Context, client MinioClient, params bucketAp
Status: &status,
Tags: &params.Body.Tags,
ExpiredObjectDeleteMarker: &params.Body.ExpiredObjectDeleteMarker,
ExpiredObjectAllversions: &params.Body.ExpiredObjectDeleteAll,
}
if params.Body.NoncurrentversionTransitionDays > 0 {
@@ -219,6 +221,7 @@ func addBucketLifecycle(ctx context.Context, client MinioClient, params bucketAp
Status: &status,
Tags: &params.Body.Tags,
ExpiredObjectDeleteMarker: &params.Body.ExpiredObjectDeleteMarker,
ExpiredObjectAllversions: &params.Body.ExpiredObjectDeleteAll,
}
if params.Body.NewerNoncurrentversionExpirationVersions > 0 {
@@ -298,6 +301,7 @@ func editBucketLifecycle(ctx context.Context, client MinioClient, params bucketA
Status: &status,
Tags: &params.Body.Tags,
ExpiredObjectDeleteMarker: &params.Body.ExpiredObjectDeleteMarker,
ExpiredObjectAllversions: &params.Body.ExpiredObjectDeleteAll,
}
if params.Body.NoncurrentversionTransitionDays > 0 {
@@ -328,6 +332,7 @@ func editBucketLifecycle(ctx context.Context, client MinioClient, params bucketA
Status: &status,
Tags: &params.Body.Tags,
ExpiredObjectDeleteMarker: &params.Body.ExpiredObjectDeleteMarker,
ExpiredObjectAllversions: &params.Body.ExpiredObjectDeleteAll,
}
if params.Body.NoncurrentversionExpirationDays > 0 {
@@ -456,6 +461,7 @@ func addMultiBucketLifecycle(ctx context.Context, client MinioClient, params buc
ExpiryDays: params.Body.ExpiryDays,
Disable: false,
ExpiredObjectDeleteMarker: params.Body.ExpiredObjectDeleteMarker,
ExpiredObjectDeleteAll: params.Body.ExpiredObjectDeleteMarker,
}
go func() {

View File

@@ -19,6 +19,7 @@ package api
import (
"context"
"encoding/base64"
b64 "encoding/base64"
"errors"
"fmt"
"io"
@@ -1077,30 +1078,43 @@ func getShareObjectResponse(session *models.Principal, params objectApi.ShareObj
if params.Expires != nil {
expireDuration = *params.Expires
}
url, err := getShareObjectURL(ctx, mcClient, params.VersionID, expireDuration)
url, err := getShareObjectURL(ctx, mcClient, params.HTTPRequest, params.VersionID, expireDuration)
if err != nil {
return nil, ErrorWithContext(ctx, err)
}
return url, nil
}
func getShareObjectURL(ctx context.Context, client MCClient, versionID string, duration string) (url *string, err error) {
func getShareObjectURL(ctx context.Context, client MCClient, r *http.Request, versionID string, duration string) (url *string, err error) {
// default duration 7d if not defined
if strings.TrimSpace(duration) == "" {
duration = "168h"
}
expiresDuration, err := time.ParseDuration(duration)
if err != nil {
return nil, err
}
objURL, pErr := client.shareDownload(ctx, versionID, expiresDuration)
minioURL, pErr := client.shareDownload(ctx, versionID, expiresDuration)
if pErr != nil {
return nil, pErr.Cause
}
encodedMinIOURL := b64.URLEncoding.EncodeToString([]byte(minioURL))
requestURL := getRequestURLWithScheme(r)
objURL := fmt.Sprintf("%s/api/v1/download-shared-object/%s", requestURL, encodedMinIOURL)
return &objURL, nil
}
func getRequestURLWithScheme(r *http.Request) string {
scheme := "http"
if r.TLS != nil {
scheme = "https"
}
return fmt.Sprintf("%s://%s", scheme, r.Host)
}
func getSetObjectLegalHoldResponse(session *models.Principal, params objectApi.PutObjectLegalHoldParams) *CodedAPIError {
ctx := params.HTTPRequest.Context()
mClient, err := newMinioClient(session, getClientIP(params.HTTPRequest))

View File

@@ -18,6 +18,7 @@ package api
import (
"context"
"crypto/tls"
"encoding/json"
"errors"
"fmt"
@@ -914,6 +915,7 @@ func Test_shareObject(t *testing.T) {
defer cancel()
client := s3ClientMock{}
type args struct {
r *http.Request
versionID string
expires string
shareFunc func(ctx context.Context, versionID string, expires time.Duration) (string, *probe.Error)
@@ -925,20 +927,46 @@ func Test_shareObject(t *testing.T) {
expected string
}{
{
test: "Get share object url",
test: "return sharefunc url base64 encoded with host name",
args: args{
r: &http.Request{
TLS: nil,
Host: "localhost:9090",
},
versionID: "2121434",
expires: "30s",
shareFunc: func(_ context.Context, _ string, _ time.Duration) (string, *probe.Error) {
return "http://someurl", nil
},
},
wantError: nil,
expected: "http://someurl",
expected: "http://localhost:9090/api/v1/download-shared-object/aHR0cDovL3NvbWV1cmw=",
},
{
test: "handle invalid expire duration",
test: "return https scheme if url uses TLS",
args: args{
r: &http.Request{
TLS: &tls.ConnectionState{},
Host: "localhost:9090",
},
versionID: "2121434",
expires: "30s",
shareFunc: func(_ context.Context, _ string, _ time.Duration) (string, *probe.Error) {
return "http://someurl", nil
},
},
wantError: nil,
expected: "https://localhost:9090/api/v1/download-shared-object/aHR0cDovL3NvbWV1cmw=",
},
{
test: "returns invalid expire duration if expiration is invalid",
args: args{
r: &http.Request{
TLS: nil,
Host: "localhost:9090",
},
versionID: "2121434",
expires: "invalid",
shareFunc: func(_ context.Context, _ string, _ time.Duration) (string, *probe.Error) {
@@ -948,8 +976,12 @@ func Test_shareObject(t *testing.T) {
wantError: errors.New("time: invalid duration \"invalid\""),
},
{
test: "handle empty expire duration",
test: "add default expiration if expiration is empty",
args: args{
r: &http.Request{
TLS: nil,
Host: "localhost:9090",
},
versionID: "2121434",
expires: "",
shareFunc: func(_ context.Context, _ string, _ time.Duration) (string, *probe.Error) {
@@ -957,11 +989,15 @@ func Test_shareObject(t *testing.T) {
},
},
wantError: nil,
expected: "http://someurl",
expected: "http://localhost:9090/api/v1/download-shared-object/aHR0cDovL3NvbWV1cmw=",
},
{
test: "handle error on share func",
test: "return error if sharefunc returns error",
args: args{
r: &http.Request{
TLS: nil,
Host: "localhost:9090",
},
versionID: "2121434",
expires: "3h",
shareFunc: func(_ context.Context, _ string, _ time.Duration) (string, *probe.Error) {
@@ -970,12 +1006,29 @@ func Test_shareObject(t *testing.T) {
},
wantError: errors.New("probe error"),
},
{
test: "return shareFunc url base64 encoded url-safe",
args: args{
r: &http.Request{
TLS: nil,
Host: "localhost:9090",
},
versionID: "2121434",
expires: "3h",
shareFunc: func(_ context.Context, _ string, _ time.Duration) (string, *probe.Error) {
// https://127.0.0.1:9000/cestest/Audio%20icon.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256 using StdEncoding adds an extra `/` making it not url safe
return "https://127.0.0.1:9000/cestest/Audio%20icon.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256", nil
},
},
wantError: nil,
expected: "http://localhost:9090/api/v1/download-shared-object/aHR0cHM6Ly8xMjcuMC4wLjE6OTAwMC9jZXN0ZXN0L0F1ZGlvJTIwaWNvbi5zdmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTY=",
},
}
for _, tt := range tests {
t.Run(tt.test, func(_ *testing.T) {
mcShareDownloadMock = tt.args.shareFunc
url, err := getShareObjectURL(ctx, client, tt.args.versionID, tt.args.expires)
url, err := getShareObjectURL(ctx, client, tt.args.r, tt.args.versionID, tt.args.expires)
if tt.wantError != nil {
if !reflect.DeepEqual(err, tt.wantError) {
t.Errorf("getShareObjectURL() error: `%s`, wantErr: `%s`", err, tt.wantError)

View File

@@ -86,5 +86,10 @@ func StartServer(ctx *cli.Context) error {
defer server.Shutdown()
return server.Serve()
if err = server.Serve(); err != nil {
server.Logf("error serving API: %v", err)
return err
}
return nil
}

87
go.mod
View File

@@ -7,34 +7,34 @@ require (
github.com/cheggaaa/pb/v3 v3.1.5
github.com/dustin/go-humanize v1.0.1
github.com/fatih/color v1.16.0
github.com/go-openapi/errors v0.21.0
github.com/go-openapi/loads v0.21.5
github.com/go-openapi/runtime v0.27.1
github.com/go-openapi/spec v0.20.14
github.com/go-openapi/strfmt v0.22.0
github.com/go-openapi/swag v0.22.9
github.com/go-openapi/validate v0.23.0
github.com/go-openapi/errors v0.22.0
github.com/go-openapi/loads v0.22.0
github.com/go-openapi/runtime v0.28.0
github.com/go-openapi/spec v0.21.0
github.com/go-openapi/strfmt v0.23.0
github.com/go-openapi/swag v0.23.0
github.com/go-openapi/validate v0.24.0
github.com/golang-jwt/jwt/v4 v4.5.0
github.com/google/uuid v1.6.0
github.com/jessevdk/go-flags v1.5.0
github.com/klauspost/compress v1.17.6
github.com/klauspost/compress v1.17.7
github.com/minio/cli v1.24.2
github.com/minio/highwayhash v1.0.2
github.com/minio/kes v0.23.0
github.com/minio/madmin-go/v3 v3.0.46
github.com/minio/mc v0.0.0-20240209221824-669cb0a9a475
github.com/minio/minio-go/v7 v7.0.67
github.com/minio/madmin-go/v3 v3.0.50
github.com/minio/mc v0.0.0-20240330152952-9f8147bf0e03
github.com/minio/minio-go/v7 v7.0.69
github.com/minio/selfupdate v0.6.0
github.com/minio/websocket v1.6.0
github.com/mitchellh/go-homedir v1.1.0
github.com/rs/xid v1.5.0
github.com/secure-io/sio-go v0.3.1
github.com/stretchr/testify v1.8.4
github.com/tidwall/gjson v1.17.0
github.com/stretchr/testify v1.9.0
github.com/tidwall/gjson v1.17.1
github.com/unrolled/secure v1.14.0
golang.org/x/crypto v0.19.0
golang.org/x/net v0.21.0
golang.org/x/oauth2 v0.17.0
golang.org/x/crypto v0.21.0
golang.org/x/net v0.23.0
golang.org/x/oauth2 v0.18.0
// Added to include security fix for
// https://github.com/golang/go/issues/56152
golang.org/x/text v0.14.0 // indirect
@@ -43,7 +43,7 @@ require (
require (
github.com/mattn/go-ieproxy v0.0.11
github.com/minio/pkg/v2 v2.0.8
github.com/minio/pkg/v2 v2.0.13
)
require (
@@ -57,7 +57,7 @@ require (
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/charmbracelet/bubbles v0.18.0 // indirect
github.com/charmbracelet/bubbletea v0.25.0 // indirect
github.com/charmbracelet/lipgloss v0.9.1 // indirect
github.com/charmbracelet/lipgloss v0.10.0 // indirect
github.com/cheggaaa/pb v1.0.29 // indirect
github.com/containerd/console v1.0.4 // indirect
github.com/coreos/go-semver v0.3.1 // indirect
@@ -67,14 +67,14 @@ require (
github.com/docker/go-units v0.5.0 // indirect
github.com/fatih/structs v1.1.0 // indirect
github.com/gdamore/encoding v1.0.0 // indirect
github.com/gdamore/tcell/v2 v2.7.0 // indirect
github.com/gdamore/tcell/v2 v2.7.4 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-openapi/analysis v0.22.2 // indirect
github.com/go-openapi/jsonpointer v0.20.2 // indirect
github.com/go-openapi/jsonreference v0.20.4 // indirect
github.com/go-openapi/analysis v0.23.0 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
@@ -83,15 +83,15 @@ require (
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/juju/ratelimit v1.0.2 // indirect
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect
github.com/lestrrat-go/blackmagic v1.0.2 // indirect
github.com/lestrrat-go/httpcc v1.0.1 // indirect
github.com/lestrrat-go/iter v1.0.2 // indirect
github.com/lestrrat-go/jwx v1.2.28 // indirect
github.com/lestrrat-go/jwx v1.2.29 // indirect
github.com/lestrrat-go/option v1.0.1 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed // indirect
github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
@@ -111,7 +111,7 @@ require (
github.com/muesli/cancelreader v0.2.2 // indirect
github.com/muesli/reflow v0.3.0 // indirect
github.com/muesli/termenv v0.15.2 // indirect
github.com/navidys/tvxwidgets v0.5.0 // indirect
github.com/navidys/tvxwidgets v0.6.0 // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/philhofer/fwd v1.1.2 // indirect
@@ -119,19 +119,18 @@ require (
github.com/pkg/xattr v0.4.9 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/posener/complete v1.2.3 // indirect
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect
github.com/prometheus/client_golang v1.18.0 // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.46.0 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/prometheus/client_golang v1.19.0 // indirect
github.com/prometheus/client_model v0.6.0 // indirect
github.com/prometheus/common v0.50.0 // indirect
github.com/prometheus/procfs v0.13.0 // indirect
github.com/prometheus/prom2json v1.3.3 // indirect
github.com/rivo/tview v0.0.0-20240204151237-861aa94d61c8 // indirect
github.com/rivo/tview v0.0.0-20240307173318-e804876934a1 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rjeczalik/notify v0.9.3 // indirect
github.com/safchain/ethtool v0.3.0 // indirect
github.com/shirou/gopsutil/v3 v3.24.1 // indirect
github.com/shirou/gopsutil/v3 v3.24.2 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
github.com/tinylib/msgp v1.1.9 // indirect
@@ -142,19 +141,17 @@ require (
go.etcd.io/etcd/api/v3 v3.5.12 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.12 // indirect
go.etcd.io/etcd/client/v3 v3.5.12 // indirect
go.mongodb.org/mongo-driver v1.13.1 // indirect
go.mongodb.org/mongo-driver v1.14.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.26.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/sync v0.6.0 // indirect
golang.org/x/sys v0.17.0 // indirect
golang.org/x/term v0.17.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/term v0.18.0 // indirect
google.golang.org/appengine v1.6.8 // indirect
google.golang.org/genproto v0.0.0-20240205150955-31a09d347014 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014 // indirect
google.golang.org/grpc v1.61.0 // indirect
google.golang.org/protobuf v1.32.0 // indirect
gopkg.in/h2non/filetype.v1 v1.0.5 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240311173647-c811ad7063a7 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240311173647-c811ad7063a7 // indirect
google.golang.org/grpc v1.62.1 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

206
go.sum
View File

@@ -22,8 +22,8 @@ github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/
github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw=
github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM=
github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg=
github.com/charmbracelet/lipgloss v0.9.1 h1:PNyd3jvaJbg4jRHKWXnCj1akQm4rh8dbEzN1p/u1KWg=
github.com/charmbracelet/lipgloss v0.9.1/go.mod h1:1mPmG4cxScwUQALAAnacHaigiiHB9Pmr+v1VEawJl6I=
github.com/charmbracelet/lipgloss v0.10.0 h1:KWeXFSexGcfahHX+54URiZGkBFazf70JNMtwg/AFW3s=
github.com/charmbracelet/lipgloss v0.10.0/go.mod h1:Wig9DSfvANsxqkRsqj6x87irdy123SR4dOXlKa91ciE=
github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo=
github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30=
github.com/cheggaaa/pb/v3 v3.1.5 h1:QuuUzeM2WsAqG2gMqtzaWithDJv0i+i6UlnwSCI4QLk=
@@ -51,33 +51,33 @@ github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=
github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
github.com/gdamore/tcell/v2 v2.7.0 h1:I5LiGTQuwrysAt1KS9wg1yFfOI3arI3ucFrxtd/xqaA=
github.com/gdamore/tcell/v2 v2.7.0/go.mod h1:hl/KtAANGBecfIPxk+FzKvThTqI84oplgbPEmVX60b8=
github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/gdamore/tcell/v2 v2.7.4 h1:sg6/UnTM9jGpZU+oFYAsDahfchWAFW8Xx2yFinNSAYU=
github.com/gdamore/tcell/v2 v2.7.4/go.mod h1:dSXtXTSK0VsW1biw65DZLZ2NKr7j0qP/0J7ONmsraWg=
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0=
github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo=
github.com/go-openapi/errors v0.21.0 h1:FhChC/duCnfoLj1gZ0BgaBmzhJC2SL/sJr8a2vAobSY=
github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho=
github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU=
github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4=
github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0=
github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8=
github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqvJYto=
github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU=
github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do=
github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw=
github.com/go-openapi/strfmt v0.22.0 h1:Ew9PnEYc246TwrEspvBdDHS4BVKXy/AOVsfqGDgAcaI=
github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4=
github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE=
github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE=
github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw=
github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE=
github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU=
github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo=
github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w=
github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco=
github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs=
github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ=
github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc=
github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
@@ -90,10 +90,8 @@ github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
@@ -126,12 +124,11 @@ github.com/juju/ratelimit v1.0.2 h1:sRxmtRiajbvrcLQT7S+JbqU0ntsb9W2yhSdNN8tWfaI=
github.com/juju/ratelimit v1.0.2/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI=
github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -144,16 +141,16 @@ github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZ
github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E=
github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI=
github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4=
github.com/lestrrat-go/jwx v1.2.28 h1:uadI6o0WpOVrBSf498tRXZIwPpEtLnR9CvqPFXeI5sA=
github.com/lestrrat-go/jwx v1.2.28/go.mod h1:nF+91HEMh/MYFVwKPl5HHsBGMPscqbQb+8IDQdIazP8=
github.com/lestrrat-go/jwx v1.2.29 h1:QT0utmUJ4/12rmsVQrJ3u55bycPkKqGYuGT4tyRhxSQ=
github.com/lestrrat-go/jwx v1.2.29/go.mod h1:hU8k2l6WF0ncx20uQdOmik/Gjg6E3/wIRtXSNFeZuB8=
github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU=
github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIgJQzlui7nK1Ncm0tp2ktmPj8xO4N/0=
github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a h1:3Bm7EwfUQUvhNeKIkUct/gl9eod1TcXuj8stxvi/GoI=
github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -187,18 +184,18 @@ github.com/minio/kes v0.23.0 h1:T0zHtyDoI3JdKrVvzdM4xwVryYYyh5pKwNUVBoqxsNs=
github.com/minio/kes v0.23.0/go.mod h1:vvXVGcgu9mYLkbVWlEvFFl6bYR196RQlOU2Q+rHApl8=
github.com/minio/kes-go v0.2.1 h1:KnqS+p6xoSFJZbQhmJaz/PbxeA6nQyRqT/ywrn5lU2o=
github.com/minio/kes-go v0.2.1/go.mod h1:76xf7l41Wrh+IifisABXK2S8uZWYgWV1IGBKC3GdOJk=
github.com/minio/madmin-go/v3 v3.0.46 h1:DabFt+aUph5Vu/SOat2RWN/xVagPBU7qzxhAQ03hH/k=
github.com/minio/madmin-go/v3 v3.0.46/go.mod h1:ZDF7kf5fhmxLhbGTqyq5efs4ao0v4eWf7nOuef/ljJs=
github.com/minio/mc v0.0.0-20240209221824-669cb0a9a475 h1:yfLzMougcV2xkVlWgwYwVRoT8pnXrcCV4oOQW+pI2EQ=
github.com/minio/mc v0.0.0-20240209221824-669cb0a9a475/go.mod h1:MmDLdb7NWd/OYhcKcXKvwErq2GNa/Zq6xtTWuhdC4II=
github.com/minio/madmin-go/v3 v3.0.50 h1:+RQMetVFvPQmAOEDN/xmLhwk9+xOzu3rqwnlZEskgvg=
github.com/minio/madmin-go/v3 v3.0.50/go.mod h1:ZDF7kf5fhmxLhbGTqyq5efs4ao0v4eWf7nOuef/ljJs=
github.com/minio/mc v0.0.0-20240330152952-9f8147bf0e03 h1:xF1hntqvs/CVEHGBETSrIMTW3iSU3k2j/YCFXGDWoBs=
github.com/minio/mc v0.0.0-20240330152952-9f8147bf0e03/go.mod h1:RMCe706GTL9EOO6pxzFXd9Vp+3w2L1uctPiycmLDr9U=
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
github.com/minio/minio-go/v7 v7.0.67 h1:BeBvZWAS+kRJm1vGTMJYVjKUNoo0FoEt/wUWdUtfmh8=
github.com/minio/minio-go/v7 v7.0.67/go.mod h1:+UXocnUeZ3wHvVh5s95gcrA4YjMIbccT6ubB+1m054A=
github.com/minio/minio-go/v7 v7.0.69 h1:l8AnsQFyY1xiwa/DaQskY4NXSLA2yrGsW5iD9nRPVS0=
github.com/minio/minio-go/v7 v7.0.69/go.mod h1:XAvOPJQ5Xlzk5o3o/ArO2NMbhSGkimC+bpW/ngRKDmQ=
github.com/minio/mux v1.9.0 h1:dWafQFyEfGhJvK6AwLOt83bIG5bxKxKJnKMCi0XAaoA=
github.com/minio/mux v1.9.0/go.mod h1:1pAare17ZRL5GpmNL+9YmqHoWnLmMZF9C/ioUCfy0BQ=
github.com/minio/pkg/v2 v2.0.8 h1:JuNWjELRaDSMZegeWxNcx5Lf7ZxqKAI5hjSgx1bLbKc=
github.com/minio/pkg/v2 v2.0.8/go.mod h1:yayUTo82b0RK+e97hGb1naC787mOtUEyDs3SIcwSyHI=
github.com/minio/pkg/v2 v2.0.13 h1:Tm4koPzm+gVVCU5YLPtzXzfwkCR5sd/asXCu/RABSeA=
github.com/minio/pkg/v2 v2.0.13/go.mod h1:zbVATXCinLCo+L/4vsPyqgiA4OYPXCJb+/E4KfE396A=
github.com/minio/selfupdate v0.6.0 h1:i76PgT0K5xO9+hjzKcacQtO7+MjJ4JKA8Ak8XQ9DDwU=
github.com/minio/selfupdate v0.6.0/go.mod h1:bO02GTIPCMQFTEvE5h4DjYB58bCoZ35XLeBf0buTDdM=
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
@@ -214,7 +211,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
@@ -225,16 +221,16 @@ github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
github.com/navidys/tvxwidgets v0.5.0 h1:yMUjQQnEIVcVRiefk/8cqmBtss6W7mcgxKMBaWPrVuM=
github.com/navidys/tvxwidgets v0.5.0/go.mod h1:GfJi01j3qlVRQD6fg7IL08lOrM4PIznB58Q6aXJS5R4=
github.com/navidys/tvxwidgets v0.6.0 h1:ARIXGfx4aURHMhq+LW5vIoCCDx1X/PdTF8AcUq+nWZ0=
github.com/navidys/tvxwidgets v0.6.0/go.mod h1:wd6aS2OzjZczFbg8GCaVuwkFcY1eixlT/y7Lc/YIwlg=
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/onsi/ginkgo/v2 v2.13.2 h1:Bi2gGVkfn6gQcjNjZJVO8Gf0FHzMPf2phUei9tejVMs=
github.com/onsi/ginkgo/v2 v2.13.2/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM=
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
github.com/onsi/ginkgo/v2 v2.16.0 h1:7q1w9frJDzninhXxjZd+Y/x54XNjG/UlRLIYPZafsPM=
github.com/onsi/ginkgo/v2 v2.16.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs=
github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo=
github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0=
github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw=
github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -247,20 +243,20 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH
github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig=
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=
github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y=
github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ=
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=
github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=
github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos=
github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8=
github.com/prometheus/common v0.50.0 h1:YSZE6aa9+luNa2da6/Tik0q0A5AbR+U003TItK57CPQ=
github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ=
github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o=
github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g=
github.com/prometheus/prom2json v1.3.3 h1:IYfSMiZ7sSOfliBoo89PcufjWO4eAR0gznGcETyaUgo=
github.com/prometheus/prom2json v1.3.3/go.mod h1:Pv4yIPktEkK7btWsrUTWDDDrnpUrAELaOCj+oFwlgmc=
github.com/rivo/tview v0.0.0-20240204151237-861aa94d61c8 h1:aW0ILZ0lkphO/2mUWocSfP1iebWtSFcxL8BiSNR+/8g=
github.com/rivo/tview v0.0.0-20240204151237-861aa94d61c8/go.mod h1:sGSvhfWFNS7FpYxS8K+e22OTOI3UsB5rDs0nRtoZkpA=
github.com/rivo/tview v0.0.0-20240307173318-e804876934a1 h1:bWLHTRekAy497pE7+nXSuzXwwFHI0XauRzz6roUvY+s=
github.com/rivo/tview v0.0.0-20240307173318-e804876934a1/go.mod h1:02iFIz7K/A9jGCvrizLPvoqr4cEIx7q54RH5Qudkrss=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
@@ -276,27 +272,26 @@ github.com/safchain/ethtool v0.3.0 h1:gimQJpsI6sc1yIqP/y8GYgiXn/NjgvpM0RNoWLVVmP
github.com/safchain/ethtool v0.3.0/go.mod h1:SA9BwrgyAqNo7M+uaL6IYbxpm5wk3L7Mm6ocLW+CJUs=
github.com/secure-io/sio-go v0.3.1 h1:dNvY9awjabXTYGsTF1PiCySl9Ltofk9GA3VdWlo7rRc=
github.com/secure-io/sio-go v0.3.1/go.mod h1:+xbkjDzPjwh4Axd07pRKSNriS9SCiYksWnZqdnfpQxs=
github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI=
github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU=
github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y=
github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk=
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=
github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U=
github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
@@ -314,14 +309,9 @@ github.com/unrolled/secure v1.14.0 h1:u9vJTU/pR4Bny0ntLUMxdfLtmIRGvQf2sEFuA0TG9A
github.com/unrolled/secure v1.14.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40=
github.com/vbauerster/mpb/v8 v8.7.2 h1:SMJtxhNho1MV3OuFgS1DAzhANN1Ejc5Ct+0iSaIkB14=
github.com/vbauerster/mpb/v8 v8.7.2/go.mod h1:ZFnrjzspgDHoxYLGvxIruiNk73GNTPG4YHgVNpR10VY=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.etcd.io/etcd/api/v3 v3.5.12 h1:W4sw5ZoU2Juc9gBWuLk5U6fHfNVyY1WC5g9uiXZio/c=
@@ -330,14 +320,14 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.12 h1:EYDL6pWwyOsylrQyLp2w+HkQ46ATiOvoEdMarin
go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4=
go.etcd.io/etcd/client/v3 v3.5.12 h1:v5lCPXn1pf1Uu3M4laUE2hp/geOTc5uPcYYsNe1lDxg=
go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw=
go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk=
go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo=
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -345,10 +335,9 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
@@ -362,10 +351,11 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ=
golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA=
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI=
golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -391,7 +381,6 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -399,18 +388,17 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -426,31 +414,27 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc=
golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
google.golang.org/genproto v0.0.0-20240205150955-31a09d347014 h1:g/4bk7P6TPMkAUbUhquq98xey1slwvuVJPosdBqYJlU=
google.golang.org/genproto v0.0.0-20240205150955-31a09d347014/go.mod h1:xEgQu1e4stdSSsxPDK8Azkrk/ECl5HvdPf6nbZrTS5M=
google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014 h1:x9PwdEgd11LgK+orcck69WVRo7DezSO4VUMPI4xpc8A=
google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014/go.mod h1:rbHMSEDyoYX62nRVLOCc4Qt1HbsdytAYoVwgjiOhF3I=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014 h1:FSL3lRCkhaPFxqi0s9o+V4UI2WTzAVOvkgbd4kVV4Wg=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go.mod h1:SaPjaZGWb0lPqs6Ittu0spdfrOArqji4ZdeP5IC/9N4=
google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0=
google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=
google.golang.org/genproto/googleapis/api v0.0.0-20240311173647-c811ad7063a7 h1:oqta3O3AnlWbmIE3bFnWbu4bRxZjfbWCp0cKSuZh01E=
google.golang.org/genproto/googleapis/api v0.0.0-20240311173647-c811ad7063a7/go.mod h1:VQW3tUculP/D4B+xVCo+VgSq8As6wA9ZjHl//pmk+6s=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240311173647-c811ad7063a7 h1:8EeVk1VKMD+GD/neyEHGmz7pFblqPjHoi+PGQIlLx2s=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240311173647-c811ad7063a7/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk=
google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/h2non/filetype.v1 v1.0.5 h1:CC1jjJjoEhNVbMhXYalmGBhOBK2V70Q1N850wt/98/Y=
gopkg.in/h2non/filetype.v1 v1.0.5/go.mod h1:M0yem4rwSX5lLVrkEuRRp2/NinFMD5vgJ4DlAhZcfNo=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0=

View File

@@ -186,6 +186,7 @@ func TestObjectGet(t *testing.T) {
}
response, err := client.Do(request)
fmt.Printf("Console server Response: %v\nErr: %v\n", response, err)
assert.NotNil(response, fmt.Sprintf("%s response object is nil", tt.name))
assert.Nil(err, fmt.Sprintf("%s returned an error: %v", tt.name, err))

View File

@@ -40,6 +40,9 @@ type AddBucketLifecycle struct {
// Non required, toggle to disable or enable rule
Disable bool `json:"disable,omitempty"`
// Non required, toggle to disable or enable rule
ExpiredObjectDeleteAll bool `json:"expired_object_delete_all,omitempty"`
// Non required, toggle to disable or enable rule
ExpiredObjectDeleteMarker bool `json:"expired_object_delete_marker,omitempty"`

View File

@@ -41,6 +41,9 @@ type AddMultiBucketLifecycle struct {
// Required: true
Buckets []string `json:"buckets"`
// Non required, toggle to disable or enable rule
ExpiredObjectDeleteAll bool `json:"expired_object_delete_all,omitempty"`
// Non required, toggle to disable or enable rule
ExpiredObjectDeleteMarker bool `json:"expired_object_delete_marker,omitempty"`

View File

@@ -40,6 +40,9 @@ type ExpirationResponse struct {
// days
Days int64 `json:"days,omitempty"`
// delete all
DeleteAll bool `json:"delete_all,omitempty"`
// delete marker
DeleteMarker bool `json:"delete_marker,omitempty"`

View File

@@ -40,6 +40,9 @@ type UpdateBucketLifecycle struct {
// Non required, toggle to disable or enable rule
Disable bool `json:"disable,omitempty"`
// Non required, toggle to disable or enable rule
ExpiredObjectDeleteAll bool `json:"expired_object_delete_all,omitempty"`
// Non required, toggle to disable or enable rule
ExpiredObjectDeleteMarker bool `json:"expired_object_delete_marker,omitempty"`

View File

@@ -18,14 +18,11 @@ package subnet
import (
"bytes"
"compress/gzip"
"crypto/tls"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"io"
"mime/multipart"
"net"
"net/http"
"time"
@@ -79,65 +76,6 @@ func UploadAuthHeaders(apiKey string) map[string]string {
return map[string]string{"x-subnet-api-key": apiKey}
}
func ProcessUploadInfo(info interface{}, uploadType string, filename string) ([]byte, string, error) {
if uploadType == "health" {
return processHealthReport(info, filename)
}
return nil, "", errors.New("invalid SUBNET upload type")
}
func UploadFileToSubnet(info []byte, client *xhttp.Client, reqURL string, headers map[string]string, formDataType string) (string, error) {
req, e := subnetUploadReq(info, reqURL, formDataType)
if e != nil {
return "", e
}
resp, e := subnetReqDo(client, req, headers)
return resp, e
}
func processHealthReport(info interface{}, filename string) ([]byte, string, error) {
var body bytes.Buffer
writer := multipart.NewWriter(&body)
zipWriter := gzip.NewWriter(&body)
version := "3"
enc := json.NewEncoder(zipWriter)
header := struct {
Version string `json:"version"`
}{Version: version}
if e := enc.Encode(header); e != nil {
return nil, "", e
}
if e := enc.Encode(info); e != nil {
return nil, "", e
}
zipWriter.Close()
temp := body
part, e := writer.CreateFormFile("file", filename)
if e != nil {
return nil, "", e
}
if _, e = io.Copy(part, &temp); e != nil {
return nil, "", e
}
writer.Close()
return body.Bytes(), writer.FormDataContentType(), nil
}
func subnetUploadReq(body []byte, url string, formDataType string) (*http.Request, error) {
uploadDataBody := bytes.NewReader(body)
r, e := http.NewRequest(http.MethodPost, url, uploadDataBody)
if e != nil {
return nil, e
}
r.Header.Add("Content-Type", formDataType)
return r, nil
}
func GenerateRegToken(clusterRegInfo mc.ClusterRegistrationInfo) (string, error) {
token, e := json.Marshal(clusterRegInfo)
if e != nil {
@@ -204,44 +142,7 @@ func subnetPostReq(client xhttp.ClientI, reqURL string, payload interface{}, hea
}
func GetClusterRegInfo(admInfo madmin.InfoMessage) mc.ClusterRegistrationInfo {
noOfPools := 1
noOfDrives := 0
for _, srvr := range admInfo.Servers {
if srvr.PoolNumber > noOfPools {
noOfPools = srvr.PoolNumber
}
noOfDrives += len(srvr.Disks)
}
totalSpace, usedSpace := getDriveSpaceInfo(admInfo)
return mc.ClusterRegistrationInfo{
DeploymentID: admInfo.DeploymentID,
ClusterName: admInfo.DeploymentID,
UsedCapacity: admInfo.Usage.Size,
Info: mc.ClusterInfo{
MinioVersion: admInfo.Servers[0].Version,
NoOfServerPools: noOfPools,
NoOfServers: len(admInfo.Servers),
NoOfDrives: noOfDrives,
TotalDriveSpace: totalSpace,
UsedDriveSpace: usedSpace,
NoOfBuckets: admInfo.Buckets.Count,
NoOfObjects: admInfo.Objects.Count,
},
}
}
func getDriveSpaceInfo(admInfo madmin.InfoMessage) (uint64, uint64) {
total := uint64(0)
used := uint64(0)
for _, srvr := range admInfo.Servers {
for _, d := range srvr.Disks {
total += d.TotalSpace
used += d.UsedSpace
}
}
return total, used
return mc.GetClusterRegInfo(admInfo, admInfo.DeploymentID)
}
func GetSubnetAPIKeyUsingLicense(lic string) (string, error) {

View File

@@ -21,7 +21,6 @@ import (
"reflect"
"testing"
"github.com/minio/madmin-go/v3"
"github.com/minio/mc/cmd"
)
@@ -480,128 +479,3 @@ func Test_subnetAuthHeaders(t *testing.T) {
})
}
}
func Test_getDriveSpaceInfo(t *testing.T) {
type args struct {
admInfo madmin.InfoMessage
}
tests := []struct {
name string
args args
want uint64
want1 uint64
}{
{
name: "basic",
args: args{
admInfo: madmin.InfoMessage{
Servers: []madmin.ServerProperties{
{
Disks: []madmin.Disk{
{
TotalSpace: 1,
UsedSpace: 1,
},
},
},
},
},
},
want: 1,
want1: 1,
},
{
name: "basic two disks",
args: args{
admInfo: madmin.InfoMessage{
Servers: []madmin.ServerProperties{
{
Disks: []madmin.Disk{
{
TotalSpace: 1,
UsedSpace: 1,
},
{
TotalSpace: 1,
UsedSpace: 1,
},
},
},
},
},
},
want: 2,
want1: 2,
},
{
name: "basic two servers two disks",
args: args{
admInfo: madmin.InfoMessage{
Servers: []madmin.ServerProperties{
{
Disks: []madmin.Disk{
{
TotalSpace: 1,
UsedSpace: 1,
},
{
TotalSpace: 1,
UsedSpace: 1,
},
},
},
{
Disks: []madmin.Disk{
{
TotalSpace: 1,
UsedSpace: 1,
},
{
TotalSpace: 1,
UsedSpace: 1,
},
},
},
},
},
},
want: 4,
want1: 4,
},
{
name: "no servers",
args: args{
admInfo: madmin.InfoMessage{
Servers: nil,
},
},
want: 0,
want1: 0,
},
{
name: "no disks",
args: args{
admInfo: madmin.InfoMessage{
Servers: []madmin.ServerProperties{
{
Disks: nil,
},
},
},
},
want: 0,
want1: 0,
},
}
for _, tt := range tests {
t.Run(tt.name, func(_ *testing.T) {
got, got1 := getDriveSpaceInfo(tt.args.admInfo)
if got != tt.want {
t.Errorf("getDriveSpaceInfo() got = %v, want %v", got, tt.want)
}
if got1 != tt.want1 {
t.Errorf("getDriveSpaceInfo() got1 = %v, want %v", got1, tt.want1)
}
})
}
}

View File

@@ -25,7 +25,7 @@ securityDefinitions:
type: apiKey
# Apply the key security definition to all APIs
security:
- key: [ ]
- key: []
parameters:
limit:
name: limit
@@ -54,7 +54,7 @@ paths:
schema:
$ref: "#/definitions/ApiError"
# Exclude this API from the authentication requirement
security: [ ]
security: []
tags:
- Auth
post:
@@ -74,7 +74,7 @@ paths:
schema:
$ref: "#/definitions/ApiError"
# Exclude this API from the authentication requirement
security: [ ]
security: []
tags:
- Auth
/login/oauth2/auth:
@@ -94,7 +94,7 @@ paths:
description: Generic error response.
schema:
$ref: "#/definitions/ApiError"
security: [ ]
security: []
tags:
- Auth
@@ -295,8 +295,8 @@ paths:
get:
summary: List Objects
security:
- key: [ ]
- anonymous: [ ]
- key: []
- anonymous: []
operationId: ListObjects
parameters:
- name: bucket_name
@@ -411,8 +411,8 @@ paths:
post:
summary: Uploads an Object.
security:
- key: [ ]
- anonymous: [ ]
- key: []
- anonymous: []
consumes:
- multipart/form-data
parameters:
@@ -438,8 +438,8 @@ paths:
summary: Download Multiple Objects
operationId: DownloadMultipleObjects
security:
- key: [ ]
- anonymous: [ ]
- key: []
- anonymous: []
produces:
- application/octet-stream
parameters:
@@ -471,8 +471,8 @@ paths:
summary: Download Object
operationId: Download Object
security:
- key: [ ]
- anonymous: [ ]
- key: []
- anonymous: []
produces:
- application/octet-stream
parameters:
@@ -542,7 +542,6 @@ paths:
$ref: "#/definitions/ApiError"
tags:
- Object
/buckets/{bucket_name}/objects/legalhold:
put:
summary: Put Object's legalhold status
@@ -2885,7 +2884,7 @@ paths:
- name: order
in: query
type: string
enum: [ timeDesc, timeAsc ]
enum: [timeDesc, timeAsc]
default: timeDesc
- name: timeStart
in: query
@@ -3518,6 +3517,30 @@ paths:
tags:
- Support
/download-shared-object/{url}:
get:
summary: Downloads an object from a presigned url
operationId: DownloadSharedObject
security: []
produces:
- application/octet-stream
parameters:
- name: url
in: path
required: true
type: string
responses:
200:
description: A successful response.
schema:
type: file
default:
description: Generic error response.
schema:
$ref: "#/definitions/ApiError"
tags:
- Public
definitions:
accountChangePasswordRequest:
type: object
@@ -4329,7 +4352,7 @@ definitions:
properties:
loginStrategy:
type: string
enum: [ form, redirect, service-account, redirect-service-account ]
enum: [form, redirect, service-account, redirect-service-account]
redirectRules:
type: array
items:
@@ -4428,7 +4451,7 @@ definitions:
type: string
status:
type: string
enum: [ ok ]
enum: [ok]
operator:
type: boolean
distributedMode:
@@ -4459,7 +4482,7 @@ definitions:
type: string
values:
type: array
items: { }
items: {}
resultTarget:
type: object
properties:
@@ -4915,7 +4938,7 @@ definitions:
type: string
service:
type: string
enum: [ replication ]
enum: [replication]
syncMode:
type: string
bandwidth:
@@ -5109,6 +5132,8 @@ definitions:
format: int64
delete_marker:
type: boolean
delete_all:
type: boolean
noncurrent_expiration_days:
type: integer
format: int64
@@ -5192,6 +5217,9 @@ definitions:
expired_object_delete_marker:
description: Non required, toggle to disable or enable rule
type: boolean
expired_object_delete_all:
description: Non required, toggle to disable or enable rule
type: boolean
noncurrentversion_expiration_days:
description: Non required, can be set in case of expiration is enabled
type: integer
@@ -5247,6 +5275,9 @@ definitions:
expired_object_delete_marker:
description: Non required, toggle to disable or enable rule
type: boolean
expired_object_delete_all:
description: Non required, toggle to disable or enable rule
type: boolean
noncurrentversion_expiration_days:
description: Non required, can be set in case of expiration is enabled
type: integer
@@ -5299,6 +5330,9 @@ definitions:
expired_object_delete_marker:
description: Non required, toggle to disable or enable rule
type: boolean
expired_object_delete_all:
description: Non required, toggle to disable or enable rule
type: boolean
noncurrentversion_expiration_days:
description: Non required, can be set in case of expiration is enabled
type: integer
@@ -6198,7 +6232,7 @@ definitions:
format: int64
required:
- exp
selectedSAs:
type: array
items:

View File

@@ -1,100 +1,101 @@
{
"files": {
"main.css": "./static/css/main.e60e4760.css",
"main.js": "./static/js/main.e9eb8088.js",
"static/js/5056.eb86acd9.chunk.js": "./static/js/5056.eb86acd9.chunk.js",
"static/js/7784.3b092fc0.chunk.js": "./static/js/7784.3b092fc0.chunk.js",
"static/js/3132.68faa431.chunk.js": "./static/js/3132.68faa431.chunk.js",
"static/js/1596.f3c6b059.chunk.js": "./static/js/1596.f3c6b059.chunk.js",
"static/js/9788.55d6e883.chunk.js": "./static/js/9788.55d6e883.chunk.js",
"static/js/7700.2214e9d4.chunk.js": "./static/js/7700.2214e9d4.chunk.js",
"static/js/9444.1d9d2cc0.chunk.js": "./static/js/9444.1d9d2cc0.chunk.js",
"static/js/380.5a675da1.chunk.js": "./static/js/380.5a675da1.chunk.js",
"static/js/712.eca7b94f.chunk.js": "./static/js/712.eca7b94f.chunk.js",
"static/js/8704.9cb334af.chunk.js": "./static/js/8704.9cb334af.chunk.js",
"static/js/9664.e89f62c6.chunk.js": "./static/js/9664.e89f62c6.chunk.js",
"static/js/7612.e8288419.chunk.js": "./static/js/7612.e8288419.chunk.js",
"static/js/424.04352234.chunk.js": "./static/js/424.04352234.chunk.js",
"static/js/926.1d04c803.chunk.js": "./static/js/926.1d04c803.chunk.js",
"static/js/1692.e6616840.chunk.js": "./static/js/1692.e6616840.chunk.js",
"static/js/1376.e17d63e1.chunk.js": "./static/js/1376.e17d63e1.chunk.js",
"static/js/7952.22a6ce54.chunk.js": "./static/js/7952.22a6ce54.chunk.js",
"static/js/7316.89c52b7f.chunk.js": "./static/js/7316.89c52b7f.chunk.js",
"static/js/1160.93409ca8.chunk.js": "./static/js/1160.93409ca8.chunk.js",
"static/js/6432.31d6d652.chunk.js": "./static/js/6432.31d6d652.chunk.js",
"static/js/3990.50417f3a.chunk.js": "./static/js/3990.50417f3a.chunk.js",
"static/js/9352.1ae2bf88.chunk.js": "./static/js/9352.1ae2bf88.chunk.js",
"static/js/4168.f6de88dd.chunk.js": "./static/js/4168.f6de88dd.chunk.js",
"static/js/1124.52654914.chunk.js": "./static/js/1124.52654914.chunk.js",
"static/js/8424.bd0ded37.chunk.js": "./static/js/8424.bd0ded37.chunk.js",
"static/js/4632.b69f999c.chunk.js": "./static/js/4632.b69f999c.chunk.js",
"static/js/8100.67b80931.chunk.js": "./static/js/8100.67b80931.chunk.js",
"static/js/2448.5e41ba14.chunk.js": "./static/js/2448.5e41ba14.chunk.js",
"static/js/6244.21ba4489.chunk.js": "./static/js/6244.21ba4489.chunk.js",
"static/js/8336.97797ef4.chunk.js": "./static/js/8336.97797ef4.chunk.js",
"static/js/152.7aa7fed2.chunk.js": "./static/js/152.7aa7fed2.chunk.js",
"static/js/7165.6417f2bc.chunk.js": "./static/js/7165.6417f2bc.chunk.js",
"static/js/5412.8f665bd9.chunk.js": "./static/js/5412.8f665bd9.chunk.js",
"static/js/6164.22ffd313.chunk.js": "./static/js/6164.22ffd313.chunk.js",
"static/js/3996.7bb99dbe.chunk.js": "./static/js/3996.7bb99dbe.chunk.js",
"static/js/9920.ea7958b0.chunk.js": "./static/js/9920.ea7958b0.chunk.js",
"static/js/5296.17a49dd1.chunk.js": "./static/js/5296.17a49dd1.chunk.js",
"static/js/6218.fe935606.chunk.js": "./static/js/6218.fe935606.chunk.js",
"static/js/2576.1b91e163.chunk.js": "./static/js/2576.1b91e163.chunk.js",
"static/js/7908.597b20bb.chunk.js": "./static/js/7908.597b20bb.chunk.js",
"static/js/6588.cfab7e27.chunk.js": "./static/js/6588.cfab7e27.chunk.js",
"static/js/2012.7d122587.chunk.js": "./static/js/2012.7d122587.chunk.js",
"static/js/4412.fe19b155.chunk.js": "./static/js/4412.fe19b155.chunk.js",
"static/js/5756.2a90f420.chunk.js": "./static/js/5756.2a90f420.chunk.js",
"static/js/20.16e8fc29.chunk.js": "./static/js/20.16e8fc29.chunk.js",
"static/js/2928.8487007f.chunk.js": "./static/js/2928.8487007f.chunk.js",
"static/js/6520.9be3294f.chunk.js": "./static/js/6520.9be3294f.chunk.js",
"static/js/6596.3e0af576.chunk.js": "./static/js/6596.3e0af576.chunk.js",
"static/js/352.57c4d53b.chunk.js": "./static/js/352.57c4d53b.chunk.js",
"static/js/3728.619f9f58.chunk.js": "./static/js/3728.619f9f58.chunk.js",
"static/js/7776.525c972b.chunk.js": "./static/js/7776.525c972b.chunk.js",
"static/js/4440.7da6ff32.chunk.js": "./static/js/4440.7da6ff32.chunk.js",
"static/js/6560.b4440a7d.chunk.js": "./static/js/6560.b4440a7d.chunk.js",
"static/js/8648.1d9c893d.chunk.js": "./static/js/8648.1d9c893d.chunk.js",
"static/js/7540.672b21be.chunk.js": "./static/js/7540.672b21be.chunk.js",
"static/js/2124.2a71d5a5.chunk.js": "./static/js/2124.2a71d5a5.chunk.js",
"static/js/8234.7c6414e0.chunk.js": "./static/js/8234.7c6414e0.chunk.js",
"static/js/5072.61e61192.chunk.js": "./static/js/5072.61e61192.chunk.js",
"static/js/3556.ab4ba514.chunk.js": "./static/js/3556.ab4ba514.chunk.js",
"static/js/4776.5ef55320.chunk.js": "./static/js/4776.5ef55320.chunk.js",
"static/js/8940.ebc12e13.chunk.js": "./static/js/8940.ebc12e13.chunk.js",
"static/js/2492.ad98215a.chunk.js": "./static/js/2492.ad98215a.chunk.js",
"static/js/6844.fa78bce4.chunk.js": "./static/js/6844.fa78bce4.chunk.js",
"static/js/6532.71c2908a.chunk.js": "./static/js/6532.71c2908a.chunk.js",
"static/js/3400.f4b8f3e0.chunk.js": "./static/js/3400.f4b8f3e0.chunk.js",
"static/js/1496.e8c5dafd.chunk.js": "./static/js/1496.e8c5dafd.chunk.js",
"static/js/6186.3019e777.chunk.js": "./static/js/6186.3019e777.chunk.js",
"static/js/428.2172e82f.chunk.js": "./static/js/428.2172e82f.chunk.js",
"static/js/7904.05fd1ade.chunk.js": "./static/js/7904.05fd1ade.chunk.js",
"static/js/9572.70d2f6c8.chunk.js": "./static/js/9572.70d2f6c8.chunk.js",
"static/js/1064.1ab42ca4.chunk.js": "./static/js/1064.1ab42ca4.chunk.js",
"static/js/9740.424d346a.chunk.js": "./static/js/9740.424d346a.chunk.js",
"static/js/4916.0094d194.chunk.js": "./static/js/4916.0094d194.chunk.js",
"static/js/1024.aee9e8e8.chunk.js": "./static/js/1024.aee9e8e8.chunk.js",
"static/js/9460.be94fd27.chunk.js": "./static/js/9460.be94fd27.chunk.js",
"static/js/4844.0dce889a.chunk.js": "./static/js/4844.0dce889a.chunk.js",
"static/js/6292.623b86cd.chunk.js": "./static/js/6292.623b86cd.chunk.js",
"static/js/7264.a0f227d8.chunk.js": "./static/js/7264.a0f227d8.chunk.js",
"static/js/5084.978ad614.chunk.js": "./static/js/5084.978ad614.chunk.js",
"static/js/4528.d208fadc.chunk.js": "./static/js/4528.d208fadc.chunk.js",
"static/js/9892.fadfbcac.chunk.js": "./static/js/9892.fadfbcac.chunk.js",
"static/js/6536.fd6f7316.chunk.js": "./static/js/6536.fd6f7316.chunk.js",
"static/js/968.5ee29217.chunk.js": "./static/js/968.5ee29217.chunk.js",
"static/js/92.b3c6645e.chunk.js": "./static/js/92.b3c6645e.chunk.js",
"static/js/5508.de9d49da.chunk.js": "./static/js/5508.de9d49da.chunk.js",
"static/js/4084.19418226.chunk.js": "./static/js/4084.19418226.chunk.js",
"static/js/9844.7ee4f681.chunk.js": "./static/js/9844.7ee4f681.chunk.js",
"static/js/3052.c221a4c1.chunk.js": "./static/js/3052.c221a4c1.chunk.js",
"static/js/8108.95a99cdc.chunk.js": "./static/js/8108.95a99cdc.chunk.js",
"static/js/7720.8a2f37ec.chunk.js": "./static/js/7720.8a2f37ec.chunk.js",
"static/js/7788.a780545f.chunk.js": "./static/js/7788.a780545f.chunk.js",
"static/js/9160.9e428c5b.chunk.js": "./static/js/9160.9e428c5b.chunk.js",
"static/js/844.53519725.chunk.js": "./static/js/844.53519725.chunk.js",
"main.js": "./static/js/main.cbc16c2b.js",
"static/js/5301.2c626a41.chunk.js": "./static/js/5301.2c626a41.chunk.js",
"static/js/9361.3fc638a6.chunk.js": "./static/js/9361.3fc638a6.chunk.js",
"static/js/843.8502a4fd.chunk.js": "./static/js/843.8502a4fd.chunk.js",
"static/js/3035.b2eb0918.chunk.js": "./static/js/3035.b2eb0918.chunk.js",
"static/js/9537.675a2ebb.chunk.js": "./static/js/9537.675a2ebb.chunk.js",
"static/js/5711.c58de6bb.chunk.js": "./static/js/5711.c58de6bb.chunk.js",
"static/js/8769.5e67beb9.chunk.js": "./static/js/8769.5e67beb9.chunk.js",
"static/js/2033.a09fb9da.chunk.js": "./static/js/2033.a09fb9da.chunk.js",
"static/js/8821.44b4fe0f.chunk.js": "./static/js/8821.44b4fe0f.chunk.js",
"static/js/9987.15024980.chunk.js": "./static/js/9987.15024980.chunk.js",
"static/js/689.5e705237.chunk.js": "./static/js/689.5e705237.chunk.js",
"static/js/6164.993b302b.chunk.js": "./static/js/6164.993b302b.chunk.js",
"static/js/2372.aaeaeefa.chunk.js": "./static/js/2372.aaeaeefa.chunk.js",
"static/js/1324.beff0285.chunk.js": "./static/js/1324.beff0285.chunk.js",
"static/js/5693.5834aa74.chunk.js": "./static/js/5693.5834aa74.chunk.js",
"static/js/5872.62eb672b.chunk.js": "./static/js/5872.62eb672b.chunk.js",
"static/js/6758.b6da6dc7.chunk.js": "./static/js/6758.b6da6dc7.chunk.js",
"static/js/755.ac098541.chunk.js": "./static/js/755.ac098541.chunk.js",
"static/js/8715.0aaa4c38.chunk.js": "./static/js/8715.0aaa4c38.chunk.js",
"static/js/7880.6f98d22b.chunk.js": "./static/js/7880.6f98d22b.chunk.js",
"static/js/2209.3b0ca7fa.chunk.js": "./static/js/2209.3b0ca7fa.chunk.js",
"static/js/7435.eb0888fa.chunk.js": "./static/js/7435.eb0888fa.chunk.js",
"static/js/9340.8c56fae7.chunk.js": "./static/js/9340.8c56fae7.chunk.js",
"static/js/9269.e21bb7dd.chunk.js": "./static/js/9269.e21bb7dd.chunk.js",
"static/js/6925.65a0241f.chunk.js": "./static/js/6925.65a0241f.chunk.js",
"static/js/3527.59dee34f.chunk.js": "./static/js/3527.59dee34f.chunk.js",
"static/js/8789.668926b3.chunk.js": "./static/js/8789.668926b3.chunk.js",
"static/js/7485.7f393450.chunk.js": "./static/js/7485.7f393450.chunk.js",
"static/js/7041.4daa055d.chunk.js": "./static/js/7041.4daa055d.chunk.js",
"static/js/2138.d05b3faa.chunk.js": "./static/js/2138.d05b3faa.chunk.js",
"static/js/5699.bb05be82.chunk.js": "./static/js/5699.bb05be82.chunk.js",
"static/js/7381.99263635.chunk.js": "./static/js/7381.99263635.chunk.js",
"static/js/7052.58711f5f.chunk.js": "./static/js/7052.58711f5f.chunk.js",
"static/js/144.1bc937a8.chunk.js": "./static/js/144.1bc937a8.chunk.js",
"static/js/5978.723fd455.chunk.js": "./static/js/5978.723fd455.chunk.js",
"static/js/4103.b6a51725.chunk.js": "./static/js/4103.b6a51725.chunk.js",
"static/js/1702.9ff3a82e.chunk.js": "./static/js/1702.9ff3a82e.chunk.js",
"static/js/7601.4e033e78.chunk.js": "./static/js/7601.4e033e78.chunk.js",
"static/js/2959.25a10423.chunk.js": "./static/js/2959.25a10423.chunk.js",
"static/js/9619.572ad00d.chunk.js": "./static/js/9619.572ad00d.chunk.js",
"static/js/8017.d5b163f3.chunk.js": "./static/js/8017.d5b163f3.chunk.js",
"static/js/3323.f86a698b.chunk.js": "./static/js/3323.f86a698b.chunk.js",
"static/js/5128.96ab1387.chunk.js": "./static/js/5128.96ab1387.chunk.js",
"static/js/6140.37801ce8.chunk.js": "./static/js/6140.37801ce8.chunk.js",
"static/js/696.77a3fec7.chunk.js": "./static/js/696.77a3fec7.chunk.js",
"static/js/2166.1e6c2b39.chunk.js": "./static/js/2166.1e6c2b39.chunk.js",
"static/js/7063.80895202.chunk.js": "./static/js/7063.80895202.chunk.js",
"static/js/3061.c8170979.chunk.js": "./static/js/3061.c8170979.chunk.js",
"static/js/5064.8df5c897.chunk.js": "./static/js/5064.8df5c897.chunk.js",
"static/js/7643.bc0ec1d5.chunk.js": "./static/js/7643.bc0ec1d5.chunk.js",
"static/js/985.d2139cb6.chunk.js": "./static/js/985.d2139cb6.chunk.js",
"static/js/1370.d5e698ce.chunk.js": "./static/js/1370.d5e698ce.chunk.js",
"static/js/8823.034b6a8d.chunk.js": "./static/js/8823.034b6a8d.chunk.js",
"static/js/24.1245bd95.chunk.js": "./static/js/24.1245bd95.chunk.js",
"static/js/5851.9d7a7887.chunk.js": "./static/js/5851.9d7a7887.chunk.js",
"static/js/4705.2270c966.chunk.js": "./static/js/4705.2270c966.chunk.js",
"static/js/3654.877a48d3.chunk.js": "./static/js/3654.877a48d3.chunk.js",
"static/js/960.69a44c1d.chunk.js": "./static/js/960.69a44c1d.chunk.js",
"static/js/8642.883c89db.chunk.js": "./static/js/8642.883c89db.chunk.js",
"static/js/3329.c2099208.chunk.js": "./static/js/3329.c2099208.chunk.js",
"static/js/2332.7f421c9f.chunk.js": "./static/js/2332.7f421c9f.chunk.js",
"static/js/5941.4df5a08b.chunk.js": "./static/js/5941.4df5a08b.chunk.js",
"static/js/2704.fe33dd23.chunk.js": "./static/js/2704.fe33dd23.chunk.js",
"static/js/7774.4d23a595.chunk.js": "./static/js/7774.4d23a595.chunk.js",
"static/js/3851.c5eaa08e.chunk.js": "./static/js/3851.c5eaa08e.chunk.js",
"static/js/9965.e00429f9.chunk.js": "./static/js/9965.e00429f9.chunk.js",
"static/js/6065.f30b3ff2.chunk.js": "./static/js/6065.f30b3ff2.chunk.js",
"static/js/12.ab9b7ed0.chunk.js": "./static/js/12.ab9b7ed0.chunk.js",
"static/js/8010.8ce54818.chunk.js": "./static/js/8010.8ce54818.chunk.js",
"static/js/2689.5e76c1cd.chunk.js": "./static/js/2689.5e76c1cd.chunk.js",
"static/js/872.6f58df17.chunk.js": "./static/js/872.6f58df17.chunk.js",
"static/js/4676.578844c1.chunk.js": "./static/js/4676.578844c1.chunk.js",
"static/js/8825.e5adf924.chunk.js": "./static/js/8825.e5adf924.chunk.js",
"static/js/614.f6cdf349.chunk.js": "./static/js/614.f6cdf349.chunk.js",
"static/js/502.0106f2a9.chunk.js": "./static/js/502.0106f2a9.chunk.js",
"static/js/6799.61dee8ac.chunk.js": "./static/js/6799.61dee8ac.chunk.js",
"static/js/7659.124c07a5.chunk.js": "./static/js/7659.124c07a5.chunk.js",
"static/js/7515.346161ed.chunk.js": "./static/js/7515.346161ed.chunk.js",
"static/js/6654.d76daa88.chunk.js": "./static/js/6654.d76daa88.chunk.js",
"static/js/5311.bf44bf69.chunk.js": "./static/js/5311.bf44bf69.chunk.js",
"static/js/5809.064e83cc.chunk.js": "./static/js/5809.064e83cc.chunk.js",
"static/js/7264.f7c51a0e.chunk.js": "./static/js/7264.f7c51a0e.chunk.js",
"static/js/4172.0d489f24.chunk.js": "./static/js/4172.0d489f24.chunk.js",
"static/js/6108.7a769377.chunk.js": "./static/js/6108.7a769377.chunk.js",
"static/js/9714.48a29c42.chunk.js": "./static/js/9714.48a29c42.chunk.js",
"static/js/459.65dbecac.chunk.js": "./static/js/459.65dbecac.chunk.js",
"static/js/8152.6306ebd5.chunk.js": "./static/js/8152.6306ebd5.chunk.js",
"static/js/1303.12f6ca82.chunk.js": "./static/js/1303.12f6ca82.chunk.js",
"static/js/5079.a0847792.chunk.js": "./static/js/5079.a0847792.chunk.js",
"static/js/4581.41480fcf.chunk.js": "./static/js/4581.41480fcf.chunk.js",
"static/js/6016.dcb3bcb4.chunk.js": "./static/js/6016.dcb3bcb4.chunk.js",
"static/js/8144.0cc85475.chunk.js": "./static/js/8144.0cc85475.chunk.js",
"static/js/1195.955963a0.chunk.js": "./static/js/1195.955963a0.chunk.js",
"static/js/1011.13d372c8.chunk.js": "./static/js/1011.13d372c8.chunk.js",
"static/media/videoBG.mp4": "./static/media/videoBG.17363418b3c2246a0e27.mp4",
"static/media/loginAnimationPoster.png": "./static/media/loginAnimationPoster.9aa924bfe619e71d5d29.png",
"static/media/Inter-BoldItalic.woff": "./static/media/Inter-BoldItalic.b376885042f6c961a541.woff",
@@ -118,103 +119,104 @@
"static/media/placeholderimage.png": "./static/media/placeholderimage.077ea48bd1ef1f4a883f.png",
"index.html": "./index.html",
"main.e60e4760.css.map": "./static/css/main.e60e4760.css.map",
"main.e9eb8088.js.map": "./static/js/main.e9eb8088.js.map",
"5056.eb86acd9.chunk.js.map": "./static/js/5056.eb86acd9.chunk.js.map",
"7784.3b092fc0.chunk.js.map": "./static/js/7784.3b092fc0.chunk.js.map",
"3132.68faa431.chunk.js.map": "./static/js/3132.68faa431.chunk.js.map",
"1596.f3c6b059.chunk.js.map": "./static/js/1596.f3c6b059.chunk.js.map",
"9788.55d6e883.chunk.js.map": "./static/js/9788.55d6e883.chunk.js.map",
"7700.2214e9d4.chunk.js.map": "./static/js/7700.2214e9d4.chunk.js.map",
"9444.1d9d2cc0.chunk.js.map": "./static/js/9444.1d9d2cc0.chunk.js.map",
"380.5a675da1.chunk.js.map": "./static/js/380.5a675da1.chunk.js.map",
"712.eca7b94f.chunk.js.map": "./static/js/712.eca7b94f.chunk.js.map",
"8704.9cb334af.chunk.js.map": "./static/js/8704.9cb334af.chunk.js.map",
"9664.e89f62c6.chunk.js.map": "./static/js/9664.e89f62c6.chunk.js.map",
"7612.e8288419.chunk.js.map": "./static/js/7612.e8288419.chunk.js.map",
"424.04352234.chunk.js.map": "./static/js/424.04352234.chunk.js.map",
"926.1d04c803.chunk.js.map": "./static/js/926.1d04c803.chunk.js.map",
"1692.e6616840.chunk.js.map": "./static/js/1692.e6616840.chunk.js.map",
"1376.e17d63e1.chunk.js.map": "./static/js/1376.e17d63e1.chunk.js.map",
"7952.22a6ce54.chunk.js.map": "./static/js/7952.22a6ce54.chunk.js.map",
"7316.89c52b7f.chunk.js.map": "./static/js/7316.89c52b7f.chunk.js.map",
"1160.93409ca8.chunk.js.map": "./static/js/1160.93409ca8.chunk.js.map",
"6432.31d6d652.chunk.js.map": "./static/js/6432.31d6d652.chunk.js.map",
"3990.50417f3a.chunk.js.map": "./static/js/3990.50417f3a.chunk.js.map",
"9352.1ae2bf88.chunk.js.map": "./static/js/9352.1ae2bf88.chunk.js.map",
"4168.f6de88dd.chunk.js.map": "./static/js/4168.f6de88dd.chunk.js.map",
"1124.52654914.chunk.js.map": "./static/js/1124.52654914.chunk.js.map",
"8424.bd0ded37.chunk.js.map": "./static/js/8424.bd0ded37.chunk.js.map",
"4632.b69f999c.chunk.js.map": "./static/js/4632.b69f999c.chunk.js.map",
"8100.67b80931.chunk.js.map": "./static/js/8100.67b80931.chunk.js.map",
"2448.5e41ba14.chunk.js.map": "./static/js/2448.5e41ba14.chunk.js.map",
"6244.21ba4489.chunk.js.map": "./static/js/6244.21ba4489.chunk.js.map",
"8336.97797ef4.chunk.js.map": "./static/js/8336.97797ef4.chunk.js.map",
"152.7aa7fed2.chunk.js.map": "./static/js/152.7aa7fed2.chunk.js.map",
"7165.6417f2bc.chunk.js.map": "./static/js/7165.6417f2bc.chunk.js.map",
"5412.8f665bd9.chunk.js.map": "./static/js/5412.8f665bd9.chunk.js.map",
"6164.22ffd313.chunk.js.map": "./static/js/6164.22ffd313.chunk.js.map",
"3996.7bb99dbe.chunk.js.map": "./static/js/3996.7bb99dbe.chunk.js.map",
"9920.ea7958b0.chunk.js.map": "./static/js/9920.ea7958b0.chunk.js.map",
"5296.17a49dd1.chunk.js.map": "./static/js/5296.17a49dd1.chunk.js.map",
"6218.fe935606.chunk.js.map": "./static/js/6218.fe935606.chunk.js.map",
"2576.1b91e163.chunk.js.map": "./static/js/2576.1b91e163.chunk.js.map",
"7908.597b20bb.chunk.js.map": "./static/js/7908.597b20bb.chunk.js.map",
"6588.cfab7e27.chunk.js.map": "./static/js/6588.cfab7e27.chunk.js.map",
"2012.7d122587.chunk.js.map": "./static/js/2012.7d122587.chunk.js.map",
"4412.fe19b155.chunk.js.map": "./static/js/4412.fe19b155.chunk.js.map",
"5756.2a90f420.chunk.js.map": "./static/js/5756.2a90f420.chunk.js.map",
"20.16e8fc29.chunk.js.map": "./static/js/20.16e8fc29.chunk.js.map",
"2928.8487007f.chunk.js.map": "./static/js/2928.8487007f.chunk.js.map",
"6520.9be3294f.chunk.js.map": "./static/js/6520.9be3294f.chunk.js.map",
"6596.3e0af576.chunk.js.map": "./static/js/6596.3e0af576.chunk.js.map",
"352.57c4d53b.chunk.js.map": "./static/js/352.57c4d53b.chunk.js.map",
"3728.619f9f58.chunk.js.map": "./static/js/3728.619f9f58.chunk.js.map",
"7776.525c972b.chunk.js.map": "./static/js/7776.525c972b.chunk.js.map",
"4440.7da6ff32.chunk.js.map": "./static/js/4440.7da6ff32.chunk.js.map",
"6560.b4440a7d.chunk.js.map": "./static/js/6560.b4440a7d.chunk.js.map",
"8648.1d9c893d.chunk.js.map": "./static/js/8648.1d9c893d.chunk.js.map",
"7540.672b21be.chunk.js.map": "./static/js/7540.672b21be.chunk.js.map",
"2124.2a71d5a5.chunk.js.map": "./static/js/2124.2a71d5a5.chunk.js.map",
"8234.7c6414e0.chunk.js.map": "./static/js/8234.7c6414e0.chunk.js.map",
"5072.61e61192.chunk.js.map": "./static/js/5072.61e61192.chunk.js.map",
"3556.ab4ba514.chunk.js.map": "./static/js/3556.ab4ba514.chunk.js.map",
"4776.5ef55320.chunk.js.map": "./static/js/4776.5ef55320.chunk.js.map",
"8940.ebc12e13.chunk.js.map": "./static/js/8940.ebc12e13.chunk.js.map",
"2492.ad98215a.chunk.js.map": "./static/js/2492.ad98215a.chunk.js.map",
"6844.fa78bce4.chunk.js.map": "./static/js/6844.fa78bce4.chunk.js.map",
"6532.71c2908a.chunk.js.map": "./static/js/6532.71c2908a.chunk.js.map",
"3400.f4b8f3e0.chunk.js.map": "./static/js/3400.f4b8f3e0.chunk.js.map",
"1496.e8c5dafd.chunk.js.map": "./static/js/1496.e8c5dafd.chunk.js.map",
"6186.3019e777.chunk.js.map": "./static/js/6186.3019e777.chunk.js.map",
"428.2172e82f.chunk.js.map": "./static/js/428.2172e82f.chunk.js.map",
"7904.05fd1ade.chunk.js.map": "./static/js/7904.05fd1ade.chunk.js.map",
"9572.70d2f6c8.chunk.js.map": "./static/js/9572.70d2f6c8.chunk.js.map",
"1064.1ab42ca4.chunk.js.map": "./static/js/1064.1ab42ca4.chunk.js.map",
"9740.424d346a.chunk.js.map": "./static/js/9740.424d346a.chunk.js.map",
"4916.0094d194.chunk.js.map": "./static/js/4916.0094d194.chunk.js.map",
"1024.aee9e8e8.chunk.js.map": "./static/js/1024.aee9e8e8.chunk.js.map",
"9460.be94fd27.chunk.js.map": "./static/js/9460.be94fd27.chunk.js.map",
"4844.0dce889a.chunk.js.map": "./static/js/4844.0dce889a.chunk.js.map",
"6292.623b86cd.chunk.js.map": "./static/js/6292.623b86cd.chunk.js.map",
"7264.a0f227d8.chunk.js.map": "./static/js/7264.a0f227d8.chunk.js.map",
"5084.978ad614.chunk.js.map": "./static/js/5084.978ad614.chunk.js.map",
"4528.d208fadc.chunk.js.map": "./static/js/4528.d208fadc.chunk.js.map",
"9892.fadfbcac.chunk.js.map": "./static/js/9892.fadfbcac.chunk.js.map",
"6536.fd6f7316.chunk.js.map": "./static/js/6536.fd6f7316.chunk.js.map",
"968.5ee29217.chunk.js.map": "./static/js/968.5ee29217.chunk.js.map",
"92.b3c6645e.chunk.js.map": "./static/js/92.b3c6645e.chunk.js.map",
"5508.de9d49da.chunk.js.map": "./static/js/5508.de9d49da.chunk.js.map",
"4084.19418226.chunk.js.map": "./static/js/4084.19418226.chunk.js.map",
"9844.7ee4f681.chunk.js.map": "./static/js/9844.7ee4f681.chunk.js.map",
"3052.c221a4c1.chunk.js.map": "./static/js/3052.c221a4c1.chunk.js.map",
"8108.95a99cdc.chunk.js.map": "./static/js/8108.95a99cdc.chunk.js.map",
"7720.8a2f37ec.chunk.js.map": "./static/js/7720.8a2f37ec.chunk.js.map",
"7788.a780545f.chunk.js.map": "./static/js/7788.a780545f.chunk.js.map",
"9160.9e428c5b.chunk.js.map": "./static/js/9160.9e428c5b.chunk.js.map",
"844.53519725.chunk.js.map": "./static/js/844.53519725.chunk.js.map"
"main.cbc16c2b.js.map": "./static/js/main.cbc16c2b.js.map",
"5301.2c626a41.chunk.js.map": "./static/js/5301.2c626a41.chunk.js.map",
"9361.3fc638a6.chunk.js.map": "./static/js/9361.3fc638a6.chunk.js.map",
"843.8502a4fd.chunk.js.map": "./static/js/843.8502a4fd.chunk.js.map",
"3035.b2eb0918.chunk.js.map": "./static/js/3035.b2eb0918.chunk.js.map",
"9537.675a2ebb.chunk.js.map": "./static/js/9537.675a2ebb.chunk.js.map",
"5711.c58de6bb.chunk.js.map": "./static/js/5711.c58de6bb.chunk.js.map",
"8769.5e67beb9.chunk.js.map": "./static/js/8769.5e67beb9.chunk.js.map",
"2033.a09fb9da.chunk.js.map": "./static/js/2033.a09fb9da.chunk.js.map",
"8821.44b4fe0f.chunk.js.map": "./static/js/8821.44b4fe0f.chunk.js.map",
"9987.15024980.chunk.js.map": "./static/js/9987.15024980.chunk.js.map",
"689.5e705237.chunk.js.map": "./static/js/689.5e705237.chunk.js.map",
"6164.993b302b.chunk.js.map": "./static/js/6164.993b302b.chunk.js.map",
"2372.aaeaeefa.chunk.js.map": "./static/js/2372.aaeaeefa.chunk.js.map",
"1324.beff0285.chunk.js.map": "./static/js/1324.beff0285.chunk.js.map",
"5693.5834aa74.chunk.js.map": "./static/js/5693.5834aa74.chunk.js.map",
"5872.62eb672b.chunk.js.map": "./static/js/5872.62eb672b.chunk.js.map",
"6758.b6da6dc7.chunk.js.map": "./static/js/6758.b6da6dc7.chunk.js.map",
"755.ac098541.chunk.js.map": "./static/js/755.ac098541.chunk.js.map",
"8715.0aaa4c38.chunk.js.map": "./static/js/8715.0aaa4c38.chunk.js.map",
"7880.6f98d22b.chunk.js.map": "./static/js/7880.6f98d22b.chunk.js.map",
"2209.3b0ca7fa.chunk.js.map": "./static/js/2209.3b0ca7fa.chunk.js.map",
"7435.eb0888fa.chunk.js.map": "./static/js/7435.eb0888fa.chunk.js.map",
"9340.8c56fae7.chunk.js.map": "./static/js/9340.8c56fae7.chunk.js.map",
"9269.e21bb7dd.chunk.js.map": "./static/js/9269.e21bb7dd.chunk.js.map",
"6925.65a0241f.chunk.js.map": "./static/js/6925.65a0241f.chunk.js.map",
"3527.59dee34f.chunk.js.map": "./static/js/3527.59dee34f.chunk.js.map",
"8789.668926b3.chunk.js.map": "./static/js/8789.668926b3.chunk.js.map",
"7485.7f393450.chunk.js.map": "./static/js/7485.7f393450.chunk.js.map",
"7041.4daa055d.chunk.js.map": "./static/js/7041.4daa055d.chunk.js.map",
"2138.d05b3faa.chunk.js.map": "./static/js/2138.d05b3faa.chunk.js.map",
"5699.bb05be82.chunk.js.map": "./static/js/5699.bb05be82.chunk.js.map",
"7381.99263635.chunk.js.map": "./static/js/7381.99263635.chunk.js.map",
"7052.58711f5f.chunk.js.map": "./static/js/7052.58711f5f.chunk.js.map",
"144.1bc937a8.chunk.js.map": "./static/js/144.1bc937a8.chunk.js.map",
"5978.723fd455.chunk.js.map": "./static/js/5978.723fd455.chunk.js.map",
"4103.b6a51725.chunk.js.map": "./static/js/4103.b6a51725.chunk.js.map",
"1702.9ff3a82e.chunk.js.map": "./static/js/1702.9ff3a82e.chunk.js.map",
"7601.4e033e78.chunk.js.map": "./static/js/7601.4e033e78.chunk.js.map",
"2959.25a10423.chunk.js.map": "./static/js/2959.25a10423.chunk.js.map",
"9619.572ad00d.chunk.js.map": "./static/js/9619.572ad00d.chunk.js.map",
"8017.d5b163f3.chunk.js.map": "./static/js/8017.d5b163f3.chunk.js.map",
"3323.f86a698b.chunk.js.map": "./static/js/3323.f86a698b.chunk.js.map",
"5128.96ab1387.chunk.js.map": "./static/js/5128.96ab1387.chunk.js.map",
"6140.37801ce8.chunk.js.map": "./static/js/6140.37801ce8.chunk.js.map",
"696.77a3fec7.chunk.js.map": "./static/js/696.77a3fec7.chunk.js.map",
"2166.1e6c2b39.chunk.js.map": "./static/js/2166.1e6c2b39.chunk.js.map",
"7063.80895202.chunk.js.map": "./static/js/7063.80895202.chunk.js.map",
"3061.c8170979.chunk.js.map": "./static/js/3061.c8170979.chunk.js.map",
"5064.8df5c897.chunk.js.map": "./static/js/5064.8df5c897.chunk.js.map",
"7643.bc0ec1d5.chunk.js.map": "./static/js/7643.bc0ec1d5.chunk.js.map",
"985.d2139cb6.chunk.js.map": "./static/js/985.d2139cb6.chunk.js.map",
"1370.d5e698ce.chunk.js.map": "./static/js/1370.d5e698ce.chunk.js.map",
"8823.034b6a8d.chunk.js.map": "./static/js/8823.034b6a8d.chunk.js.map",
"24.1245bd95.chunk.js.map": "./static/js/24.1245bd95.chunk.js.map",
"5851.9d7a7887.chunk.js.map": "./static/js/5851.9d7a7887.chunk.js.map",
"4705.2270c966.chunk.js.map": "./static/js/4705.2270c966.chunk.js.map",
"3654.877a48d3.chunk.js.map": "./static/js/3654.877a48d3.chunk.js.map",
"960.69a44c1d.chunk.js.map": "./static/js/960.69a44c1d.chunk.js.map",
"8642.883c89db.chunk.js.map": "./static/js/8642.883c89db.chunk.js.map",
"3329.c2099208.chunk.js.map": "./static/js/3329.c2099208.chunk.js.map",
"2332.7f421c9f.chunk.js.map": "./static/js/2332.7f421c9f.chunk.js.map",
"5941.4df5a08b.chunk.js.map": "./static/js/5941.4df5a08b.chunk.js.map",
"2704.fe33dd23.chunk.js.map": "./static/js/2704.fe33dd23.chunk.js.map",
"7774.4d23a595.chunk.js.map": "./static/js/7774.4d23a595.chunk.js.map",
"3851.c5eaa08e.chunk.js.map": "./static/js/3851.c5eaa08e.chunk.js.map",
"9965.e00429f9.chunk.js.map": "./static/js/9965.e00429f9.chunk.js.map",
"6065.f30b3ff2.chunk.js.map": "./static/js/6065.f30b3ff2.chunk.js.map",
"12.ab9b7ed0.chunk.js.map": "./static/js/12.ab9b7ed0.chunk.js.map",
"8010.8ce54818.chunk.js.map": "./static/js/8010.8ce54818.chunk.js.map",
"2689.5e76c1cd.chunk.js.map": "./static/js/2689.5e76c1cd.chunk.js.map",
"872.6f58df17.chunk.js.map": "./static/js/872.6f58df17.chunk.js.map",
"4676.578844c1.chunk.js.map": "./static/js/4676.578844c1.chunk.js.map",
"8825.e5adf924.chunk.js.map": "./static/js/8825.e5adf924.chunk.js.map",
"614.f6cdf349.chunk.js.map": "./static/js/614.f6cdf349.chunk.js.map",
"502.0106f2a9.chunk.js.map": "./static/js/502.0106f2a9.chunk.js.map",
"6799.61dee8ac.chunk.js.map": "./static/js/6799.61dee8ac.chunk.js.map",
"7659.124c07a5.chunk.js.map": "./static/js/7659.124c07a5.chunk.js.map",
"7515.346161ed.chunk.js.map": "./static/js/7515.346161ed.chunk.js.map",
"6654.d76daa88.chunk.js.map": "./static/js/6654.d76daa88.chunk.js.map",
"5311.bf44bf69.chunk.js.map": "./static/js/5311.bf44bf69.chunk.js.map",
"5809.064e83cc.chunk.js.map": "./static/js/5809.064e83cc.chunk.js.map",
"7264.f7c51a0e.chunk.js.map": "./static/js/7264.f7c51a0e.chunk.js.map",
"4172.0d489f24.chunk.js.map": "./static/js/4172.0d489f24.chunk.js.map",
"6108.7a769377.chunk.js.map": "./static/js/6108.7a769377.chunk.js.map",
"9714.48a29c42.chunk.js.map": "./static/js/9714.48a29c42.chunk.js.map",
"459.65dbecac.chunk.js.map": "./static/js/459.65dbecac.chunk.js.map",
"8152.6306ebd5.chunk.js.map": "./static/js/8152.6306ebd5.chunk.js.map",
"1303.12f6ca82.chunk.js.map": "./static/js/1303.12f6ca82.chunk.js.map",
"5079.a0847792.chunk.js.map": "./static/js/5079.a0847792.chunk.js.map",
"4581.41480fcf.chunk.js.map": "./static/js/4581.41480fcf.chunk.js.map",
"6016.dcb3bcb4.chunk.js.map": "./static/js/6016.dcb3bcb4.chunk.js.map",
"8144.0cc85475.chunk.js.map": "./static/js/8144.0cc85475.chunk.js.map",
"1195.955963a0.chunk.js.map": "./static/js/1195.955963a0.chunk.js.map",
"1011.13d372c8.chunk.js.map": "./static/js/1011.13d372c8.chunk.js.map"
},
"entrypoints": [
"static/css/main.e60e4760.css",
"static/js/main.e9eb8088.js"
"static/js/main.cbc16c2b.js"
]
}

View File

@@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><base href="/"/><meta content="width=device-width,initial-scale=1" name="viewport"/><meta content="#081C42" media="(prefers-color-scheme: light)" name="theme-color"/><meta content="#081C42" media="(prefers-color-scheme: dark)" name="theme-color"/><meta content="MinIO Console" name="description"/><meta name="minio-license" content="apgl"/><link href="./styles/root-styles.css" rel="stylesheet"/><link href="./apple-icon-180x180.png" rel="apple-touch-icon" sizes="180x180"/><link href="./favicon-32x32.png" rel="icon" sizes="32x32" type="image/png"/><link href="./favicon-96x96.png" rel="icon" sizes="96x96" type="image/png"/><link href="./favicon-16x16.png" rel="icon" sizes="16x16" type="image/png"/><link href="./manifest.json" rel="manifest"/><link color="#3a4e54" href="./safari-pinned-tab.svg" rel="mask-icon"/><title>MinIO Console</title><script defer="defer" src="./static/js/main.e9eb8088.js"></script><link href="./static/css/main.e60e4760.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"><div id="preload"><img src="./images/background.svg"/> <img src="./images/background-wave-orig2.svg"/></div><div id="loader-block"><img src="./Loader.svg"/></div></div></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><base href="/"/><meta content="width=device-width,initial-scale=1" name="viewport"/><meta content="#081C42" media="(prefers-color-scheme: light)" name="theme-color"/><meta content="#081C42" media="(prefers-color-scheme: dark)" name="theme-color"/><meta content="MinIO Console" name="description"/><meta name="minio-license" content="agpl"/><link href="./styles/root-styles.css" rel="stylesheet"/><link href="./apple-icon-180x180.png" rel="apple-touch-icon" sizes="180x180"/><link href="./favicon-32x32.png" rel="icon" sizes="32x32" type="image/png"/><link href="./favicon-96x96.png" rel="icon" sizes="96x96" type="image/png"/><link href="./favicon-16x16.png" rel="icon" sizes="16x16" type="image/png"/><link href="./manifest.json" rel="manifest"/><link color="#3a4e54" href="./safari-pinned-tab.svg" rel="mask-icon"/><title>MinIO Console</title><script defer="defer" src="./static/js/main.cbc16c2b.js"></script><link href="./static/css/main.e60e4760.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"><div id="preload"><img src="./images/background.svg"/> <img src="./images/background-wave-orig2.svg"/></div><div id="loader-block"><img src="./Loader.svg"/></div></div></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[1024],{11024:(e,t,n)=>{n.r(t),n.d(t,{default:()=>p});var s=n(69060),o=n(66152),c=n(95705),l=n(66156),r=n(61180),u=n(78256),a=n(70780),i=n(82496);const p=e=>{let{onClose:t,modalOpen:n,bucket:p,toDelete:f}=e;const h=(0,l.Ab)(),[b,d]=(0,s.useState)(!1);return(0,i.jsx)(a.c,{title:"Delete Anonymous Access Rule",confirmText:"Delete",isOpen:n,isLoading:b,onConfirm:()=>{d(!0);let e={prefix:f};r.m.bucket.deleteAccessRuleWithBucket(p,e).then((()=>{t()})).catch((e=>{h((0,c.aW)((0,u.K)(e.error))),t()})).finally((()=>d(!1)))},titleIcon:(0,i.jsx)(o.sB6,{}),onClose:t,confirmationContent:(0,i.jsx)(s.Fragment,{children:"Are you sure you want to delete this access rule?"})})}}}]);
//# sourceMappingURL=1024.aee9e8e8.chunk.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"static/js/1024.aee9e8e8.chunk.js","mappings":"6NAgCA,MA0CA,EA1CyBA,IAKC,IALA,QACxBC,EAAO,UACPC,EAAS,OACTC,EAAM,SACNC,GACkBJ,EAClB,MAAMK,GAAWC,EAAAA,EAAAA,OAEVC,EAAyBC,IAC9BC,EAAAA,EAAAA,WAAkB,GAiBpB,OACEC,EAAAA,EAAAA,KAACC,EAAAA,EAAa,CACZC,MAAK,+BACLC,YAAa,SACbC,OAAQZ,EACRa,UAAWR,EACXS,UArBoBC,KACtBT,GAA2B,GAC3B,IAAIU,EAAyB,CAAEC,OAAQf,GACvCgB,EAAAA,EAAIjB,OACDkB,2BAA2BlB,EAAQe,GACnCI,MAAK,KACJrB,GAAS,IAEVsB,OAAOC,IACNnB,GAASoB,EAAAA,EAAAA,KAAqBC,EAAAA,EAAAA,GAAeF,EAAIG,SACjD1B,GAAS,IAEV2B,SAAQ,IAAMpB,GAA2B,IAAO,EAUjDqB,WAAWnB,EAAAA,EAAAA,KAACoB,EAAAA,IAAiB,IAC7B7B,QAASA,EACT8B,qBACErB,EAAAA,EAAAA,KAACsB,EAAAA,SAAQ,CAAAC,SAAC,uDAEZ,C","sources":["screens/Console/Buckets/BucketDetails/DeleteAccessRule.tsx"],"sourcesContent":["// This file is part of MinIO Console Server\n// Copyright (c) 2021 MinIO, Inc.\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, { Fragment, useState } from \"react\";\nimport { ConfirmDeleteIcon } from \"mds\";\nimport { setErrorSnackMessage } from \"../../../../systemSlice\";\nimport { useAppDispatch } from \"../../../../store\";\nimport { api } from \"api\";\nimport { ApiError, HttpResponse, PrefixWrapper } from \"api/consoleApi\";\nimport { errorToHandler } from \"api/errors\";\nimport ConfirmDialog from \"../../Common/ModalWrapper/ConfirmDialog\";\n\ninterface IDeleteAccessRule {\n modalOpen: boolean;\n onClose: () => any;\n bucket: string;\n toDelete: string;\n}\n\nconst DeleteAccessRule = ({\n onClose,\n modalOpen,\n bucket,\n toDelete,\n}: IDeleteAccessRule) => {\n const dispatch = useAppDispatch();\n\n const [loadingDeleteAccessRule, setLoadingDeleteAccessRule] =\n useState<boolean>(false);\n\n const onConfirmDelete = () => {\n setLoadingDeleteAccessRule(true);\n let wrapper: PrefixWrapper = { prefix: toDelete };\n api.bucket\n .deleteAccessRuleWithBucket(bucket, wrapper)\n .then(() => {\n onClose();\n })\n .catch((res: HttpResponse<boolean, ApiError>) => {\n dispatch(setErrorSnackMessage(errorToHandler(res.error)));\n onClose();\n })\n .finally(() => setLoadingDeleteAccessRule(false));\n };\n\n return (\n <ConfirmDialog\n title={`Delete Anonymous Access Rule`}\n confirmText={\"Delete\"}\n isOpen={modalOpen}\n isLoading={loadingDeleteAccessRule}\n onConfirm={onConfirmDelete}\n titleIcon={<ConfirmDeleteIcon />}\n onClose={onClose}\n confirmationContent={\n <Fragment>Are you sure you want to delete this access rule?</Fragment>\n }\n />\n );\n};\n\nexport default DeleteAccessRule;\n"],"names":["_ref","onClose","modalOpen","bucket","toDelete","dispatch","useAppDispatch","loadingDeleteAccessRule","setLoadingDeleteAccessRule","useState","_jsx","ConfirmDialog","title","confirmText","isOpen","isLoading","onConfirm","onConfirmDelete","wrapper","prefix","api","deleteAccessRuleWithBucket","then","catch","res","setErrorSnackMessage","errorToHandler","error","finally","titleIcon","ConfirmDeleteIcon","confirmationContent","Fragment","children"],"sourceRoot":""}

View File

@@ -1,2 +0,0 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[1064],{31064:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});var l=n(69060),o=n(70780),s=n(66152),c=n(95705),i=n(66156),a=n(61180),r=n(78256),u=n(61060),p=n(82496);const d=e=>{let{closeDeleteModalAndRefresh:t,deleteOpen:n,selectedPolicy:d}=e;const f=(0,i.Ab)(),[y,h]=(0,l.useState)(!1);if(!d)return null;return(0,p.jsx)(o.c,{title:"Delete Policy",confirmText:"Delete",isOpen:n,titleIcon:(0,p.jsx)(s.sB6,{}),isLoading:y,onConfirm:()=>{h(!0),a.m.policy.removePolicy((0,u.CO)(d)).then((e=>{t(!0)})).catch((async e=>{const n=await e.json();f((0,c.aW)((0,r.K)(n))),t(!1)})).finally((()=>h(!1)))},onClose:()=>t(!1),confirmationContent:(0,p.jsxs)(l.Fragment,{children:["Are you sure you want to delete policy ",(0,p.jsx)("br",{}),(0,p.jsx)("b",{children:d}),"?"]})})}}}]);
//# sourceMappingURL=1064.1ab42ca4.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[1303],{1303:(e,a,t)=>{t.r(a),t.d(a,{default:()=>g});var l=t(65043),n=t(89923),s=t(77403),r=t(94141),c=t(64159),d=t(20554),o=t(56629),i=t(53518),u=t(70579);const g=e=>{let{modalOpen:a,currentTags:t,onCloseAndUpdate:g,bucketName:b}=e;const p=(0,d.jL)(),[h,w]=(0,l.useState)(""),[x,m]=(0,l.useState)(""),[j,k]=(0,l.useState)(!1);return(0,u.jsx)(r.A,{modalOpen:a,title:"Add New Tag ",onClose:()=>{g(!1)},titleIcon:(0,u.jsx)(n.b_$,{}),children:(0,u.jsxs)(n.Hbc,{withBorders:!1,containerPadding:!1,children:[(0,u.jsxs)(n.azJ,{sx:{marginBottom:15},children:[(0,u.jsx)("strong",{children:"Bucket"}),": ",b]}),(0,u.jsx)(n.cl_,{value:h,label:"New Tag Key",id:"newTagKey",name:"newTagKey",placeholder:"Enter New Tag Key",onChange:e=>{w(e.target.value)}}),(0,u.jsx)(n.cl_,{value:x,label:"New Tag Label",id:"newTagLabel",name:"newTagLabel",placeholder:"Enter New Tag Label",onChange:e=>{m(e.target.value)}}),(0,u.jsxs)(n.xA9,{item:!0,xs:12,sx:s.Uz.modalButtonBar,children:[(0,u.jsx)(n.$nd,{id:"clear",type:"button",variant:"regular",onClick:()=>{m(""),w("")},label:"Clear"}),(0,u.jsx)(n.$nd,{id:"save-add-bucket-tag",type:"submit",variant:"callAction",color:"primary",disabled:""===x.trim()||""===h.trim()||j,onClick:()=>{k(!0);const e={};e[h]=x;const a={...t,...e};o.F.buckets.putBucketTags(b,{tags:a}).then((()=>{k(!1),g(!0)})).catch((e=>{p((0,c.Dy)((0,i.S)(e.error))),k(!1)}))},label:"Save"})]})]})})}}}]);
//# sourceMappingURL=1303.12f6ca82.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[1496],{31496:(e,t,i)=>{i.r(t),i.d(t,{default:()=>I});var s=i(69060),c=i(19536),a=i(51560),n=i(66152),o=i(61180),r=i(78256),l=i(21124),d=i(3992),u=i(61060),m=i(95705),S=i(2432),h=i(66156),_=i(82496);const I=()=>{const e=(0,h.Ab)(),t=(0,a.i6)(),i=(0,a.W4)(),I=(0,c.w1)(S.qO),[b,O]=(0,s.useState)("simple-tab-0"),[p,k]=(0,s.useState)(!0),[A,E]=(0,s.useState)([]),[L,P]=(0,s.useState)(!0),[U,C]=(0,s.useState)([]),N=i.bucketName||"",f=(0,d.i)(N,[l.Oi.ADMIN_LIST_USER_POLICIES]),T=(0,d.i)(N,[l.Oi.ADMIN_GET_POLICY,l.Oi.ADMIN_LIST_USERS,l.Oi.ADMIN_LIST_GROUPS],!0),g=(0,d.i)(l.Gc,[l.Oi.ADMIN_GET_USER]),x=(0,d.i)(l.Gc,[l.Oi.ADMIN_GET_POLICY,l.Oi.ADMIN_LIST_USERS,l.Oi.ADMIN_LIST_GROUPS]);(0,s.useEffect)((()=>{I&&(P(!0),k(!0))}),[I,P,k]);const M=[{type:"view",disableButtonFunction:()=>!x,onClick:e=>{t("".concat(l.Ks.POLICIES,"/").concat((0,u.CO)(e.name)))}}],y=[{type:"view",disableButtonFunction:()=>!g,onClick:e=>{t("".concat(l.Ks.USERS,"/").concat((0,u.CO)(e)))}}];return(0,s.useEffect)((()=>{L&&(T?o.m.bucketUsers.listUsersWithAccessToBucket(N).then((e=>{C(e.data),P(!1)})).catch((t=>{e((0,m.aW)((0,r.K)(t))),P(!1)})):P(!1))}),[L,e,N,T]),(0,s.useEffect)((()=>{e((0,m.i8)("bucket_detail_access"))}),[]),(0,s.useEffect)((()=>{p&&(f?o.m.bucketPolicy.listPoliciesWithBucket(N).then((e=>{E(e.data.policies),k(!1)})).catch((t=>{e((0,m.aW)((0,r.K)(t))),k(!1)})):k(!1))}),[p,e,N,f]),(0,_.jsxs)(s.Fragment,{children:[(0,_.jsx)(n.eCc,{separator:!0,children:(0,_.jsx)(n.M5Y,{content:(0,_.jsxs)(s.Fragment,{children:["Understand which"," ",(0,_.jsx)("a",{target:"blank",href:"https://min.io/docs/minio/linux/administration/identity-access-management/policy-based-access-control.html#",children:"Policies"})," ","and"," ",(0,_.jsx)("a",{target:"blank",href:"https://min.io/docs/minio/linux/administration/identity-access-management/minio-user-management.html",children:"Users"})," ","are authorized to access this Bucket."]}),placement:"right",children:"Access Audit"})}),(0,_.jsx)(n.kZJ,{currentTabOrPath:b,onTabClick:e=>{O(e)},horizontal:!0,options:[{tabConfig:{label:"Policies",id:"simple-tab-0"},content:(0,_.jsx)(d.K,{scopes:[l.Oi.ADMIN_LIST_USER_POLICIES],resource:N,errorProps:{disabled:!0},children:A&&(0,_.jsx)(n.iSL,{noBackground:!0,itemActions:M,columns:[{label:"Name",elementKey:"name"}],isLoading:p,records:A,entityName:"Policies",idField:"name"})})},{tabConfig:{label:"Users",id:"simple-tab-1"},content:(0,_.jsx)(d.K,{scopes:[l.Oi.ADMIN_GET_POLICY,l.Oi.ADMIN_LIST_USERS,l.Oi.ADMIN_LIST_GROUPS],resource:N,matchAll:!0,errorProps:{disabled:!0},children:(0,_.jsx)(n.iSL,{noBackground:!0,itemActions:y,columns:[{label:"User",elementKey:"accessKey"}],isLoading:L,records:U,entityName:"Users",idField:"accessKey"})})}]})]})}}}]);
//# sourceMappingURL=1496.e8c5dafd.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[1596],{41596:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>x});var o=n(69060),l=n(47600),a=n(19536),s=n(66152),c=n(66156),r=n(61060),i=n(55707),u=n(18276),h=n(95705),d=n(50900),b=n(3428),f=n(48504),p=n(82496);const x=()=>{const e=(0,c.Ab)(),t=(0,a.w1)((e=>e.watch.messages)),[n,x]=(0,o.useState)(!1),[m,w]=(0,o.useState)("Select Bucket"),[g,y]=(0,o.useState)(""),[j,k]=(0,o.useState)(""),[v,S]=(0,o.useState)([]);(0,o.useEffect)((()=>{d.c.invoke("GET","/api/v1/buckets").then((e=>{let t=[];null!==e.buckets&&(t=e.buckets),S(t)})).catch((e=>{console.error(e)}))}),[]),(0,o.useEffect)((()=>{if(e((0,u.AF)()),n&&v.some((e=>e.name===m))){const t=new URL(window.location.toString()),n=!1?"9090":t.port,o=new URL(document.baseURI).pathname,a=(0,i.K_)(t.protocol),s=new l.w3cwebsocket("".concat(a,"://").concat(t.hostname,":").concat(n).concat(o,"ws/watch/").concat(m,"?prefix=").concat(g,"&suffix=").concat(j));let c=null;if(null!==s)return s.onopen=()=>{console.log("WebSocket Client Connected"),s.send("ok"),c=setInterval((()=>{s.send("ok")}),1e4)},s.onmessage=t=>{let n=JSON.parse(t.data.toString());n.Time=new Date(n.Time.toString()),n.key=Math.random(),e((0,u.oZ)(n))},s.onclose=()=>{clearInterval(c),console.log("connection closed by server"),x(!1)},()=>{s.close(1e3),clearInterval(c),console.log("closing websockets")}}else x(!1)}),[e,n,v,m,g,j]);const _=v.map((e=>({label:e.name,value:e.name})));(0,o.useEffect)((()=>{e((0,h.i8)("watch"))}),[]);const C=_.map((e=>({label:e.label,value:e.value})));return(0,p.jsxs)(o.Fragment,{children:[(0,p.jsx)(b.c,{label:"Watch",actions:(0,p.jsx)(f.c,{})}),(0,p.jsx)(s._al,{children:(0,p.jsxs)(s.yeN,{container:!0,children:[(0,p.jsxs)(s.yeN,{item:!0,xs:12,sx:{display:"flex",gap:10,marginBottom:15,alignItems:"center"},children:[(0,p.jsxs)(s.kvh,{sx:{flexGrow:1},children:[(0,p.jsx)(s.mWW,{children:"Bucket"}),(0,p.jsx)(s.M1e,{id:"bucket-name",name:"bucket-name",value:m,onChange:e=>{w(e)},disabled:n,options:C,placeholder:"Select Bucket"})]}),(0,p.jsxs)(s.kvh,{sx:{flexGrow:1},children:[(0,p.jsx)(s.mWW,{children:"Prefix"}),(0,p.jsx)(s.q22,{id:"prefix-resource",disabled:n,onChange:e=>{y(e.target.value)}})]}),(0,p.jsxs)(s.kvh,{sx:{flexGrow:1},children:[(0,p.jsx)(s.mWW,{children:"Suffix"}),(0,p.jsx)(s.q22,{id:"suffix-resource",disabled:n,onChange:e=>{k(e.target.value)}})]}),(0,p.jsx)(s.kvh,{sx:{alignSelf:"flex-end",paddingBottom:4},children:n?(0,p.jsx)(s.qaq,{id:"stop-watch",type:"submit",variant:"callAction",onClick:()=>x(!1),label:"Stop"}):(0,p.jsx)(s.qaq,{id:"start-watch",type:"submit",variant:"callAction",onClick:()=>x(!0),label:"Start"})})]}),(0,p.jsx)(s.yeN,{item:!0,xs:12,children:(0,p.jsx)(s.iSL,{columns:[{label:"Time",elementKey:"Time",renderFunction:r.gD},{label:"Size",elementKey:"Size",renderFunction:r.U7},{label:"Type",elementKey:"Type"},{label:"Path",elementKey:"Path"}],records:t,entityName:"Watch",customEmptyMessage:"No Changes at this time",idField:"watch_table",isLoading:!1,customPaperHeight:"calc(100vh - 270px)"})})]})})]})}},7504:e=>{var t=function(){if("object"===typeof self&&self)return self;if("object"===typeof window&&window)return window;throw new Error("Unable to resolve global `this`")};e.exports=function(){if(this)return this;if("object"===typeof globalThis&&globalThis)return globalThis;try{Object.defineProperty(Object.prototype,"__global__",{get:function(){return this},configurable:!0})}catch(e){return t()}try{return __global__||t()}finally{delete Object.prototype.__global__}}()},47600:(e,t,n)=>{var o;if("object"===typeof globalThis)o=globalThis;else try{o=n(7504)}catch(c){}finally{if(o||"undefined"===typeof window||(o=window),!o)throw new Error("Could not determine global this")}var l=o.WebSocket||o.MozWebSocket,a=n(3068);function s(e,t){return t?new l(e,t):new l(e)}l&&["CONNECTING","OPEN","CLOSING","CLOSED"].forEach((function(e){Object.defineProperty(s,e,{get:function(){return l[e]}})})),e.exports={w3cwebsocket:l?s:null,version:a}},3068:(e,t,n)=>{e.exports=n(40648).version},40648:e=>{"use strict";e.exports={version:"1.0.34"}}}]);
//# sourceMappingURL=1596.f3c6b059.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[2012],{24256:(e,t,n)=>{n.d(t,{c:()=>i});var l=n(69060),a=n(58564),o=n.n(a),s=n(66152),c=n(82496);const i=e=>{let{elements:t,name:n,label:a,tooltip:i="",commonPlaceholder:r="",onChange:h,withBorder:d=!1}=e;const[u,m]=(0,l.useState)([""]),f=(0,l.createRef)();(0,l.useEffect)((()=>{if(1===u.length&&""===u[0]&&t&&""!==t){const e=t.split(",");e.push(""),m(e)}}),[t,u]),(0,l.useEffect)((()=>{if(u.length>1){const e=f.current;e&&e.scrollIntoView(!1)}}),[u,f]);const p=(0,l.useCallback)((e=>{h(e)}),[h]),v=(0,l.useRef)(!0);(0,l.useEffect)((()=>{if(v.current)return void(v.current=!1);const e=u.filter((e=>""!==e.trim())).join(",");p(e)}),[u]);const x=e=>{e.persist();let t=[...u];const n=o()(e.target,"dataset.index","0");t[parseInt(n)]=e.target.value,m(t)},g=u.map(((e,t)=>(0,c.jsx)(s.q22,{id:"".concat(n,"-").concat(t.toString()),label:"",name:"".concat(n,"-").concat(t.toString()),value:u[t],onChange:x,index:t,placeholder:r,overlayIcon:t===u.length-1?(0,c.jsx)(s.EgV,{}):null,overlayAction:()=>{(e=>{if(""!==e[e.length-1].trim()){const t=[...e];t.push(""),m(t)}})(u)}},"csv-multi-".concat(n,"-").concat(t.toString()))));return(0,c.jsx)(l.Fragment,{children:(0,c.jsxs)(s.kvh,{sx:{display:"flex"},className:"inputItem",children:[(0,c.jsxs)(s.mWW,{sx:{alignItems:"flex-start"},children:[(0,c.jsx)("span",{children:a}),""!==i&&(0,c.jsx)(s.kvh,{sx:{marginLeft:5,display:"flex",alignItems:"center","& .min-icon":{width:13}},children:(0,c.jsx)(s.o5h,{tooltip:i,placement:"top",children:(0,c.jsx)(s.kvh,{className:i,children:(0,c.jsx)(s.OKz,{})})})})]}),(0,c.jsxs)(s.kvh,{withBorders:d,sx:{width:"100%",overflowY:"auto",height:150,position:"relative"},children:[g,(0,c.jsx)("div",{ref:f})]})]})})}},22012:(e,t,n)=>{n.r(t),n.d(t,{default:()=>i,valueDef:()=>c});var l=n(69060),a=n(66152),o=n(24256),s=n(82496);const c=(e,t,n)=>{let l="on|off"===t?"off":"";if(n.length>0){const t=n.find((t=>t.key===e));t&&(l=t.value||"")}return l},i=e=>{let{onChange:t,fields:n,defaultVals:i,overrideEnv:r}=e;const[h,d]=(0,l.useState)([]),u=n||[],m=i||[];(0,l.useEffect)((()=>{const e=n.map((e=>({key:e.name,value:c(e.name,e.type,m)})));d(e)}),[n,i]),(0,l.useEffect)((()=>{t(h)}),[h]);const f=(e,t,n)=>{const l=[...h];t=t.trim(),l[n]={key:e,value:t},d(l)},p=(e,t)=>{const n=h[t];if(n){const t=null===r||void 0===r?void 0:r["".concat(n.key)];if(t)return(0,s.jsx)(a.E$k,{label:e.label,actionButton:(0,s.jsx)(a.yeN,{item:!0,sx:{display:"flex",justifyContent:"flex-end",paddingRight:"10px"},children:(0,s.jsx)(a.o5h,{tooltip:"This value is set from the ".concat(t.overrideEnv," environment variable"),placement:"left",children:(0,s.jsx)(a.Mz0,{style:{width:20}})})}),sx:{width:"100%"},children:t.value})}switch(e.type){case"on|off":const l=n?n.value:"off";return(0,s.jsx)(a.Wkk,{onChange:n=>{const l=n.target.checked?"on":"off";f(e.name,l,t)},id:e.name,name:e.name,label:e.label,value:"switch_on",tooltip:e.tooltip,checked:"on"===l});case"csv":return(0,s.jsx)(o.c,{elements:n?n.value:"",label:e.label,name:e.name,onChange:n=>{let l="";l=Array.isArray(n)?n.join(","):n,f(e.name,l,t)},tooltip:e.tooltip,commonPlaceholder:e.placeholder,withBorder:!0});case"comment":return(0,s.jsx)(a.W_2,{id:e.name,name:e.name,label:e.label,tooltip:e.tooltip,value:n?n.value:"",onChange:n=>f(e.name,n.target.value,t),placeholder:e.placeholder});default:return(0,s.jsx)(a.q22,{id:e.name,name:e.name,label:e.label,tooltip:e.tooltip,value:n?n.value:"",onChange:n=>f(e.name,n.target.value,t),placeholder:e.placeholder})}};return(0,s.jsx)(a.yE_,{withBorders:!1,containerPadding:!1,children:u.map(((e,t)=>(0,s.jsx)(l.Fragment,{children:p(e,t)},e.name)))})}}}]);
//# sourceMappingURL=2012.7d122587.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[2124],{2124:(e,n,t)=>{t.r(n),t.d(n,{default:()=>r});t(69060);var s=t(4836),i=t(66152),l=t(92432),o=t(86260),a=t(15144),c=t(82496);const r=e=>{let{isOpen:n,onClose:t}=e;return(0,c.jsx)(s.c,{modalOpen:n,title:"License",onClose:()=>{t()},children:(0,c.jsxs)(i.kvh,{sx:{display:"flex",flexFlow:"column","& .link-text":{color:"#2781B0",fontWeight:600}},children:[(0,c.jsx)(i.kvh,{sx:{display:"flex",alignItems:"center",marginBottom:"40px",justifyContent:"center","& .min-icon":{fill:"blue",width:"188px",height:"62px"}},children:(0,c.jsx)(i.kqt,{})}),(0,c.jsxs)(i.kvh,{sx:{marginBottom:"27px"},children:["By using this software, you acknowledge that MinIO software is licensed under the ",(0,c.jsx)(o.c,{}),", for which, the full text can be found here:"," ",(0,c.jsx)("a",{href:"https://www.gnu.org/licenses/agpl-3.0.html",rel:"noopener",className:"link-text",children:"https://www.gnu.org/licenses/agpl-3.0.html."})]}),(0,c.jsxs)(i.kvh,{sx:{paddingBottom:"23px"},children:["Please review the terms carefully and ensure you are in compliance with the obligations of the license. If you are not able to satisfy the license obligations, we offer a commercial license which is available here:"," ",(0,c.jsx)("a",{href:"https://min.io/signup?ref=con",rel:"noopener",className:"link-text",children:"https://min.io/signup."})]}),(0,c.jsx)(a.c,{}),(0,c.jsx)(i.kvh,{sx:{marginTop:"19px",display:"flex",alignItems:"center",justifyContent:"center"},children:(0,c.jsx)(i.qaq,{id:"confirm",type:"button",variant:"callAction",onClick:()=>{(0,l.Yn)(),t()},label:"Acknowledge"})})]})})}}}]);
//# sourceMappingURL=2124.2a71d5a5.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[2209],{72237:(e,n,s)=>{s.d(n,{A:()=>a});var t=s(65043),l=s(70579);const a=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return function(s){return(0,l.jsx)(t.Suspense,{fallback:n,children:(0,l.jsx)(e,{...s})})}}},12209:(e,n,s)=>{s.r(n),s.d(n,{default:()=>r});var t=s(65043),l=s(73216),a=s(39808),h=s(72237),c=s(70579);const p=(0,h.A)(t.lazy((()=>s.e(985).then(s.bind(s,10985))))),u=(0,h.A)(t.lazy((()=>s.e(1370).then(s.bind(s,81370))))),r=()=>(0,c.jsxs)(l.BV,{children:[(0,c.jsx)(l.qh,{path:"/",element:(0,c.jsx)(p,{})}),(0,c.jsx)(l.qh,{path:":policyName",element:(0,c.jsx)(u,{})}),(0,c.jsx)(l.qh,{element:(0,c.jsx)(a.A,{})})]})}}]);
//# sourceMappingURL=2209.3b0ca7fa.chunk.js.map

View File

@@ -1 +1 @@
{"version":3,"file":"static/js/6432.31d6d652.chunk.js","mappings":"8IAiCA,QAfA,SACEA,GAEC,IADDC,EAAmCC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,KAUtC,OARA,SAA+BG,GAC7B,OACEC,EAAAA,EAAAA,KAACC,EAAAA,SAAQ,CAACN,SAAUA,EAASO,UAC3BF,EAAAA,EAAAA,KAACN,EAAgB,IAAMK,KAG7B,CAGF,C,2GCtBA,MAAMI,GAAeC,EAAAA,EAAAA,GAAaC,EAAAA,MAAW,IAAM,mCAC7CC,GAAgBF,EAAAA,EAAAA,GAAaC,EAAAA,MAAW,IAAM,mCAYpD,EAViBE,KAEbC,EAAAA,EAAAA,MAACC,EAAAA,GAAM,CAAAP,SAAA,EACLF,EAAAA,EAAAA,KAACU,EAAAA,GAAK,CAACC,KAAM,IAAKC,SAASZ,EAAAA,EAAAA,KAACG,EAAY,OACxCH,EAAAA,EAAAA,KAACU,EAAAA,GAAK,CAACC,KAAI,cAAiBC,SAASZ,EAAAA,EAAAA,KAACM,EAAa,OACnDN,EAAAA,EAAAA,KAACU,EAAAA,GAAK,CAACE,SAASZ,EAAAA,EAAAA,KAACa,EAAAA,EAAY,Q","sources":["screens/Console/Common/Components/withSuspense.tsx","screens/Console/Policies/Policies.tsx"],"sourcesContent":["// This file is part of MinIO Console Server\n// Copyright (c) 2021 MinIO, Inc.\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, { ComponentType, Suspense, SuspenseProps } from \"react\";\n\nfunction withSuspense<P extends string | number | object>(\n WrappedComponent: ComponentType<P>,\n fallback: SuspenseProps[\"fallback\"] = null,\n) {\n function ComponentWithSuspense(props: P) {\n return (\n <Suspense fallback={fallback}>\n <WrappedComponent {...(props as any)} />\n </Suspense>\n );\n }\n\n return ComponentWithSuspense;\n}\n\nexport default withSuspense;\n","// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nimport React from \"react\";\nimport { Route, Routes } from \"react-router-dom\";\n\nimport NotFoundPage from \"../../NotFoundPage\";\nimport withSuspense from \"../Common/Components/withSuspense\";\n\nconst ListPolicies = withSuspense(React.lazy(() => import(\"./ListPolicies\")));\nconst PolicyDetails = withSuspense(React.lazy(() => import(\"./PolicyDetails\")));\n\nconst Policies = () => {\n return (\n <Routes>\n <Route path={\"/\"} element={<ListPolicies />} />\n <Route path={`:policyName`} element={<PolicyDetails />} />\n <Route element={<NotFoundPage />} />\n </Routes>\n );\n};\n\nexport default Policies;\n"],"names":["WrappedComponent","fallback","arguments","length","undefined","props","_jsx","Suspense","children","ListPolicies","withSuspense","React","PolicyDetails","Policies","_jsxs","Routes","Route","path","element","NotFoundPage"],"sourceRoot":""}
{"version":3,"file":"static/js/2209.3b0ca7fa.chunk.js","mappings":"8IAiCA,QAfA,SACEA,GAEC,IADDC,EAAmCC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,KAUtC,OARA,SAA+BG,GAC7B,OACEC,EAAAA,EAAAA,KAACC,EAAAA,SAAQ,CAACN,SAAUA,EAASO,UAC3BF,EAAAA,EAAAA,KAACN,EAAgB,IAAMK,KAG7B,CAGF,C,2GCtBA,MAAMI,GAAeC,EAAAA,EAAAA,GAAaC,EAAAA,MAAW,IAAM,kCAC7CC,GAAgBF,EAAAA,EAAAA,GAAaC,EAAAA,MAAW,IAAM,mCAYpD,EAViBE,KAEbC,EAAAA,EAAAA,MAACC,EAAAA,GAAM,CAAAP,SAAA,EACLF,EAAAA,EAAAA,KAACU,EAAAA,GAAK,CAACC,KAAM,IAAKC,SAASZ,EAAAA,EAAAA,KAACG,EAAY,OACxCH,EAAAA,EAAAA,KAACU,EAAAA,GAAK,CAACC,KAAI,cAAiBC,SAASZ,EAAAA,EAAAA,KAACM,EAAa,OACnDN,EAAAA,EAAAA,KAACU,EAAAA,GAAK,CAACE,SAASZ,EAAAA,EAAAA,KAACa,EAAAA,EAAY,Q","sources":["screens/Console/Common/Components/withSuspense.tsx","screens/Console/Policies/Policies.tsx"],"sourcesContent":["// This file is part of MinIO Console Server\n// Copyright (c) 2021 MinIO, Inc.\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, { ComponentType, Suspense, SuspenseProps } from \"react\";\n\nfunction withSuspense<P extends string | number | object>(\n WrappedComponent: ComponentType<P>,\n fallback: SuspenseProps[\"fallback\"] = null,\n) {\n function ComponentWithSuspense(props: P) {\n return (\n <Suspense fallback={fallback}>\n <WrappedComponent {...(props as any)} />\n </Suspense>\n );\n }\n\n return ComponentWithSuspense;\n}\n\nexport default withSuspense;\n","// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nimport React from \"react\";\nimport { Route, Routes } from \"react-router-dom\";\n\nimport NotFoundPage from \"../../NotFoundPage\";\nimport withSuspense from \"../Common/Components/withSuspense\";\n\nconst ListPolicies = withSuspense(React.lazy(() => import(\"./ListPolicies\")));\nconst PolicyDetails = withSuspense(React.lazy(() => import(\"./PolicyDetails\")));\n\nconst Policies = () => {\n return (\n <Routes>\n <Route path={\"/\"} element={<ListPolicies />} />\n <Route path={`:policyName`} element={<PolicyDetails />} />\n <Route element={<NotFoundPage />} />\n </Routes>\n );\n};\n\nexport default Policies;\n"],"names":["WrappedComponent","fallback","arguments","length","undefined","props","_jsx","Suspense","children","ListPolicies","withSuspense","React","PolicyDetails","Policies","_jsxs","Routes","Route","path","element","NotFoundPage"],"sourceRoot":""}

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[2332],{32332:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j,emptyContent:()=>y});var a=n(65043),s=n(89923),l=n(73216),o=n(99161),r=n(64159),c=n(20554),i=n(77403),p=n(38375),x=n(48793),m=n(92452),d=n(56629),u=n(53518),h=n(70579);const y='{\n "bytes": ""\n}',j=()=>{const e=(0,c.jL)(),t=(0,l.Zp)(),[n,j]=(0,a.useState)(!1),[b,k]=(0,a.useState)(""),[f,C]=(0,a.useState)(y),S=""!==b.trim()&&-1===b.indexOf(" ");return(0,a.useEffect)((()=>{e((0,r.ph)("import_key"))}),[]),(0,h.jsx)(a.Fragment,{children:(0,h.jsxs)(s.xA9,{item:!0,xs:12,children:[(0,h.jsx)(x.A,{label:(0,h.jsx)(s.EGL,{onClick:()=>t(o.zZ.KMS_KEYS),label:"Keys"}),actions:(0,h.jsx)(m.A,{})}),(0,h.jsx)(s.Mxu,{children:(0,h.jsx)(s.Hbc,{title:"Import Key",icon:(0,h.jsx)(s.No_,{}),helpBox:(0,h.jsx)(p.A,{helpText:"Encryption Key",contents:["Import a cryptographic key in the Key Management Service server connected to MINIO."]}),children:(0,h.jsxs)("form",{noValidate:!0,autoComplete:"off",onSubmit:n=>{(n=>{j(!0),n.preventDefault();let a=JSON.parse(f);d.F.kms.kmsImportKey(b,a).then((e=>{t("".concat(o.zZ.KMS_KEYS))})).catch((async t=>{const n=await t.json();e((0,r.C9)((0,u.S)(n)))})).finally((()=>j(!1)))})(n)},children:[(0,h.jsx)(s.cl_,{id:"key-name",name:"key-name",label:"Key Name",autoFocus:!0,value:b,error:(e=>-1!==e.indexOf(" ")?"Key name cannot contain spaces":"")(b),onChange:e=>{k(e.target.value)}}),(0,h.jsx)(s.BYM,{label:"Set key Content",value:f,onChange:e=>{C(e)},editorHeight:"350px"}),(0,h.jsxs)(s.xA9,{item:!0,xs:12,sx:i.Uz.modalButtonBar,children:[(0,h.jsx)(s.$nd,{id:"clear",type:"button",variant:"regular",onClick:()=>{k(""),C("")},label:"Clear"}),(0,h.jsx)(s.$nd,{id:"import-key",type:"submit",variant:"callAction",color:"primary",disabled:n||!S,label:"Import"})]})]})})})]})})}},38375:(e,t,n)=>{n.d(t,{A:()=>o});var a=n(65043),s=n(89923),l=n(70579);const o=e=>{let{helpText:t,contents:n}=e;return(0,l.jsx)(s.lVp,{iconComponent:(0,l.jsx)(s.nag,{}),title:t,help:(0,l.jsx)(a.Fragment,{children:n.map((e=>(0,l.jsx)(s.azJ,{sx:{paddingBottom:"20px"},children:e})))})})}}}]);
//# sourceMappingURL=2332.7f421c9f.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[24],{60024:(e,s,t)=>{t.r(s),t.d(s,{default:()=>h});var r=t(65043),l=t(89923),a=t(77403),n=t(20649),o=t(13109),d=t(94141),i=t(64159),c=t(20554),u=t(70579);const h=e=>{let{open:s,checkedUsers:t,closeModalAndRefresh:h}=e;const p=(0,c.jL)(),[x,j]=(0,r.useState)(!1),[b,g]=(0,r.useState)(!1),[m,f]=(0,r.useState)([]);(0,r.useEffect)((()=>{x&&(m.length>0?n.A.invoke("PUT","/api/v1/users-groups-bulk",{groups:m,users:t}).then((()=>{j(!1),g(!0)})).catch((e=>{j(!1),p((0,i.Dy)(e))})):(j(!1),p((0,i.Dy)({errorMessage:"You need to select at least one group to assign",detailedError:""}))))}),[x,j,h,m,t,p]);return(0,u.jsx)(d.A,{modalOpen:s,onClose:()=>{h(b)},title:b?"The selected users were added to the following groups.":"Add Users to Group",titleIcon:(0,u.jsx)(l.WC,{}),children:b?(0,u.jsx)(r.Fragment,{children:(0,u.jsxs)(l.Hbc,{withBorders:!1,containerPadding:!1,sx:{margin:"30px 0"},children:[(0,u.jsx)(l.EmB,{label:"Groups",sx:{width:"100%"},children:m.join(", ")}),(0,u.jsxs)(l.EmB,{label:"Users",sx:{width:"100%"},children:[" ",t.join(", ")," "]})]})}):(0,u.jsxs)("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),j(!0)},children:[(0,u.jsxs)(l.Hbc,{withBorders:!1,containerPadding:!1,children:[(0,u.jsx)(l.EmB,{label:"Selected Users",sx:{width:"100%"},children:t.join(", ")}),(0,u.jsx)(o.A,{selectedGroups:m,setSelectedGroups:f})]}),(0,u.jsxs)(l.xA9,{item:!0,xs:12,sx:a.Uz.modalButtonBar,children:[(0,u.jsx)(l.$nd,{id:"clear-bulk-add-group",type:"button",variant:"regular",color:"primary",onClick:()=>{f([])},label:"Clear"}),(0,u.jsx)(l.$nd,{id:"save-add-group",type:"submit",variant:"callAction",disabled:x||m.length<1,label:"Save"})]}),x&&(0,u.jsx)(l.xA9,{item:!0,xs:12,children:(0,u.jsx)(l.z21,{})})]})})}}}]);
//# sourceMappingURL=24.1245bd95.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[2492],{92492:(e,t,a)=>{a.r(t),a.d(t,{default:()=>w});var n=a(69060),s=a(39427),d=a(66152),o=a(19536),l=a(4836),r=a(66156),i=a(10732),c=a(61628),u=a(82496);const w=e=>{let{closeModalAndRefresh:t,open:a,bucketName:w}=e;const b=(0,r.Ab)(),h=(0,o.w1)((e=>e.objectBrowser.rewind.rewindEnabled)),S=(0,o.w1)((e=>e.objectBrowser.rewind.dateToRewind)),[p,k]=(0,n.useState)(!1),[x,C]=(0,n.useState)(!0),[j,m]=(0,n.useState)(s.CS.fromJSDate(new Date));(0,n.useEffect)((()=>{h&&(C(!0),m(s.CS.fromISO(S||s.CS.now().toISO()||"")))}),[h,S]);return(0,u.jsx)(l.c,{modalOpen:a,onClose:()=>{t()},title:"Rewind - ".concat(w),children:(0,u.jsxs)(d.yE_,{withBorders:!1,containerPadding:!1,children:[(0,u.jsx)(d.KuV,{value:j,onChange:e=>e?m(e):null,id:"rewind-selector",label:"Rewind to",timeFormat:"24h",secondsSelector:!1,disabled:!x}),h&&(0,u.jsx)(d.Wkk,{value:"status",id:"status",name:"status",checked:x,onChange:e=>{C(e.target.checked)},label:"Current Status",indicatorLabels:["Enabled","Disabled"]}),(0,u.jsx)(d.yeN,{item:!0,xs:12,sx:c.W2.modalButtonBar,children:(0,u.jsx)(d.qaq,{type:"button",variant:"callAction",disabled:p||!j&&x,onClick:()=>{!x&&h?b((0,i.It)()):(k(!0),b((0,i.sV)({state:!0,bucket:w,dateRewind:j.toISO()}))),b((0,i.QP)(!0)),t()},id:"rewind-apply-button",label:!x&&h?"Show Current Data":"Show Rewind Data"})}),p&&(0,u.jsx)(d.yeN,{item:!0,xs:12,children:(0,u.jsx)(d.cHM,{})})]})})}}}]);
//# sourceMappingURL=2492.ad98215a.chunk.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[2689],{62689:(e,t,n)=>{n.r(t),n.d(t,{default:()=>_});var i=n(65043),l=n(22166),s=n(73216),c=n(89923),r=n(20649),a=n(77938),o=n(99161),d=n(64159),u=n(39947),p=n(20554),h=n(6681),b=n(72237),x=n(70579);const m=(0,b.A)(i.lazy((()=>n.e(9714).then(n.bind(n,79714))))),A=(0,b.A)(i.lazy((()=>n.e(459).then(n.bind(n,10459))))),R=(0,b.A)(i.lazy((()=>n.e(8152).then(n.bind(n,28152))))),_=()=>{const e=(0,p.jL)(),t=(0,s.g)(),n=(0,l.d4)(u.Nx),[b,_]=(0,i.useState)(!0),[j,O]=(0,i.useState)([]),[I,S]=(0,i.useState)(!1),[T,k]=(0,i.useState)(!1),[g,N]=(0,i.useState)(!1),[C,f]=(0,i.useState)(""),[y,P]=(0,i.useState)([]),[E,v]=(0,i.useState)(!1),F=t.bucketName||"",V=(0,a._)(F,[o.OV.S3_GET_REPLICATION_CONFIGURATION,o.OV.S3_GET_ACTIONS]);(0,i.useEffect)((()=>{e((0,d.ph)("bucket_detail_replication"))}),[]),(0,i.useEffect)((()=>{n&&_(!0)}),[n,_]),(0,i.useEffect)((()=>{b&&(V?r.A.invoke("GET","/api/v1/buckets/".concat(F,"/replication")).then((e=>{const t=e.rules?e.rules:[];t.sort(((e,t)=>e.priority-t.priority)),O(t),_(!1)})).catch((t=>{e((0,d.C9)(t)),_(!1)})):_(!1))}),[b,e,F,V]);const w=function(){k(arguments.length>0&&void 0!==arguments[0]&&arguments[0])},U=(0,s.Zp)(),G=[{type:"delete",onClick:e=>{f(e.id),v(!1),S(!0)}},{type:"view",onClick:e=>{f(e.id),U("/buckets/edit-replication?bucketName=".concat(F,"&ruleID=").concat(e.id))},disableButtonFunction:!(0,a._)(F,[o.OV.S3_PUT_REPLICATION_CONFIGURATION,o.OV.S3_PUT_ACTIONS],!0)}];return(0,x.jsxs)(i.Fragment,{children:[T&&(0,x.jsx)(A,{closeModalAndRefresh:()=>{w(!1),_(!0)},open:T,bucketName:F,setReplicationRules:j}),I&&(0,x.jsx)(R,{deleteOpen:I,selectedBucket:F,closeDeleteModalAndRefresh:e=>{S(!1),e&&_(!0)},ruleToDelete:C,rulesToDelete:y,remainingRules:j.length,allSelected:j.length>0&&y.length===j.length,deleteSelectedRules:E}),g&&(0,x.jsx)(m,{closeModalAndRefresh:e=>{N(!1),e&&_(!0)},open:g,bucketName:F,ruleID:C}),(0,x.jsx)(c._xt,{separator:!0,sx:{marginBottom:15},actions:(0,x.jsxs)(c.azJ,{style:{display:"flex",gap:10},children:[(0,x.jsx)(a.R,{scopes:[o.OV.S3_PUT_REPLICATION_CONFIGURATION,o.OV.S3_PUT_ACTIONS],resource:F,matchAll:!0,errorProps:{disabled:!0},children:(0,x.jsx)(h.A,{tooltip:"Remove Selected Replication Rules",children:(0,x.jsx)(c.$nd,{id:"remove-bucket-replication-rule",onClick:()=>{f("selectedRules"),v(!0),S(!0)},label:"Remove Selected Rules",icon:(0,x.jsx)(c.ucK,{}),color:"secondary",disabled:0===y.length||0===j.length,variant:"secondary"})})}),(0,x.jsx)(a.R,{scopes:[o.OV.S3_PUT_REPLICATION_CONFIGURATION,o.OV.S3_PUT_ACTIONS],resource:F,matchAll:!0,errorProps:{disabled:!0},children:(0,x.jsx)(h.A,{tooltip:"Add Replication Rule",children:(0,x.jsx)(c.$nd,{id:"add-bucket-replication-rule",onClick:()=>{U(o.zZ.BUCKETS_ADD_REPLICATION+"?bucketName=".concat(F,"&nextPriority=").concat(j.length+1))},label:"Add Replication Rule",icon:(0,x.jsx)(c.REV,{}),variant:"callAction"})})})]}),children:(0,x.jsx)(c.V7x,{content:(0,x.jsxs)(i.Fragment,{children:["MinIO"," ",(0,x.jsx)("a",{target:"blank",href:"https://min.io/docs/minio/kubernetes/upstream/administration/bucket-replication.html",children:"server-side bucket replication"})," ","is an automatic bucket-level configuration that synchronizes objects between a source and destination bucket."]}),placement:"right",children:"Replication"})}),(0,x.jsxs)(c.xA9,{container:!0,children:[(0,x.jsx)(c.xA9,{item:!0,xs:12,children:(0,x.jsx)(a.R,{scopes:[o.OV.S3_GET_REPLICATION_CONFIGURATION,o.OV.S3_GET_ACTIONS],resource:F,errorProps:{disabled:!0},children:(0,x.jsx)(c.bQt,{itemActions:G,columns:[{label:"Priority",elementKey:"priority",width:55,contentTextAlign:"center"},{label:"Destination",elementKey:"destination",renderFunction:e=>(0,x.jsx)(i.Fragment,{children:e.bucket.replace("arn:aws:s3:::","")})},{label:"Prefix",elementKey:"prefix",width:200},{label:"Tags",elementKey:"tags",renderFunction:e=>(0,x.jsx)(i.Fragment,{children:e&&""!==e.tags?"Yes":"No"}),width:60},{label:"Status",elementKey:"status",width:100}],isLoading:b,records:j,entityName:"Replication Rules",idField:"id",customPaperHeight:"400px",textSelectable:!0,selectedItems:y,onSelect:e=>(e=>{const t=e.target,n=t.value,i=t.checked;let l=[...y];return i?l.push(n):l=l.filter((e=>e!==n)),P(l),l})(e),onSelectAll:()=>{y.length!==j.length?P(j.map((e=>e.id))):P([])}})})}),(0,x.jsxs)(c.xA9,{item:!0,xs:12,children:[(0,x.jsx)("br",{}),(0,x.jsx)(c.lVp,{title:"Replication",iconComponent:(0,x.jsx)(c.brV,{}),help:(0,x.jsxs)(i.Fragment,{children:["MinIO supports server-side and client-side replication of objects between source and destination buckets.",(0,x.jsx)("br",{}),(0,x.jsx)("br",{}),"You can learn more at our"," ",(0,x.jsx)("a",{href:"https://min.io/docs/minio/linux/administration/bucket-replication.html?ref=con",target:"_blank",rel:"noopener",children:"documentation"}),"."]})})]})]})]})}}}]);
//# sourceMappingURL=2689.5e76c1cd.chunk.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[2704],{32704:(e,t,a)=>{a.r(t),a.d(t,{default:()=>w});var n=a(65043),s=a(24241),d=a(89923),o=a(22166),l=a(94141),r=a(20554),c=a(6035),i=a(77403),u=a(70579);const w=e=>{let{closeModalAndRefresh:t,open:a,bucketName:w}=e;const b=(0,r.jL)(),h=(0,o.d4)((e=>e.objectBrowser.rewind.rewindEnabled)),x=(0,o.d4)((e=>e.objectBrowser.rewind.dateToRewind)),[j,p]=(0,n.useState)(!1),[S,m]=(0,n.useState)(!0),[k,f]=(0,n.useState)(s.c9.fromJSDate(new Date));(0,n.useEffect)((()=>{h&&(m(!0),f(s.c9.fromISO(x||s.c9.now().toISO()||"")))}),[h,x]);return(0,u.jsx)(l.A,{modalOpen:a,onClose:()=>{t()},title:"Rewind - ".concat(w),children:(0,u.jsxs)(d.Hbc,{withBorders:!1,containerPadding:!1,children:[(0,u.jsx)(d.e8j,{value:k,onChange:e=>e?f(e):null,id:"rewind-selector",label:"Rewind to",timeFormat:"24h",secondsSelector:!1,disabled:!S}),h&&(0,u.jsx)(d.dOG,{value:"status",id:"status",name:"status",checked:S,onChange:e=>{m(e.target.checked)},label:"Current Status",indicatorLabels:["Enabled","Disabled"]}),(0,u.jsx)(d.xA9,{item:!0,xs:12,sx:i.Uz.modalButtonBar,children:(0,u.jsx)(d.$nd,{type:"button",variant:"callAction",disabled:j||!k&&S,onClick:()=>{!S&&h?b((0,c.rS)()):(p(!0),b((0,c.v8)({state:!0,bucket:w,dateRewind:k.toISO()}))),b((0,c.Yw)(!0)),t()},id:"rewind-apply-button",label:!S&&h?"Show Current Data":"Show Rewind Data"})}),j&&(0,u.jsx)(d.xA9,{item:!0,xs:12,children:(0,u.jsx)(d.z21,{})})]})})}}}]);
//# sourceMappingURL=2704.fe33dd23.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[3035],{13035:(e,t,n)=>{n.r(t),n.d(t,{default:()=>p});var a=n(65043),l=n(22166),s=n(89923),c=n(20554),o=n(56483),i=n(32511),r=n(68603),d=n(64159),u=n(20649),x=n(48793),h=n(92452),m=n(70579);const p=()=>{const e=(0,c.jL)(),t=(0,l.d4)((e=>e.watch.messages)),[n,p]=(0,a.useState)(!1),[b,f]=(0,a.useState)("Select Bucket"),[g,j]=(0,a.useState)(""),[w,k]=(0,a.useState)(""),[S,v]=(0,a.useState)([]);(0,a.useEffect)((()=>{u.A.invoke("GET","/api/v1/buckets").then((e=>{let t=[];null!==e.buckets&&(t=e.buckets),v(t)})).catch((e=>{console.error(e)}))}),[]),(0,a.useEffect)((()=>{if(e((0,r.n4)()),n&&S.some((e=>e.name===b))){const t=new URL(window.location.toString()),n=!1?"9090":t.port,a=new URL(document.baseURI).pathname,l=(0,i.nw)(t.protocol),s=new WebSocket("".concat(l,"://").concat(t.hostname,":").concat(n).concat(a,"ws/watch/").concat(b,"?prefix=").concat(g,"&suffix=").concat(w));let c=null;if(null!==s)return s.onopen=()=>{console.log("WebSocket Client Connected"),s.send("ok"),c=setInterval((()=>{s.send("ok")}),1e4)},s.onmessage=t=>{let n=JSON.parse(t.data.toString());n.Time=new Date(n.Time.toString()),n.key=Math.random(),e((0,r.ID)(n))},s.onclose=()=>{clearInterval(c),console.log("connection closed by server"),p(!1)},()=>{s.close(1e3),clearInterval(c),console.log("closing websockets")}}else p(!1)}),[e,n,S,b,g,w]);const y=S.map((e=>({label:e.name,value:e.name})));(0,a.useEffect)((()=>{e((0,d.ph)("watch"))}),[]);const C=y.map((e=>({label:e.label,value:e.value})));return(0,m.jsxs)(a.Fragment,{children:[(0,m.jsx)(x.A,{label:"Watch",actions:(0,m.jsx)(h.A,{})}),(0,m.jsx)(s.Mxu,{children:(0,m.jsxs)(s.xA9,{container:!0,children:[(0,m.jsxs)(s.xA9,{item:!0,xs:12,sx:{display:"flex",gap:10,marginBottom:15,alignItems:"center"},children:[(0,m.jsxs)(s.azJ,{sx:{flexGrow:1},children:[(0,m.jsx)(s.l1Y,{children:"Bucket"}),(0,m.jsx)(s.l6P,{id:"bucket-name",name:"bucket-name",value:b,onChange:e=>{f(e)},disabled:n,options:C,placeholder:"Select Bucket"})]}),(0,m.jsxs)(s.azJ,{sx:{flexGrow:1},children:[(0,m.jsx)(s.l1Y,{children:"Prefix"}),(0,m.jsx)(s.cl_,{id:"prefix-resource",disabled:n,onChange:e=>{j(e.target.value)}})]}),(0,m.jsxs)(s.azJ,{sx:{flexGrow:1},children:[(0,m.jsx)(s.l1Y,{children:"Suffix"}),(0,m.jsx)(s.cl_,{id:"suffix-resource",disabled:n,onChange:e=>{k(e.target.value)}})]}),(0,m.jsx)(s.azJ,{sx:{alignSelf:"flex-end",paddingBottom:4},children:n?(0,m.jsx)(s.$nd,{id:"stop-watch",type:"submit",variant:"callAction",onClick:()=>p(!1),label:"Stop"}):(0,m.jsx)(s.$nd,{id:"start-watch",type:"submit",variant:"callAction",onClick:()=>p(!0),label:"Start"})})]}),(0,m.jsx)(s.xA9,{item:!0,xs:12,children:(0,m.jsx)(s.bQt,{columns:[{label:"Time",elementKey:"Time",renderFunction:o.cj},{label:"Size",elementKey:"Size",renderFunction:o.nO},{label:"Type",elementKey:"Type"},{label:"Path",elementKey:"Path"}],records:t,entityName:"Watch",customEmptyMessage:"No Changes at this time",idField:"watch_table",isLoading:!1,customPaperHeight:"calc(100vh - 270px)"})})]})})]})}}}]);
//# sourceMappingURL=3035.b2eb0918.chunk.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[3052],{53052:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});var a=n(69060),s=n(89940),o=n(70780),r=n(66152),c=n(95705),l=n(66156),i=n(82496);const d=e=>{let{deleteOpen:t,currentTags:n,selectedTag:d,onCloseAndUpdate:u,bucketName:p}=e;const b=(0,l.Ab)(),[g,h]=d,[w,f]=(0,s.c)((()=>u(!0)),(e=>b((0,c.aW)(e))));if(!d)return null;return(0,i.jsx)(o.c,{title:"Delete Tag",confirmText:"Delete",isOpen:t,titleIcon:(0,i.jsx)(r.sB6,{}),isLoading:w,onConfirm:()=>{const e={...n};delete e[g],f("PUT","/api/v1/buckets/".concat(p,"/tags"),{tags:e})},onClose:()=>u(!1),confirmationContent:(0,i.jsxs)(a.Fragment,{children:["Are you sure you want to delete the tag"," ",(0,i.jsxs)("b",{style:{maxWidth:200,whiteSpace:"normal",wordWrap:"break-word"},children:[g," : ",h]})," ","?"]})})}}}]);
//# sourceMappingURL=3052.c221a4c1.chunk.js.map

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunkweb_app=self.webpackChunkweb_app||[]).push([[3061],{43061:(e,l,t)=>{t.r(l),t.d(l,{default:()=>x});var o=t(65043),a=t(89923),n=t(32511),c=t(73216),i=t(14558),s=t(20554),r=t(64159),p=t(28481),d=t(48793),u=t(92452),b=t(70579),m=null;const x=()=>{const e=(0,c.Zp)(),[l,t]=(0,o.useState)(!1),[x,f]=(0,o.useState)(["cpu","mem","block","mutex","goroutines"]),h=(0,i.vf)(),g=e=>{let l=[];l=x.indexOf(e.target.value)>-1?x.filter((l=>l!==e.target.value)):[...x,e.target.value],f(l)},v=(0,s.jL)();return(0,o.useEffect)((()=>{v((0,r.ph)("profile"))}),[]),(0,b.jsxs)(o.Fragment,{children:[(0,b.jsx)(d.A,{label:"Profile",actions:(0,b.jsx)(u.A,{})}),(0,b.jsxs)(a.Mxu,{children:[!h&&(0,b.jsx)(p.A,{compactMode:!0}),(0,b.jsxs)(a.Hbc,{children:[(0,b.jsxs)(a.azJ,{sx:{display:"flex",gap:10,"& div":{width:"initial"},"& .inputItem:not(:last-of-type)":{marginBottom:0}},children:[(0,b.jsx)(a.l1Y,{noMinWidth:!0,children:"Types to profile:"}),[{label:"cpu",value:"cpu"},{label:"mem",value:"mem"},{label:"block",value:"block"},{label:"mutex",value:"mutex"},{label:"goroutines",value:"goroutines"}].map((e=>(0,b.jsx)(a.Sc0,{checked:x.indexOf(e.value)>-1,disabled:l||!h,id:"checkbox-".concat(e.label),label:e.label,name:"checkbox-".concat(e.label),onChange:g,value:e.value},"checkbox-".concat(e.label))))]}),(0,b.jsxs)(a.azJ,{sx:{display:"flex",justifyContent:"flex-end",marginTop:24,gap:10},children:[(0,b.jsx)(a.$nd,{id:"start-profiling",type:"submit",variant:h?"callAction":"regular",disabled:l||x.length<1||!h,onClick:()=>{h?(()=>{const e=x.join(","),l=new URL(window.location.toString()),o=l.port,a=new URL(document.baseURI).pathname,c=(0,n.nw)(l.protocol);if(null!==(m=new WebSocket("".concat(c,"://").concat(l.hostname,":").concat(o).concat(a,"ws/profile?types=").concat(e))))m.onopen=()=>{t(!0),m.send("ok")},m.onmessage=e=>{let l=new Blob([e.data],{type:"application/zip"});t(!1);var o=document.createElement("a");o.href=window.URL.createObjectURL(l),o.download="profile.zip",document.body.appendChild(o),o.click(),document.body.removeChild(o)},m.onclose=()=>{console.log("connection closed by server"),t(!1)}})():e("/support/register")},label:"Start Profiling"}),(0,b.jsx)(a.$nd,{id:"stop-profiling",type:"submit",variant:"callAction",color:"primary",disabled:!l||!h,onClick:()=>{m.close(1e3),t(!1)},label:"Stop Profiling"})]})]})]})]})}}}]);
//# sourceMappingURL=3061.c8170979.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More