diff --git a/cmd/admin-handlers-idp-config.go b/cmd/admin-handlers-idp-config.go index 52444da90..504feaf6a 100644 --- a/cmd/admin-handlers-idp-config.go +++ b/cmd/admin-handlers-idp-config.go @@ -20,6 +20,7 @@ package cmd import ( "context" "encoding/json" + "errors" "fmt" "io" "net/http" @@ -27,16 +28,13 @@ import ( "github.com/gorilla/mux" "github.com/minio/madmin-go" - "github.com/minio/minio-go/v7/pkg/set" "github.com/minio/minio/internal/config" "github.com/minio/minio/internal/config/identity/openid" "github.com/minio/minio/internal/logger" iampolicy "github.com/minio/pkg/iam/policy" + "github.com/minio/pkg/ldap" ) -// List of implemented ID config types. -var idCfgTypes = set.CreateStringSet("openid") - // SetIdentityProviderCfg: // // PUT /id-cfg?type=openid&name=dex1 @@ -64,18 +62,18 @@ func (a adminAPIHandlers) SetIdentityProviderCfg(w http.ResponseWriter, r *http. return } - cfgType := mux.Vars(r)["type"] - if !idCfgTypes.Contains(cfgType) { - // TODO: change this to invalid type error when implementation - // is complete. - writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrNotImplemented), r.URL) + idpCfgType := mux.Vars(r)["type"] + if !madmin.ValidIDPConfigTypes.Contains(idpCfgType) { + writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminConfigInvalidIDPType), r.URL) return } var cfgDataBuilder strings.Builder - switch cfgType { - case "openid": + switch idpCfgType { + case madmin.OpenidIDPCfg: fmt.Fprintf(&cfgDataBuilder, "identity_openid") + case madmin.LDAPIDPCfg: + fmt.Fprintf(&cfgDataBuilder, "identity_ldap") } // Ensure body content type is opaque. @@ -88,6 +86,13 @@ func (a adminAPIHandlers) SetIdentityProviderCfg(w http.ResponseWriter, r *http. // Subsystem configuration name could be empty. cfgName := mux.Vars(r)["name"] if cfgName != "" { + if idpCfgType == madmin.LDAPIDPCfg { + // LDAP does not support multiple configurations. So this must be + // empty. + writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrBadRequest), r.URL) + return + } + fmt.Fprintf(&cfgDataBuilder, "%s%s", config.SubSystemSeparator, cfgName) } @@ -119,6 +124,16 @@ func (a adminAPIHandlers) SetIdentityProviderCfg(w http.ResponseWriter, r *http. } if err = validateConfig(cfg, subSys); err != nil { + + var validationErr ldap.Validation + if errors.As(err, &validationErr) { + // If we got an LDAP validation error, we need to send appropriate + // error message back to client (likely mc). + writeCustomErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminConfigLDAPValidation), + validationErr.FormatError(), r.URL) + return + } + writeCustomErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminConfigBadJSON), err.Error(), r.URL) return } @@ -156,28 +171,32 @@ func (a adminAPIHandlers) GetIdentityProviderCfg(w http.ResponseWriter, r *http. return } - cfgType := mux.Vars(r)["type"] + idpCfgType := mux.Vars(r)["type"] cfgName := r.Form.Get("name") password := cred.SecretKey - if !idCfgTypes.Contains(cfgType) { - // TODO: change this to invalid type error when implementation - // is complete. - writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrNotImplemented), r.URL) + if !madmin.ValidIDPConfigTypes.Contains(idpCfgType) { + writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminConfigInvalidIDPType), r.URL) return } // If no cfgName is provided, we list. if cfgName == "" { - a.listIdentityProviders(ctx, w, r, cfgType, password) + a.listIdentityProviders(ctx, w, r, idpCfgType, password) return } cfg := globalServerConfig.Clone() - - cfgInfos, err := globalOpenIDConfig.GetConfigInfo(cfg, cfgName) + var cfgInfos []madmin.IDPCfgInfo + var err error + switch idpCfgType { + case madmin.OpenidIDPCfg: + cfgInfos, err = globalOpenIDConfig.GetConfigInfo(cfg, cfgName) + case madmin.LDAPIDPCfg: + cfgInfos, err = globalLDAPConfig.GetConfigInfo(cfg, cfgName) + } if err != nil { - if err == openid.ErrProviderConfigNotFound { + if errors.Is(err, openid.ErrProviderConfigNotFound) { writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminNoSuchConfigTarget), r.URL) return } @@ -187,7 +206,7 @@ func (a adminAPIHandlers) GetIdentityProviderCfg(w http.ResponseWriter, r *http. } res := madmin.IDPConfig{ - Type: cfgType, + Type: idpCfgType, Name: cfgName, Info: cfgInfos, } @@ -206,18 +225,22 @@ func (a adminAPIHandlers) GetIdentityProviderCfg(w http.ResponseWriter, r *http. writeSuccessResponseJSON(w, econfigData) } -func (a adminAPIHandlers) listIdentityProviders(ctx context.Context, w http.ResponseWriter, r *http.Request, cfgType, password string) { - // var subSys string - switch cfgType { - case "openid": - // subSys = config.IdentityOpenIDSubSys +func (a adminAPIHandlers) listIdentityProviders(ctx context.Context, w http.ResponseWriter, r *http.Request, idpCfgType, password string) { + var cfgList []madmin.IDPListItem + var err error + switch idpCfgType { + case madmin.OpenidIDPCfg: + cfg := globalServerConfig.Clone() + cfgList, err = globalOpenIDConfig.GetConfigList(cfg) + case madmin.LDAPIDPCfg: + cfg := globalServerConfig.Clone() + cfgList, err = globalLDAPConfig.GetConfigList(cfg) + default: writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrNotImplemented), r.URL) return } - cfg := globalServerConfig.Clone() - cfgList, err := globalOpenIDConfig.GetConfigList(cfg) if err != nil { writeErrorResponseJSON(ctx, w, toAdminAPIErr(ctx, err), r.URL) return @@ -251,57 +274,82 @@ func (a adminAPIHandlers) DeleteIdentityProviderCfg(w http.ResponseWriter, r *ht return } - cfgType := mux.Vars(r)["type"] + idpCfgType := mux.Vars(r)["type"] cfgName := mux.Vars(r)["name"] - if !idCfgTypes.Contains(cfgType) { - // TODO: change this to invalid type error when implementation - // is complete. - writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrNotImplemented), r.URL) + if !madmin.ValidIDPConfigTypes.Contains(idpCfgType) { + writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminConfigInvalidIDPType), r.URL) return } - cfg := globalServerConfig.Clone() + cfgCopy := globalServerConfig.Clone() + var subSys string + switch idpCfgType { + case madmin.OpenidIDPCfg: + subSys = config.IdentityOpenIDSubSys + cfgInfos, err := globalOpenIDConfig.GetConfigInfo(cfgCopy, cfgName) + if err != nil { + if errors.Is(err, openid.ErrProviderConfigNotFound) { + writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminNoSuchConfigTarget), r.URL) + return + } - cfgInfos, err := globalOpenIDConfig.GetConfigInfo(cfg, cfgName) - if err != nil { - if err == openid.ErrProviderConfigNotFound { - writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminNoSuchConfigTarget), r.URL) + writeErrorResponseJSON(ctx, w, toAdminAPIErr(ctx, err), r.URL) return } - writeErrorResponseJSON(ctx, w, toAdminAPIErr(ctx, err), r.URL) - return - } - - hasEnv := false - for _, ci := range cfgInfos { - if ci.IsCfg && ci.IsEnv { - hasEnv = true - break + hasEnv := false + for _, ci := range cfgInfos { + if ci.IsCfg && ci.IsEnv { + hasEnv = true + break + } } - } - if hasEnv { - writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminConfigEnvOverridden), r.URL) - return - } + if hasEnv { + writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminConfigEnvOverridden), r.URL) + return + } + case madmin.LDAPIDPCfg: + subSys = config.IdentityLDAPSubSys + cfgInfos, err := globalLDAPConfig.GetConfigInfo(cfgCopy, cfgName) + if err != nil { + if errors.Is(err, openid.ErrProviderConfigNotFound) { + writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminNoSuchConfigTarget), r.URL) + return + } - var subSys string - switch cfgType { - case "openid": - subSys = config.IdentityOpenIDSubSys + writeErrorResponseJSON(ctx, w, toAdminAPIErr(ctx, err), r.URL) + return + } + + hasEnv := false + for _, ci := range cfgInfos { + if ci.IsCfg && ci.IsEnv { + hasEnv = true + break + } + } + + if hasEnv { + writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAdminConfigEnvOverridden), r.URL) + return + } default: writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrNotImplemented), r.URL) return } - cfg, err = readServerConfig(ctx, objectAPI) + cfg, err := readServerConfig(ctx, objectAPI) if err != nil { writeErrorResponseJSON(ctx, w, toAdminAPIErr(ctx, err), r.URL) return } - if err = cfg.DelKVS(fmt.Sprintf("%s:%s", subSys, cfgName)); err != nil { + cfgKey := fmt.Sprintf("%s:%s", subSys, cfgName) + if cfgName == madmin.Default { + cfgKey = subSys + } + if err = cfg.DelKVS(cfgKey); err != nil { writeErrorResponseJSON(ctx, w, toAdminAPIErr(ctx, err), r.URL) return } diff --git a/cmd/api-errors.go b/cmd/api-errors.go index a99151e26..bd9dc2cb1 100644 --- a/cmd/api-errors.go +++ b/cmd/api-errors.go @@ -30,6 +30,7 @@ import ( "github.com/Azure/azure-storage-blob-go/azblob" "google.golang.org/api/googleapi" + "github.com/minio/madmin-go" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/tags" "github.com/minio/minio/internal/auth" @@ -274,6 +275,8 @@ const ( ErrAdminNoSuchConfigTarget ErrAdminConfigEnvOverridden ErrAdminConfigDuplicateKeys + ErrAdminConfigInvalidIDPType + ErrAdminConfigLDAPValidation ErrAdminCredentialsMismatch ErrInsecureClientRequest ErrObjectTampered @@ -1288,6 +1291,16 @@ var errorCodes = errorCodeMap{ Description: "JSON configuration provided has objects with duplicate keys", HTTPStatusCode: http.StatusBadRequest, }, + ErrAdminConfigInvalidIDPType: { + Code: "XMinioAdminConfigInvalidIDPType", + Description: fmt.Sprintf("Invalid IDP configuration type - must be one of %v", madmin.ValidIDPConfigTypes), + HTTPStatusCode: http.StatusBadRequest, + }, + ErrAdminConfigLDAPValidation: { + Code: "XMinioAdminConfigLDAPValidation", + Description: "LDAP Configuration validation failed", + HTTPStatusCode: http.StatusBadRequest, + }, ErrAdminConfigNotificationTargetsFailed: { Code: "XMinioAdminNotificationTargetsTestFailed", Description: "Configuration update failed due an unsuccessful attempt to connect to one or more notification servers", diff --git a/cmd/apierrorcode_string.go b/cmd/apierrorcode_string.go index 2e93c7804..1080f5c6a 100644 --- a/cmd/apierrorcode_string.go +++ b/cmd/apierrorcode_string.go @@ -190,125 +190,127 @@ func _() { _ = x[ErrAdminNoSuchConfigTarget-179] _ = x[ErrAdminConfigEnvOverridden-180] _ = x[ErrAdminConfigDuplicateKeys-181] - _ = x[ErrAdminCredentialsMismatch-182] - _ = x[ErrInsecureClientRequest-183] - _ = x[ErrObjectTampered-184] - _ = x[ErrSiteReplicationInvalidRequest-185] - _ = x[ErrSiteReplicationPeerResp-186] - _ = x[ErrSiteReplicationBackendIssue-187] - _ = x[ErrSiteReplicationServiceAccountError-188] - _ = x[ErrSiteReplicationBucketConfigError-189] - _ = x[ErrSiteReplicationBucketMetaError-190] - _ = x[ErrSiteReplicationIAMError-191] - _ = x[ErrSiteReplicationConfigMissing-192] - _ = x[ErrAdminBucketQuotaExceeded-193] - _ = x[ErrAdminNoSuchQuotaConfiguration-194] - _ = x[ErrHealNotImplemented-195] - _ = x[ErrHealNoSuchProcess-196] - _ = x[ErrHealInvalidClientToken-197] - _ = x[ErrHealMissingBucket-198] - _ = x[ErrHealAlreadyRunning-199] - _ = x[ErrHealOverlappingPaths-200] - _ = x[ErrIncorrectContinuationToken-201] - _ = x[ErrEmptyRequestBody-202] - _ = x[ErrUnsupportedFunction-203] - _ = x[ErrInvalidExpressionType-204] - _ = x[ErrBusy-205] - _ = x[ErrUnauthorizedAccess-206] - _ = x[ErrExpressionTooLong-207] - _ = x[ErrIllegalSQLFunctionArgument-208] - _ = x[ErrInvalidKeyPath-209] - _ = x[ErrInvalidCompressionFormat-210] - _ = x[ErrInvalidFileHeaderInfo-211] - _ = x[ErrInvalidJSONType-212] - _ = x[ErrInvalidQuoteFields-213] - _ = x[ErrInvalidRequestParameter-214] - _ = x[ErrInvalidDataType-215] - _ = x[ErrInvalidTextEncoding-216] - _ = x[ErrInvalidDataSource-217] - _ = x[ErrInvalidTableAlias-218] - _ = x[ErrMissingRequiredParameter-219] - _ = x[ErrObjectSerializationConflict-220] - _ = x[ErrUnsupportedSQLOperation-221] - _ = x[ErrUnsupportedSQLStructure-222] - _ = x[ErrUnsupportedSyntax-223] - _ = x[ErrUnsupportedRangeHeader-224] - _ = x[ErrLexerInvalidChar-225] - _ = x[ErrLexerInvalidOperator-226] - _ = x[ErrLexerInvalidLiteral-227] - _ = x[ErrLexerInvalidIONLiteral-228] - _ = x[ErrParseExpectedDatePart-229] - _ = x[ErrParseExpectedKeyword-230] - _ = x[ErrParseExpectedTokenType-231] - _ = x[ErrParseExpected2TokenTypes-232] - _ = x[ErrParseExpectedNumber-233] - _ = x[ErrParseExpectedRightParenBuiltinFunctionCall-234] - _ = x[ErrParseExpectedTypeName-235] - _ = x[ErrParseExpectedWhenClause-236] - _ = x[ErrParseUnsupportedToken-237] - _ = x[ErrParseUnsupportedLiteralsGroupBy-238] - _ = x[ErrParseExpectedMember-239] - _ = x[ErrParseUnsupportedSelect-240] - _ = x[ErrParseUnsupportedCase-241] - _ = x[ErrParseUnsupportedCaseClause-242] - _ = x[ErrParseUnsupportedAlias-243] - _ = x[ErrParseUnsupportedSyntax-244] - _ = x[ErrParseUnknownOperator-245] - _ = x[ErrParseMissingIdentAfterAt-246] - _ = x[ErrParseUnexpectedOperator-247] - _ = x[ErrParseUnexpectedTerm-248] - _ = x[ErrParseUnexpectedToken-249] - _ = x[ErrParseUnexpectedKeyword-250] - _ = x[ErrParseExpectedExpression-251] - _ = x[ErrParseExpectedLeftParenAfterCast-252] - _ = x[ErrParseExpectedLeftParenValueConstructor-253] - _ = x[ErrParseExpectedLeftParenBuiltinFunctionCall-254] - _ = x[ErrParseExpectedArgumentDelimiter-255] - _ = x[ErrParseCastArity-256] - _ = x[ErrParseInvalidTypeParam-257] - _ = x[ErrParseEmptySelect-258] - _ = x[ErrParseSelectMissingFrom-259] - _ = x[ErrParseExpectedIdentForGroupName-260] - _ = x[ErrParseExpectedIdentForAlias-261] - _ = x[ErrParseUnsupportedCallWithStar-262] - _ = x[ErrParseNonUnaryAgregateFunctionCall-263] - _ = x[ErrParseMalformedJoin-264] - _ = x[ErrParseExpectedIdentForAt-265] - _ = x[ErrParseAsteriskIsNotAloneInSelectList-266] - _ = x[ErrParseCannotMixSqbAndWildcardInSelectList-267] - _ = x[ErrParseInvalidContextForWildcardInSelectList-268] - _ = x[ErrIncorrectSQLFunctionArgumentType-269] - _ = x[ErrValueParseFailure-270] - _ = x[ErrEvaluatorInvalidArguments-271] - _ = x[ErrIntegerOverflow-272] - _ = x[ErrLikeInvalidInputs-273] - _ = x[ErrCastFailed-274] - _ = x[ErrInvalidCast-275] - _ = x[ErrEvaluatorInvalidTimestampFormatPattern-276] - _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbolForParsing-277] - _ = x[ErrEvaluatorTimestampFormatPatternDuplicateFields-278] - _ = x[ErrEvaluatorTimestampFormatPatternHourClockAmPmMismatch-279] - _ = x[ErrEvaluatorUnterminatedTimestampFormatPatternToken-280] - _ = x[ErrEvaluatorInvalidTimestampFormatPatternToken-281] - _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbol-282] - _ = x[ErrEvaluatorBindingDoesNotExist-283] - _ = x[ErrMissingHeaders-284] - _ = x[ErrInvalidColumnIndex-285] - _ = x[ErrAdminConfigNotificationTargetsFailed-286] - _ = x[ErrAdminProfilerNotEnabled-287] - _ = x[ErrInvalidDecompressedSize-288] - _ = x[ErrAddUserInvalidArgument-289] - _ = x[ErrAdminResourceInvalidArgument-290] - _ = x[ErrAdminAccountNotEligible-291] - _ = x[ErrAccountNotEligible-292] - _ = x[ErrAdminServiceAccountNotFound-293] - _ = x[ErrPostPolicyConditionInvalidFormat-294] - _ = x[ErrInvalidChecksum-295] + _ = x[ErrAdminConfigInvalidIDPType-182] + _ = x[ErrAdminConfigLDAPValidation-183] + _ = x[ErrAdminCredentialsMismatch-184] + _ = x[ErrInsecureClientRequest-185] + _ = x[ErrObjectTampered-186] + _ = x[ErrSiteReplicationInvalidRequest-187] + _ = x[ErrSiteReplicationPeerResp-188] + _ = x[ErrSiteReplicationBackendIssue-189] + _ = x[ErrSiteReplicationServiceAccountError-190] + _ = x[ErrSiteReplicationBucketConfigError-191] + _ = x[ErrSiteReplicationBucketMetaError-192] + _ = x[ErrSiteReplicationIAMError-193] + _ = x[ErrSiteReplicationConfigMissing-194] + _ = x[ErrAdminBucketQuotaExceeded-195] + _ = x[ErrAdminNoSuchQuotaConfiguration-196] + _ = x[ErrHealNotImplemented-197] + _ = x[ErrHealNoSuchProcess-198] + _ = x[ErrHealInvalidClientToken-199] + _ = x[ErrHealMissingBucket-200] + _ = x[ErrHealAlreadyRunning-201] + _ = x[ErrHealOverlappingPaths-202] + _ = x[ErrIncorrectContinuationToken-203] + _ = x[ErrEmptyRequestBody-204] + _ = x[ErrUnsupportedFunction-205] + _ = x[ErrInvalidExpressionType-206] + _ = x[ErrBusy-207] + _ = x[ErrUnauthorizedAccess-208] + _ = x[ErrExpressionTooLong-209] + _ = x[ErrIllegalSQLFunctionArgument-210] + _ = x[ErrInvalidKeyPath-211] + _ = x[ErrInvalidCompressionFormat-212] + _ = x[ErrInvalidFileHeaderInfo-213] + _ = x[ErrInvalidJSONType-214] + _ = x[ErrInvalidQuoteFields-215] + _ = x[ErrInvalidRequestParameter-216] + _ = x[ErrInvalidDataType-217] + _ = x[ErrInvalidTextEncoding-218] + _ = x[ErrInvalidDataSource-219] + _ = x[ErrInvalidTableAlias-220] + _ = x[ErrMissingRequiredParameter-221] + _ = x[ErrObjectSerializationConflict-222] + _ = x[ErrUnsupportedSQLOperation-223] + _ = x[ErrUnsupportedSQLStructure-224] + _ = x[ErrUnsupportedSyntax-225] + _ = x[ErrUnsupportedRangeHeader-226] + _ = x[ErrLexerInvalidChar-227] + _ = x[ErrLexerInvalidOperator-228] + _ = x[ErrLexerInvalidLiteral-229] + _ = x[ErrLexerInvalidIONLiteral-230] + _ = x[ErrParseExpectedDatePart-231] + _ = x[ErrParseExpectedKeyword-232] + _ = x[ErrParseExpectedTokenType-233] + _ = x[ErrParseExpected2TokenTypes-234] + _ = x[ErrParseExpectedNumber-235] + _ = x[ErrParseExpectedRightParenBuiltinFunctionCall-236] + _ = x[ErrParseExpectedTypeName-237] + _ = x[ErrParseExpectedWhenClause-238] + _ = x[ErrParseUnsupportedToken-239] + _ = x[ErrParseUnsupportedLiteralsGroupBy-240] + _ = x[ErrParseExpectedMember-241] + _ = x[ErrParseUnsupportedSelect-242] + _ = x[ErrParseUnsupportedCase-243] + _ = x[ErrParseUnsupportedCaseClause-244] + _ = x[ErrParseUnsupportedAlias-245] + _ = x[ErrParseUnsupportedSyntax-246] + _ = x[ErrParseUnknownOperator-247] + _ = x[ErrParseMissingIdentAfterAt-248] + _ = x[ErrParseUnexpectedOperator-249] + _ = x[ErrParseUnexpectedTerm-250] + _ = x[ErrParseUnexpectedToken-251] + _ = x[ErrParseUnexpectedKeyword-252] + _ = x[ErrParseExpectedExpression-253] + _ = x[ErrParseExpectedLeftParenAfterCast-254] + _ = x[ErrParseExpectedLeftParenValueConstructor-255] + _ = x[ErrParseExpectedLeftParenBuiltinFunctionCall-256] + _ = x[ErrParseExpectedArgumentDelimiter-257] + _ = x[ErrParseCastArity-258] + _ = x[ErrParseInvalidTypeParam-259] + _ = x[ErrParseEmptySelect-260] + _ = x[ErrParseSelectMissingFrom-261] + _ = x[ErrParseExpectedIdentForGroupName-262] + _ = x[ErrParseExpectedIdentForAlias-263] + _ = x[ErrParseUnsupportedCallWithStar-264] + _ = x[ErrParseNonUnaryAgregateFunctionCall-265] + _ = x[ErrParseMalformedJoin-266] + _ = x[ErrParseExpectedIdentForAt-267] + _ = x[ErrParseAsteriskIsNotAloneInSelectList-268] + _ = x[ErrParseCannotMixSqbAndWildcardInSelectList-269] + _ = x[ErrParseInvalidContextForWildcardInSelectList-270] + _ = x[ErrIncorrectSQLFunctionArgumentType-271] + _ = x[ErrValueParseFailure-272] + _ = x[ErrEvaluatorInvalidArguments-273] + _ = x[ErrIntegerOverflow-274] + _ = x[ErrLikeInvalidInputs-275] + _ = x[ErrCastFailed-276] + _ = x[ErrInvalidCast-277] + _ = x[ErrEvaluatorInvalidTimestampFormatPattern-278] + _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbolForParsing-279] + _ = x[ErrEvaluatorTimestampFormatPatternDuplicateFields-280] + _ = x[ErrEvaluatorTimestampFormatPatternHourClockAmPmMismatch-281] + _ = x[ErrEvaluatorUnterminatedTimestampFormatPatternToken-282] + _ = x[ErrEvaluatorInvalidTimestampFormatPatternToken-283] + _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbol-284] + _ = x[ErrEvaluatorBindingDoesNotExist-285] + _ = x[ErrMissingHeaders-286] + _ = x[ErrInvalidColumnIndex-287] + _ = x[ErrAdminConfigNotificationTargetsFailed-288] + _ = x[ErrAdminProfilerNotEnabled-289] + _ = x[ErrInvalidDecompressedSize-290] + _ = x[ErrAddUserInvalidArgument-291] + _ = x[ErrAdminResourceInvalidArgument-292] + _ = x[ErrAdminAccountNotEligible-293] + _ = x[ErrAccountNotEligible-294] + _ = x[ErrAdminServiceAccountNotFound-295] + _ = x[ErrPostPolicyConditionInvalidFormat-296] + _ = x[ErrInvalidChecksum-297] } -const _APIErrorCode_name = "NoneAccessDeniedBadDigestEntityTooSmallEntityTooLargePolicyTooLargeIncompleteBodyInternalErrorInvalidAccessKeyIDAccessKeyDisabledInvalidBucketNameInvalidDigestInvalidRangeInvalidRangePartNumberInvalidCopyPartRangeInvalidCopyPartRangeSourceInvalidMaxKeysInvalidEncodingMethodInvalidMaxUploadsInvalidMaxPartsInvalidPartNumberMarkerInvalidPartNumberInvalidRequestBodyInvalidCopySourceInvalidMetadataDirectiveInvalidCopyDestInvalidPolicyDocumentInvalidObjectStateMalformedXMLMissingContentLengthMissingContentMD5MissingRequestBodyErrorMissingSecurityHeaderNoSuchBucketNoSuchBucketPolicyNoSuchBucketLifecycleNoSuchLifecycleConfigurationInvalidLifecycleWithObjectLockNoSuchBucketSSEConfigNoSuchCORSConfigurationNoSuchWebsiteConfigurationReplicationConfigurationNotFoundErrorRemoteDestinationNotFoundErrorReplicationDestinationMissingLockRemoteTargetNotFoundErrorReplicationRemoteConnectionErrorReplicationBandwidthLimitErrorBucketRemoteIdenticalToSourceBucketRemoteAlreadyExistsBucketRemoteLabelInUseBucketRemoteArnTypeInvalidBucketRemoteArnInvalidBucketRemoteRemoveDisallowedRemoteTargetNotVersionedErrorReplicationSourceNotVersionedErrorReplicationNeedsVersioningErrorReplicationBucketNeedsVersioningErrorReplicationDenyEditErrorReplicationNoExistingObjectsObjectRestoreAlreadyInProgressNoSuchKeyNoSuchUploadInvalidVersionIDNoSuchVersionNotImplementedPreconditionFailedRequestTimeTooSkewedSignatureDoesNotMatchMethodNotAllowedInvalidPartInvalidPartOrderAuthorizationHeaderMalformedMalformedPOSTRequestPOSTFileRequiredSignatureVersionNotSupportedBucketNotEmptyAllAccessDisabledMalformedPolicyMissingFieldsMissingCredTagCredMalformedInvalidRegionInvalidServiceS3InvalidServiceSTSInvalidRequestVersionMissingSignTagMissingSignHeadersTagMalformedDateMalformedPresignedDateMalformedCredentialDateMalformedCredentialRegionMalformedExpiresNegativeExpiresAuthHeaderEmptyExpiredPresignRequestRequestNotReadyYetUnsignedHeadersMissingDateHeaderInvalidQuerySignatureAlgoInvalidQueryParamsBucketAlreadyOwnedByYouInvalidDurationBucketAlreadyExistsTooManyBucketsMetadataTooLargeUnsupportedMetadataMaximumExpiresSlowDownInvalidPrefixMarkerBadRequestKeyTooLongErrorInvalidBucketObjectLockConfigurationObjectLockConfigurationNotFoundObjectLockConfigurationNotAllowedNoSuchObjectLockConfigurationObjectLockedInvalidRetentionDatePastObjectLockRetainDateUnknownWORMModeDirectiveBucketTaggingNotFoundObjectLockInvalidHeadersInvalidTagDirectiveInvalidEncryptionMethodInvalidEncryptionKeyIDInsecureSSECustomerRequestSSEMultipartEncryptedSSEEncryptedObjectInvalidEncryptionParametersInvalidSSECustomerAlgorithmInvalidSSECustomerKeyMissingSSECustomerKeyMissingSSECustomerKeyMD5SSECustomerKeyMD5MismatchInvalidSSECustomerParametersIncompatibleEncryptionMethodKMSNotConfiguredKMSKeyNotFoundExceptionNoAccessKeyInvalidTokenEventNotificationARNNotificationRegionNotificationOverlappingFilterNotificationFilterNameInvalidFilterNamePrefixFilterNameSuffixFilterValueInvalidOverlappingConfigsUnsupportedNotificationContentSHA256MismatchContentChecksumMismatchReadQuorumWriteQuorumStorageFullRequestBodyParseObjectExistsAsDirectoryInvalidObjectNameInvalidObjectNamePrefixSlashInvalidResourceNameServerNotInitializedOperationTimedOutClientDisconnectedOperationMaxedOutInvalidRequestTransitionStorageClassNotFoundErrorInvalidStorageClassBackendDownMalformedJSONAdminNoSuchUserAdminNoSuchGroupAdminGroupNotEmptyAdminNoSuchJobAdminNoSuchPolicyAdminInvalidArgumentAdminInvalidAccessKeyAdminInvalidSecretKeyAdminConfigNoQuorumAdminConfigTooLargeAdminConfigBadJSONAdminNoSuchConfigTargetAdminConfigEnvOverriddenAdminConfigDuplicateKeysAdminCredentialsMismatchInsecureClientRequestObjectTamperedSiteReplicationInvalidRequestSiteReplicationPeerRespSiteReplicationBackendIssueSiteReplicationServiceAccountErrorSiteReplicationBucketConfigErrorSiteReplicationBucketMetaErrorSiteReplicationIAMErrorSiteReplicationConfigMissingAdminBucketQuotaExceededAdminNoSuchQuotaConfigurationHealNotImplementedHealNoSuchProcessHealInvalidClientTokenHealMissingBucketHealAlreadyRunningHealOverlappingPathsIncorrectContinuationTokenEmptyRequestBodyUnsupportedFunctionInvalidExpressionTypeBusyUnauthorizedAccessExpressionTooLongIllegalSQLFunctionArgumentInvalidKeyPathInvalidCompressionFormatInvalidFileHeaderInfoInvalidJSONTypeInvalidQuoteFieldsInvalidRequestParameterInvalidDataTypeInvalidTextEncodingInvalidDataSourceInvalidTableAliasMissingRequiredParameterObjectSerializationConflictUnsupportedSQLOperationUnsupportedSQLStructureUnsupportedSyntaxUnsupportedRangeHeaderLexerInvalidCharLexerInvalidOperatorLexerInvalidLiteralLexerInvalidIONLiteralParseExpectedDatePartParseExpectedKeywordParseExpectedTokenTypeParseExpected2TokenTypesParseExpectedNumberParseExpectedRightParenBuiltinFunctionCallParseExpectedTypeNameParseExpectedWhenClauseParseUnsupportedTokenParseUnsupportedLiteralsGroupByParseExpectedMemberParseUnsupportedSelectParseUnsupportedCaseParseUnsupportedCaseClauseParseUnsupportedAliasParseUnsupportedSyntaxParseUnknownOperatorParseMissingIdentAfterAtParseUnexpectedOperatorParseUnexpectedTermParseUnexpectedTokenParseUnexpectedKeywordParseExpectedExpressionParseExpectedLeftParenAfterCastParseExpectedLeftParenValueConstructorParseExpectedLeftParenBuiltinFunctionCallParseExpectedArgumentDelimiterParseCastArityParseInvalidTypeParamParseEmptySelectParseSelectMissingFromParseExpectedIdentForGroupNameParseExpectedIdentForAliasParseUnsupportedCallWithStarParseNonUnaryAgregateFunctionCallParseMalformedJoinParseExpectedIdentForAtParseAsteriskIsNotAloneInSelectListParseCannotMixSqbAndWildcardInSelectListParseInvalidContextForWildcardInSelectListIncorrectSQLFunctionArgumentTypeValueParseFailureEvaluatorInvalidArgumentsIntegerOverflowLikeInvalidInputsCastFailedInvalidCastEvaluatorInvalidTimestampFormatPatternEvaluatorInvalidTimestampFormatPatternSymbolForParsingEvaluatorTimestampFormatPatternDuplicateFieldsEvaluatorTimestampFormatPatternHourClockAmPmMismatchEvaluatorUnterminatedTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternSymbolEvaluatorBindingDoesNotExistMissingHeadersInvalidColumnIndexAdminConfigNotificationTargetsFailedAdminProfilerNotEnabledInvalidDecompressedSizeAddUserInvalidArgumentAdminResourceInvalidArgumentAdminAccountNotEligibleAccountNotEligibleAdminServiceAccountNotFoundPostPolicyConditionInvalidFormatInvalidChecksum" +const _APIErrorCode_name = "NoneAccessDeniedBadDigestEntityTooSmallEntityTooLargePolicyTooLargeIncompleteBodyInternalErrorInvalidAccessKeyIDAccessKeyDisabledInvalidBucketNameInvalidDigestInvalidRangeInvalidRangePartNumberInvalidCopyPartRangeInvalidCopyPartRangeSourceInvalidMaxKeysInvalidEncodingMethodInvalidMaxUploadsInvalidMaxPartsInvalidPartNumberMarkerInvalidPartNumberInvalidRequestBodyInvalidCopySourceInvalidMetadataDirectiveInvalidCopyDestInvalidPolicyDocumentInvalidObjectStateMalformedXMLMissingContentLengthMissingContentMD5MissingRequestBodyErrorMissingSecurityHeaderNoSuchBucketNoSuchBucketPolicyNoSuchBucketLifecycleNoSuchLifecycleConfigurationInvalidLifecycleWithObjectLockNoSuchBucketSSEConfigNoSuchCORSConfigurationNoSuchWebsiteConfigurationReplicationConfigurationNotFoundErrorRemoteDestinationNotFoundErrorReplicationDestinationMissingLockRemoteTargetNotFoundErrorReplicationRemoteConnectionErrorReplicationBandwidthLimitErrorBucketRemoteIdenticalToSourceBucketRemoteAlreadyExistsBucketRemoteLabelInUseBucketRemoteArnTypeInvalidBucketRemoteArnInvalidBucketRemoteRemoveDisallowedRemoteTargetNotVersionedErrorReplicationSourceNotVersionedErrorReplicationNeedsVersioningErrorReplicationBucketNeedsVersioningErrorReplicationDenyEditErrorReplicationNoExistingObjectsObjectRestoreAlreadyInProgressNoSuchKeyNoSuchUploadInvalidVersionIDNoSuchVersionNotImplementedPreconditionFailedRequestTimeTooSkewedSignatureDoesNotMatchMethodNotAllowedInvalidPartInvalidPartOrderAuthorizationHeaderMalformedMalformedPOSTRequestPOSTFileRequiredSignatureVersionNotSupportedBucketNotEmptyAllAccessDisabledMalformedPolicyMissingFieldsMissingCredTagCredMalformedInvalidRegionInvalidServiceS3InvalidServiceSTSInvalidRequestVersionMissingSignTagMissingSignHeadersTagMalformedDateMalformedPresignedDateMalformedCredentialDateMalformedCredentialRegionMalformedExpiresNegativeExpiresAuthHeaderEmptyExpiredPresignRequestRequestNotReadyYetUnsignedHeadersMissingDateHeaderInvalidQuerySignatureAlgoInvalidQueryParamsBucketAlreadyOwnedByYouInvalidDurationBucketAlreadyExistsTooManyBucketsMetadataTooLargeUnsupportedMetadataMaximumExpiresSlowDownInvalidPrefixMarkerBadRequestKeyTooLongErrorInvalidBucketObjectLockConfigurationObjectLockConfigurationNotFoundObjectLockConfigurationNotAllowedNoSuchObjectLockConfigurationObjectLockedInvalidRetentionDatePastObjectLockRetainDateUnknownWORMModeDirectiveBucketTaggingNotFoundObjectLockInvalidHeadersInvalidTagDirectiveInvalidEncryptionMethodInvalidEncryptionKeyIDInsecureSSECustomerRequestSSEMultipartEncryptedSSEEncryptedObjectInvalidEncryptionParametersInvalidSSECustomerAlgorithmInvalidSSECustomerKeyMissingSSECustomerKeyMissingSSECustomerKeyMD5SSECustomerKeyMD5MismatchInvalidSSECustomerParametersIncompatibleEncryptionMethodKMSNotConfiguredKMSKeyNotFoundExceptionNoAccessKeyInvalidTokenEventNotificationARNNotificationRegionNotificationOverlappingFilterNotificationFilterNameInvalidFilterNamePrefixFilterNameSuffixFilterValueInvalidOverlappingConfigsUnsupportedNotificationContentSHA256MismatchContentChecksumMismatchReadQuorumWriteQuorumStorageFullRequestBodyParseObjectExistsAsDirectoryInvalidObjectNameInvalidObjectNamePrefixSlashInvalidResourceNameServerNotInitializedOperationTimedOutClientDisconnectedOperationMaxedOutInvalidRequestTransitionStorageClassNotFoundErrorInvalidStorageClassBackendDownMalformedJSONAdminNoSuchUserAdminNoSuchGroupAdminGroupNotEmptyAdminNoSuchJobAdminNoSuchPolicyAdminInvalidArgumentAdminInvalidAccessKeyAdminInvalidSecretKeyAdminConfigNoQuorumAdminConfigTooLargeAdminConfigBadJSONAdminNoSuchConfigTargetAdminConfigEnvOverriddenAdminConfigDuplicateKeysAdminConfigInvalidIDPTypeAdminConfigLDAPValidationAdminCredentialsMismatchInsecureClientRequestObjectTamperedSiteReplicationInvalidRequestSiteReplicationPeerRespSiteReplicationBackendIssueSiteReplicationServiceAccountErrorSiteReplicationBucketConfigErrorSiteReplicationBucketMetaErrorSiteReplicationIAMErrorSiteReplicationConfigMissingAdminBucketQuotaExceededAdminNoSuchQuotaConfigurationHealNotImplementedHealNoSuchProcessHealInvalidClientTokenHealMissingBucketHealAlreadyRunningHealOverlappingPathsIncorrectContinuationTokenEmptyRequestBodyUnsupportedFunctionInvalidExpressionTypeBusyUnauthorizedAccessExpressionTooLongIllegalSQLFunctionArgumentInvalidKeyPathInvalidCompressionFormatInvalidFileHeaderInfoInvalidJSONTypeInvalidQuoteFieldsInvalidRequestParameterInvalidDataTypeInvalidTextEncodingInvalidDataSourceInvalidTableAliasMissingRequiredParameterObjectSerializationConflictUnsupportedSQLOperationUnsupportedSQLStructureUnsupportedSyntaxUnsupportedRangeHeaderLexerInvalidCharLexerInvalidOperatorLexerInvalidLiteralLexerInvalidIONLiteralParseExpectedDatePartParseExpectedKeywordParseExpectedTokenTypeParseExpected2TokenTypesParseExpectedNumberParseExpectedRightParenBuiltinFunctionCallParseExpectedTypeNameParseExpectedWhenClauseParseUnsupportedTokenParseUnsupportedLiteralsGroupByParseExpectedMemberParseUnsupportedSelectParseUnsupportedCaseParseUnsupportedCaseClauseParseUnsupportedAliasParseUnsupportedSyntaxParseUnknownOperatorParseMissingIdentAfterAtParseUnexpectedOperatorParseUnexpectedTermParseUnexpectedTokenParseUnexpectedKeywordParseExpectedExpressionParseExpectedLeftParenAfterCastParseExpectedLeftParenValueConstructorParseExpectedLeftParenBuiltinFunctionCallParseExpectedArgumentDelimiterParseCastArityParseInvalidTypeParamParseEmptySelectParseSelectMissingFromParseExpectedIdentForGroupNameParseExpectedIdentForAliasParseUnsupportedCallWithStarParseNonUnaryAgregateFunctionCallParseMalformedJoinParseExpectedIdentForAtParseAsteriskIsNotAloneInSelectListParseCannotMixSqbAndWildcardInSelectListParseInvalidContextForWildcardInSelectListIncorrectSQLFunctionArgumentTypeValueParseFailureEvaluatorInvalidArgumentsIntegerOverflowLikeInvalidInputsCastFailedInvalidCastEvaluatorInvalidTimestampFormatPatternEvaluatorInvalidTimestampFormatPatternSymbolForParsingEvaluatorTimestampFormatPatternDuplicateFieldsEvaluatorTimestampFormatPatternHourClockAmPmMismatchEvaluatorUnterminatedTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternSymbolEvaluatorBindingDoesNotExistMissingHeadersInvalidColumnIndexAdminConfigNotificationTargetsFailedAdminProfilerNotEnabledInvalidDecompressedSizeAddUserInvalidArgumentAdminResourceInvalidArgumentAdminAccountNotEligibleAccountNotEligibleAdminServiceAccountNotFoundPostPolicyConditionInvalidFormatInvalidChecksum" -var _APIErrorCode_index = [...]uint16{0, 4, 16, 25, 39, 53, 67, 81, 94, 112, 129, 146, 159, 171, 193, 213, 239, 253, 274, 291, 306, 329, 346, 364, 381, 405, 420, 441, 459, 471, 491, 508, 531, 552, 564, 582, 603, 631, 661, 682, 705, 731, 768, 798, 831, 856, 888, 918, 947, 972, 994, 1020, 1042, 1070, 1099, 1133, 1164, 1201, 1225, 1253, 1283, 1292, 1304, 1320, 1333, 1347, 1365, 1385, 1406, 1422, 1433, 1449, 1477, 1497, 1513, 1541, 1555, 1572, 1587, 1600, 1614, 1627, 1640, 1656, 1673, 1694, 1708, 1729, 1742, 1764, 1787, 1812, 1828, 1843, 1858, 1879, 1897, 1912, 1929, 1954, 1972, 1995, 2010, 2029, 2043, 2059, 2078, 2092, 2100, 2119, 2129, 2144, 2180, 2211, 2244, 2273, 2285, 2305, 2329, 2353, 2374, 2398, 2417, 2440, 2462, 2488, 2509, 2527, 2554, 2581, 2602, 2623, 2647, 2672, 2700, 2728, 2744, 2767, 2778, 2790, 2807, 2822, 2840, 2869, 2886, 2902, 2918, 2936, 2954, 2977, 2998, 3021, 3031, 3042, 3053, 3069, 3092, 3109, 3137, 3156, 3176, 3193, 3211, 3228, 3242, 3277, 3296, 3307, 3320, 3335, 3351, 3369, 3383, 3400, 3420, 3441, 3462, 3481, 3500, 3518, 3541, 3565, 3589, 3613, 3634, 3648, 3677, 3700, 3727, 3761, 3793, 3823, 3846, 3874, 3898, 3927, 3945, 3962, 3984, 4001, 4019, 4039, 4065, 4081, 4100, 4121, 4125, 4143, 4160, 4186, 4200, 4224, 4245, 4260, 4278, 4301, 4316, 4335, 4352, 4369, 4393, 4420, 4443, 4466, 4483, 4505, 4521, 4541, 4560, 4582, 4603, 4623, 4645, 4669, 4688, 4730, 4751, 4774, 4795, 4826, 4845, 4867, 4887, 4913, 4934, 4956, 4976, 5000, 5023, 5042, 5062, 5084, 5107, 5138, 5176, 5217, 5247, 5261, 5282, 5298, 5320, 5350, 5376, 5404, 5437, 5455, 5478, 5513, 5553, 5595, 5627, 5644, 5669, 5684, 5701, 5711, 5722, 5760, 5814, 5860, 5912, 5960, 6003, 6047, 6075, 6089, 6107, 6143, 6166, 6189, 6211, 6239, 6262, 6280, 6307, 6339, 6354} +var _APIErrorCode_index = [...]uint16{0, 4, 16, 25, 39, 53, 67, 81, 94, 112, 129, 146, 159, 171, 193, 213, 239, 253, 274, 291, 306, 329, 346, 364, 381, 405, 420, 441, 459, 471, 491, 508, 531, 552, 564, 582, 603, 631, 661, 682, 705, 731, 768, 798, 831, 856, 888, 918, 947, 972, 994, 1020, 1042, 1070, 1099, 1133, 1164, 1201, 1225, 1253, 1283, 1292, 1304, 1320, 1333, 1347, 1365, 1385, 1406, 1422, 1433, 1449, 1477, 1497, 1513, 1541, 1555, 1572, 1587, 1600, 1614, 1627, 1640, 1656, 1673, 1694, 1708, 1729, 1742, 1764, 1787, 1812, 1828, 1843, 1858, 1879, 1897, 1912, 1929, 1954, 1972, 1995, 2010, 2029, 2043, 2059, 2078, 2092, 2100, 2119, 2129, 2144, 2180, 2211, 2244, 2273, 2285, 2305, 2329, 2353, 2374, 2398, 2417, 2440, 2462, 2488, 2509, 2527, 2554, 2581, 2602, 2623, 2647, 2672, 2700, 2728, 2744, 2767, 2778, 2790, 2807, 2822, 2840, 2869, 2886, 2902, 2918, 2936, 2954, 2977, 2998, 3021, 3031, 3042, 3053, 3069, 3092, 3109, 3137, 3156, 3176, 3193, 3211, 3228, 3242, 3277, 3296, 3307, 3320, 3335, 3351, 3369, 3383, 3400, 3420, 3441, 3462, 3481, 3500, 3518, 3541, 3565, 3589, 3614, 3639, 3663, 3684, 3698, 3727, 3750, 3777, 3811, 3843, 3873, 3896, 3924, 3948, 3977, 3995, 4012, 4034, 4051, 4069, 4089, 4115, 4131, 4150, 4171, 4175, 4193, 4210, 4236, 4250, 4274, 4295, 4310, 4328, 4351, 4366, 4385, 4402, 4419, 4443, 4470, 4493, 4516, 4533, 4555, 4571, 4591, 4610, 4632, 4653, 4673, 4695, 4719, 4738, 4780, 4801, 4824, 4845, 4876, 4895, 4917, 4937, 4963, 4984, 5006, 5026, 5050, 5073, 5092, 5112, 5134, 5157, 5188, 5226, 5267, 5297, 5311, 5332, 5348, 5370, 5400, 5426, 5454, 5487, 5505, 5528, 5563, 5603, 5645, 5677, 5694, 5719, 5734, 5751, 5761, 5772, 5810, 5864, 5910, 5962, 6010, 6053, 6097, 6125, 6139, 6157, 6193, 6216, 6239, 6261, 6289, 6312, 6330, 6357, 6389, 6404} func (i APIErrorCode) String() string { if i < 0 || i >= APIErrorCode(len(_APIErrorCode_index)-1) { diff --git a/go.mod b/go.mod index 3e150d048..73d87fb6b 100644 --- a/go.mod +++ b/go.mod @@ -48,7 +48,7 @@ require ( github.com/minio/dperf v0.4.2 github.com/minio/highwayhash v1.0.2 github.com/minio/kes v0.21.0 - github.com/minio/madmin-go v1.6.3 + github.com/minio/madmin-go v1.6.5 github.com/minio/minio-go/v7 v7.0.41-0.20221013203648-8257e7003b5e github.com/minio/pkg v1.5.2 github.com/minio/selfupdate v0.5.0 diff --git a/go.sum b/go.sum index a8546da5f..6c3415953 100644 --- a/go.sum +++ b/go.sum @@ -651,8 +651,8 @@ github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLT github.com/minio/kes v0.21.0 h1:Xe0vNRyBgC35TZkbOnU4hAgJRBEaFcT6KiI9/29BdUo= github.com/minio/kes v0.21.0/go.mod h1:3FW1BQkMGQW78yhy+69tUq5bdcf5rnXJizyeKB9a/tc= github.com/minio/madmin-go v1.3.5/go.mod h1:vGKGboQgGIWx4DuDUaXixjlIEZOCIp6ivJkQoiVaACc= -github.com/minio/madmin-go v1.6.3 h1:JNF1NqS0EfDzGmNaKTLYnJhT7b/35+JpBSburE/u1q8= -github.com/minio/madmin-go v1.6.3/go.mod h1:FVl1TS8T79779KZEboPHL5byffHJ6DyrAAavqgsG6UQ= +github.com/minio/madmin-go v1.6.5 h1:7+KR/BIhIJw8xKwLdFfrjd+VONrmRZn32zJUU4Ukff4= +github.com/minio/madmin-go v1.6.5/go.mod h1:FVl1TS8T79779KZEboPHL5byffHJ6DyrAAavqgsG6UQ= github.com/minio/mc v0.0.0-20221007160339-ec8687d57e36 h1:PZBesSP8+opPLIEtQVfFKM4kKCOP68vNXws5nsXZG44= github.com/minio/mc v0.0.0-20221007160339-ec8687d57e36/go.mod h1:pE0JlsioQpQKBFZf9dRO0V06t0jXhBuHR5p+rFxA2i8= github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= diff --git a/internal/config/identity/ldap/config.go b/internal/config/identity/ldap/config.go index 1f48cf377..a62f5fbfa 100644 --- a/internal/config/identity/ldap/config.go +++ b/internal/config/identity/ldap/config.go @@ -19,8 +19,11 @@ package ldap import ( "crypto/x509" + "errors" + "sort" "time" + "github.com/minio/madmin-go" "github.com/minio/minio/internal/config" "github.com/minio/pkg/ldap" ) @@ -216,3 +219,61 @@ func Lookup(s config.Config, rootCAs *x509.CertPool) (l Config, err error) { return l, nil } + +// GetConfigList - returns a list of LDAP configurations. +func (l *Config) GetConfigList(s config.Config) ([]madmin.IDPListItem, error) { + ldapConfigs, err := s.GetAvailableTargets(config.IdentityLDAPSubSys) + if err != nil { + return nil, err + } + + // For now, ldapConfigs will only have a single entry for the default + // configuration. + + var res []madmin.IDPListItem + for _, cfg := range ldapConfigs { + res = append(res, madmin.IDPListItem{ + Type: "ldap", + Name: cfg, + Enabled: l.Enabled(), + }) + } + + return res, nil +} + +// ErrProviderConfigNotFound - represents a non-existing provider error. +var ErrProviderConfigNotFound = errors.New("provider configuration not found") + +// GetConfigInfo - returns config details for an LDAP configuration. +func (l *Config) GetConfigInfo(s config.Config, cfgName string) ([]madmin.IDPCfgInfo, error) { + // For now only a single LDAP config is supported. + if cfgName != madmin.Default { + return nil, ErrProviderConfigNotFound + } + kvsrcs, err := s.GetResolvedConfigParams(config.IdentityLDAPSubSys, cfgName) + if err != nil { + return nil, err + } + + res := make([]madmin.IDPCfgInfo, 0, len(kvsrcs)) + for _, kvsrc := range kvsrcs { + // skip default values. + if kvsrc.Src == config.ValueSourceDef { + continue + } + res = append(res, madmin.IDPCfgInfo{ + Key: kvsrc.Key, + Value: kvsrc.Value, + IsCfg: true, + IsEnv: kvsrc.Src == config.ValueSourceEnv, + }) + } + + // sort the structs by the key + sort.Slice(res, func(i, j int) bool { + return res[i].Key < res[j].Key + }) + + return res, nil +}