mirror of
https://github.com/OpenMaxIO/openmaxio-object-browser
synced 2026-07-01 15:51:18 -07:00
Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6625d54d67 | ||
|
|
ee6d1ed586 | ||
|
|
6de1d88e11 | ||
|
|
de19b6f17b | ||
|
|
226a90be1d | ||
|
|
6cfb6ff06a | ||
|
|
649c3d74b8 | ||
|
|
662ce3b2f5 | ||
|
|
0292bc154d | ||
|
|
ceee83f03a | ||
|
|
144904f0f6 | ||
|
|
963c8f1221 | ||
|
|
6c50c38f83 | ||
|
|
3aac62cc81 | ||
|
|
78a05d39c4 | ||
|
|
79bec3880e | ||
|
|
bdf7bd6309 | ||
|
|
4ce1ba999b | ||
|
|
d01501703b | ||
|
|
6a38a09462 | ||
|
|
78990e354f | ||
|
|
3189ebdfef | ||
|
|
39bf627b0a | ||
|
|
a838c763ea | ||
|
|
0afea63994 | ||
|
|
0df9487527 | ||
|
|
9274ee72ad | ||
|
|
2b6c3debb4 | ||
|
|
8dd6dd4e7f | ||
|
|
5e64c96497 | ||
|
|
54c0b4b8a2 | ||
|
|
31056e12ba |
4
.github/workflows/vulncheck.yaml
vendored
4
.github/workflows/vulncheck.yaml
vendored
@@ -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
|
||||
|
||||
57
CHANGELOG.md
57
CHANGELOG.md
@@ -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
265
CREDITS
@@ -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
|
||||
----------------------------------------------------------------
|
||||
|
||||
4
Makefile
4
Makefile
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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")
|
||||
)
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
73
api/operations/public/download_shared_object.go
Normal file
73
api/operations/public/download_shared_object.go
Normal 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)
|
||||
|
||||
}
|
||||
88
api/operations/public/download_shared_object_parameters.go
Normal file
88
api/operations/public/download_shared_object_parameters.go
Normal 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
|
||||
}
|
||||
134
api/operations/public/download_shared_object_responses.go
Normal file
134
api/operations/public/download_shared_object_responses.go
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
116
api/operations/public/download_shared_object_urlbuilder.go
Normal file
116
api/operations/public/download_shared_object_urlbuilder.go
Normal 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
125
api/public_objects.go
Normal 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
103
api/public_objects_test.go
Normal 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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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, "")
|
||||
|
||||
@@ -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: ¶ms.Body.Tags,
|
||||
ExpiredObjectDeleteMarker: ¶ms.Body.ExpiredObjectDeleteMarker,
|
||||
ExpiredObjectAllversions: ¶ms.Body.ExpiredObjectDeleteAll,
|
||||
}
|
||||
|
||||
if params.Body.NoncurrentversionTransitionDays > 0 {
|
||||
@@ -219,6 +221,7 @@ func addBucketLifecycle(ctx context.Context, client MinioClient, params bucketAp
|
||||
Status: &status,
|
||||
Tags: ¶ms.Body.Tags,
|
||||
ExpiredObjectDeleteMarker: ¶ms.Body.ExpiredObjectDeleteMarker,
|
||||
ExpiredObjectAllversions: ¶ms.Body.ExpiredObjectDeleteAll,
|
||||
}
|
||||
|
||||
if params.Body.NewerNoncurrentversionExpirationVersions > 0 {
|
||||
@@ -298,6 +301,7 @@ func editBucketLifecycle(ctx context.Context, client MinioClient, params bucketA
|
||||
Status: &status,
|
||||
Tags: ¶ms.Body.Tags,
|
||||
ExpiredObjectDeleteMarker: ¶ms.Body.ExpiredObjectDeleteMarker,
|
||||
ExpiredObjectAllversions: ¶ms.Body.ExpiredObjectDeleteAll,
|
||||
}
|
||||
|
||||
if params.Body.NoncurrentversionTransitionDays > 0 {
|
||||
@@ -328,6 +332,7 @@ func editBucketLifecycle(ctx context.Context, client MinioClient, params bucketA
|
||||
Status: &status,
|
||||
Tags: ¶ms.Body.Tags,
|
||||
ExpiredObjectDeleteMarker: ¶ms.Body.ExpiredObjectDeleteMarker,
|
||||
ExpiredObjectAllversions: ¶ms.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() {
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
87
go.mod
@@ -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
206
go.sum
@@ -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=
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"`
|
||||
|
||||
|
||||
@@ -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"`
|
||||
|
||||
|
||||
@@ -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"`
|
||||
|
||||
|
||||
@@ -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"`
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
72
swagger.yml
72
swagger.yml
@@ -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:
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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>
|
||||
2
web-app/build/static/js/1011.13d372c8.chunk.js
Normal file
2
web-app/build/static/js/1011.13d372c8.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
web-app/build/static/js/1011.13d372c8.chunk.js.map
Normal file
1
web-app/build/static/js/1011.13d372c8.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
@@ -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
|
||||
@@ -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":""}
|
||||
@@ -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
3
web-app/build/static/js/1195.955963a0.chunk.js
Normal file
3
web-app/build/static/js/1195.955963a0.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
web-app/build/static/js/1195.955963a0.chunk.js.map
Normal file
1
web-app/build/static/js/1195.955963a0.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
web-app/build/static/js/12.ab9b7ed0.chunk.js
Normal file
2
web-app/build/static/js/12.ab9b7ed0.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
web-app/build/static/js/12.ab9b7ed0.chunk.js.map
Normal file
1
web-app/build/static/js/12.ab9b7ed0.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
web-app/build/static/js/1303.12f6ca82.chunk.js
Normal file
2
web-app/build/static/js/1303.12f6ca82.chunk.js
Normal 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
2
web-app/build/static/js/1324.beff0285.chunk.js
Normal file
2
web-app/build/static/js/1324.beff0285.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
web-app/build/static/js/1324.beff0285.chunk.js.map
Normal file
1
web-app/build/static/js/1324.beff0285.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
web-app/build/static/js/1370.d5e698ce.chunk.js
Normal file
2
web-app/build/static/js/1370.d5e698ce.chunk.js
Normal file
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
2
web-app/build/static/js/144.1bc937a8.chunk.js
Normal file
2
web-app/build/static/js/144.1bc937a8.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
web-app/build/static/js/144.1bc937a8.chunk.js.map
Normal file
1
web-app/build/static/js/144.1bc937a8.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
@@ -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
@@ -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
2
web-app/build/static/js/1702.9ff3a82e.chunk.js
Normal file
2
web-app/build/static/js/1702.9ff3a82e.chunk.js
Normal file
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
@@ -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
|
||||
2
web-app/build/static/js/2033.a09fb9da.chunk.js
Normal file
2
web-app/build/static/js/2033.a09fb9da.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
web-app/build/static/js/2033.a09fb9da.chunk.js.map
Normal file
1
web-app/build/static/js/2033.a09fb9da.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
@@ -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
|
||||
2
web-app/build/static/js/2138.d05b3faa.chunk.js
Normal file
2
web-app/build/static/js/2138.d05b3faa.chunk.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
web-app/build/static/js/2166.1e6c2b39.chunk.js
Normal file
2
web-app/build/static/js/2166.1e6c2b39.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
web-app/build/static/js/2166.1e6c2b39.chunk.js.map
Normal file
1
web-app/build/static/js/2166.1e6c2b39.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
web-app/build/static/js/2209.3b0ca7fa.chunk.js
Normal file
2
web-app/build/static/js/2209.3b0ca7fa.chunk.js
Normal 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
|
||||
@@ -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":""}
|
||||
2
web-app/build/static/js/2332.7f421c9f.chunk.js
Normal file
2
web-app/build/static/js/2332.7f421c9f.chunk.js
Normal 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
2
web-app/build/static/js/2372.aaeaeefa.chunk.js
Normal file
2
web-app/build/static/js/2372.aaeaeefa.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
web-app/build/static/js/2372.aaeaeefa.chunk.js.map
Normal file
1
web-app/build/static/js/2372.aaeaeefa.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
web-app/build/static/js/24.1245bd95.chunk.js
Normal file
2
web-app/build/static/js/24.1245bd95.chunk.js
Normal 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
|
||||
1
web-app/build/static/js/24.1245bd95.chunk.js.map
Normal file
1
web-app/build/static/js/24.1245bd95.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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
2
web-app/build/static/js/2689.5e76c1cd.chunk.js
Normal file
2
web-app/build/static/js/2689.5e76c1cd.chunk.js
Normal 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
|
||||
1
web-app/build/static/js/2689.5e76c1cd.chunk.js.map
Normal file
1
web-app/build/static/js/2689.5e76c1cd.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
web-app/build/static/js/2704.fe33dd23.chunk.js
Normal file
2
web-app/build/static/js/2704.fe33dd23.chunk.js
Normal 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
2
web-app/build/static/js/2959.25a10423.chunk.js
Normal file
2
web-app/build/static/js/2959.25a10423.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
web-app/build/static/js/2959.25a10423.chunk.js.map
Normal file
1
web-app/build/static/js/2959.25a10423.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
web-app/build/static/js/3035.b2eb0918.chunk.js
Normal file
2
web-app/build/static/js/3035.b2eb0918.chunk.js
Normal 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
|
||||
1
web-app/build/static/js/3035.b2eb0918.chunk.js.map
Normal file
1
web-app/build/static/js/3035.b2eb0918.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
@@ -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
|
||||
2
web-app/build/static/js/3061.c8170979.chunk.js
Normal file
2
web-app/build/static/js/3061.c8170979.chunk.js
Normal 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
|
||||
1
web-app/build/static/js/3061.c8170979.chunk.js.map
Normal file
1
web-app/build/static/js/3061.c8170979.chunk.js.map
Normal file
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
Reference in New Issue
Block a user