From f878d609794c9d166ecb763ebfea89e954c704fb Mon Sep 17 00:00:00 2001 From: Clark Boylan Date: Tue, 16 Nov 2021 14:35:44 -0800 Subject: [PATCH] Retire this repository as it has moved This project is no longer developed on opendev and has moved to github. Perform project retirement to clean up the opendev content. In particular we want to remove zuul configs that have errors, but also give people hints to the current code repository. Depends-On: https://review.opendev.org/c/openstack/project-config/+/818170 Change-Id: Icd4d25d60d96d57eb99f1bcb4055a7bb4ae10b30 --- .babelrc | 17 - .env.example | 82 - .gitattributes | 3 - .gitignore | 44 - .gitreview | 2 +- .zuul.yaml | 46 - CONTRIBUTING.md | 3 - app/Console/Commands/CleanOAuth2StaleData.php | 66 - app/Console/Commands/CleanOpenIdStaleData.php | 85 - app/Console/Commands/CreateSuperAdmin.php | 85 - .../Commands/SpammerProcess/.gitignore | 4 - app/Console/Commands/SpammerProcess/README.md | 19 - .../RebuildUserSpammerEstimator.php | 94 - .../SpammerProcess/UserSpammerProcessor.php | 138 - .../SpammerProcess/estimator_build.py | 36 - .../SpammerProcess/estimator_build.sh | 31 - .../SpammerProcess/estimator_process.py | 41 - .../SpammerProcess/estimator_process.sh | 31 - .../Commands/SpammerProcess/requirements.txt | 27 - app/Console/Kernel.php | 50 - app/Events/Event.php | 8 - app/Events/OAuth2ClientLocked.php | 44 - app/Events/UserActivated.php | 19 - app/Events/UserCreated.php | 20 - app/Events/UserDeactivated.php | 19 - app/Events/UserEmailUpdated.php | 18 - app/Events/UserEmailVerified.php | 18 - app/Events/UserEvent.php | 44 - app/Events/UserLocked.php | 18 - .../UserPasswordResetRequestCreated.php | 18 - app/Events/UserPasswordResetSuccessful.php | 18 - app/Events/UserSpamStateUpdated.php | 22 - app/Exceptions/Handler.php | 64 - app/Http/Controllers/AdminController.php | 656 - .../Controllers/Api/APICRUDController.php | 249 - .../Controllers/Api/ApiBannedIPController.php | 133 - app/Http/Controllers/Api/ApiController.php | 133 - .../Controllers/Api/ApiEndpointController.php | 185 - .../Api/ApiResourceServerController.php | 138 - .../Controllers/Api/ApiScopeController.php | 140 - .../Api/ApiScopeGroupController.php | 123 - .../Api/AsymmetricKeyApiController.php | 63 - .../Controllers/Api/ClientApiController.php | 695 - .../Api/ClientPublicKeyApiController.php | 95 - .../Controllers/Api/GroupApiController.php | 271 - app/Http/Controllers/Api/JsonController.php | 103 - .../OAuth2/OAuth2DisqusSSOApiController.php | 66 - .../Api/OAuth2/OAuth2ProtectedController.php | 48 - .../OAuth2RocketChatSSOApiController.php | 65 - .../OAuth2StreamChatSSOApiController.php | 66 - .../Api/OAuth2/OAuth2UserApiController.php | 284 - ...h2UserRegistrationRequestApiController.php | 97 - .../Api/ServerPrivateKeyApiController.php | 55 - .../Controllers/Api/UserApiController.php | 270 - .../Auth/EmailVerificationController.php | 114 - .../Auth/ForgotPasswordController.php | 170 - .../Auth/PasswordSetController.php | 216 - .../Controllers/Auth/RegisterController.php | 263 - .../Auth/ResetPasswordController.php | 148 - app/Http/Controllers/Controller.php | 25 - .../Factories/UserValidationRulesFactory.php | 111 - app/Http/Controllers/HomeController.php | 47 - .../OAuth2/OAuth2ProviderController.php | 294 - .../OpenId/DiscoveryController.php | 88 - .../Controllers/OpenId/OpenIdController.php | 39 - .../OpenId/OpenIdProviderController.php | 105 - app/Http/Controllers/Traits/GetAllTrait.php | 140 - app/Http/Controllers/UserController.php | 472 - app/Http/Kernel.php | 80 - app/Http/Middleware/Authenticate.php | 49 - app/Http/Middleware/CORSMiddleware.php | 381 - .../Middleware/CORSRequestPreflightData.php | 82 - .../Middleware/CORSRequestPreflightType.php | 36 - .../Middleware/CheckForMaintenanceMode.php | 17 - ...esSameSiteNoneKnownIncompatibleClients.php | 65 - .../CurrentUserCanEditOAuth2Client.php | 81 - .../CurrentUserIsOAuth2ServerAdmin.php | 44 - .../CurrentUserIsOAuth2ServerAdminJson.php | 45 - .../CurrentUserIsOpenIdServerAdmin.php | 44 - .../CurrentUserIsOpenIdServerAdminJson.php | 44 - .../CurrentUserOwnsOAuth2Client.php | 80 - app/Http/Middleware/ETagsMiddleware.php | 51 - app/Http/Middleware/EncryptCookies.php | 59 - ...Auth2BearerAccessTokenRequestValidator.php | 350 - ...ltipartFormDataInputForNonPostRequests.php | 56 - .../Middleware/RedirectIfAuthenticated.php | 38 - app/Http/Middleware/SSLMiddleware.php | 33 - .../SecurityHTTPHeadersWriterMiddleware.php | 51 - app/Http/Middleware/SingleAccessPoint.php | 49 - app/Http/Middleware/TrimStrings.php | 18 - app/Http/Middleware/TrustProxies.php | 23 - app/Http/Middleware/VerifyCsrfToken.php | 17 - app/Http/Middleware/cors_server_flowchart.png | Bin 99960 -> 0 bytes app/Http/Requests/Request.php | 10 - app/Http/Utils/CookieSameSitePolicy.php | 164 - app/Http/Utils/CountryList.php | 37 - app/Http/Utils/DateUtils.php | 32 - app/Http/Utils/FileTypes.php | 24 - app/Http/Utils/FileUploader.php | 79 - .../Utils/FilterAvailableSummitsStrategy.php | 34 - .../Utils/Filters/AbstractFilterElement.php | 36 - .../Filters/DoctrineCaseFilterMapping.php | 57 - .../Utils/Filters/DoctrineFilterMapping.php | 90 - .../DoctrineInstanceOfFilterMapping.php | 66 - .../Filters/DoctrineJoinFilterMapping.php | 105 - .../Filters/DoctrineLeftJoinFilterMapping.php | 81 - .../Filters/DoctrineSwitchFilterMapping.php | 63 - app/Http/Utils/Filters/Filter.php | 452 - app/Http/Utils/Filters/FilterElement.php | 106 - app/Http/Utils/Filters/FilterMapping.php | 48 - app/Http/Utils/Filters/FilterParser.php | 133 - .../Utils/Filters/FilterParserException.php | 26 - app/Http/Utils/HTMLCleaner.php | 39 - app/Http/Utils/IBucket.php | 30 - app/Http/Utils/IFileUploader.php | 30 - app/Http/Utils/IUserIPHelperProvider.php | 22 - app/Http/Utils/Log/LaravelMailerHandler.php | 210 - app/Http/Utils/Order.php | 90 - app/Http/Utils/OrderElement.php | 72 - app/Http/Utils/OrderParser.php | 60 - app/Http/Utils/OrderParserException.php | 24 - app/Http/Utils/PagingConstants.php | 23 - app/Http/Utils/PagingInfo.php | 67 - app/Http/Utils/PagingResponse.php | 129 - .../ParseMultiPartFormDataInputStream.php | 375 - app/Http/Utils/SwiftBucket.php | 102 - app/Http/Utils/UserIPHelperProvider.php | 26 - app/Http/Utils/UtilsProvider.php | 35 - app/Http/routes.php | 424 - app/Jobs/Job.php | 21 - app/Jobs/PublishUserCreated.php | 56 - app/Jobs/PublishUserDeleted.php | 55 - app/Jobs/PublishUserUpdated.php | 55 - app/Listeners/.gitkeep | 1 - app/Mail/OAuth2ClientLocked.php | 82 - app/Mail/UserEmailVerificationRequest.php | 85 - app/Mail/UserEmailVerificationSuccess.php | 67 - app/Mail/UserLockedEmail.php | 83 - app/Mail/UserPasswordResetMail.php | 68 - app/Mail/UserPasswordResetRequestMail.php | 76 - app/Mail/UserSpammerProcessorResultsEmail.php | 55 - app/Mail/WelcomeNewUserEmail.php | 88 - app/ModelSerializers/AbstractSerializer.php | 221 - app/ModelSerializers/Auth/GroupSerializer.php | 27 - .../UserRegistrationRequestSerializer.php | 47 - app/ModelSerializers/Auth/UserSerializer.php | 77 - app/ModelSerializers/BaseSerializer.php | 26 - app/ModelSerializers/IModelSerializer.php | 30 - .../OAuth2/AccessTokenSerializer.php | 50 - .../OAuth2/ApiEndpointSerializer.php | 86 - .../OAuth2/ApiScopeGroupSerializer.php | 94 - .../OAuth2/ApiScopeSerializer.php | 85 - app/ModelSerializers/OAuth2/ApiSerializer.php | 103 - .../OAuth2/AsymmetricKeySerializer.php | 35 - .../OAuth2/ClientPublicKeySerializer.php | 18 - .../OAuth2/ClientSerializer.php | 55 - .../OAuth2/RefreshTokenSerializer.php | 51 - .../OAuth2/ResourceServerSerializer.php | 90 - .../OAuth2/ServerPrivateKeySerializer.php | 22 - app/ModelSerializers/SerializerRegistry.php | 124 - app/Models/BannedIP.php | 146 - .../Exceptions/EntityNotFoundException.php | 22 - app/Models/Exceptions/ValidationException.php | 43 - .../Factories/ServerConfigurationFactory.php | 45 - app/Models/OAuth2/AccessToken.php | 348 - app/Models/OAuth2/Api.php | 217 - app/Models/OAuth2/ApiEndpoint.php | 342 - app/Models/OAuth2/ApiScope.php | 286 - app/Models/OAuth2/ApiScopeGroup.php | 190 - app/Models/OAuth2/AsymmetricKey.php | 328 - app/Models/OAuth2/Client.php | 1606 --- app/Models/OAuth2/ClientPublicKey.php | 108 - .../OAuth2/Factories/ApiEndpointFactory.php | 57 - app/Models/OAuth2/Factories/ApiFactory.php | 54 - .../OAuth2/Factories/ApiScopeFactory.php | 69 - .../OAuth2/Factories/ApiScopeGroupFactory.php | 43 - app/Models/OAuth2/Factories/ClientFactory.php | 217 - .../Factories/ResourceServerFactory.php | 45 - app/Models/OAuth2/OAuth2TrailException.php | 99 - app/Models/OAuth2/RefreshToken.php | 314 - app/Models/OAuth2/ResourceServer.php | 215 - app/Models/OAuth2/ServerPrivateKey.php | 153 - app/Models/OAuth2/UserConsent.php | 111 - .../Factories/OpenIdTrustedSiteFactory.php | 45 - .../Factories/ServerExtensionFactory.php | 49 - app/Models/OpenId/OpenIdAssociation.php | 228 - app/Models/OpenId/OpenIdTrustedSite.php | 154 - app/Models/OpenId/ServerExtension.php | 166 - .../IDisqusSSOProfileRepository.php | 24 - .../IRocketChatSSOProfileRepository.php | 23 - .../IStreamChatSSOProfileRepository.php | 23 - app/Models/SSO/Disqus/DisqusSSOProfile.php | 91 - app/Models/SSO/Disqus/DisqusUserProfile.php | 110 - .../SSO/RocketChat/RocketChatSSOProfile.php | 91 - .../SSO/RocketChat/RocketChatUserProfile.php | 41 - .../SSO/StreamChat/StreamChatSSOProfile.php | 90 - .../SSO/StreamChat/StreamChatUserProfile.php | 85 - app/Models/ServerConfiguration.php | 75 - app/Models/UserAction.php | 120 - app/Models/UserExceptionTrail.php | 120 - app/Models/Utils/BaseEntity.php | 164 - app/Models/Utils/IBaseRepository.php | 55 - app/Models/Utils/IEntity.php | 29 - app/Models/Utils/IntervalParser.php | 50 - .../Utils/MySQLExtensionsServiceProvider.php | 47 - app/Models/Utils/PreRemoveEventArgs.php | 42 - app/Models/Utils/RandomGenerator.php | 84 - app/Models/Utils/SilverstripeBaseModel.php | 156 - app/Models/Utils/TimeZoneEntity.php | 94 - app/Models/Utils/UTCTimestamp.php | 35 - app/Models/WhiteListedIP.php | 55 - app/Policies/.gitkeep | 1 - app/Providers/AppServiceProvider.php | 120 - app/Providers/AuthServiceProvider.php | 57 - app/Providers/EventServiceProvider.php | 169 - ...entAuthContextValidatorFactoryProvider.php | 50 - app/Providers/RouteServiceProvider.php | 53 - .../AbstractDoctrineOAuth2TokenRepository.php | 102 - .../DoctrineAccessTokenRepository.php | 68 - .../DoctrineApiEndpointRepository.php | 103 - app/Repositories/DoctrineApiRepository.php | 92 - .../DoctrineApiScopeGroupRepository.php | 42 - .../DoctrineApiScopeRepository.php | 176 - .../DoctrineAsymmetricKeyRepository.php | 142 - .../DoctrineBannedIPRepository.php | 44 - .../DoctrineClientPublicKeyRepository.php | 33 - .../DoctrineDisqusSSOProfileRepository.php | 42 - app/Repositories/DoctrineGroupRepository.php | 86 - .../DoctrineOAuth2ClientRepository.php | 154 - ...DoctrineOAuth2TrailExceptionRepository.php | 58 - .../DoctrineOpenIdAssociationRepository.php | 43 - .../DoctrineOpenIdTrustedSiteRepository.php | 69 - .../DoctrineRefreshTokenRepository.php | 65 - app/Repositories/DoctrineRepository.php | 312 - .../DoctrineResourceServerRepository.php | 106 - ...DoctrineRocketChatSSOProfileRepository.php | 42 - .../DoctrineServerConfigurationRepository.php | 40 - .../DoctrineServerExtensionRepository.php | 43 - .../DoctrineServerPrivateKeyRepository.php | 40 - .../DoctrineSpamEstimatorFeedRepository.php | 46 - ...DoctrineStreamChatSSOProfileRepository.php | 42 - .../DoctrineUserExceptionTrailRepository.php | 57 - ...rineUserPasswordResetRequestRepository.php | 42 - ...trineUserRegistrationRequestRepository.php | 52 - app/Repositories/DoctrineUserRepository.php | 126 - .../DoctrineWhiteListedIPRepository.php | 42 - .../IServerConfigurationRepository.php | 27 - .../IServerExtensionRepository.php | 26 - app/Repositories/ModelDoctrineRepository.php | 71 - app/Repositories/RepositoriesProvider.php | 290 - app/Services/AbstractService.php | 34 - app/Services/Apis/IRocketChatAPI.php | 33 - app/Services/Apis/RocketChatAPI.php | 89 - app/Services/Auth/DisqusSSOService.php | 122 - app/Services/Auth/GroupService.php | 193 - app/Services/Auth/IDisqusSSOService.php | 31 - app/Services/Auth/IGroupService.php | 38 - app/Services/Auth/IRocketChatSSOService.php | 29 - app/Services/Auth/IStreamChatSSOService.php | 28 - app/Services/Auth/IUserService.php | 108 - app/Services/Auth/RocketChatSSOService.php | 136 - app/Services/Auth/StreamChatSSOService.php | 143 - app/Services/Auth/UserService.php | 444 - app/Services/Facades/ExternalUrlService.php | 27 - .../Facades/ServerConfigurationService.php | 26 - app/Services/IBaseService.php | 47 - app/Services/IUserActionService.php | 35 - app/Services/OAuth2/ApiEndpointService.php | 236 - app/Services/OAuth2/ApiScopeGroupService.php | 192 - app/Services/OAuth2/ApiScopeService.php | 164 - app/Services/OAuth2/ApiService.php | 115 - app/Services/OAuth2/AsymmetricKeyService.php | 85 - .../OAuth2/ClientCredentialGenerator.php | 49 - .../OAuth2/ClientPublicKeyService.php | 119 - app/Services/OAuth2/ClientService.php | 596 - .../OAuth2/HttpIClientJWKSetReader.php | 63 - app/Services/OAuth2/IdTokenBuilderImpl.php | 195 - .../OAuth2MementoSessionSerializerService.php | 64 - app/Services/OAuth2/OAuth2ServiceProvider.php | 120 - .../OpenIDProviderConfigurationService.php | 95 - app/Services/OAuth2/PrincipalService.php | 148 - .../OAuth2/ResourceServer/UserService.php | 317 - app/Services/OAuth2/ResourceServerContext.php | 76 - app/Services/OAuth2/ResourceServerService.php | 211 - .../OAuth2/SecurityContextService.php | 67 - .../OAuth2/ServerPrivateKeyService.php | 107 - app/Services/OAuth2/TokenService.php | 1488 -- app/Services/OAuth2/UserConsentService.php | 80 - app/Services/OpenId/AssociationService.php | 240 - app/Services/OpenId/NonceService.php | 156 - .../OpenIdMementoSessionSerializerService.php | 65 - app/Services/OpenId/OpenIdProvider.php | 64 - .../OpenId/ServerExtensionsService.php | 73 - app/Services/OpenId/TrustedSitesService.php | 151 - app/Services/OpenId/UserService.php | 387 - .../AbstractBlacklistSecurityPolicy.php | 139 - .../AuthorizationCodeRedeemPolicy.php | 93 - .../BlacklistSecurityPolicy.php | 308 - .../SecurityPolicies/DelayCounterMeasure.php | 56 - .../LockUserCounterMeasure.php | 91 - .../LockUserSecurityPolicy.php | 66 - .../OAuth2LockClientCounterMeasure.php | 54 - .../SecurityPolicies/OAuth2SecurityPolicy.php | 162 - .../RevokeAuthorizationCodeRelatedTokens.php | 59 - app/Services/ServicesProvider.php | 122 - app/Services/UserActionService.php | 72 - app/Services/Utils/BannedIPService.php | 172 - app/Services/Utils/CheckPointService.php | 116 - .../Utils/DoctrineTransactionService.php | 104 - app/Services/Utils/ExternalUrlService.php | 44 - app/Services/Utils/LockManagerService.php | 95 - app/Services/Utils/LogService.php | 53 - app/Services/Utils/RedisCacheService.php | 157 - .../Utils/ServerConfigurationService.php | 252 - app/Services/Utils/UtilsProvider.php | 83 - app/Strategies/DefaultLoginStrategy.php | 82 - app/Strategies/DirectResponseStrategy.php | 31 - .../DisplayResponseJsonStrategy.php | 97 - .../DisplayResponseStrategyFactory.php | 38 - .../DisplayResponseUserAgentStrategy.php | 61 - app/Strategies/IConsentStrategy.php | 17 - app/Strategies/IDisplayResponseStrategy.php | 37 - app/Strategies/ILoginStrategy.php | 28 - .../IndirectResponseQueryStringStrategy.php | 43 - .../IndirectResponseUrlFragmentStrategy.php | 44 - .../OAuth2AuthenticationStrategy.php | 32 - app/Strategies/OAuth2ConsentStrategy.php | 106 - app/Strategies/OAuth2LoginStrategy.php | 119 - .../OpenIdAuthenticationStrategy.php | 50 - app/Strategies/OpenIdConsentStrategy.php | 119 - app/Strategies/OpenIdLoginStrategy.php | 93 - app/Strategies/PostResponseStrategy.php | 35 - app/Strategies/StrategyProvider.php | 66 - app/Validators/CustomValidator.php | 372 - app/libs/Auth/AuthHelper.php | 381 - app/libs/Auth/AuthService.php | 400 - .../Auth/AuthenticationExtensionService.php | 48 - .../Auth/AuthenticationServiceProvider.php | 45 - app/libs/Auth/CustomAuthProvider.php | 236 - .../Exceptions/AuthenticationException.php | 27 - ...icationInvalidPasswordAttemptException.php | 45 - .../AuthenticationLockedUserLoginAttempt.php | 35 - .../UnverifiedEmailMemberException.php | 25 - app/libs/Auth/Factories/GroupFactory.php | 45 - app/libs/Auth/Factories/UserFactory.php | 171 - .../UserRegistrationRequestFactory.php | 50 - app/libs/Auth/IAuthenticationExtension.php | 25 - .../Auth/IAuthenticationExtensionService.php | 18 - app/libs/Auth/IUserNameGeneratorService.php | 30 - app/libs/Auth/Models/Affiliation.php | 189 - app/libs/Auth/Models/Group.php | 191 - app/libs/Auth/Models/IGroupSlugs.php | 29 - app/libs/Auth/Models/Organization.php | 55 - app/libs/Auth/Models/SpamEstimatorFeed.php | 149 - app/libs/Auth/Models/User.php | 1783 --- .../Auth/Models/UserPasswordResetRequest.php | 170 - .../Auth/Models/UserRegistrationRequest.php | 215 - .../Auth/Repositories/IBannedIPRepository.php | 27 - .../Auth/Repositories/IGroupRepository.php | 39 - .../ISpamEstimatorFeedRepository.php | 22 - .../IUserExceptionTrailRepository.php | 28 - .../IUserPasswordResetRequestRepository.php | 27 - .../IUserRegistrationRequestRepository.php | 33 - .../Auth/Repositories/IUserRepository.php | 46 - .../Repositories/IWhiteListedIPRepository.php | 27 - app/libs/Auth/UserNameGeneratorService.php | 111 - app/libs/OAuth2/.gitkeep | 0 app/libs/OAuth2/AddressClaim.php | 68 - ...erAccessTokenAuthorizationHeaderParser.php | 78 - app/libs/OAuth2/Builders/IdTokenBuilder.php | 31 - .../Discovery/DiscoveryDocumentBuilder.php | 266 - .../IOpenIDProviderConfigurationService.php | 65 - .../Discovery/OpenIDProviderMetadata.php | 275 - app/libs/OAuth2/Endpoints/.gitkeep | 0 .../Endpoints/AuthorizationEndpoint.php | 76 - app/libs/OAuth2/Endpoints/IOAuth2Endpoint.php | 27 - app/libs/OAuth2/Endpoints/TokenEndpoint.php | 63 - .../Endpoints/TokenIntrospectionEndpoint.php | 97 - .../Endpoints/TokenRevocationEndpoint.php | 81 - .../Exceptions/AbsentClientException.php | 28 - .../Exceptions/AbsentCurrentUserException.php | 28 - .../Exceptions/AccessDeniedException.php | 28 - ...AllowedClientUriAlreadyExistsException.php | 28 - .../BearerTokenDisclosureAttemptException.php | 28 - .../Exceptions/ConsentRequiredException.php | 28 - .../ExpiredAccessTokenException.php | 28 - .../ExpiredAuthorizationCodeException.php | 28 - .../InteractionRequiredException.php | 28 - .../InvalidAccessTokenException.php | 28 - .../InvalidAllowedClientUriException.php | 28 - app/libs/OAuth2/Exceptions/InvalidApi.php | 28 - .../OAuth2/Exceptions/InvalidApiEndpoint.php | 27 - .../OAuth2/Exceptions/InvalidApiScope.php | 27 - .../Exceptions/InvalidApiScopeGroup.php | 22 - .../Exceptions/InvalidApplicationType.php | 28 - .../InvalidAuthenticationRequestException.php | 28 - .../InvalidAuthorizationCodeException.php | 29 - .../InvalidAuthorizationRequestException.php | 29 - ...validClientAssertionAlgorithmException.php | 29 - .../InvalidClientAssertionException.php | 29 - .../InvalidClientAssertionTypeException.php | 29 - .../InvalidClientAuthMethodException.php | 29 - ...idClientAuthenticationContextException.php | 29 - .../Exceptions/InvalidClientCredentials.php | 28 - .../Exceptions/InvalidClientException.php | 28 - .../OAuth2/Exceptions/InvalidClientType.php | 28 - .../Exceptions/InvalidGrantTypeException.php | 28 - .../OAuth2/Exceptions/InvalidLoginHint.php | 28 - .../Exceptions/InvalidOAuth2PKCERequest.php | 18 - .../Exceptions/InvalidOAuth2Request.php | 30 - .../InvalidRedeemAuthCodeException.php | 28 - .../Exceptions/InvalidResourceServer.php | 30 - ...nvalidTokenEndpointAuthMethodException.php | 30 - .../Exceptions/LockedClientException.php | 28 - .../Exceptions/LoginRequiredException.php | 28 - .../MissingClientAuthorizationInfo.php | 28 - .../Exceptions/MissingClientIdParam.php | 28 - .../OAuth2/Exceptions/OAuth2BaseException.php | 35 - .../Exceptions/OAuth2ClientBaseException.php | 45 - .../Exceptions/OAuth2GenericException.php | 28 - ...Auth2MissingBearerAccessTokenException.php | 26 - .../OAuth2ResourceServerException.php | 94 - .../RecipientKeyNotFoundException.php | 28 - .../Exceptions/ReloadSessionException.php | 30 - .../ReplayAttackAuthCodeException.php | 29 - .../Exceptions/ReplayAttackException.php | 50 - .../ReplayAttackRefreshTokenException.php | 29 - .../RevokedAccessTokenException.php | 28 - .../RevokedRefreshTokenException.php | 28 - .../Exceptions/ScopeNotAllowedException.php | 37 - .../Exceptions/ServerKeyNotFoundException.php | 28 - .../UnAuthorizedClientException.php | 28 - .../UnsupportedResponseTypeException.php | 28 - .../Exceptions/UriNotAllowedException.php | 32 - .../Exceptions/UseRefreshTokenException.php | 26 - ...uth2AccessTokenFragmentResponseFactory.php | 106 - .../OAuth2AccessTokenResponseFactory.php | 129 - .../OAuth2AuthorizationRequestFactory.php | 64 - .../OAuth2PKCEValidationMethodFactory.php | 69 - app/libs/OAuth2/GrantTypes/.gitkeep | 0 .../OAuth2/GrantTypes/AbstractGrantType.php | 133 - .../GrantTypes/AuthorizationCodeGrantType.php | 397 - .../GrantTypes/ClientCredentialsGrantType.php | 185 - .../OAuth2/GrantTypes/HybridGrantType.php | 258 - app/libs/OAuth2/GrantTypes/IGrantType.php | 62 - .../OAuth2/GrantTypes/ImplicitGrantType.php | 238 - .../GrantTypes/InteractiveGrantType.php | 669 - .../RefreshBearerTokenGrantType.php | 216 - .../GrantTypes/RevokeBearerTokenGrantType.php | 279 - .../IValidateBearerTokenStrategy.php | 26 - .../Strategies/PKCEBaseValidator.php | 42 - .../Strategies/PKCEPlainValidator.php | 25 - .../Strategies/PKCES256Validator.php | 32 - ...idateBearerTokenResourceServerStrategy.php | 107 - .../ValidateBearerTokenStrategy.php | 58 - .../ValidateBearerTokenStrategyFactory.php | 44 - .../ValidateBearerTokenGrantType.php | 254 - .../Heuristics/ClientEncryptionKeyFinder.php | 139 - .../Heuristics/ClientSigningKeyFinder.php | 129 - app/libs/OAuth2/Heuristics/IKeyFinder.php | 38 - .../Heuristics/ServerEncryptionKeyFinder.php | 116 - .../Heuristics/ServerSigningKeyFinder.php | 131 - app/libs/OAuth2/IOAuth2Protocol.php | 80 - app/libs/OAuth2/IResourceServerContext.php | 44 - app/libs/OAuth2/IUserScopes.php | 31 - app/libs/OAuth2/Models/.gitkeep | 0 app/libs/OAuth2/Models/AccessToken.php | 145 - app/libs/OAuth2/Models/AuthorizationCode.php | 387 - .../ClientAssertionAuthenticationContext.php | 96 - .../Models/ClientAuthenticationContext.php | 85 - ...ClientCredentialsAuthenticationContext.php | 68 - app/libs/OAuth2/Models/IApi.php | 16 - app/libs/OAuth2/Models/IApiEndpoint.php | 85 - app/libs/OAuth2/Models/IApiScope.php | 28 - app/libs/OAuth2/Models/IApiScopeGroup.php | 51 - app/libs/OAuth2/Models/IAsymmetricKey.php | 86 - app/libs/OAuth2/Models/IClient.php | 327 - app/libs/OAuth2/Models/IClientPublicKey.php | 43 - app/libs/OAuth2/Models/IOAuth2User.php | 50 - app/libs/OAuth2/Models/IPrincipal.php | 23 - app/libs/OAuth2/Models/IResourceServer.php | 72 - app/libs/OAuth2/Models/IScope.php | 53 - app/libs/OAuth2/Models/IServerPrivateKey.php | 39 - app/libs/OAuth2/Models/IUserConsent.php | 50 - app/libs/OAuth2/Models/JWTResponseInfo.php | 79 - app/libs/OAuth2/Models/Principal.php | 59 - app/libs/OAuth2/Models/RefreshToken.php | 96 - app/libs/OAuth2/Models/SecurityContext.php | 76 - app/libs/OAuth2/Models/Token.php | 144 - .../OAuth2/Models/TokenEndpointAuthInfo.php | 55 - app/libs/OAuth2/OAuth2Message.php | 86 - app/libs/OAuth2/OAuth2Protocol.php | 1565 -- app/libs/OAuth2/OAuth2ServiceProvider.php | 37 - .../Repositories/IAccessTokenRepository.php | 71 - .../Repositories/IApiEndpointRepository.php | 44 - .../OAuth2/Repositories/IApiRepository.php | 34 - .../Repositories/IApiScopeGroupRepository.php | 27 - .../Repositories/IApiScopeRepository.php | 63 - .../Repositories/IAsymmetricKeyRepository.php | 53 - .../IClientPublicKeyRepository.php | 9 - .../OAuth2/Repositories/IClientRepository.php | 52 - .../IOAuth2TrailExceptionRepository.php | 29 - .../Repositories/IRefreshTokenRepository.php | 58 - .../IResourceServerRepository.php | 47 - .../IServerPrivateKeyRepository.php | 26 - app/libs/OAuth2/Requests/.gitkeep | 0 .../OAuth2AccessTokenRequestAuthCode.php | 81 - ...th2AccessTokenRequestClientCredentials.php | 52 - .../OAuth2AccessTokenValidationRequest.php | 55 - .../Requests/OAuth2AuthenticationRequest.php | 234 - .../Requests/OAuth2AuthorizationRequest.php | 243 - .../OAuth2/Requests/OAuth2LogoutRequest.php | 91 - .../OAuth2RefreshAccessTokenRequest.php | 64 - app/libs/OAuth2/Requests/OAuth2Request.php | 88 - .../OAuth2/Requests/OAuth2RequestMemento.php | 64 - .../OAuth2/Requests/OAuth2TokenRequest.php | 59 - .../Requests/OAuth2TokenRevocationRequest.php | 63 - .../OAuth2/ResourceServer/IUserService.php | 45 - .../ResourceServer/OAuth2ProtectedService.php | 44 - app/libs/OAuth2/Responses/.gitkeep | 0 .../OAuth2AccessTokenFragmentResponse.php | 49 - .../Responses/OAuth2AccessTokenResponse.php | 51 - .../OAuth2AccessTokenValidationResponse.php | 88 - .../Responses/OAuth2AuthorizationResponse.php | 81 - .../Responses/OAuth2DirectErrorResponse.php | 74 - .../OAuth2/Responses/OAuth2DirectResponse.php | 41 - .../OAuth2HybridTokenFragmentResponse.php | 53 - .../OAuth2IDTokenFragmentResponse.php | 53 - .../Responses/OAuth2IdTokenResponse.php | 46 - .../Responses/OAuth2IndirectErrorResponse.php | 72 - .../OAuth2IndirectFragmentErrorResponse.php | 55 - .../OAuth2IndirectFragmentResponse.php | 23 - .../Responses/OAuth2IndirectResponse.php | 75 - .../OAuth2/Responses/OAuth2LogoutResponse.php | 38 - .../OAuth2/Responses/OAuth2PostResponse.php | 100 - app/libs/OAuth2/Responses/OAuth2Response.php | 24 - .../OAuth2TokenRevocationResponse.php | 42 - .../OAuth2WWWAuthenticateErrorResponse.php | 93 - app/libs/OAuth2/Services/.gitkeep | 0 .../OAuth2/Services/AccessTokenGenerator.php | 19 - .../Services/AuthorizationCodeGenerator.php | 20 - .../OAuth2/Services/IApiEndpointService.php | 46 - .../OAuth2/Services/IApiScopeGroupService.php | 22 - app/libs/OAuth2/Services/IApiScopeService.php | 36 - app/libs/OAuth2/Services/IApiService.php | 22 - .../OAuth2/Services/IAsymmetricKeyService.php | 22 - .../Services/IClientCrendentialGenerator.php | 29 - .../OAuth2/Services/IClientJWKSetReader.php | 30 - .../Services/IClientPublicKeyService.php | 22 - app/libs/OAuth2/Services/IClientService.php | 117 - .../IMementoOAuth2SerializerService.php | 41 - .../OAuth2/Services/IPrincipalService.php | 48 - .../Services/IResourceServerService.php | 29 - .../Services/ISecurityContextService.php | 36 - .../Services/IServerPrivateKeyService.php | 23 - app/libs/OAuth2/Services/ITokenService.php | 195 - .../OAuth2/Services/IUserConsentService.php | 32 - .../OAuth2/Services/OAuth2ServiceCatalog.php | 23 - .../OAuth2/Services/OAuth2TokenGenerator.php | 35 - .../OAuth2/Services/RefreshTokenGenerator.php | 19 - app/libs/OAuth2/StandardClaims.php | 217 - .../ClientAssertionAuthContextValidator.php | 109 - .../ClientAuthContextValidatorFactory.php | 89 - .../ClientPKCEAuthContextValidator.php | 56 - ...ntPlainCredentialsAuthContextValidator.php | 56 - ...rivateKeyAssertionAuthContextValidator.php | 107 - ...redSecretAssertionAuthContextValidator.php | 67 - .../IClientAuthContextValidator.php | 29 - .../IOAuth2AuthenticationStrategy.php | 32 - .../Strategies/IPKCEValidationMethod.php | 22 - ...uth2IndirectErrorResponseFactoryMethod.php | 82 - .../OAuth2ResponseStrategyFactoryMethod.php | 96 - .../OpenId/Exceptions/InvalidAssociation.php | 26 - .../InvalidAssociationTypeException.php | 26 - app/libs/OpenId/Exceptions/InvalidDHParam.php | 26 - .../OpenId/Exceptions/InvalidKVFormat.php | 26 - app/libs/OpenId/Exceptions/InvalidNonce.php | 26 - ...InvalidOpenIdAuthenticationRequestMode.php | 25 - .../InvalidOpenIdMessageException.php | 26 - .../Exceptions/InvalidOpenIdMessageMode.php | 25 - .../InvalidRequestContextException.php | 26 - .../InvalidSessionTypeException.php | 26 - .../OpenId/Exceptions/OpenIdBaseException.php | 22 - .../Exceptions/OpenIdCryptoException.php | 26 - .../OpenIdInvalidRealmException.php | 25 - .../Exceptions/ReplayAttackException.php | 26 - .../Implementations/OpenIdAXExtension.php | 184 - .../Implementations/OpenIdAXRequest.php | 96 - .../Implementations/OpenIdOAuth2Extension.php | 257 - .../Implementations/OpenIdOAuth2Request.php | 104 - .../Implementations/OpenIdPAPEExtension.php | 82 - .../Implementations/OpenIdSREGExtension.php | 49 - .../OpenIdSREGExtension_1_0.php | 210 - .../Implementations/OpenIdSREGRequest.php | 37 - .../Implementations/OpenIdSREGRequest_1_0.php | 155 - .../OpenIdAuthenticationExtension.php | 90 - .../OpenId/Extensions/OpenIdExtension.php | 95 - .../SessionAssociationRequestFactory.php | 57 - .../IOpenIdAuthenticationStrategy.php | 38 - .../OpenIdAuthenticationRequestHandler.php | 534 - ...penIdCheckAuthenticationRequestHandler.php | 211 - .../OpenId/Handlers/OpenIdMessageHandler.php | 92 - ...OpenIdSessionAssociationRequestHandler.php | 104 - .../ISessionAssociationStrategy.php | 28 - .../SessionAssociationDHStrategy.php | 117 - .../SessionAssociationUnencryptedStrategy.php | 110 - .../OpenId/Helpers/AssocHandleGenerator.php | 40 - .../OpenId/Helpers/AssociationFactory.php | 82 - .../OpenId/Helpers/OpenIdCryptoHelper.php | 204 - .../OpenId/Helpers/OpenIdErrorMessages.php | 33 - .../OpenId/Helpers/OpenIdSignatureBuilder.php | 82 - app/libs/OpenId/Helpers/OpenIdUriHelper.php | 711 - app/libs/OpenId/IOpenIdProtocol.php | 40 - app/libs/OpenId/Models/Association.php | 178 - app/libs/OpenId/Models/IAssociation.php | 100 - app/libs/OpenId/Models/IOpenIdUser.php | 130 - app/libs/OpenId/Models/ITrustedSite.php | 21 - app/libs/OpenId/Models/OpenIdNonce.php | 154 - app/libs/OpenId/OpenIdMessage.php | 117 - app/libs/OpenId/OpenIdProtocol.php | 223 - app/libs/OpenId/OpenIdServiceProvider.php | 59 - .../IOpenIdAssociationRepository.php | 27 - .../IOpenIdTrustedSiteRepository.php | 30 - .../OpenId/Requests/Contexts/PartialView.php | 43 - .../Requests/Contexts/RequestContext.php | 67 - .../OpenIdAssociationSessionRequest.php | 90 - .../Requests/OpenIdAuthenticationRequest.php | 218 - .../OpenIdCheckAuthenticationRequest.php | 133 - .../OpenIdDHAssociationSessionRequest.php | 142 - .../OpenId/Requests/OpenIdMessageMemento.php | 59 - app/libs/OpenId/Requests/OpenIdRequest.php | 72 - .../Responses/Contexts/ResponseContext.php | 36 - .../OpenIdAssociationSessionResponse.php | 47 - ...AssociationSessionUnsuccessfulResponse.php | 31 - .../OpenIdCheckAuthenticationResponse.php | 43 - ...iffieHellmanAssociationSessionResponse.php | 36 - .../OpenIdDirectGenericErrorResponse.php | 41 - .../OpenId/Responses/OpenIdDirectResponse.php | 80 - .../OpenIdImmediateNegativeAssertion.php | 37 - .../OpenIdIndirectGenericErrorResponse.php | 48 - .../Responses/OpenIdIndirectResponse.php | 83 - .../OpenIdNonImmediateNegativeAssertion.php | 36 - .../OpenIdPositiveAssertionResponse.php | 91 - app/libs/OpenId/Responses/OpenIdResponse.php | 46 - ...dUnencryptedAssociationSessionResponse.php | 34 - .../OpenId/Services/IAssociationService.php | 45 - .../IMementoOpenIdSerializerService.php | 41 - app/libs/OpenId/Services/INonceService.php | 56 - .../Services/IServerConfigurationService.php | 19 - .../Services/IServerExtensionsService.php | 11 - .../OpenId/Services/ITrustedSitesService.php | 45 - app/libs/OpenId/Services/IUserService.php | 75 - .../NonceUniqueIdentifierGenerator.php | 47 - .../OpenId/Services/OpenIdServiceCatalog.php | 16 - .../OpenIdResponseStrategyFactoryMethod.php | 50 - app/libs/OpenId/Xrds/XRDSDocumentBuilder.php | 52 - app/libs/OpenId/Xrds/XRDSService.php | 70 - app/libs/Utils/.gitkeep | 0 app/libs/Utils/ArrayUtils.php | 42 - app/libs/Utils/CSVReader.php | 76 - app/libs/Utils/Db/ITransactionService.php | 28 - .../Exceptions/ConfigurationException.php | 22 - .../Exceptions/UnacquiredLockException.php | 26 - .../Utils/FileSystem/FileNameSanitizer.php | 40 - app/libs/Utils/FileSystem/SwiftAdapter.php | 357 - .../Utils/FileSystem/SwiftServiceProvider.php | 93 - app/libs/Utils/Http/HttpContentType.php | 41 - app/libs/Utils/Http/HttpMessage.php | 89 - app/libs/Utils/Http/HttpResponse.php | 87 - app/libs/Utils/Http/HttpUtils.php | 46 - app/libs/Utils/IHttpResponseStrategy.php | 22 - app/libs/Utils/IPHelper.php | 32 - app/libs/Utils/JsonUtils.php | 101 - app/libs/Utils/MathUtils.php | 59 - app/libs/Utils/Model/Identifier.php | 98 - app/libs/Utils/RequestUtils.php | 45 - app/libs/Utils/Services/IAuthService.php | 139 - app/libs/Utils/Services/IBannedIPService.php | 39 - app/libs/Utils/Services/ICacheService.php | 95 - .../Utils/Services/ICheckPointService.php | 41 - .../Utils/Services/ILockManagerService.php | 42 - app/libs/Utils/Services/ILogService.php | 32 - app/libs/Utils/Services/ISecurityPolicy.php | 42 - .../ISecurityPolicyCounterMeasure.php | 17 - .../Services/IServerConfigurationService.php | 31 - .../Utils/Services/IdentifierGenerator.php | 26 - app/libs/Utils/Services/ServiceLocator.php | 56 - .../Services/UniqueIdentifierGenerator.php | 56 - .../Utils/Services/UtilsServiceCatalog.php | 16 - app/libs/Utils/URLUtils.php | 117 - artisan | 53 - behat.yml | 13 - bindep.txt | 21 - bootstrap/app.php | 55 - bootstrap/autoload.php | 34 - bootstrap/cache/.gitignore | 2 - clear_logs.sh | 3 - composer.json | 116 - composer.lock | 8321 ----------- config/app.php | 230 - config/auth.php | 103 - config/broadcasting.php | 52 - config/cache.php | 81 - config/cache_regions.php | 25 - config/compile.php | 35 - config/cors.php | 63 - config/curl.php | 19 - config/database.php | 138 - config/doctrine.php | 255 - config/filesystems.php | 68 - config/hashing.php | 52 - config/log.php | 26 - config/logging.php | 81 - config/mail.php | 116 - config/migrations.php | 62 - config/queue.php | 165 - config/recaptcha.php | 65 - config/server.php | 22 - config/services.php | 42 - config/session.php | 181 - config/view.php | 33 - database/.gitignore | 1 - database/factories/.gitkeep | 0 database/migrations/.gitkeep | 0 database/migrations/Version20190604015804.php | 694 - database/migrations/Version20190604015808.php | 44 - database/migrations/Version20190604024945.php | 113 - database/migrations/Version20190609163537.php | 56 - database/migrations/Version20190611172226.php | 41 - database/migrations/Version20190614143948.php | 51 - database/migrations/Version20190621173542.php | 71 - database/migrations/Version20190627180435.php | 46 - database/migrations/Version20190729014640.php | 61 - database/migrations/Version20190729150610.php | 84 - database/migrations/Version20190828144355.php | 64 - database/migrations/Version20190828144405.php | 41 - database/migrations/Version20190829142736.php | 62 - database/migrations/Version20190904133943.php | 94 - database/migrations/Version20191017190223.php | 50 - database/migrations/Version20191121032755.php | 40 - database/migrations/Version20200115152348.php | 49 - database/migrations/Version20200306133045.php | 91 - database/migrations/Version20200306135446.php | 59 - database/migrations/Version20200528175450.php | 65 - database/migrations/Version20200530150357.php | 72 - database/migrations/Version20200715150546.php | 51 - database/migrations/Version20200715195145.php | 53 - database/migrations/Version20200715195155.php | 47 - database/migrations/Version20200803193707.php | 50 - database/migrations/Version20200811151509.php | 83 - database/migrations/Version20200910212216.php | 57 - database/migrations/Version20201105184620.php | 49 - database/migrations/Version20201214162511.php | 49 - database/seeds/.gitkeep | 0 database/seeds/ApiEndpointSeeder.php | 155 - database/seeds/ApiScopeSeeder.php | 134 - database/seeds/ApiSeeder.php | 66 - database/seeds/DatabaseSeeder.php | 43 - database/seeds/OpenIdExtensionsSeeder.php | 71 - database/seeds/ResourceServerSeeder.php | 41 - database/seeds/SeedUtils.php | 126 - database/seeds/ServerConfigurationSeeder.php | 152 - database/seeds/TestSeeder.php | 2190 --- doc/source/conf.py | 98 - doc/source/index.rst | 60 - doc/source/oauth2.rst | 625 - doc/source/openid.rst | 176 - gulpfile.js | 16 - package-lock.json | 12026 ---------------- package.json | 57 - phpunit.xml | 20 - .../openstackid-release-branch/post.yaml | 15 - playbooks/openstackid-release-branch/run.yaml | 54 - .../openstackid-release-master/post.yaml | 15 - playbooks/openstackid-release-master/run.yaml | 54 - playbooks/openstackid-unittests/run.yaml | 29 - public/.htaccess | 20 - public/assets/css/auth/email.css | 90 - public/assets/css/auth/login.css | 9 - public/assets/css/auth/register.css | 99 - public/assets/css/edit-client-public-keys.css | 28 - public/assets/css/edit-client.css | 0 public/assets/css/main.css | 372 - public/assets/css/private-keys.css | 28 - .../smoothness/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 212 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 208 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 335 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 207 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 332 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 280 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_454545_256x240.png | Bin 6992 -> 0 bytes .../images/ui-icons_888888_256x240.png | Bin 6999 -> 0 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4549 -> 0 bytes .../smoothness/jquery-ui-1.10.3.custom.css | 1177 -- .../jquery-ui-1.10.3.custom.min.css | 7 - public/assets/img/apis/server.png | Bin 1442 -> 0 bytes .../img/generic-profile-photo-small.png | Bin 3861 -> 0 bytes public/assets/img/generic-profile-photo.png | Bin 2176 -> 0 bytes .../assets/img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes public/assets/img/glyphicons-halflings.png | Bin 12799 -> 0 bytes public/assets/img/oauth2.default.logo.png | Bin 14587 -> 0 bytes public/assets/img/openstack-logo-full.svg | 57 - public/assets/js/admin/banned-ips.js | 42 - public/assets/js/admin/edit-group.js | 193 - public/assets/js/admin/edit-user.js | 224 - public/assets/js/admin/groups.js | 119 - public/assets/js/admin/server-config.js | 39 - public/assets/js/admin/users.js | 238 - public/assets/js/ajax.utils.js | 73 - public/assets/js/auth/email-verification.js | 33 - public/assets/js/auth/registration.js | 72 - public/assets/js/auth/registration_success.js | 14 - public/assets/js/auth/reset_password.js | 58 - public/assets/js/auth/send_password_link.js | 41 - public/assets/js/auth/set_password.js | 58 - public/assets/js/auth/set_password_success.js | 21 - public/assets/js/basic-crud.js | 249 - public/assets/js/jquery-ajax-loader.js | 85 - public/assets/js/jquery.cleanform.js | 10 - public/assets/js/jquery.serialize.js | 32 - ...uery.validate.additional.custom.methods.js | 108 - public/assets/js/login.js | 41 - public/assets/js/oauth2/consent.js | 36 - .../oauth2/profile/admin/api-scope-groups.js | 265 - .../assets/js/oauth2/profile/admin/clients.js | 42 - .../profile/admin/edit-api-scope-group.js | 150 - .../js/oauth2/profile/admin/edit-api.js | 460 - .../js/oauth2/profile/admin/edit-endpoint.js | 65 - .../profile/admin/edit-resource-server.js | 253 - .../js/oauth2/profile/admin/edit-scope.js | 41 - .../oauth2/profile/admin/resource-servers.js | 173 - .../profile/admin/server-private-keys.js | 318 - public/assets/js/oauth2/profile/clients.js | 254 - .../js/oauth2/profile/edit-client-data.js | 232 - .../oauth2/profile/edit-client-public-keys.js | 277 - .../js/oauth2/profile/edit-client-scopes.js | 28 - .../profile/edit-client-security-logout.js | 55 - .../edit-client-security-main-settings.js | 88 - .../js/oauth2/profile/edit-client-tokens.js | 226 - .../js/oauth2/profile/edit-user-grants.js | 216 - .../assets/js/oauth2/session/check.session.js | 96 - public/assets/js/openid/consent.js | 15 - public/assets/js/profile.js | 199 - public/assets/js/urlfragment.jquery.js | 95 - public/favicon.ico | 0 public/favicon/android-chrome-192x192.png | Bin 1561 -> 0 bytes public/favicon/android-chrome-256x256.png | Bin 2153 -> 0 bytes public/favicon/apple-touch-icon.png | Bin 1198 -> 0 bytes public/favicon/browserconfig.xml | 9 - public/favicon/favicon-16x16.png | Bin 648 -> 0 bytes public/favicon/favicon-32x32.png | Bin 678 -> 0 bytes public/favicon/favicon.ico | Bin 15086 -> 0 bytes public/favicon/manifest.json | 17 - public/favicon/mstile-150x150.png | Bin 1272 -> 0 bytes public/favicon/safari-pinned-tab.svg | 27 - public/index.php | 58 - public/robots.txt | 2 - readme.md | 69 +- requirements.txt | 4 - resources/assets/js/index.js | 29 - resources/lang/en/auth.php | 19 - resources/lang/en/messages.php | 12 - resources/lang/en/pagination.php | 19 - resources/lang/en/passwords.php | 22 - resources/lang/en/validation.php | 113 - .../views/admin/add-group-form.blade.php | 20 - resources/views/admin/add-user-form.blade.php | 43 - resources/views/admin/banned-ips.blade.php | 52 - resources/views/admin/edit-group.blade.php | 116 - resources/views/admin/edit-user.blade.php | 248 - resources/views/admin/groups.blade.php | 85 - resources/views/admin/server-config.blade.php | 101 - resources/views/admin/users.blade.php | 91 - .../views/auth/email_verification.blade.php | 57 - .../auth/email_verification_error.blade.php | 15 - ...mail_verification_resend_success.blade.php | 15 - .../auth/email_verification_success.blade.php | 16 - resources/views/auth/login.blade.php | 114 - .../views/auth/passwords/email.blade.php | 63 - .../auth/passwords/email_error.blade.php | 17 - .../views/auth/passwords/reset.blade.php | 69 - .../auth/passwords/reset_error.blade.php | 18 - .../auth/passwords/reset_success.blade.php | 17 - resources/views/auth/passwords/set.blade.php | 75 - .../views/auth/passwords/set_error.blade.php | 17 - .../auth/passwords/set_success.blade.php | 26 - resources/views/auth/register.blade.php | 116 - resources/views/auth/register_error.blade.php | 18 - .../views/auth/register_success.blade.php | 23 - .../auth/email_verification_request.blade.php | 23 - .../email_verification_request_fn.blade.php | 15 - ...ail_verification_request_success.blade.php | 14 - .../auth/reset_password_request.blade.php | 16 - .../auth/reset_password_successfull.blade.php | 14 - .../views/emails/auth/user_locked.blade.php | 19 - .../emails/oauth_client_locked.blade.php | 14 - .../user_spammer_process_result.blade.php | 20 - .../emails/welcome_new_user_email.blade.php | 30 - .../welcome_new_user_email_fn.blade.php | 16 - resources/views/error.blade.php | 6 - resources/views/errors/400.blade.php | 15 - resources/views/errors/404.blade.php | 12 - resources/views/errors/503.blade.php | 41 - resources/views/extensions/ax.blade.php | 10 - resources/views/extensions/oauth2.blade.php | 54 - resources/views/extensions/pape.blade.php | 4 - resources/views/extensions/sreg.blade.php | 13 - resources/views/home.blade.php | 35 - resources/views/identity.blade.php | 71 - resources/views/layout.blade.php | 50 - resources/views/menu.blade.php | 62 - resources/views/modal.blade.php | 18 - resources/views/oauth2/consent.blade.php | 43 - .../oauth2/profile/add-client-form.blade.php | 41 - .../admin/api-scope-group-add-form.blade.php | 19 - .../profile/admin/api-scope-groups.blade.php | 86 - .../oauth2/profile/admin/clients.blade.php | 43 - .../admin/edit-api-scope-group.blade.php | 80 - .../oauth2/profile/admin/edit-api.blade.php | 208 - .../profile/admin/edit-endpoint.blade.php | 108 - .../admin/edit-resource-server.blade.php | 158 - .../oauth2/profile/admin/edit-scope.blade.php | 77 - .../profile/admin/endpoint-add-form.blade.php | 46 - .../admin/resource-server-add-form.blade.php | 20 - .../resource-server-api-add-form.blade.php | 15 - .../profile/admin/resource-servers.blade.php | 82 - .../profile/admin/scope-add-form.blade.php | 35 - .../server-private-key-add-form.blade.php | 45 - .../admin/server-private-keys.blade.php | 103 - .../views/oauth2/profile/clients.blade.php | 104 - .../oauth2/profile/edit-client-data.blade.php | 193 - .../edit-client-public-key-add-form.blade.php | 32 - .../profile/edit-client-public-keys.blade.php | 74 - .../profile/edit-client-scopes.blade.php | 44 - .../edit-client-security-logout.blade.php | 37 - ...it-client-security-main-settings.blade.php | 97 - .../profile/edit-client-tokens.blade.php | 119 - .../oauth2/profile/edit-client.blade.php | 152 - .../oauth2/profile/edit-user-grants.blade.php | 117 - .../oauth2/session/check-session.blade.php | 13 - .../oauth2/session/session-ended.blade.php | 15 - .../oauth2/session/session-logout.blade.php | 43 - resources/views/openid/consent.blade.php | 57 - resources/views/profile.blade.php | 382 - resources/views/vendor/.gitkeep | 1 - roles/setup-test-laravel-env/README.rst | 8 - .../setup-test-laravel-env/defaults/main.yaml | 8 - roles/setup-test-laravel-env/tasks/main.yaml | 60 - server.php | 21 - setup.cfg | 23 - setup.py | 21 - storage/app/.gitignore | 3 - storage/app/public/.gitignore | 2 - storage/framework/.gitignore | 8 - storage/framework/cache/.gitignore | 2 - storage/framework/sessions/.gitignore | 2 - storage/framework/views/.gitignore | 2 - tests/ApiEndpointTest.php | 274 - tests/ApiScopeTest.php | 127 - tests/ApiTest.php | 252 - tests/AssociationServiceTest.php | 263 - tests/BrowserKitTestCase.php | 58 - tests/CacheServiceStub.php | 177 - tests/ClientApiTest.php | 99 - tests/ClientPublicKeyApiTest.php | 76 - tests/CreatesApplication.php | 34 - tests/CustomAuthProviderTest.php | 43 - tests/DiffieHellmanTest.php | 46 - tests/DiscoveryControllerTest.php | 27 - tests/DoctrineRepositoriesTests.php | 68 - tests/Feature/ExampleTest.php | 21 - tests/OAuth2ClientTests.php | 51 - tests/OAuth2ProtectedApiTest.php | 115 - tests/OAuth2ProtocolTest.php | 1383 -- .../OAuth2UserRegistrationServiceApiTest.php | 74 - tests/OAuth2UserServiceApiTest.php | 104 - tests/OAuthSSOApiControllerTest.php | 206 - tests/OIDCProtocolTest.php | 3222 ----- tests/OpenIdProtocolTest.php | 1279 -- tests/OpenStackIDBaseTest.php | 69 - tests/ResourceServerApiTest.php | 306 - tests/ServicesTests.php | 88 - tests/StubServerConfigurationService.php | 29 - tests/TestCase.php | 22 - tests/TrustedSitesServiceTest.php | 85 - tests/Unit/ExampleTest.php | 19 - tests/UserAgentTests.php | 40 - tests/UserGeneratorServiceTest.php | 52 - tests/XRDSDocumentTest.php | 34 - tests/features/bootstrap/FeatureContext.php | 112 - tests/features/bootstrap/LaravelContext.php | 285 - tests/features/get_auth_code.feature | 17 - tox.ini | 22 - update_doctrine.sh | 9 - webpack.config.js | 140 - webpack.mix.js | 15 - 1001 files changed, 10 insertions(+), 116661 deletions(-) delete mode 100644 .babelrc delete mode 100644 .env.example delete mode 100644 .gitattributes delete mode 100644 .gitignore delete mode 100644 .zuul.yaml delete mode 100644 CONTRIBUTING.md delete mode 100644 app/Console/Commands/CleanOAuth2StaleData.php delete mode 100644 app/Console/Commands/CleanOpenIdStaleData.php delete mode 100644 app/Console/Commands/CreateSuperAdmin.php delete mode 100644 app/Console/Commands/SpammerProcess/.gitignore delete mode 100644 app/Console/Commands/SpammerProcess/README.md delete mode 100644 app/Console/Commands/SpammerProcess/RebuildUserSpammerEstimator.php delete mode 100644 app/Console/Commands/SpammerProcess/UserSpammerProcessor.php delete mode 100644 app/Console/Commands/SpammerProcess/estimator_build.py delete mode 100755 app/Console/Commands/SpammerProcess/estimator_build.sh delete mode 100644 app/Console/Commands/SpammerProcess/estimator_process.py delete mode 100755 app/Console/Commands/SpammerProcess/estimator_process.sh delete mode 100644 app/Console/Commands/SpammerProcess/requirements.txt delete mode 100644 app/Console/Kernel.php delete mode 100644 app/Events/Event.php delete mode 100644 app/Events/OAuth2ClientLocked.php delete mode 100644 app/Events/UserActivated.php delete mode 100644 app/Events/UserCreated.php delete mode 100644 app/Events/UserDeactivated.php delete mode 100644 app/Events/UserEmailUpdated.php delete mode 100644 app/Events/UserEmailVerified.php delete mode 100644 app/Events/UserEvent.php delete mode 100644 app/Events/UserLocked.php delete mode 100644 app/Events/UserPasswordResetRequestCreated.php delete mode 100644 app/Events/UserPasswordResetSuccessful.php delete mode 100644 app/Events/UserSpamStateUpdated.php delete mode 100644 app/Exceptions/Handler.php delete mode 100644 app/Http/Controllers/AdminController.php delete mode 100644 app/Http/Controllers/Api/APICRUDController.php delete mode 100644 app/Http/Controllers/Api/ApiBannedIPController.php delete mode 100644 app/Http/Controllers/Api/ApiController.php delete mode 100644 app/Http/Controllers/Api/ApiEndpointController.php delete mode 100644 app/Http/Controllers/Api/ApiResourceServerController.php delete mode 100644 app/Http/Controllers/Api/ApiScopeController.php delete mode 100644 app/Http/Controllers/Api/ApiScopeGroupController.php delete mode 100644 app/Http/Controllers/Api/AsymmetricKeyApiController.php delete mode 100644 app/Http/Controllers/Api/ClientApiController.php delete mode 100644 app/Http/Controllers/Api/ClientPublicKeyApiController.php delete mode 100644 app/Http/Controllers/Api/GroupApiController.php delete mode 100644 app/Http/Controllers/Api/JsonController.php delete mode 100644 app/Http/Controllers/Api/OAuth2/OAuth2DisqusSSOApiController.php delete mode 100644 app/Http/Controllers/Api/OAuth2/OAuth2ProtectedController.php delete mode 100644 app/Http/Controllers/Api/OAuth2/OAuth2RocketChatSSOApiController.php delete mode 100644 app/Http/Controllers/Api/OAuth2/OAuth2StreamChatSSOApiController.php delete mode 100644 app/Http/Controllers/Api/OAuth2/OAuth2UserApiController.php delete mode 100644 app/Http/Controllers/Api/OAuth2/OAuth2UserRegistrationRequestApiController.php delete mode 100644 app/Http/Controllers/Api/ServerPrivateKeyApiController.php delete mode 100644 app/Http/Controllers/Api/UserApiController.php delete mode 100644 app/Http/Controllers/Auth/EmailVerificationController.php delete mode 100644 app/Http/Controllers/Auth/ForgotPasswordController.php delete mode 100644 app/Http/Controllers/Auth/PasswordSetController.php delete mode 100644 app/Http/Controllers/Auth/RegisterController.php delete mode 100644 app/Http/Controllers/Auth/ResetPasswordController.php delete mode 100644 app/Http/Controllers/Controller.php delete mode 100644 app/Http/Controllers/Factories/UserValidationRulesFactory.php delete mode 100644 app/Http/Controllers/HomeController.php delete mode 100644 app/Http/Controllers/OAuth2/OAuth2ProviderController.php delete mode 100644 app/Http/Controllers/OpenId/DiscoveryController.php delete mode 100644 app/Http/Controllers/OpenId/OpenIdController.php delete mode 100644 app/Http/Controllers/OpenId/OpenIdProviderController.php delete mode 100644 app/Http/Controllers/Traits/GetAllTrait.php delete mode 100644 app/Http/Controllers/UserController.php delete mode 100644 app/Http/Kernel.php delete mode 100644 app/Http/Middleware/Authenticate.php delete mode 100644 app/Http/Middleware/CORSMiddleware.php delete mode 100644 app/Http/Middleware/CORSRequestPreflightData.php delete mode 100644 app/Http/Middleware/CORSRequestPreflightType.php delete mode 100644 app/Http/Middleware/CheckForMaintenanceMode.php delete mode 100644 app/Http/Middleware/CookiesSameSiteNoneKnownIncompatibleClients.php delete mode 100644 app/Http/Middleware/CurrentUserCanEditOAuth2Client.php delete mode 100644 app/Http/Middleware/CurrentUserIsOAuth2ServerAdmin.php delete mode 100644 app/Http/Middleware/CurrentUserIsOAuth2ServerAdminJson.php delete mode 100644 app/Http/Middleware/CurrentUserIsOpenIdServerAdmin.php delete mode 100644 app/Http/Middleware/CurrentUserIsOpenIdServerAdminJson.php delete mode 100644 app/Http/Middleware/CurrentUserOwnsOAuth2Client.php delete mode 100644 app/Http/Middleware/ETagsMiddleware.php delete mode 100644 app/Http/Middleware/EncryptCookies.php delete mode 100644 app/Http/Middleware/OAuth2BearerAccessTokenRequestValidator.php delete mode 100644 app/Http/Middleware/ParseMultipartFormDataInputForNonPostRequests.php delete mode 100644 app/Http/Middleware/RedirectIfAuthenticated.php delete mode 100644 app/Http/Middleware/SSLMiddleware.php delete mode 100644 app/Http/Middleware/SecurityHTTPHeadersWriterMiddleware.php delete mode 100644 app/Http/Middleware/SingleAccessPoint.php delete mode 100644 app/Http/Middleware/TrimStrings.php delete mode 100644 app/Http/Middleware/TrustProxies.php delete mode 100644 app/Http/Middleware/VerifyCsrfToken.php delete mode 100644 app/Http/Middleware/cors_server_flowchart.png delete mode 100644 app/Http/Requests/Request.php delete mode 100644 app/Http/Utils/CookieSameSitePolicy.php delete mode 100644 app/Http/Utils/CountryList.php delete mode 100644 app/Http/Utils/DateUtils.php delete mode 100644 app/Http/Utils/FileTypes.php delete mode 100644 app/Http/Utils/FileUploader.php delete mode 100644 app/Http/Utils/FilterAvailableSummitsStrategy.php delete mode 100644 app/Http/Utils/Filters/AbstractFilterElement.php delete mode 100644 app/Http/Utils/Filters/DoctrineCaseFilterMapping.php delete mode 100644 app/Http/Utils/Filters/DoctrineFilterMapping.php delete mode 100644 app/Http/Utils/Filters/DoctrineInstanceOfFilterMapping.php delete mode 100644 app/Http/Utils/Filters/DoctrineJoinFilterMapping.php delete mode 100644 app/Http/Utils/Filters/DoctrineLeftJoinFilterMapping.php delete mode 100644 app/Http/Utils/Filters/DoctrineSwitchFilterMapping.php delete mode 100644 app/Http/Utils/Filters/Filter.php delete mode 100644 app/Http/Utils/Filters/FilterElement.php delete mode 100644 app/Http/Utils/Filters/FilterMapping.php delete mode 100644 app/Http/Utils/Filters/FilterParser.php delete mode 100644 app/Http/Utils/Filters/FilterParserException.php delete mode 100644 app/Http/Utils/HTMLCleaner.php delete mode 100644 app/Http/Utils/IBucket.php delete mode 100644 app/Http/Utils/IFileUploader.php delete mode 100644 app/Http/Utils/IUserIPHelperProvider.php delete mode 100644 app/Http/Utils/Log/LaravelMailerHandler.php delete mode 100644 app/Http/Utils/Order.php delete mode 100644 app/Http/Utils/OrderElement.php delete mode 100644 app/Http/Utils/OrderParser.php delete mode 100644 app/Http/Utils/OrderParserException.php delete mode 100644 app/Http/Utils/PagingConstants.php delete mode 100644 app/Http/Utils/PagingInfo.php delete mode 100644 app/Http/Utils/PagingResponse.php delete mode 100644 app/Http/Utils/ParseMultiPartFormDataInputStream.php delete mode 100644 app/Http/Utils/SwiftBucket.php delete mode 100644 app/Http/Utils/UserIPHelperProvider.php delete mode 100644 app/Http/Utils/UtilsProvider.php delete mode 100644 app/Http/routes.php delete mode 100644 app/Jobs/Job.php delete mode 100644 app/Jobs/PublishUserCreated.php delete mode 100644 app/Jobs/PublishUserDeleted.php delete mode 100644 app/Jobs/PublishUserUpdated.php delete mode 100644 app/Listeners/.gitkeep delete mode 100644 app/Mail/OAuth2ClientLocked.php delete mode 100644 app/Mail/UserEmailVerificationRequest.php delete mode 100644 app/Mail/UserEmailVerificationSuccess.php delete mode 100644 app/Mail/UserLockedEmail.php delete mode 100644 app/Mail/UserPasswordResetMail.php delete mode 100644 app/Mail/UserPasswordResetRequestMail.php delete mode 100644 app/Mail/UserSpammerProcessorResultsEmail.php delete mode 100644 app/Mail/WelcomeNewUserEmail.php delete mode 100644 app/ModelSerializers/AbstractSerializer.php delete mode 100644 app/ModelSerializers/Auth/GroupSerializer.php delete mode 100644 app/ModelSerializers/Auth/UserRegistrationRequestSerializer.php delete mode 100644 app/ModelSerializers/Auth/UserSerializer.php delete mode 100644 app/ModelSerializers/BaseSerializer.php delete mode 100644 app/ModelSerializers/IModelSerializer.php delete mode 100644 app/ModelSerializers/OAuth2/AccessTokenSerializer.php delete mode 100644 app/ModelSerializers/OAuth2/ApiEndpointSerializer.php delete mode 100644 app/ModelSerializers/OAuth2/ApiScopeGroupSerializer.php delete mode 100644 app/ModelSerializers/OAuth2/ApiScopeSerializer.php delete mode 100644 app/ModelSerializers/OAuth2/ApiSerializer.php delete mode 100644 app/ModelSerializers/OAuth2/AsymmetricKeySerializer.php delete mode 100644 app/ModelSerializers/OAuth2/ClientPublicKeySerializer.php delete mode 100644 app/ModelSerializers/OAuth2/ClientSerializer.php delete mode 100644 app/ModelSerializers/OAuth2/RefreshTokenSerializer.php delete mode 100644 app/ModelSerializers/OAuth2/ResourceServerSerializer.php delete mode 100644 app/ModelSerializers/OAuth2/ServerPrivateKeySerializer.php delete mode 100644 app/ModelSerializers/SerializerRegistry.php delete mode 100644 app/Models/BannedIP.php delete mode 100644 app/Models/Exceptions/EntityNotFoundException.php delete mode 100644 app/Models/Exceptions/ValidationException.php delete mode 100644 app/Models/Factories/ServerConfigurationFactory.php delete mode 100644 app/Models/OAuth2/AccessToken.php delete mode 100644 app/Models/OAuth2/Api.php delete mode 100644 app/Models/OAuth2/ApiEndpoint.php delete mode 100644 app/Models/OAuth2/ApiScope.php delete mode 100644 app/Models/OAuth2/ApiScopeGroup.php delete mode 100644 app/Models/OAuth2/AsymmetricKey.php delete mode 100644 app/Models/OAuth2/Client.php delete mode 100644 app/Models/OAuth2/ClientPublicKey.php delete mode 100644 app/Models/OAuth2/Factories/ApiEndpointFactory.php delete mode 100644 app/Models/OAuth2/Factories/ApiFactory.php delete mode 100644 app/Models/OAuth2/Factories/ApiScopeFactory.php delete mode 100644 app/Models/OAuth2/Factories/ApiScopeGroupFactory.php delete mode 100644 app/Models/OAuth2/Factories/ClientFactory.php delete mode 100644 app/Models/OAuth2/Factories/ResourceServerFactory.php delete mode 100644 app/Models/OAuth2/OAuth2TrailException.php delete mode 100644 app/Models/OAuth2/RefreshToken.php delete mode 100644 app/Models/OAuth2/ResourceServer.php delete mode 100644 app/Models/OAuth2/ServerPrivateKey.php delete mode 100644 app/Models/OAuth2/UserConsent.php delete mode 100644 app/Models/OpenId/Factories/OpenIdTrustedSiteFactory.php delete mode 100644 app/Models/OpenId/Factories/ServerExtensionFactory.php delete mode 100644 app/Models/OpenId/OpenIdAssociation.php delete mode 100644 app/Models/OpenId/OpenIdTrustedSite.php delete mode 100644 app/Models/OpenId/ServerExtension.php delete mode 100644 app/Models/Repositories/IDisqusSSOProfileRepository.php delete mode 100644 app/Models/Repositories/IRocketChatSSOProfileRepository.php delete mode 100644 app/Models/Repositories/IStreamChatSSOProfileRepository.php delete mode 100644 app/Models/SSO/Disqus/DisqusSSOProfile.php delete mode 100644 app/Models/SSO/Disqus/DisqusUserProfile.php delete mode 100644 app/Models/SSO/RocketChat/RocketChatSSOProfile.php delete mode 100644 app/Models/SSO/RocketChat/RocketChatUserProfile.php delete mode 100644 app/Models/SSO/StreamChat/StreamChatSSOProfile.php delete mode 100644 app/Models/SSO/StreamChat/StreamChatUserProfile.php delete mode 100644 app/Models/ServerConfiguration.php delete mode 100644 app/Models/UserAction.php delete mode 100644 app/Models/UserExceptionTrail.php delete mode 100644 app/Models/Utils/BaseEntity.php delete mode 100644 app/Models/Utils/IBaseRepository.php delete mode 100644 app/Models/Utils/IEntity.php delete mode 100644 app/Models/Utils/IntervalParser.php delete mode 100644 app/Models/Utils/MySQLExtensionsServiceProvider.php delete mode 100644 app/Models/Utils/PreRemoveEventArgs.php delete mode 100644 app/Models/Utils/RandomGenerator.php delete mode 100644 app/Models/Utils/SilverstripeBaseModel.php delete mode 100644 app/Models/Utils/TimeZoneEntity.php delete mode 100644 app/Models/Utils/UTCTimestamp.php delete mode 100644 app/Models/WhiteListedIP.php delete mode 100644 app/Policies/.gitkeep delete mode 100644 app/Providers/AppServiceProvider.php delete mode 100644 app/Providers/AuthServiceProvider.php delete mode 100644 app/Providers/EventServiceProvider.php delete mode 100644 app/Providers/OAuth2/ClientAuthContextValidatorFactoryProvider.php delete mode 100644 app/Providers/RouteServiceProvider.php delete mode 100644 app/Repositories/AbstractDoctrineOAuth2TokenRepository.php delete mode 100644 app/Repositories/DoctrineAccessTokenRepository.php delete mode 100644 app/Repositories/DoctrineApiEndpointRepository.php delete mode 100644 app/Repositories/DoctrineApiRepository.php delete mode 100644 app/Repositories/DoctrineApiScopeGroupRepository.php delete mode 100644 app/Repositories/DoctrineApiScopeRepository.php delete mode 100644 app/Repositories/DoctrineAsymmetricKeyRepository.php delete mode 100644 app/Repositories/DoctrineBannedIPRepository.php delete mode 100644 app/Repositories/DoctrineClientPublicKeyRepository.php delete mode 100644 app/Repositories/DoctrineDisqusSSOProfileRepository.php delete mode 100644 app/Repositories/DoctrineGroupRepository.php delete mode 100644 app/Repositories/DoctrineOAuth2ClientRepository.php delete mode 100644 app/Repositories/DoctrineOAuth2TrailExceptionRepository.php delete mode 100644 app/Repositories/DoctrineOpenIdAssociationRepository.php delete mode 100644 app/Repositories/DoctrineOpenIdTrustedSiteRepository.php delete mode 100644 app/Repositories/DoctrineRefreshTokenRepository.php delete mode 100644 app/Repositories/DoctrineRepository.php delete mode 100644 app/Repositories/DoctrineResourceServerRepository.php delete mode 100644 app/Repositories/DoctrineRocketChatSSOProfileRepository.php delete mode 100644 app/Repositories/DoctrineServerConfigurationRepository.php delete mode 100644 app/Repositories/DoctrineServerExtensionRepository.php delete mode 100644 app/Repositories/DoctrineServerPrivateKeyRepository.php delete mode 100644 app/Repositories/DoctrineSpamEstimatorFeedRepository.php delete mode 100644 app/Repositories/DoctrineStreamChatSSOProfileRepository.php delete mode 100644 app/Repositories/DoctrineUserExceptionTrailRepository.php delete mode 100644 app/Repositories/DoctrineUserPasswordResetRequestRepository.php delete mode 100644 app/Repositories/DoctrineUserRegistrationRequestRepository.php delete mode 100644 app/Repositories/DoctrineUserRepository.php delete mode 100644 app/Repositories/DoctrineWhiteListedIPRepository.php delete mode 100644 app/Repositories/IServerConfigurationRepository.php delete mode 100644 app/Repositories/IServerExtensionRepository.php delete mode 100644 app/Repositories/ModelDoctrineRepository.php delete mode 100644 app/Repositories/RepositoriesProvider.php delete mode 100644 app/Services/AbstractService.php delete mode 100644 app/Services/Apis/IRocketChatAPI.php delete mode 100644 app/Services/Apis/RocketChatAPI.php delete mode 100644 app/Services/Auth/DisqusSSOService.php delete mode 100644 app/Services/Auth/GroupService.php delete mode 100644 app/Services/Auth/IDisqusSSOService.php delete mode 100644 app/Services/Auth/IGroupService.php delete mode 100644 app/Services/Auth/IRocketChatSSOService.php delete mode 100644 app/Services/Auth/IStreamChatSSOService.php delete mode 100644 app/Services/Auth/IUserService.php delete mode 100644 app/Services/Auth/RocketChatSSOService.php delete mode 100644 app/Services/Auth/StreamChatSSOService.php delete mode 100644 app/Services/Auth/UserService.php delete mode 100644 app/Services/Facades/ExternalUrlService.php delete mode 100644 app/Services/Facades/ServerConfigurationService.php delete mode 100644 app/Services/IBaseService.php delete mode 100644 app/Services/IUserActionService.php delete mode 100644 app/Services/OAuth2/ApiEndpointService.php delete mode 100644 app/Services/OAuth2/ApiScopeGroupService.php delete mode 100644 app/Services/OAuth2/ApiScopeService.php delete mode 100644 app/Services/OAuth2/ApiService.php delete mode 100644 app/Services/OAuth2/AsymmetricKeyService.php delete mode 100644 app/Services/OAuth2/ClientCredentialGenerator.php delete mode 100644 app/Services/OAuth2/ClientPublicKeyService.php delete mode 100644 app/Services/OAuth2/ClientService.php delete mode 100644 app/Services/OAuth2/HttpIClientJWKSetReader.php delete mode 100644 app/Services/OAuth2/IdTokenBuilderImpl.php delete mode 100644 app/Services/OAuth2/OAuth2MementoSessionSerializerService.php delete mode 100644 app/Services/OAuth2/OAuth2ServiceProvider.php delete mode 100644 app/Services/OAuth2/OpenIDProviderConfigurationService.php delete mode 100644 app/Services/OAuth2/PrincipalService.php delete mode 100644 app/Services/OAuth2/ResourceServer/UserService.php delete mode 100644 app/Services/OAuth2/ResourceServerContext.php delete mode 100644 app/Services/OAuth2/ResourceServerService.php delete mode 100644 app/Services/OAuth2/SecurityContextService.php delete mode 100644 app/Services/OAuth2/ServerPrivateKeyService.php delete mode 100644 app/Services/OAuth2/TokenService.php delete mode 100644 app/Services/OAuth2/UserConsentService.php delete mode 100644 app/Services/OpenId/AssociationService.php delete mode 100644 app/Services/OpenId/NonceService.php delete mode 100644 app/Services/OpenId/OpenIdMementoSessionSerializerService.php delete mode 100644 app/Services/OpenId/OpenIdProvider.php delete mode 100644 app/Services/OpenId/ServerExtensionsService.php delete mode 100644 app/Services/OpenId/TrustedSitesService.php delete mode 100644 app/Services/OpenId/UserService.php delete mode 100644 app/Services/SecurityPolicies/AbstractBlacklistSecurityPolicy.php delete mode 100644 app/Services/SecurityPolicies/AuthorizationCodeRedeemPolicy.php delete mode 100644 app/Services/SecurityPolicies/BlacklistSecurityPolicy.php delete mode 100644 app/Services/SecurityPolicies/DelayCounterMeasure.php delete mode 100644 app/Services/SecurityPolicies/LockUserCounterMeasure.php delete mode 100644 app/Services/SecurityPolicies/LockUserSecurityPolicy.php delete mode 100644 app/Services/SecurityPolicies/OAuth2LockClientCounterMeasure.php delete mode 100644 app/Services/SecurityPolicies/OAuth2SecurityPolicy.php delete mode 100644 app/Services/SecurityPolicies/RevokeAuthorizationCodeRelatedTokens.php delete mode 100644 app/Services/ServicesProvider.php delete mode 100644 app/Services/UserActionService.php delete mode 100644 app/Services/Utils/BannedIPService.php delete mode 100644 app/Services/Utils/CheckPointService.php delete mode 100644 app/Services/Utils/DoctrineTransactionService.php delete mode 100644 app/Services/Utils/ExternalUrlService.php delete mode 100644 app/Services/Utils/LockManagerService.php delete mode 100644 app/Services/Utils/LogService.php delete mode 100644 app/Services/Utils/RedisCacheService.php delete mode 100644 app/Services/Utils/ServerConfigurationService.php delete mode 100644 app/Services/Utils/UtilsProvider.php delete mode 100644 app/Strategies/DefaultLoginStrategy.php delete mode 100644 app/Strategies/DirectResponseStrategy.php delete mode 100644 app/Strategies/DisplayResponseJsonStrategy.php delete mode 100644 app/Strategies/DisplayResponseStrategyFactory.php delete mode 100644 app/Strategies/DisplayResponseUserAgentStrategy.php delete mode 100644 app/Strategies/IConsentStrategy.php delete mode 100644 app/Strategies/IDisplayResponseStrategy.php delete mode 100644 app/Strategies/ILoginStrategy.php delete mode 100644 app/Strategies/IndirectResponseQueryStringStrategy.php delete mode 100644 app/Strategies/IndirectResponseUrlFragmentStrategy.php delete mode 100644 app/Strategies/OAuth2AuthenticationStrategy.php delete mode 100644 app/Strategies/OAuth2ConsentStrategy.php delete mode 100644 app/Strategies/OAuth2LoginStrategy.php delete mode 100644 app/Strategies/OpenIdAuthenticationStrategy.php delete mode 100644 app/Strategies/OpenIdConsentStrategy.php delete mode 100644 app/Strategies/OpenIdLoginStrategy.php delete mode 100644 app/Strategies/PostResponseStrategy.php delete mode 100644 app/Strategies/StrategyProvider.php delete mode 100644 app/Validators/CustomValidator.php delete mode 100644 app/libs/Auth/AuthHelper.php delete mode 100644 app/libs/Auth/AuthService.php delete mode 100644 app/libs/Auth/AuthenticationExtensionService.php delete mode 100644 app/libs/Auth/AuthenticationServiceProvider.php delete mode 100644 app/libs/Auth/CustomAuthProvider.php delete mode 100644 app/libs/Auth/Exceptions/AuthenticationException.php delete mode 100644 app/libs/Auth/Exceptions/AuthenticationInvalidPasswordAttemptException.php delete mode 100644 app/libs/Auth/Exceptions/AuthenticationLockedUserLoginAttempt.php delete mode 100644 app/libs/Auth/Exceptions/UnverifiedEmailMemberException.php delete mode 100644 app/libs/Auth/Factories/GroupFactory.php delete mode 100644 app/libs/Auth/Factories/UserFactory.php delete mode 100644 app/libs/Auth/Factories/UserRegistrationRequestFactory.php delete mode 100644 app/libs/Auth/IAuthenticationExtension.php delete mode 100644 app/libs/Auth/IAuthenticationExtensionService.php delete mode 100644 app/libs/Auth/IUserNameGeneratorService.php delete mode 100644 app/libs/Auth/Models/Affiliation.php delete mode 100644 app/libs/Auth/Models/Group.php delete mode 100644 app/libs/Auth/Models/IGroupSlugs.php delete mode 100644 app/libs/Auth/Models/Organization.php delete mode 100644 app/libs/Auth/Models/SpamEstimatorFeed.php delete mode 100644 app/libs/Auth/Models/User.php delete mode 100644 app/libs/Auth/Models/UserPasswordResetRequest.php delete mode 100644 app/libs/Auth/Models/UserRegistrationRequest.php delete mode 100644 app/libs/Auth/Repositories/IBannedIPRepository.php delete mode 100644 app/libs/Auth/Repositories/IGroupRepository.php delete mode 100644 app/libs/Auth/Repositories/ISpamEstimatorFeedRepository.php delete mode 100644 app/libs/Auth/Repositories/IUserExceptionTrailRepository.php delete mode 100644 app/libs/Auth/Repositories/IUserPasswordResetRequestRepository.php delete mode 100644 app/libs/Auth/Repositories/IUserRegistrationRequestRepository.php delete mode 100644 app/libs/Auth/Repositories/IUserRepository.php delete mode 100644 app/libs/Auth/Repositories/IWhiteListedIPRepository.php delete mode 100644 app/libs/Auth/UserNameGeneratorService.php delete mode 100644 app/libs/OAuth2/.gitkeep delete mode 100644 app/libs/OAuth2/AddressClaim.php delete mode 100644 app/libs/OAuth2/BearerAccessTokenAuthorizationHeaderParser.php delete mode 100644 app/libs/OAuth2/Builders/IdTokenBuilder.php delete mode 100644 app/libs/OAuth2/Discovery/DiscoveryDocumentBuilder.php delete mode 100644 app/libs/OAuth2/Discovery/IOpenIDProviderConfigurationService.php delete mode 100644 app/libs/OAuth2/Discovery/OpenIDProviderMetadata.php delete mode 100644 app/libs/OAuth2/Endpoints/.gitkeep delete mode 100644 app/libs/OAuth2/Endpoints/AuthorizationEndpoint.php delete mode 100644 app/libs/OAuth2/Endpoints/IOAuth2Endpoint.php delete mode 100644 app/libs/OAuth2/Endpoints/TokenEndpoint.php delete mode 100644 app/libs/OAuth2/Endpoints/TokenIntrospectionEndpoint.php delete mode 100644 app/libs/OAuth2/Endpoints/TokenRevocationEndpoint.php delete mode 100644 app/libs/OAuth2/Exceptions/AbsentClientException.php delete mode 100644 app/libs/OAuth2/Exceptions/AbsentCurrentUserException.php delete mode 100644 app/libs/OAuth2/Exceptions/AccessDeniedException.php delete mode 100644 app/libs/OAuth2/Exceptions/AllowedClientUriAlreadyExistsException.php delete mode 100644 app/libs/OAuth2/Exceptions/BearerTokenDisclosureAttemptException.php delete mode 100644 app/libs/OAuth2/Exceptions/ConsentRequiredException.php delete mode 100644 app/libs/OAuth2/Exceptions/ExpiredAccessTokenException.php delete mode 100644 app/libs/OAuth2/Exceptions/ExpiredAuthorizationCodeException.php delete mode 100644 app/libs/OAuth2/Exceptions/InteractionRequiredException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidAccessTokenException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidAllowedClientUriException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidApi.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidApiEndpoint.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidApiScope.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidApiScopeGroup.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidApplicationType.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidAuthenticationRequestException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidAuthorizationCodeException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidAuthorizationRequestException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidClientAssertionAlgorithmException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidClientAssertionException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidClientAssertionTypeException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidClientAuthMethodException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidClientAuthenticationContextException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidClientCredentials.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidClientException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidClientType.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidGrantTypeException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidLoginHint.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidOAuth2PKCERequest.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidOAuth2Request.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidRedeemAuthCodeException.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidResourceServer.php delete mode 100644 app/libs/OAuth2/Exceptions/InvalidTokenEndpointAuthMethodException.php delete mode 100644 app/libs/OAuth2/Exceptions/LockedClientException.php delete mode 100644 app/libs/OAuth2/Exceptions/LoginRequiredException.php delete mode 100644 app/libs/OAuth2/Exceptions/MissingClientAuthorizationInfo.php delete mode 100644 app/libs/OAuth2/Exceptions/MissingClientIdParam.php delete mode 100644 app/libs/OAuth2/Exceptions/OAuth2BaseException.php delete mode 100644 app/libs/OAuth2/Exceptions/OAuth2ClientBaseException.php delete mode 100644 app/libs/OAuth2/Exceptions/OAuth2GenericException.php delete mode 100644 app/libs/OAuth2/Exceptions/OAuth2MissingBearerAccessTokenException.php delete mode 100644 app/libs/OAuth2/Exceptions/OAuth2ResourceServerException.php delete mode 100644 app/libs/OAuth2/Exceptions/RecipientKeyNotFoundException.php delete mode 100644 app/libs/OAuth2/Exceptions/ReloadSessionException.php delete mode 100644 app/libs/OAuth2/Exceptions/ReplayAttackAuthCodeException.php delete mode 100644 app/libs/OAuth2/Exceptions/ReplayAttackException.php delete mode 100644 app/libs/OAuth2/Exceptions/ReplayAttackRefreshTokenException.php delete mode 100644 app/libs/OAuth2/Exceptions/RevokedAccessTokenException.php delete mode 100644 app/libs/OAuth2/Exceptions/RevokedRefreshTokenException.php delete mode 100644 app/libs/OAuth2/Exceptions/ScopeNotAllowedException.php delete mode 100644 app/libs/OAuth2/Exceptions/ServerKeyNotFoundException.php delete mode 100644 app/libs/OAuth2/Exceptions/UnAuthorizedClientException.php delete mode 100644 app/libs/OAuth2/Exceptions/UnsupportedResponseTypeException.php delete mode 100644 app/libs/OAuth2/Exceptions/UriNotAllowedException.php delete mode 100644 app/libs/OAuth2/Exceptions/UseRefreshTokenException.php delete mode 100644 app/libs/OAuth2/Factories/OAuth2AccessTokenFragmentResponseFactory.php delete mode 100644 app/libs/OAuth2/Factories/OAuth2AccessTokenResponseFactory.php delete mode 100644 app/libs/OAuth2/Factories/OAuth2AuthorizationRequestFactory.php delete mode 100644 app/libs/OAuth2/Factories/OAuth2PKCEValidationMethodFactory.php delete mode 100644 app/libs/OAuth2/GrantTypes/.gitkeep delete mode 100644 app/libs/OAuth2/GrantTypes/AbstractGrantType.php delete mode 100644 app/libs/OAuth2/GrantTypes/AuthorizationCodeGrantType.php delete mode 100644 app/libs/OAuth2/GrantTypes/ClientCredentialsGrantType.php delete mode 100644 app/libs/OAuth2/GrantTypes/HybridGrantType.php delete mode 100644 app/libs/OAuth2/GrantTypes/IGrantType.php delete mode 100644 app/libs/OAuth2/GrantTypes/ImplicitGrantType.php delete mode 100644 app/libs/OAuth2/GrantTypes/InteractiveGrantType.php delete mode 100644 app/libs/OAuth2/GrantTypes/RefreshBearerTokenGrantType.php delete mode 100644 app/libs/OAuth2/GrantTypes/RevokeBearerTokenGrantType.php delete mode 100644 app/libs/OAuth2/GrantTypes/Strategies/IValidateBearerTokenStrategy.php delete mode 100644 app/libs/OAuth2/GrantTypes/Strategies/PKCEBaseValidator.php delete mode 100644 app/libs/OAuth2/GrantTypes/Strategies/PKCEPlainValidator.php delete mode 100644 app/libs/OAuth2/GrantTypes/Strategies/PKCES256Validator.php delete mode 100644 app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenResourceServerStrategy.php delete mode 100644 app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenStrategy.php delete mode 100644 app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenStrategyFactory.php delete mode 100644 app/libs/OAuth2/GrantTypes/ValidateBearerTokenGrantType.php delete mode 100644 app/libs/OAuth2/Heuristics/ClientEncryptionKeyFinder.php delete mode 100644 app/libs/OAuth2/Heuristics/ClientSigningKeyFinder.php delete mode 100644 app/libs/OAuth2/Heuristics/IKeyFinder.php delete mode 100644 app/libs/OAuth2/Heuristics/ServerEncryptionKeyFinder.php delete mode 100644 app/libs/OAuth2/Heuristics/ServerSigningKeyFinder.php delete mode 100644 app/libs/OAuth2/IOAuth2Protocol.php delete mode 100644 app/libs/OAuth2/IResourceServerContext.php delete mode 100644 app/libs/OAuth2/IUserScopes.php delete mode 100644 app/libs/OAuth2/Models/.gitkeep delete mode 100644 app/libs/OAuth2/Models/AccessToken.php delete mode 100644 app/libs/OAuth2/Models/AuthorizationCode.php delete mode 100644 app/libs/OAuth2/Models/ClientAssertionAuthenticationContext.php delete mode 100644 app/libs/OAuth2/Models/ClientAuthenticationContext.php delete mode 100644 app/libs/OAuth2/Models/ClientCredentialsAuthenticationContext.php delete mode 100644 app/libs/OAuth2/Models/IApi.php delete mode 100644 app/libs/OAuth2/Models/IApiEndpoint.php delete mode 100644 app/libs/OAuth2/Models/IApiScope.php delete mode 100644 app/libs/OAuth2/Models/IApiScopeGroup.php delete mode 100644 app/libs/OAuth2/Models/IAsymmetricKey.php delete mode 100644 app/libs/OAuth2/Models/IClient.php delete mode 100644 app/libs/OAuth2/Models/IClientPublicKey.php delete mode 100644 app/libs/OAuth2/Models/IOAuth2User.php delete mode 100644 app/libs/OAuth2/Models/IPrincipal.php delete mode 100644 app/libs/OAuth2/Models/IResourceServer.php delete mode 100644 app/libs/OAuth2/Models/IScope.php delete mode 100644 app/libs/OAuth2/Models/IServerPrivateKey.php delete mode 100644 app/libs/OAuth2/Models/IUserConsent.php delete mode 100644 app/libs/OAuth2/Models/JWTResponseInfo.php delete mode 100644 app/libs/OAuth2/Models/Principal.php delete mode 100644 app/libs/OAuth2/Models/RefreshToken.php delete mode 100644 app/libs/OAuth2/Models/SecurityContext.php delete mode 100644 app/libs/OAuth2/Models/Token.php delete mode 100644 app/libs/OAuth2/Models/TokenEndpointAuthInfo.php delete mode 100644 app/libs/OAuth2/OAuth2Message.php delete mode 100644 app/libs/OAuth2/OAuth2Protocol.php delete mode 100644 app/libs/OAuth2/OAuth2ServiceProvider.php delete mode 100644 app/libs/OAuth2/Repositories/IAccessTokenRepository.php delete mode 100644 app/libs/OAuth2/Repositories/IApiEndpointRepository.php delete mode 100644 app/libs/OAuth2/Repositories/IApiRepository.php delete mode 100644 app/libs/OAuth2/Repositories/IApiScopeGroupRepository.php delete mode 100644 app/libs/OAuth2/Repositories/IApiScopeRepository.php delete mode 100644 app/libs/OAuth2/Repositories/IAsymmetricKeyRepository.php delete mode 100644 app/libs/OAuth2/Repositories/IClientPublicKeyRepository.php delete mode 100644 app/libs/OAuth2/Repositories/IClientRepository.php delete mode 100644 app/libs/OAuth2/Repositories/IOAuth2TrailExceptionRepository.php delete mode 100644 app/libs/OAuth2/Repositories/IRefreshTokenRepository.php delete mode 100644 app/libs/OAuth2/Repositories/IResourceServerRepository.php delete mode 100644 app/libs/OAuth2/Repositories/IServerPrivateKeyRepository.php delete mode 100644 app/libs/OAuth2/Requests/.gitkeep delete mode 100644 app/libs/OAuth2/Requests/OAuth2AccessTokenRequestAuthCode.php delete mode 100644 app/libs/OAuth2/Requests/OAuth2AccessTokenRequestClientCredentials.php delete mode 100644 app/libs/OAuth2/Requests/OAuth2AccessTokenValidationRequest.php delete mode 100644 app/libs/OAuth2/Requests/OAuth2AuthenticationRequest.php delete mode 100644 app/libs/OAuth2/Requests/OAuth2AuthorizationRequest.php delete mode 100644 app/libs/OAuth2/Requests/OAuth2LogoutRequest.php delete mode 100644 app/libs/OAuth2/Requests/OAuth2RefreshAccessTokenRequest.php delete mode 100644 app/libs/OAuth2/Requests/OAuth2Request.php delete mode 100644 app/libs/OAuth2/Requests/OAuth2RequestMemento.php delete mode 100644 app/libs/OAuth2/Requests/OAuth2TokenRequest.php delete mode 100644 app/libs/OAuth2/Requests/OAuth2TokenRevocationRequest.php delete mode 100644 app/libs/OAuth2/ResourceServer/IUserService.php delete mode 100644 app/libs/OAuth2/ResourceServer/OAuth2ProtectedService.php delete mode 100644 app/libs/OAuth2/Responses/.gitkeep delete mode 100644 app/libs/OAuth2/Responses/OAuth2AccessTokenFragmentResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2AccessTokenResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2AccessTokenValidationResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2AuthorizationResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2DirectErrorResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2DirectResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2HybridTokenFragmentResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2IDTokenFragmentResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2IdTokenResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2IndirectErrorResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2IndirectFragmentErrorResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2IndirectFragmentResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2IndirectResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2LogoutResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2PostResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2Response.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2TokenRevocationResponse.php delete mode 100644 app/libs/OAuth2/Responses/OAuth2WWWAuthenticateErrorResponse.php delete mode 100644 app/libs/OAuth2/Services/.gitkeep delete mode 100644 app/libs/OAuth2/Services/AccessTokenGenerator.php delete mode 100644 app/libs/OAuth2/Services/AuthorizationCodeGenerator.php delete mode 100644 app/libs/OAuth2/Services/IApiEndpointService.php delete mode 100644 app/libs/OAuth2/Services/IApiScopeGroupService.php delete mode 100644 app/libs/OAuth2/Services/IApiScopeService.php delete mode 100644 app/libs/OAuth2/Services/IApiService.php delete mode 100644 app/libs/OAuth2/Services/IAsymmetricKeyService.php delete mode 100644 app/libs/OAuth2/Services/IClientCrendentialGenerator.php delete mode 100644 app/libs/OAuth2/Services/IClientJWKSetReader.php delete mode 100644 app/libs/OAuth2/Services/IClientPublicKeyService.php delete mode 100644 app/libs/OAuth2/Services/IClientService.php delete mode 100644 app/libs/OAuth2/Services/IMementoOAuth2SerializerService.php delete mode 100644 app/libs/OAuth2/Services/IPrincipalService.php delete mode 100644 app/libs/OAuth2/Services/IResourceServerService.php delete mode 100644 app/libs/OAuth2/Services/ISecurityContextService.php delete mode 100644 app/libs/OAuth2/Services/IServerPrivateKeyService.php delete mode 100644 app/libs/OAuth2/Services/ITokenService.php delete mode 100644 app/libs/OAuth2/Services/IUserConsentService.php delete mode 100644 app/libs/OAuth2/Services/OAuth2ServiceCatalog.php delete mode 100644 app/libs/OAuth2/Services/OAuth2TokenGenerator.php delete mode 100644 app/libs/OAuth2/Services/RefreshTokenGenerator.php delete mode 100644 app/libs/OAuth2/StandardClaims.php delete mode 100644 app/libs/OAuth2/Strategies/ClientAssertionAuthContextValidator.php delete mode 100644 app/libs/OAuth2/Strategies/ClientAuthContextValidatorFactory.php delete mode 100644 app/libs/OAuth2/Strategies/ClientPKCEAuthContextValidator.php delete mode 100644 app/libs/OAuth2/Strategies/ClientPlainCredentialsAuthContextValidator.php delete mode 100644 app/libs/OAuth2/Strategies/ClientPrivateKeyAssertionAuthContextValidator.php delete mode 100644 app/libs/OAuth2/Strategies/ClientSharedSecretAssertionAuthContextValidator.php delete mode 100644 app/libs/OAuth2/Strategies/IClientAuthContextValidator.php delete mode 100644 app/libs/OAuth2/Strategies/IOAuth2AuthenticationStrategy.php delete mode 100644 app/libs/OAuth2/Strategies/IPKCEValidationMethod.php delete mode 100644 app/libs/OAuth2/Strategies/OAuth2IndirectErrorResponseFactoryMethod.php delete mode 100644 app/libs/OAuth2/Strategies/OAuth2ResponseStrategyFactoryMethod.php delete mode 100644 app/libs/OpenId/Exceptions/InvalidAssociation.php delete mode 100644 app/libs/OpenId/Exceptions/InvalidAssociationTypeException.php delete mode 100644 app/libs/OpenId/Exceptions/InvalidDHParam.php delete mode 100644 app/libs/OpenId/Exceptions/InvalidKVFormat.php delete mode 100644 app/libs/OpenId/Exceptions/InvalidNonce.php delete mode 100644 app/libs/OpenId/Exceptions/InvalidOpenIdAuthenticationRequestMode.php delete mode 100644 app/libs/OpenId/Exceptions/InvalidOpenIdMessageException.php delete mode 100644 app/libs/OpenId/Exceptions/InvalidOpenIdMessageMode.php delete mode 100644 app/libs/OpenId/Exceptions/InvalidRequestContextException.php delete mode 100644 app/libs/OpenId/Exceptions/InvalidSessionTypeException.php delete mode 100644 app/libs/OpenId/Exceptions/OpenIdBaseException.php delete mode 100644 app/libs/OpenId/Exceptions/OpenIdCryptoException.php delete mode 100644 app/libs/OpenId/Exceptions/OpenIdInvalidRealmException.php delete mode 100644 app/libs/OpenId/Exceptions/ReplayAttackException.php delete mode 100644 app/libs/OpenId/Extensions/Implementations/OpenIdAXExtension.php delete mode 100644 app/libs/OpenId/Extensions/Implementations/OpenIdAXRequest.php delete mode 100644 app/libs/OpenId/Extensions/Implementations/OpenIdOAuth2Extension.php delete mode 100644 app/libs/OpenId/Extensions/Implementations/OpenIdOAuth2Request.php delete mode 100644 app/libs/OpenId/Extensions/Implementations/OpenIdPAPEExtension.php delete mode 100644 app/libs/OpenId/Extensions/Implementations/OpenIdSREGExtension.php delete mode 100644 app/libs/OpenId/Extensions/Implementations/OpenIdSREGExtension_1_0.php delete mode 100644 app/libs/OpenId/Extensions/Implementations/OpenIdSREGRequest.php delete mode 100644 app/libs/OpenId/Extensions/Implementations/OpenIdSREGRequest_1_0.php delete mode 100644 app/libs/OpenId/Extensions/OpenIdAuthenticationExtension.php delete mode 100644 app/libs/OpenId/Extensions/OpenIdExtension.php delete mode 100644 app/libs/OpenId/Handlers/Factories/SessionAssociationRequestFactory.php delete mode 100644 app/libs/OpenId/Handlers/IOpenIdAuthenticationStrategy.php delete mode 100644 app/libs/OpenId/Handlers/OpenIdAuthenticationRequestHandler.php delete mode 100644 app/libs/OpenId/Handlers/OpenIdCheckAuthenticationRequestHandler.php delete mode 100644 app/libs/OpenId/Handlers/OpenIdMessageHandler.php delete mode 100644 app/libs/OpenId/Handlers/OpenIdSessionAssociationRequestHandler.php delete mode 100644 app/libs/OpenId/Handlers/Strategies/SessionAssociation/ISessionAssociationStrategy.php delete mode 100644 app/libs/OpenId/Handlers/Strategies/SessionAssociation/Implementations/SessionAssociationDHStrategy.php delete mode 100644 app/libs/OpenId/Handlers/Strategies/SessionAssociation/Implementations/SessionAssociationUnencryptedStrategy.php delete mode 100644 app/libs/OpenId/Helpers/AssocHandleGenerator.php delete mode 100644 app/libs/OpenId/Helpers/AssociationFactory.php delete mode 100644 app/libs/OpenId/Helpers/OpenIdCryptoHelper.php delete mode 100644 app/libs/OpenId/Helpers/OpenIdErrorMessages.php delete mode 100644 app/libs/OpenId/Helpers/OpenIdSignatureBuilder.php delete mode 100644 app/libs/OpenId/Helpers/OpenIdUriHelper.php delete mode 100644 app/libs/OpenId/IOpenIdProtocol.php delete mode 100644 app/libs/OpenId/Models/Association.php delete mode 100644 app/libs/OpenId/Models/IAssociation.php delete mode 100644 app/libs/OpenId/Models/IOpenIdUser.php delete mode 100644 app/libs/OpenId/Models/ITrustedSite.php delete mode 100644 app/libs/OpenId/Models/OpenIdNonce.php delete mode 100644 app/libs/OpenId/OpenIdMessage.php delete mode 100644 app/libs/OpenId/OpenIdProtocol.php delete mode 100644 app/libs/OpenId/OpenIdServiceProvider.php delete mode 100644 app/libs/OpenId/Repositories/IOpenIdAssociationRepository.php delete mode 100644 app/libs/OpenId/Repositories/IOpenIdTrustedSiteRepository.php delete mode 100644 app/libs/OpenId/Requests/Contexts/PartialView.php delete mode 100644 app/libs/OpenId/Requests/Contexts/RequestContext.php delete mode 100644 app/libs/OpenId/Requests/OpenIdAssociationSessionRequest.php delete mode 100644 app/libs/OpenId/Requests/OpenIdAuthenticationRequest.php delete mode 100644 app/libs/OpenId/Requests/OpenIdCheckAuthenticationRequest.php delete mode 100644 app/libs/OpenId/Requests/OpenIdDHAssociationSessionRequest.php delete mode 100644 app/libs/OpenId/Requests/OpenIdMessageMemento.php delete mode 100644 app/libs/OpenId/Requests/OpenIdRequest.php delete mode 100644 app/libs/OpenId/Responses/Contexts/ResponseContext.php delete mode 100644 app/libs/OpenId/Responses/OpenIdAssociationSessionResponse.php delete mode 100644 app/libs/OpenId/Responses/OpenIdAssociationSessionUnsuccessfulResponse.php delete mode 100644 app/libs/OpenId/Responses/OpenIdCheckAuthenticationResponse.php delete mode 100644 app/libs/OpenId/Responses/OpenIdDiffieHellmanAssociationSessionResponse.php delete mode 100644 app/libs/OpenId/Responses/OpenIdDirectGenericErrorResponse.php delete mode 100644 app/libs/OpenId/Responses/OpenIdDirectResponse.php delete mode 100644 app/libs/OpenId/Responses/OpenIdImmediateNegativeAssertion.php delete mode 100644 app/libs/OpenId/Responses/OpenIdIndirectGenericErrorResponse.php delete mode 100644 app/libs/OpenId/Responses/OpenIdIndirectResponse.php delete mode 100644 app/libs/OpenId/Responses/OpenIdNonImmediateNegativeAssertion.php delete mode 100644 app/libs/OpenId/Responses/OpenIdPositiveAssertionResponse.php delete mode 100644 app/libs/OpenId/Responses/OpenIdResponse.php delete mode 100644 app/libs/OpenId/Responses/OpenIdUnencryptedAssociationSessionResponse.php delete mode 100644 app/libs/OpenId/Services/IAssociationService.php delete mode 100644 app/libs/OpenId/Services/IMementoOpenIdSerializerService.php delete mode 100644 app/libs/OpenId/Services/INonceService.php delete mode 100644 app/libs/OpenId/Services/IServerConfigurationService.php delete mode 100644 app/libs/OpenId/Services/IServerExtensionsService.php delete mode 100644 app/libs/OpenId/Services/ITrustedSitesService.php delete mode 100644 app/libs/OpenId/Services/IUserService.php delete mode 100644 app/libs/OpenId/Services/NonceUniqueIdentifierGenerator.php delete mode 100644 app/libs/OpenId/Services/OpenIdServiceCatalog.php delete mode 100644 app/libs/OpenId/Strategies/OpenIdResponseStrategyFactoryMethod.php delete mode 100644 app/libs/OpenId/Xrds/XRDSDocumentBuilder.php delete mode 100644 app/libs/OpenId/Xrds/XRDSService.php delete mode 100644 app/libs/Utils/.gitkeep delete mode 100644 app/libs/Utils/ArrayUtils.php delete mode 100644 app/libs/Utils/CSVReader.php delete mode 100644 app/libs/Utils/Db/ITransactionService.php delete mode 100644 app/libs/Utils/Exceptions/ConfigurationException.php delete mode 100644 app/libs/Utils/Exceptions/UnacquiredLockException.php delete mode 100644 app/libs/Utils/FileSystem/FileNameSanitizer.php delete mode 100644 app/libs/Utils/FileSystem/SwiftAdapter.php delete mode 100644 app/libs/Utils/FileSystem/SwiftServiceProvider.php delete mode 100644 app/libs/Utils/Http/HttpContentType.php delete mode 100644 app/libs/Utils/Http/HttpMessage.php delete mode 100644 app/libs/Utils/Http/HttpResponse.php delete mode 100644 app/libs/Utils/Http/HttpUtils.php delete mode 100644 app/libs/Utils/IHttpResponseStrategy.php delete mode 100644 app/libs/Utils/IPHelper.php delete mode 100644 app/libs/Utils/JsonUtils.php delete mode 100644 app/libs/Utils/MathUtils.php delete mode 100644 app/libs/Utils/Model/Identifier.php delete mode 100644 app/libs/Utils/RequestUtils.php delete mode 100644 app/libs/Utils/Services/IAuthService.php delete mode 100644 app/libs/Utils/Services/IBannedIPService.php delete mode 100644 app/libs/Utils/Services/ICacheService.php delete mode 100644 app/libs/Utils/Services/ICheckPointService.php delete mode 100644 app/libs/Utils/Services/ILockManagerService.php delete mode 100644 app/libs/Utils/Services/ILogService.php delete mode 100644 app/libs/Utils/Services/ISecurityPolicy.php delete mode 100644 app/libs/Utils/Services/ISecurityPolicyCounterMeasure.php delete mode 100644 app/libs/Utils/Services/IServerConfigurationService.php delete mode 100644 app/libs/Utils/Services/IdentifierGenerator.php delete mode 100644 app/libs/Utils/Services/ServiceLocator.php delete mode 100644 app/libs/Utils/Services/UniqueIdentifierGenerator.php delete mode 100644 app/libs/Utils/Services/UtilsServiceCatalog.php delete mode 100644 app/libs/Utils/URLUtils.php delete mode 100755 artisan delete mode 100644 behat.yml delete mode 100644 bindep.txt delete mode 100644 bootstrap/app.php delete mode 100644 bootstrap/autoload.php delete mode 100644 bootstrap/cache/.gitignore delete mode 100755 clear_logs.sh delete mode 100644 composer.json delete mode 100644 composer.lock delete mode 100644 config/app.php delete mode 100644 config/auth.php delete mode 100644 config/broadcasting.php delete mode 100644 config/cache.php delete mode 100644 config/cache_regions.php delete mode 100644 config/compile.php delete mode 100644 config/cors.php delete mode 100644 config/curl.php delete mode 100644 config/database.php delete mode 100644 config/doctrine.php delete mode 100644 config/filesystems.php delete mode 100644 config/hashing.php delete mode 100644 config/log.php delete mode 100644 config/logging.php delete mode 100644 config/mail.php delete mode 100644 config/migrations.php delete mode 100644 config/queue.php delete mode 100644 config/recaptcha.php delete mode 100644 config/server.php delete mode 100644 config/services.php delete mode 100644 config/session.php delete mode 100644 config/view.php delete mode 100644 database/.gitignore delete mode 100644 database/factories/.gitkeep delete mode 100644 database/migrations/.gitkeep delete mode 100644 database/migrations/Version20190604015804.php delete mode 100644 database/migrations/Version20190604015808.php delete mode 100644 database/migrations/Version20190604024945.php delete mode 100644 database/migrations/Version20190609163537.php delete mode 100644 database/migrations/Version20190611172226.php delete mode 100644 database/migrations/Version20190614143948.php delete mode 100644 database/migrations/Version20190621173542.php delete mode 100644 database/migrations/Version20190627180435.php delete mode 100644 database/migrations/Version20190729014640.php delete mode 100644 database/migrations/Version20190729150610.php delete mode 100644 database/migrations/Version20190828144355.php delete mode 100644 database/migrations/Version20190828144405.php delete mode 100644 database/migrations/Version20190829142736.php delete mode 100644 database/migrations/Version20190904133943.php delete mode 100644 database/migrations/Version20191017190223.php delete mode 100644 database/migrations/Version20191121032755.php delete mode 100644 database/migrations/Version20200115152348.php delete mode 100644 database/migrations/Version20200306133045.php delete mode 100644 database/migrations/Version20200306135446.php delete mode 100644 database/migrations/Version20200528175450.php delete mode 100644 database/migrations/Version20200530150357.php delete mode 100644 database/migrations/Version20200715150546.php delete mode 100644 database/migrations/Version20200715195145.php delete mode 100644 database/migrations/Version20200715195155.php delete mode 100644 database/migrations/Version20200803193707.php delete mode 100644 database/migrations/Version20200811151509.php delete mode 100644 database/migrations/Version20200910212216.php delete mode 100644 database/migrations/Version20201105184620.php delete mode 100644 database/migrations/Version20201214162511.php delete mode 100644 database/seeds/.gitkeep delete mode 100644 database/seeds/ApiEndpointSeeder.php delete mode 100644 database/seeds/ApiScopeSeeder.php delete mode 100644 database/seeds/ApiSeeder.php delete mode 100644 database/seeds/DatabaseSeeder.php delete mode 100644 database/seeds/OpenIdExtensionsSeeder.php delete mode 100644 database/seeds/ResourceServerSeeder.php delete mode 100644 database/seeds/SeedUtils.php delete mode 100644 database/seeds/ServerConfigurationSeeder.php delete mode 100644 database/seeds/TestSeeder.php delete mode 100644 doc/source/conf.py delete mode 100644 doc/source/index.rst delete mode 100644 doc/source/oauth2.rst delete mode 100644 doc/source/openid.rst delete mode 100644 gulpfile.js delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 phpunit.xml delete mode 100644 playbooks/openstackid-release-branch/post.yaml delete mode 100644 playbooks/openstackid-release-branch/run.yaml delete mode 100644 playbooks/openstackid-release-master/post.yaml delete mode 100644 playbooks/openstackid-release-master/run.yaml delete mode 100644 playbooks/openstackid-unittests/run.yaml delete mode 100644 public/.htaccess delete mode 100644 public/assets/css/auth/email.css delete mode 100644 public/assets/css/auth/login.css delete mode 100644 public/assets/css/auth/register.css delete mode 100644 public/assets/css/edit-client-public-keys.css delete mode 100644 public/assets/css/edit-client.css delete mode 100644 public/assets/css/main.css delete mode 100644 public/assets/css/private-keys.css delete mode 100755 public/assets/css/smoothness/images/animated-overlay.gif delete mode 100755 public/assets/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100755 public/assets/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100755 public/assets/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100755 public/assets/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100755 public/assets/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png delete mode 100755 public/assets/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100755 public/assets/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100755 public/assets/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100755 public/assets/css/smoothness/images/ui-icons_222222_256x240.png delete mode 100755 public/assets/css/smoothness/images/ui-icons_2e83ff_256x240.png delete mode 100755 public/assets/css/smoothness/images/ui-icons_454545_256x240.png delete mode 100755 public/assets/css/smoothness/images/ui-icons_888888_256x240.png delete mode 100755 public/assets/css/smoothness/images/ui-icons_cd0a0a_256x240.png delete mode 100755 public/assets/css/smoothness/jquery-ui-1.10.3.custom.css delete mode 100755 public/assets/css/smoothness/jquery-ui-1.10.3.custom.min.css delete mode 100644 public/assets/img/apis/server.png delete mode 100755 public/assets/img/generic-profile-photo-small.png delete mode 100755 public/assets/img/generic-profile-photo.png delete mode 100644 public/assets/img/glyphicons-halflings-white.png delete mode 100644 public/assets/img/glyphicons-halflings.png delete mode 100644 public/assets/img/oauth2.default.logo.png delete mode 100644 public/assets/img/openstack-logo-full.svg delete mode 100644 public/assets/js/admin/banned-ips.js delete mode 100644 public/assets/js/admin/edit-group.js delete mode 100644 public/assets/js/admin/edit-user.js delete mode 100644 public/assets/js/admin/groups.js delete mode 100644 public/assets/js/admin/server-config.js delete mode 100644 public/assets/js/admin/users.js delete mode 100644 public/assets/js/ajax.utils.js delete mode 100644 public/assets/js/auth/email-verification.js delete mode 100644 public/assets/js/auth/registration.js delete mode 100644 public/assets/js/auth/registration_success.js delete mode 100644 public/assets/js/auth/reset_password.js delete mode 100644 public/assets/js/auth/send_password_link.js delete mode 100644 public/assets/js/auth/set_password.js delete mode 100644 public/assets/js/auth/set_password_success.js delete mode 100644 public/assets/js/basic-crud.js delete mode 100644 public/assets/js/jquery-ajax-loader.js delete mode 100644 public/assets/js/jquery.cleanform.js delete mode 100644 public/assets/js/jquery.serialize.js delete mode 100644 public/assets/js/jquery.validate.additional.custom.methods.js delete mode 100644 public/assets/js/login.js delete mode 100644 public/assets/js/oauth2/consent.js delete mode 100644 public/assets/js/oauth2/profile/admin/api-scope-groups.js delete mode 100644 public/assets/js/oauth2/profile/admin/clients.js delete mode 100644 public/assets/js/oauth2/profile/admin/edit-api-scope-group.js delete mode 100644 public/assets/js/oauth2/profile/admin/edit-api.js delete mode 100644 public/assets/js/oauth2/profile/admin/edit-endpoint.js delete mode 100644 public/assets/js/oauth2/profile/admin/edit-resource-server.js delete mode 100644 public/assets/js/oauth2/profile/admin/edit-scope.js delete mode 100644 public/assets/js/oauth2/profile/admin/resource-servers.js delete mode 100644 public/assets/js/oauth2/profile/admin/server-private-keys.js delete mode 100644 public/assets/js/oauth2/profile/clients.js delete mode 100644 public/assets/js/oauth2/profile/edit-client-data.js delete mode 100644 public/assets/js/oauth2/profile/edit-client-public-keys.js delete mode 100644 public/assets/js/oauth2/profile/edit-client-scopes.js delete mode 100644 public/assets/js/oauth2/profile/edit-client-security-logout.js delete mode 100644 public/assets/js/oauth2/profile/edit-client-security-main-settings.js delete mode 100644 public/assets/js/oauth2/profile/edit-client-tokens.js delete mode 100644 public/assets/js/oauth2/profile/edit-user-grants.js delete mode 100644 public/assets/js/oauth2/session/check.session.js delete mode 100644 public/assets/js/openid/consent.js delete mode 100644 public/assets/js/profile.js delete mode 100644 public/assets/js/urlfragment.jquery.js delete mode 100644 public/favicon.ico delete mode 100644 public/favicon/android-chrome-192x192.png delete mode 100644 public/favicon/android-chrome-256x256.png delete mode 100644 public/favicon/apple-touch-icon.png delete mode 100644 public/favicon/browserconfig.xml delete mode 100644 public/favicon/favicon-16x16.png delete mode 100644 public/favicon/favicon-32x32.png delete mode 100644 public/favicon/favicon.ico delete mode 100644 public/favicon/manifest.json delete mode 100644 public/favicon/mstile-150x150.png delete mode 100644 public/favicon/safari-pinned-tab.svg delete mode 100644 public/index.php delete mode 100644 public/robots.txt delete mode 100644 requirements.txt delete mode 100644 resources/assets/js/index.js delete mode 100644 resources/lang/en/auth.php delete mode 100644 resources/lang/en/messages.php delete mode 100644 resources/lang/en/pagination.php delete mode 100644 resources/lang/en/passwords.php delete mode 100644 resources/lang/en/validation.php delete mode 100644 resources/views/admin/add-group-form.blade.php delete mode 100644 resources/views/admin/add-user-form.blade.php delete mode 100644 resources/views/admin/banned-ips.blade.php delete mode 100644 resources/views/admin/edit-group.blade.php delete mode 100644 resources/views/admin/edit-user.blade.php delete mode 100644 resources/views/admin/groups.blade.php delete mode 100644 resources/views/admin/server-config.blade.php delete mode 100644 resources/views/admin/users.blade.php delete mode 100644 resources/views/auth/email_verification.blade.php delete mode 100644 resources/views/auth/email_verification_error.blade.php delete mode 100644 resources/views/auth/email_verification_resend_success.blade.php delete mode 100644 resources/views/auth/email_verification_success.blade.php delete mode 100644 resources/views/auth/login.blade.php delete mode 100644 resources/views/auth/passwords/email.blade.php delete mode 100644 resources/views/auth/passwords/email_error.blade.php delete mode 100644 resources/views/auth/passwords/reset.blade.php delete mode 100644 resources/views/auth/passwords/reset_error.blade.php delete mode 100644 resources/views/auth/passwords/reset_success.blade.php delete mode 100644 resources/views/auth/passwords/set.blade.php delete mode 100644 resources/views/auth/passwords/set_error.blade.php delete mode 100644 resources/views/auth/passwords/set_success.blade.php delete mode 100644 resources/views/auth/register.blade.php delete mode 100644 resources/views/auth/register_error.blade.php delete mode 100644 resources/views/auth/register_success.blade.php delete mode 100644 resources/views/emails/auth/email_verification_request.blade.php delete mode 100644 resources/views/emails/auth/email_verification_request_fn.blade.php delete mode 100644 resources/views/emails/auth/email_verification_request_success.blade.php delete mode 100644 resources/views/emails/auth/reset_password_request.blade.php delete mode 100644 resources/views/emails/auth/reset_password_successfull.blade.php delete mode 100644 resources/views/emails/auth/user_locked.blade.php delete mode 100644 resources/views/emails/oauth_client_locked.blade.php delete mode 100644 resources/views/emails/user_spammer_process_result.blade.php delete mode 100644 resources/views/emails/welcome_new_user_email.blade.php delete mode 100644 resources/views/emails/welcome_new_user_email_fn.blade.php delete mode 100644 resources/views/error.blade.php delete mode 100644 resources/views/errors/400.blade.php delete mode 100644 resources/views/errors/404.blade.php delete mode 100644 resources/views/errors/503.blade.php delete mode 100644 resources/views/extensions/ax.blade.php delete mode 100644 resources/views/extensions/oauth2.blade.php delete mode 100644 resources/views/extensions/pape.blade.php delete mode 100644 resources/views/extensions/sreg.blade.php delete mode 100644 resources/views/home.blade.php delete mode 100644 resources/views/identity.blade.php delete mode 100644 resources/views/layout.blade.php delete mode 100644 resources/views/menu.blade.php delete mode 100644 resources/views/modal.blade.php delete mode 100644 resources/views/oauth2/consent.blade.php delete mode 100644 resources/views/oauth2/profile/add-client-form.blade.php delete mode 100644 resources/views/oauth2/profile/admin/api-scope-group-add-form.blade.php delete mode 100644 resources/views/oauth2/profile/admin/api-scope-groups.blade.php delete mode 100644 resources/views/oauth2/profile/admin/clients.blade.php delete mode 100644 resources/views/oauth2/profile/admin/edit-api-scope-group.blade.php delete mode 100644 resources/views/oauth2/profile/admin/edit-api.blade.php delete mode 100644 resources/views/oauth2/profile/admin/edit-endpoint.blade.php delete mode 100644 resources/views/oauth2/profile/admin/edit-resource-server.blade.php delete mode 100644 resources/views/oauth2/profile/admin/edit-scope.blade.php delete mode 100644 resources/views/oauth2/profile/admin/endpoint-add-form.blade.php delete mode 100644 resources/views/oauth2/profile/admin/resource-server-add-form.blade.php delete mode 100644 resources/views/oauth2/profile/admin/resource-server-api-add-form.blade.php delete mode 100644 resources/views/oauth2/profile/admin/resource-servers.blade.php delete mode 100644 resources/views/oauth2/profile/admin/scope-add-form.blade.php delete mode 100644 resources/views/oauth2/profile/admin/server-private-key-add-form.blade.php delete mode 100644 resources/views/oauth2/profile/admin/server-private-keys.blade.php delete mode 100644 resources/views/oauth2/profile/clients.blade.php delete mode 100644 resources/views/oauth2/profile/edit-client-data.blade.php delete mode 100644 resources/views/oauth2/profile/edit-client-public-key-add-form.blade.php delete mode 100644 resources/views/oauth2/profile/edit-client-public-keys.blade.php delete mode 100644 resources/views/oauth2/profile/edit-client-scopes.blade.php delete mode 100644 resources/views/oauth2/profile/edit-client-security-logout.blade.php delete mode 100644 resources/views/oauth2/profile/edit-client-security-main-settings.blade.php delete mode 100644 resources/views/oauth2/profile/edit-client-tokens.blade.php delete mode 100644 resources/views/oauth2/profile/edit-client.blade.php delete mode 100644 resources/views/oauth2/profile/edit-user-grants.blade.php delete mode 100644 resources/views/oauth2/session/check-session.blade.php delete mode 100644 resources/views/oauth2/session/session-ended.blade.php delete mode 100644 resources/views/oauth2/session/session-logout.blade.php delete mode 100644 resources/views/openid/consent.blade.php delete mode 100644 resources/views/profile.blade.php delete mode 100644 resources/views/vendor/.gitkeep delete mode 100644 roles/setup-test-laravel-env/README.rst delete mode 100644 roles/setup-test-laravel-env/defaults/main.yaml delete mode 100644 roles/setup-test-laravel-env/tasks/main.yaml delete mode 100644 server.php delete mode 100644 setup.cfg delete mode 100644 setup.py delete mode 100755 storage/app/.gitignore delete mode 100755 storage/app/public/.gitignore delete mode 100755 storage/framework/.gitignore delete mode 100755 storage/framework/cache/.gitignore delete mode 100755 storage/framework/sessions/.gitignore delete mode 100755 storage/framework/views/.gitignore delete mode 100644 tests/ApiEndpointTest.php delete mode 100644 tests/ApiScopeTest.php delete mode 100644 tests/ApiTest.php delete mode 100644 tests/AssociationServiceTest.php delete mode 100644 tests/BrowserKitTestCase.php delete mode 100644 tests/CacheServiceStub.php delete mode 100644 tests/ClientApiTest.php delete mode 100644 tests/ClientPublicKeyApiTest.php delete mode 100644 tests/CreatesApplication.php delete mode 100644 tests/CustomAuthProviderTest.php delete mode 100644 tests/DiffieHellmanTest.php delete mode 100644 tests/DiscoveryControllerTest.php delete mode 100644 tests/DoctrineRepositoriesTests.php delete mode 100644 tests/Feature/ExampleTest.php delete mode 100644 tests/OAuth2ClientTests.php delete mode 100644 tests/OAuth2ProtectedApiTest.php delete mode 100644 tests/OAuth2ProtocolTest.php delete mode 100644 tests/OAuth2UserRegistrationServiceApiTest.php delete mode 100644 tests/OAuth2UserServiceApiTest.php delete mode 100644 tests/OAuthSSOApiControllerTest.php delete mode 100644 tests/OIDCProtocolTest.php delete mode 100644 tests/OpenIdProtocolTest.php delete mode 100644 tests/OpenStackIDBaseTest.php delete mode 100644 tests/ResourceServerApiTest.php delete mode 100644 tests/ServicesTests.php delete mode 100644 tests/StubServerConfigurationService.php delete mode 100644 tests/TestCase.php delete mode 100644 tests/TrustedSitesServiceTest.php delete mode 100644 tests/Unit/ExampleTest.php delete mode 100644 tests/UserAgentTests.php delete mode 100644 tests/UserGeneratorServiceTest.php delete mode 100644 tests/XRDSDocumentTest.php delete mode 100644 tests/features/bootstrap/FeatureContext.php delete mode 100644 tests/features/bootstrap/LaravelContext.php delete mode 100644 tests/features/get_auth_code.feature delete mode 100644 tox.ini delete mode 100755 update_doctrine.sh delete mode 100644 webpack.config.js delete mode 100644 webpack.mix.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index ecfdeab6..00000000 --- a/.babelrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "presets": [ - [ - "env", - { - "targets": { - "node": "current" - } - } - ], - "flow", - "react" - ], - "plugins": [ - "transform-object-rest-spread" - ] -} diff --git a/.env.example b/.env.example deleted file mode 100644 index b2024021..00000000 --- a/.env.example +++ /dev/null @@ -1,82 +0,0 @@ -APP_ENV=local -APP_DEBUG=true -DEV_EMAIL_TO=smarcet@gmail.com -APP_KEY=SomeRandomString -APP_URL=http://localhost -APP_OAUTH_2_0_CLIENT_ID=clientid -APP_OAUTH_2_0_CLIENT_SECRET=clientsecret -APP_OAUTH_2_0_AUTH_SERVER_BASE_URL=http://localhost - -DB_HOST=localhost -DB_DATABASE=homestead -DB_USERNAME=homestead -DB_PASSWORD=secret - -DB_USE_SSL=false -DB_MYSQL_ATTR_SSL_CA= -DB_MYSQL_ATTR_SSL_KEY= -DB_MYSQL_ATTR_SSL_CERT= -DB_MYSQL_ATTR_SSL_CIPHER=DHE-RSA-AES256-SHA - -REDIS_HOST=127.0.0.1 -REDIS_PORT=port -REDIS_DB=0 -REDIS_PASSWORD= - -CACHE_DRIVER=redis - -SESSION_DRIVER=redis -SESSION_COOKIE_DOMAIN= -SESSION_COOKIE_SECURE=false - -QUEUE_DRIVER=database -QUEUE_CONN= -QUEUE_DATABASE= - -MAIL_DRIVER=sendgrid -SENDGRID_API_KEY='YOUR_SENDGRID_API_KEY' - -CORS_ALLOWED_HEADERS=origin, content-type, accept, authorization, x-requested-with -CORS_ALLOWED_METHODS=GET, POST, OPTIONS, PUT, DELETE -CORS_USE_PRE_FLIGHT_CACHING=true -CORS_MAX_AGE=3200 -CORS_EXPOSED_HEADERS= - -CURL_TIMEOUT=3600 -CURL_ALLOWS_REDIRECT=false -CURL_VERIFY_SSL_CERT=false - -ASSETS_BASE_URL=http://www.openstack.org -SSL_ENABLED=true -DB_LOG_ENABLED=true -ACCESS_TOKEN_CACHE_LIFETIME=300 -API_RESPONSE_CACHE_LIFETIME=600 - -LOG_EMAIL_TO=smarcet@gmail.com -LOG_EMAIL_FROM=smarcet@gmail.com -LOG_LEVEL=info - -EVENTBRITE_OAUTH2_PERSONAL_TOKEN= - -RECAPTCHA_PUBLIC_KEY= -RECAPTCHA_PRIVATE_KEY= - -BANNING_ENABLE= -SUPPORT_EMAIL= -USER_SPAM_PROCESSOR_TO= -MAIL_FROM_EMAIL="noreply@openstack.org" -MAIL_FROM_NAME="noreply@openstack.org" - -## RABBIT MQ -RABBITMQ_EXCHANGE_NAME=databus-exchange -RABBITMQ_HOST= -RABBITMQ_PORT=5671 -RABBITMQ_VHOST=databus -RABBITMQ_LOGIN=admin -RABBITMQ_PASSWORD=1qaz2wsx -RABBITMQ_QUEUE=default -RABBITMQ_SSL=true -RABBITMQ_SSL_CAFILE=/certs/rabbit/ca-osf.pem -RABBITMQ_SSL_LOCALCERT=/certs/rabbit/client-cert-osf.pem -RABBITMQ_SSL_LOCALKEY=/certs/rabbit/client-key-osf.pem -RABBITMQ_SSL_VERIFY_PEER=false \ No newline at end of file diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index f2920314..00000000 --- a/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -* text=auto -*.css linguist-vendored -*.less linguist-vendored \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e9659c26..00000000 --- a/.gitignore +++ /dev/null @@ -1,44 +0,0 @@ -/vendor -composer.phar -.idea/* -.tox -AUTHORS -ChangeLog -doc/build -*.egg -*.egg-info -*.log -/node_modules -.idea/ -/public/storage -Homestead.yaml -Homestead.json -.env -.env.testing -storage/proxies -/public/assets/jquery-cookie/ -/public/assets/crypto-js/ -/public/assets/bootstrap-tagsinput/ -/public/assets/fonts/ -/public/assets/typeahead/ -/public/assets/__common__.js -/public/assets/index.js -public/assets/index.js.map -public/assets/__common__.js.map -public/assets/images/ -public/assets/svg/ -public/assets/css/index.css.map -public/assets/css/index.css -public/assets/simplemde/ -/public/assets/pwstrength-bootstrap/ -/public/assets/sweetalert2/ -/public/assets/urijs -/public/assets/uri.js -/public/assets/clipboard-copy-element/ -_intellij_phpdebug_validator.php -/public/assets/chosen-js -/public/assets/moment -routes.txt -model.sql -.phpunit.result.cache -!/public/web.config diff --git a/.gitreview b/.gitreview index 69dc87f5..916d75e9 100644 --- a/.gitreview +++ b/.gitreview @@ -1,4 +1,4 @@ [gerrit] host=review.opendev.org port=29418 -project=osf/openstackid.git +project=openinfra/openstackid.git diff --git a/.zuul.yaml b/.zuul.yaml deleted file mode 100644 index 816f80f1..00000000 --- a/.zuul.yaml +++ /dev/null @@ -1,46 +0,0 @@ -- job: - name: openstackid-release-branch - parent: publish-openstack-artifacts - run: playbooks/openstackid-release-branch/run.yaml - post-run: playbooks/openstackid-release-branch/post.yaml - timeout: 1800 - # OpenStackID needs MYSQL 5.7.x and will fail with newer MYSQL, Bionic has Java 5.7.x. - nodeset: ubuntu-bionic - -- job: - # This is included into the osf/openstackid release pipeline from the - # openstack/project-config .zuul.d/projects.yaml - name: openstackid-release-master - parent: publish-openstack-artifacts - run: playbooks/openstackid-release-master/run.yaml - post-run: playbooks/openstackid-release-master/post.yaml - timeout: 1800 - # OpenStackID needs MYSQL 5.7.x and will fail with newer MYSQL, Bionic has Java 5.7.x. - nodeset: ubuntu-bionic - -- job: - name: openstackid-unittests - run: playbooks/openstackid-unittests/run.yaml - timeout: 1800 - # OpenStackID needs MYSQL 5.7.x and will fail with newer MYSQL, Bionic has Java 5.7.x. - nodeset: ubuntu-bionic - - -- project: - name: osf/openstackid - check: - jobs: - - openstackid-unittests - - opendev-tox-docs: - nodeset: ubuntu-bionic - gate: - jobs: - - openstackid-unittests - - opendev-tox-docs: - nodeset: ubuntu-bionic - post: - jobs: - - openstackid-release-branch - promote: - jobs: - - promote-tox-docs-infra diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 015febc4..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,3 +0,0 @@ -# Contribution Guidelines - -Please submit all issues and pull requests to the [laravel/framework](http://github.com/laravel/framework) repository! \ No newline at end of file diff --git a/app/Console/Commands/CleanOAuth2StaleData.php b/app/Console/Commands/CleanOAuth2StaleData.php deleted file mode 100644 index 0d31a329..00000000 --- a/app/Console/Commands/CleanOAuth2StaleData.php +++ /dev/null @@ -1,66 +0,0 @@ -whereRaw("DATE_ADD(created_at, INTERVAL lifetime second) <= UTC_TIMESTAMP()") - ->delete(); - - Log::debug(sprintf("CleanOAuth2StaleData::handle %s rows where deleted from oauth2_access_token", $res)); - } - - } -} \ No newline at end of file diff --git a/app/Console/Commands/CleanOpenIdStaleData.php b/app/Console/Commands/CleanOpenIdStaleData.php deleted file mode 100644 index 67afc015..00000000 --- a/app/Console/Commands/CleanOpenIdStaleData.php +++ /dev/null @@ -1,85 +0,0 @@ -whereRaw("DATE_ADD(issued, INTERVAL lifetime second) <= UTC_TIMESTAMP()") - ->delete(); - - Log::debug(sprintf("CleanOpenIdStaleData::handle %s rows where deleted from openid_associations", $res)); - } - - if (Schema::hasTable('user_exceptions_trail')) { - // delete old exceptions trails - $res = DB::table('user_exceptions_trail') - ->whereRaw("DATE_ADD(created_at, INTERVAL {$interval} second) <= UTC_TIMESTAMP()") - ->delete(); - - Log::debug(sprintf("CleanOpenIdStaleData::handle %s rows where deleted from user_exceptions_trail", $res)); - } - - if (Schema::hasTable('user_actions')) { - // delete old user actions - $res = DB::table('user_actions') - ->whereRaw("DATE_ADD(created_at, INTERVAL 1 year) <= UTC_TIMESTAMP()") - ->delete(); - - Log::debug(sprintf("CleanOpenIdStaleData::handle %s rows where deleted from user_actions", $res)); - } - } -} \ No newline at end of file diff --git a/app/Console/Commands/CreateSuperAdmin.php b/app/Console/Commands/CreateSuperAdmin.php deleted file mode 100644 index eca4c7c8..00000000 --- a/app/Console/Commands/CreateSuperAdmin.php +++ /dev/null @@ -1,85 +0,0 @@ -argument('email')); - $password = trim($this->argument('password')); - - $user = EntityManager::getRepository(User::class)->findOneBy(['email' => $email]); - if(is_null($user)) { - $user = new User(); - $user->setEmail($email); - $user->verifyEmail(); - $user->setPassword($password); - EntityManager::persist($user); - EntityManager::flush(); - } - - $group = EntityManager::getRepository(Group::class)->findOneBy(['name' => 'super admins']); - if(is_null($group)){ - $group = new Group(); - $group->setName('super admins'); - $group->setSlug('super-admins'); - $group->setDefault(false); - $group->setActive(true); - EntityManager::persist($group); - EntityManager::flush(); - } - - $user->addToGroup($group); - EntityManager::persist($user); - EntityManager::flush(); - } -} diff --git a/app/Console/Commands/SpammerProcess/.gitignore b/app/Console/Commands/SpammerProcess/.gitignore deleted file mode 100644 index b32a23ab..00000000 --- a/app/Console/Commands/SpammerProcess/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -env/ -.idea/ -__pycache__/ -user_classifier.pickle \ No newline at end of file diff --git a/app/Console/Commands/SpammerProcess/README.md b/app/Console/Commands/SpammerProcess/README.md deleted file mode 100644 index b5718543..00000000 --- a/app/Console/Commands/SpammerProcess/README.md +++ /dev/null @@ -1,19 +0,0 @@ -## Dependencies - -````bas -$ sudo apt update -$ sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools python3-venv -libmysqlclient-dev -```` - - -## Virtual Env - -````bash -$ python3.6 -m venv env - -$ source env/bin/activate - -$ pip install -r requirements.txt - -```` \ No newline at end of file diff --git a/app/Console/Commands/SpammerProcess/RebuildUserSpammerEstimator.php b/app/Console/Commands/SpammerProcess/RebuildUserSpammerEstimator.php deleted file mode 100644 index 736d45d7..00000000 --- a/app/Console/Commands/SpammerProcess/RebuildUserSpammerEstimator.php +++ /dev/null @@ -1,94 +0,0 @@ -setTimeout(PHP_INT_MAX); - $process->setIdleTimeout(PHP_INT_MAX); - $process->run(); - - while ($process->isRunning()) { - } - - $output = $process->getOutput(); - - Log::debug(sprintf("RebuildUserSpammerEstimator::handle output %s", $output)); - - if (!$process->isSuccessful()) { - throw new Exception("Process Error!"); - } - } - catch (Exception $ex){ - Log::error($ex); - } - } -} \ No newline at end of file diff --git a/app/Console/Commands/SpammerProcess/UserSpammerProcessor.php b/app/Console/Commands/SpammerProcess/UserSpammerProcessor.php deleted file mode 100644 index a4a8ebc5..00000000 --- a/app/Console/Commands/SpammerProcess/UserSpammerProcessor.php +++ /dev/null @@ -1,138 +0,0 @@ -user_repository = $user_repository; - } - - /** - * @throws Exception - */ - public function handle() - { - try { - $connections = Config::get('database.connections', []); - $db = $connections['openstackid'] ?? []; - $host = $db['host'] ?? ''; - $database = $db['database'] ?? ''; - $username = $db['username'] ?? ''; - $password = $db['password'] ?? ''; - - $command = sprintf( - '%s/app/Console/Commands/SpammerProcess/estimator_process.sh "%s" "%s" "%s" "%s" "%s"', - base_path(), - base_path() . '/app/Console/Commands/SpammerProcess', - $host, - $username, - $password, - $database - ); - - Log::debug(sprintf("UserSpammerProcessor::handle running command %s", $command)); - - $process = new Process($command); - $process->setTimeout(PHP_INT_MAX); - $process->setIdleTimeout(PHP_INT_MAX); - $process->run(); - - while ($process->isRunning()) { - } - - $csv_content = $process->getOutput(); - - Log::debug(sprintf("UserSpammerProcessor::handle output %s", $csv_content)); - - if (!$process->isSuccessful()) { - throw new Exception("Process Error!"); - } - - $rows = CSVReader::load($csv_content); - - // send email with excerpt - - $users = []; - - foreach ($rows as $row) { - $user_id = intval($row["ID"]); - $type = $row["Type"]; - $user = $this->user_repository->getById($user_id); - if (is_null($user) || !$user instanceof User) continue; - - $users[] = [ - 'id' => $user->getId(), - 'email' => $user->getEmail(), - 'full_name' => $user->getFullName(), - 'spam_type' => $type, - 'edit_link' => URL::route("edit_user", ["user_id" => $user->getId()], true) - ]; - } - - if (count($users) > 0 && !empty(Config::get('mail.user_spam_processor_to'))) { - Log::debug("UserSpammerProcessor::handle sending email"); - Mail::queue(new UserSpammerProcessorResultsEmail($users)); - } - } - catch (Exception $ex){ - Log::error($ex); - } - } -} \ No newline at end of file diff --git a/app/Console/Commands/SpammerProcess/estimator_build.py b/app/Console/Commands/SpammerProcess/estimator_build.py deleted file mode 100644 index 09a1e51a..00000000 --- a/app/Console/Commands/SpammerProcess/estimator_build.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# !/usr/bin/env python -# -# Copyright (c) 2020 OpenStack Foundation -# -# 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. - -import sys -from openstack_member_spammer_estimator import EstimatorBuilder -import os - -# params -db_host = sys.argv[1] -db_user = sys.argv[2] -db_user_password = sys.argv[3] -db_name = sys.argv[4] -filename = 'user_classifier.pickle' -builder = EstimatorBuilder(filename=filename, db_host=db_host, db_user=db_user, db_user_password=db_user_password, - db_name=db_name) -script_dir = os.path.dirname(__file__) -pickle_file = os.path.join(script_dir, ) -if os.path.exists(pickle_file): - os.remove(pickle_file) - -builder.build() diff --git a/app/Console/Commands/SpammerProcess/estimator_build.sh b/app/Console/Commands/SpammerProcess/estimator_build.sh deleted file mode 100755 index 0ee04b5a..00000000 --- a/app/Console/Commands/SpammerProcess/estimator_build.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# Copyright (c) 2020 OpenStack Foundation -# -# 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. - -WORK_DIR=$1 -DB_HOST=$2 -DB_USER=$3 -DB_PASSWORD=$4 -DB_NAME=$5 - -export PYTHONPATH="$PYTHONPATH:$WORK_DIR"; - -cd $WORK_DIR; - -source env/bin/activate; - -python estimator_build.py $DB_HOST $DB_USER $DB_PASSWORD $DB_NAME; - -deactivate; \ No newline at end of file diff --git a/app/Console/Commands/SpammerProcess/estimator_process.py b/app/Console/Commands/SpammerProcess/estimator_process.py deleted file mode 100644 index f2f7f696..00000000 --- a/app/Console/Commands/SpammerProcess/estimator_process.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -#!/usr/bin/env python -# -# Copyright (c) 2020 OpenStack Foundation -# -# 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. - -import sys -from openstack_member_spammer_estimator import EstimatorClassifier -import os - -# params -db_host = sys.argv[1] -db_user = sys.argv[2] -db_user_password = sys.argv[3] -db_name = sys.argv[4] -filename = 'user_classifier.pickle' - -classifier = EstimatorClassifier(db_host=db_host, db_user=db_user, db_user_password=db_user_password, db_name=db_name) -script_dir = os.path.dirname(__file__) -pickle_file = os.path.join(script_dir, filename) -if not os.path.exists(pickle_file): - raise Exception('File %s does not exists!' % pickle_file) - -res = classifier.classify(pickle_file) - -# output CSV file -print("ID,Type") -for row in res: - print("%s,%s" % row) diff --git a/app/Console/Commands/SpammerProcess/estimator_process.sh b/app/Console/Commands/SpammerProcess/estimator_process.sh deleted file mode 100755 index 0985b5fc..00000000 --- a/app/Console/Commands/SpammerProcess/estimator_process.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# Copyright (c) 2017 OpenStack Foundation -# -# 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. - -WORK_DIR=$1 -DB_HOST=$2 -DB_USER=$3 -DB_PASSWORD=$4 -DB_NAME=$5 - -export PYTHONPATH="$PYTHONPATH:$WORK_DIR"; - -cd $WORK_DIR; - -source env/bin/activate; - -python estimator_process.py $DB_HOST $DB_USER $DB_PASSWORD $DB_NAME; - -deactivate; \ No newline at end of file diff --git a/app/Console/Commands/SpammerProcess/requirements.txt b/app/Console/Commands/SpammerProcess/requirements.txt deleted file mode 100644 index 4db23625..00000000 --- a/app/Console/Commands/SpammerProcess/requirements.txt +++ /dev/null @@ -1,27 +0,0 @@ -openstack-member-spammer-estimator==1.0.2 -pkg-resources==0.0.0 -attrs==19.3.0 -configparser==4.0.2 -HTMLParser==0.0.2 -importlib-metadata==1.5.0 -joblib==0.14.1 -more-itertools==8.2.0 -mysqlclient==1.4.6 -nltk==3.4.5 -numpy==1.18.1 -packaging==20.3 -pandas==0.24.2 -pluggy==0.13.1 -py==1.8.1 -pyparsing==2.4.6 -pytest==5.3.5 -python-dateutil==2.8.1 -pytz==2019.3 -scikit-learn==0.22.2.post1 -scipy==1.4.1 -six==1.14.0 -sklearn==0.0 -wcwidth==0.1.8 -zipp==1.2.0 -singledispatch==3.4.0.3 -six==1.14.0 diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php deleted file mode 100644 index 3741930c..00000000 --- a/app/Console/Kernel.php +++ /dev/null @@ -1,50 +0,0 @@ -command('idp:oauth2-clean')->dailyAt("02:30")->withoutOverlapping(); - $schedule->command('idp:openid-clean')->dailyAt("03:30")->withoutOverlapping(); - // user spammer - $schedule->command('user-spam:rebuild')->dailyAt("02:30")->withoutOverlapping(); - $schedule->command('user-spam:process')->dailyAt("03:30")->withoutOverlapping(); - } -} diff --git a/app/Events/Event.php b/app/Events/Event.php deleted file mode 100644 index ba2f8883..00000000 --- a/app/Events/Event.php +++ /dev/null @@ -1,8 +0,0 @@ -client_id = $client_id; - } - - /** - * @return string - */ - public function getClientId(): string - { - return $this->client_id; - } -} \ No newline at end of file diff --git a/app/Events/UserActivated.php b/app/Events/UserActivated.php deleted file mode 100644 index e09ce7b3..00000000 --- a/app/Events/UserActivated.php +++ /dev/null @@ -1,19 +0,0 @@ -user_id = $user_id; - } - - /** - * @return int - */ - public function getUserId(): int - { - return $this->user_id; - } -} \ No newline at end of file diff --git a/app/Events/UserLocked.php b/app/Events/UserLocked.php deleted file mode 100644 index 1fc7d53d..00000000 --- a/app/Events/UserLocked.php +++ /dev/null @@ -1,18 +0,0 @@ -client_service = $client_service; - $this->scope_service = $scope_service; - $this->access_token_repository = $access_token_repository; - $this->refresh_token_repository = $refresh_token_repository; - $this->resource_server_service = $resource_server_service; - $this->api_service = $api_service; - $this->endpoint_service = $endpoint_service; - $this->auth_service = $auth_service; - $this->user_service = $user_service; - $this->configuration_service = $configuration_service; - $this->banned_ips_service = $banned_ips_service; - $this->private_keys_repository = $private_keys_repository; - $this->api_group_repository = $api_group_repository; - $this->client_repository = $client_repository; - $this->user_repository = $user_repository; - $this->endpoint_repository = $endpoint_repository; - $this->scope_repository = $scope_repository; - $this->api_repository = $api_repository; - $this->resource_server_repository = $resource_server_repository; - $this->banned_ips_repository = $banned_ips_repository; - $this->group_repository = $group_repository; - } - - /** - * @param $id - * @return \Illuminate\Contracts\View\View - */ - public function editRegisteredClient($id) - { - $user = $this->auth_service->getCurrentUser(); - $client = $this->client_repository->getClientByIdentifier($id); - - if (is_null($client)) { - Log::warning(sprintf("invalid oauth2 client id %s", $id)); - return View::make("errors.404"); - } - - $selected_scopes = $client->getClientScopes(); - $aux_scopes = []; - - foreach ($selected_scopes as $scope) { - array_push($aux_scopes, $scope->getId()); - } - - // scope pre processing - $scopes = $this->scope_repository->getAvailableScopes(); - $group_scopes = $user->getGroupScopes(); - $merged_scopes = array_merge($scopes, $group_scopes); - $final_scopes = []; - $processed_scopes = []; - foreach($merged_scopes as $test_scope){ - if(isset($processed_scopes[$test_scope->getId()])) continue; - - $processed_scopes[$test_scope->getId()] = $test_scope->getId(); - $final_scopes[] = $test_scope; - } - - usort($final_scopes, function($elem1, $elem2){ - return $elem1->getApiId() > $elem2->getApiId() ; - }); - // scope pre processing - - $access_tokens = $this->access_token_repository->getAllValidByClientIdentifier($client->getId(), new PagingInfo(1 , self::TokenPageSize)); - - foreach ($access_tokens->getItems() as $token) { - $friendly_scopes = $this->scope_repository->getFriendlyScopesByName(explode(' ', $token->scope)); - $token->setFriendlyScopes(implode(',', $friendly_scopes)); - } - - $refresh_tokens = $this->refresh_token_repository->getAllValidByClientIdentifier($client->getId(), new PagingInfo(1 , self::TokenPageSize)); - - foreach ($refresh_tokens->getItems() as $token) { - $friendly_scopes = $this->scope_repository->getFriendlyScopesByName(explode(' ', $token->scope)); - $token->setFriendlyScopes(implode(',', $friendly_scopes)); - } - - return View::make("oauth2.profile.edit-client", - [ - 'client' => $client, - 'selected_scopes' => $aux_scopes, - 'scopes' => $final_scopes, - 'access_tokens' => $access_tokens->getItems(), - 'access_tokens_pages' => $access_tokens->getTotal() > 0 ? intval(ceil($access_tokens->getTotal() / self::TokenPageSize)) : 0, - "use_system_scopes" => $user->canUseSystemScopes(), - 'refresh_tokens' => $refresh_tokens->getItems(), - 'refresh_tokens_pages' => $refresh_tokens->getTotal() > 0 ? intval(ceil($refresh_tokens->getTotal() / self::TokenPageSize)) : 0, - ]); - } - - // Api Scope Groups - - public function listApiScopeGroups() - { - $user = $this->auth_service->getCurrentUser(); - $groups = $this->api_group_repository->getAllByPage(new PagingInfo(1, PHP_INT_MAX)); - $non_selected_scopes = $this->scope_repository->getAssignableByGroups(); - return View::make("oauth2.profile.admin.api-scope-groups", [ - 'groups' => $groups, - 'non_selected_scopes' => $non_selected_scopes, - ]); - } - - /** - * @param $id - * @return \Illuminate\Contracts\View\View|\Illuminate\Http\Response - */ - public function editApiScopeGroup($id){ - $group = $this->api_group_repository->getById($id); - - if(is_null($group)) - return Response::view('errors.404', [], 404); - - $user = $this->auth_service->getCurrentUser(); - $non_selected_scopes = $this->scope_repository->getAssignableByGroups(); - return View::make("oauth2.profile.admin.edit-api-scope-group", - array - ( - 'group' => $group, - 'non_selected_scopes' => $non_selected_scopes, - ) - ); - } - - // Resource servers - - /** - * @return \Illuminate\Contracts\View\View - */ - public function listResourceServers() { - $user = $this->auth_service->getCurrentUser(); - $resource_servers = $this->resource_server_repository->getAllByPage(new PagingInfo(1, PHP_INT_MAX)); - return View::make("oauth2.profile.admin.resource-servers", - [ - 'resource_servers' => $resource_servers - ] - ); - } - - /** - * @param $id - * @return \Illuminate\Contracts\View\View|\Illuminate\Http\Response - */ - public function editResourceServer($id){ - $resource_server = $this->resource_server_repository->getById($id); - if(is_null($resource_server)) - return Response::view('errors.404', [], 404); - $user = $this->auth_service->getCurrentUser(); - return View::make("oauth2.profile.admin.edit-resource-server",array( - 'resource_server'=>$resource_server - )); - } - - /** - * @param $id - * @return \Illuminate\Contracts\View\View|\Illuminate\Http\Response - */ - public function editApi($id){ - $api = $this->api_repository->getById($id); - if(is_null($api)) - return Response::view('errors.404', [], 404); - $user = $this->auth_service->getCurrentUser(); - return View::make("oauth2.profile.admin.edit-api",['api'=>$api]); - } - - /** - * @param $id - * @return \Illuminate\Contracts\View\View|\Illuminate\Http\Response - */ - public function editScope($id){ - $scope = $this->scope_repository->getById($id); - if(is_null($scope)) - return Response::view('errors.404', [], 404); - $user = $this->auth_service->getCurrentUser(); - return View::make("oauth2.profile.admin.edit-scope",array( - 'scope'=>$scope)); - } - - /** - * @param $id - * @return \Illuminate\Contracts\View\View|\Illuminate\Http\Response - */ - public function editEndpoint($id){ - $endpoint = $this->endpoint_repository->getById($id); - if(is_null($endpoint)) return Response::view('errors.404', [], 404); - $user = $this->auth_service->getCurrentUser(); - $selected_scopes = []; - $list = $endpoint->getScopes(); - foreach($list as $selected_scope){ - $selected_scopes[] = $selected_scope->getId(); - } - return View::make('oauth2.profile.admin.edit-endpoint',array( - 'endpoint' => $endpoint , - 'selected_scopes' => $selected_scopes)); - } - - /** - * @return \Illuminate\Contracts\View\View - */ - public function editIssuedGrants(){ - - $user = $this->auth_service->getCurrentUser(); - $access_tokens = $this->access_token_repository->getAllValidByUserId($user->getId(), new PagingInfo(1, self::TokenPageSize)); - $refresh_tokens = $this->refresh_token_repository->getAllValidByUserId($user->getId(), new PagingInfo(1, self::TokenPageSize)); - - foreach($access_tokens->getItems() as $access_token){ - $friendly_scopes = $this->scope_repository->getFriendlyScopesByName(explode(' ',$access_token->getScope())); - $access_token->setFriendlyScopes(implode(', ',$friendly_scopes)); - } - - foreach($refresh_tokens->getItems() as $refresh_token){ - $friendly_scopes = $this->scope_repository->getFriendlyScopesByName(explode(' ',$refresh_token->getScope())); - $refresh_token->setFriendlyScopes(implode(', ',$friendly_scopes)); - } - - return View::make("oauth2.profile.edit-user-grants", - array - ( - 'user_id' => $user->getId(), - 'access_tokens' => $access_tokens->getItems() , - 'access_tokens_pages' => $access_tokens->getTotal() > 0 ? intval(ceil($access_tokens->getTotal() / self::TokenPageSize)) : 0, - 'refresh_tokens' => $refresh_tokens->getItems(), - 'refresh_tokens_pages' => $refresh_tokens->getTotal() > 0 ? intval(ceil($refresh_tokens->getTotal() / self::TokenPageSize)) : 0, - ) - ); - } - - /** - * @return \Illuminate\Contracts\View\View - */ - public function listOAuth2Clients(){ - $user = $this->auth_service->getCurrentUser(); - $clients = $user->getAvailableClients(); - - return View::make("oauth2.profile.clients", [ - "username" => $user->getFullName(), - "user_id" => $user->getId(), - "use_system_scopes" => $user->canUseSystemScopes(), - 'clients' => $clients, - ]); - } - - /** - * @return \Illuminate\Contracts\View\View - */ - public function listLockedClients(){ - $filter = new Filter(); - $filter->addFilterCondition(FilterElement::makeEqual('locked', true)); - $clients = $this->client_repository->getAllByPage(new PagingInfo(1, PHP_INT_MAX), $filter); - - return View::make("oauth2.profile.admin.clients",[ - 'clients' => $clients - ]); - } - - public function listServerConfig(){ - - $user = $this->auth_service->getCurrentUser(); - $config_values = []; - $dictionary = array - ( - 'MaxFailed.Login.Attempts', - 'MaxFailed.LoginAttempts.2ShowCaptcha', - 'OpenId.Private.Association.Lifetime', - 'OpenId.Session.Association.Lifetime', - 'OpenId.Nonce.Lifetime', - 'OAuth2.AuthorizationCode.Lifetime', - 'OAuth2.AccessToken.Lifetime', - 'OAuth2.IdToken.Lifetime', - 'OAuth2.RefreshToken.Lifetime', - 'OAuth2.AccessToken.Revoked.Lifetime', - 'OAuth2.AccessToken.Void.Lifetime', - 'OAuth2.RefreshToken.Revoked.Lifetime', - 'OAuth2SecurityPolicy.MaxBearerTokenDisclosureAttempts', - 'OAuth2SecurityPolicy.MinutesWithoutExceptions', - 'OAuth2SecurityPolicy.MaxInvalidClientExceptionAttempts', - 'OAuth2SecurityPolicy.MaxInvalidRedeemAuthCodeAttempts', - 'OAuth2SecurityPolicy.MaxInvalidClientCredentialsAttempts', - ); - - foreach($dictionary as $key) - $config_values[$key] = $this->configuration_service->getConfigValue($key); - - return View::make("admin.server-config", - array - ( - "username" => $user->getFullName(), - "user_id" => $user->getId(), - 'config_values' => $config_values, - ) - ); - } - - public function saveServerConfig(){ - - $values = Input::all(); - - $rules = array - ( - 'general-max-failed-login-attempts' => 'required|integer', - 'general-max-failed-login-attempts-captcha' => 'required|integer', - 'openid-private-association-lifetime' => 'required|integer', - 'openid-session-association-lifetime' => 'required|integer', - 'openid-nonce-lifetime' => 'required|integer', - 'oauth2-auth-code-lifetime' => 'required|integer', - 'oauth2-refresh-token-lifetime' => 'required|integer', - 'oauth2-access-token-lifetime' => 'required|integer', - 'oauth2-id-token-lifetime' => 'required|integer', - 'oauth2-id-access-token-revoked-lifetime' => 'required|integer', - 'oauth2-id-access-token-void-lifetime' => 'required|integer', - 'oauth2-id-refresh-token-revoked-lifetime' => 'required|integer', - 'oauth2-id-security-policy-minutes-without-exceptions' => 'required|integer', - 'oauth2-id-security-policy-max-bearer-token-disclosure-attempts' => 'required|integer', - 'oauth2-id-security-policy-max-invalid-client-exception-attempts' => 'required|integer', - 'oauth2-id-security-policy-max-invalid-redeem-auth-code-attempts' => 'required|integer', - 'oauth2-id-security-policy-max-invalid-client-credentials-attempts' => 'required|integer', - ); - - $dictionary = array - ( - 'general-max-failed-login-attempts' => 'MaxFailed.Login.Attempts', - 'general-max-failed-login-attempts-captcha' => 'MaxFailed.LoginAttempts.2ShowCaptcha', - 'openid-private-association-lifetime' => 'OpenId.Private.Association.Lifetime', - 'openid-session-association-lifetime' => 'OpenId.Session.Association.Lifetime', - 'openid-nonce-lifetime' => 'OpenId.Nonce.Lifetime', - 'oauth2-auth-code-lifetime' => 'OAuth2.AuthorizationCode.Lifetime', - 'oauth2-access-token-lifetime' => 'OAuth2.AccessToken.Lifetime', - 'oauth2-id-token-lifetime' => 'OAuth2.IdToken.Lifetime', - 'oauth2-refresh-token-lifetime' => 'OAuth2.RefreshToken.Lifetime', - 'oauth2-id-access-token-revoked-lifetime' => 'OAuth2.AccessToken.Revoked.Lifetime', - 'oauth2-id-access-token-void-lifetime' => 'OAuth2.AccessToken.Void.Lifetime', - 'oauth2-id-refresh-token-revoked-lifetime' => 'OAuth2.RefreshToken.Revoked.Lifetime', - 'oauth2-id-security-policy-minutes-without-exceptions' => 'OAuth2SecurityPolicy.MinutesWithoutExceptions', - 'oauth2-id-security-policy-max-bearer-token-disclosure-attempts' => 'OAuth2SecurityPolicy.MaxBearerTokenDisclosureAttempts', - 'oauth2-id-security-policy-max-invalid-client-exception-attempts' => 'OAuth2SecurityPolicy.MaxInvalidClientExceptionAttempts', - 'oauth2-id-security-policy-max-invalid-redeem-auth-code-attempts' => 'OAuth2SecurityPolicy.MaxInvalidRedeemAuthCodeAttempts', - 'oauth2-id-security-policy-max-invalid-client-credentials-attempts' => 'OAuth2SecurityPolicy.MaxInvalidClientCredentialsAttempts', - ); - - // Creates a Validator instance and validates the data. - $validation = Validator::make($values, $rules); - - if ($validation->fails()) - { - return Redirect::action("AdminController@listServerConfig")->withErrors($validation); - } - - foreach($values as $field => $value) - { - if(array_key_exists($field, $dictionary)) - $this->configuration_service->saveConfigValue($dictionary[$field], $value); - } - - return Redirect::action("AdminController@listServerConfig"); - } - - public function listBannedIPs(){ - $page = $this->banned_ips_repository->getAllByPage(new PagingInfo(1, PHP_INT_MAX)); - return View::make("admin.banned-ips",[ - "page" => $page - ] - ); - } - - public function listServerPrivateKeys(){ - return View::make("oauth2.profile.admin.server-private-keys", - [ - 'private_keys' => $this->private_keys_repository->getAllByPage(new PagingInfo(1, PHP_INT_MAX)), - ] - ); - } - - public function listUsers(){ - // init database - $isoCodes = new IsoCodesFactory(); - - // get languages database - $languages = $isoCodes->getLanguages()->toArray(); - $lang2Code = []; - foreach ($languages as $lang){ - if(!empty($lang->getAlpha2())) - $lang2Code[] = $lang; - } - - // get countries database - $countries = $isoCodes->getCountries()->toArray(); - return View::make("admin.users", - [ - 'page' => $this->user_repository->getAllByPage(new PagingInfo(1, 10)), - 'countries' => CountryList::getCountries(), - ] - ); - } - - public function listGroups(){ - return View::make("admin.groups", - [ - 'groups' => $this->group_repository->getAllByPage(new PagingInfo(1, 10)), - - ] - ); - } - - /** - * @param $user_id - * @return \Illuminate\Contracts\View\View - */ - public function editUser($user_id){ - - $user = $this->user_repository->getById($user_id); - if (is_null($user)) { - Log::warning(sprintf("invalid user id %s", $user_id)); - return View::make("errors.404"); - } - - // init database - $isoCodes = new IsoCodesFactory(); - - // get languages database - $languages = $isoCodes->getLanguages()->toArray(); - $lang2Code = []; - foreach ($languages as $lang){ - if(!empty($lang->getAlpha2())) - $lang2Code[] = $lang; - } - - - return View::make("admin.edit-user", - [ - 'user' => $user, - 'countries' => CountryList::getCountries(), - 'languages' => $lang2Code, - ] - ); - } - - /** - * @param $group_id - * @return \Illuminate\Contracts\View\View - */ - public function editGroup($group_id){ - - $group = $this->group_repository->getById($group_id); - - if (is_null($group)) { - Log::warning(sprintf("invalid group id %s", $group_id)); - return View::make("errors.404"); - } - - return View::make("admin.edit-group", - [ - 'group' => $group, - ] - ); - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/APICRUDController.php b/app/Http/Controllers/Api/APICRUDController.php deleted file mode 100644 index 44b977b5..00000000 --- a/app/Http/Controllers/Api/APICRUDController.php +++ /dev/null @@ -1,249 +0,0 @@ -repository = $repository; - $this->service = $service; - } - - /** - * @param $id - * @return string - */ - protected function getEntityNotFoundMessage($id):string { - return sprintf("entity %s not found", $id); - } - - /** - * @param $id - * @return \Illuminate\Http\JsonResponse - */ - public function get($id) - { - try { - $entity = $this->repository->getById($id); - if (is_null($entity)) { - throw new EntityNotFoundException($this->getEntityNotFoundMessage($id)); - } - - return $this->ok(SerializerRegistry::getInstance()->getSerializer($entity, $this->serializerType())->serialize - ( - Input::get("expand", '') - )); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(['message' => $ex2->getMessage()]); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - protected function serializerType():string{ - return SerializerRegistry::SerializerType_Public; - } - - /** - * @return array - */ - protected abstract function getUpdatePayloadValidationRules():array; - - /** - * @return array - */ - protected function getUpdatePayload():array{ - return request()->all(); - } - - /** - * @param $id - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function update($id) - { - $payload = $this->getUpdatePayload(); - return $this->_update($id, $payload); - } - - protected function curateUpdatePayload(array $payload):array { - return $payload; - } - - protected function curateCreatePayload(array $payload):array { - return $payload; - } - - protected function onUpdate($id, $payload){ - return $this->service->update($id, $payload); - } - /** - * @param $id - * @param array $payload - * @return \Illuminate\Http\JsonResponse|mixed - */ - protected function _update($id, array $payload) - { - try { - - $rules = $this->getUpdatePayloadValidationRules(); - // Creates a Validator instance and validates the data. - $validation = Validator::make($payload, $rules); - if ($validation->fails()) { - $ex = new ValidationException(); - throw $ex->setMessages($validation->messages()->toArray()); - } - - $entity = $this->onUpdate($id, $this->curateUpdatePayload($payload)); - - return $this->updated(SerializerRegistry::getInstance()->getSerializer($entity, $this->serializerType())->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412($ex1->getMessages()); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(['message' => $ex2->getMessage()]); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @return array - */ - protected abstract function getCreatePayloadValidationRules():array; - - /** - * @return array - */ - protected function getCreatePayload():array{ - return Input::All(); - } - - /** - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function create() - { - try { - $payload = $this->getCreatePayload(); - - $rules = $this->getCreatePayloadValidationRules(); - // Creates a Validator instance and validates the data. - $validation = Validator::make($payload, $rules); - - if ($validation->fails()) { - $ex = new ValidationException(); - throw $ex->setMessages($validation->messages()->toArray()); - } - - $entity = $this->service->create($this->curateCreatePayload($payload)); - - return $this->created(SerializerRegistry::getInstance()->getSerializer($entity, $this->serializerType())->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412($ex1->getMessages()); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(['message' => $ex2->getMessage()]); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function delete($id) - { - try { - $this->service->delete($id); - return $this->deleted(); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412($ex1->getMessages()); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(['message' => $ex2->getMessage()]); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ApiBannedIPController.php b/app/Http/Controllers/Api/ApiBannedIPController.php deleted file mode 100644 index beb9e961..00000000 --- a/app/Http/Controllers/Api/ApiBannedIPController.php +++ /dev/null @@ -1,133 +0,0 @@ -repository->getByIp(strval($ip)); - } else { - $banned_ip = $this->repository->getById(intval($id)); - } - if (is_null($banned_ip)) { - throw new EntityNotFoundException(); - } - return $this->ok(SerializerRegistry::getInstance()->getSerializer($banned_ip)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array( $ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param null $id - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function delete($id = null) - { - try { - if (is_null($id)) { - $ip = Input::get("ip", null); - } else { - $banned_ip = $this->repository->getById($id); - $ip = $banned_ip->getIp(); - } - if (is_null($ip)) - return $this->error400('invalid request'); - $this->service->deleteByIP($ip); - return $this->deleted(); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array( $ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @return array - */ - protected function getUpdatePayloadValidationRules(): array - { - return []; - } - - /** - * @return array - */ - protected function getCreatePayloadValidationRules(): array - { - return []; - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ApiController.php b/app/Http/Controllers/Api/ApiController.php deleted file mode 100644 index 0a3bb32e..00000000 --- a/app/Http/Controllers/Api/ApiController.php +++ /dev/null @@ -1,133 +0,0 @@ -service->update($id, ['active' => true]); - - return $this->updated(SerializerRegistry::getInstance()->getSerializer($api)->serialize()); - - } catch (ValidationException $ex1) { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } catch (EntityNotFoundException $ex2) { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @return array - */ - protected function getFilterRules():array{ - return [ - 'resource_server_id' => ['=='] - ]; - } - - /** - * @return array - */ - protected function getFilterValidatorRules():array{ - return [ - 'resource_server_id' => 'sometimes|required|integer', - ]; - } - - /** - * @param $id - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function deactivate($id) - { - try { - $api = $this->service->update($id, ['active' => false]); - - return $this->updated(SerializerRegistry::getInstance()->getSerializer($api)->serialize()); - } catch (ValidationException $ex1) { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } catch (EntityNotFoundException $ex2) { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @return array - */ - protected function getUpdatePayloadValidationRules(): array - { - return [ - 'name' => 'sometimes|required|alpha_dash|max:255', - 'description' => 'sometimes|required|text', - 'active' => 'sometimes|required|boolean', - ]; - } - - /** - * @return array - */ - protected function getCreatePayloadValidationRules(): array - { - return [ - 'name' => 'required|alpha_dash|max:255', - 'description' => 'required|text', - 'active' => 'required|boolean', - 'resource_server_id' => 'required|integer', - ]; - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ApiEndpointController.php b/app/Http/Controllers/Api/ApiEndpointController.php deleted file mode 100644 index 3855b639..00000000 --- a/app/Http/Controllers/Api/ApiEndpointController.php +++ /dev/null @@ -1,185 +0,0 @@ -service->update($id,['active'=>false]); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($endpoint)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array( $ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - public function deactivate($id){ - try { - $endpoint = $this->service->update($id,['active'=>false]); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($endpoint)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array( $ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - public function addRequiredScope($id, $scope_id){ - try { - $endpoint = $this->service->addRequiredScope($id, $scope_id); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($endpoint)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array( $ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - public function removeRequiredScope($id, $scope_id){ - try { - $endpoint = $this->service->removeRequiredScope($id,$scope_id); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($endpoint)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array( $ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - protected function getFilterRules():array - { - return [ - 'name' => ['=@', '=='], - 'http_method' => ['=@', '=='], - 'route' => ['=@', '=='], - 'active' => [ '=='], - 'api_id' => ['=='], - ]; - } - - /** - * @return array - */ - protected function getFilterValidatorRules():array{ - return [ - 'name' => 'sometimes|required|string', - 'http_method'=> 'sometimes|required|string', - 'route' => 'sometimes|required|string', - 'active' => 'sometimes|required|boolean', - 'api_id' => 'sometimes|required|integer', - ]; - } - /** - * @return array - */ - protected function getUpdatePayloadValidationRules(): array - { - return [ - 'name' => 'required|alpha_dash|max:255', - 'description' => 'required|freetext', - 'active' => 'required|boolean', - 'allow_cors' => 'required|boolean', - 'route' => 'required|route', - 'http_method' => 'required|httpmethod', - 'api_id' => 'required|integer', - 'rate_limit' => 'required|integer', - ]; - } - - /** - * @return array - */ - protected function getCreatePayloadValidationRules(): array - { - return [ - 'name' => 'sometimes|required|alpha_dash|max:255', - 'description' => 'sometimes|required|freetext', - 'active' => 'sometimes|required|boolean', - 'allow_cors' => 'sometimes|required|boolean', - 'route' => 'sometimes|required|route', - 'http_method' => 'sometimes|required|httpmethod', - 'rate_limit' => 'sometimes|integer', - ]; - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ApiResourceServerController.php b/app/Http/Controllers/Api/ApiResourceServerController.php deleted file mode 100644 index 81832ee2..00000000 --- a/app/Http/Controllers/Api/ApiResourceServerController.php +++ /dev/null @@ -1,138 +0,0 @@ -service->regenerateClientSecret($id); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($resource_server->getClient())->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array( $ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - - public function activate($id) - { - try { - $entity = $this->service->update($id, ['active' => true]); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($entity)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array( $ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - public function deactivate($id) - { - try { - - $entity = $this->service->update($id, ['active' => false]); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($entity)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array( $ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @return array - */ - protected function getUpdatePayloadValidationRules(): array - { - return [ - 'host' => 'sometimes|required|host|max:255', - 'ips' => 'required', - 'friendly_name' => 'sometimes|required|text|max:512', - ]; - } - - /** - * @return array - */ - protected function getCreatePayloadValidationRules(): array - { - return [ - 'host' => 'required|host|max:255', - 'ips' => 'required', - 'friendly_name' => 'required|text|max:512', - 'active' => 'required|boolean', - ]; - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ApiScopeController.php b/app/Http/Controllers/Api/ApiScopeController.php deleted file mode 100644 index 6a0e4f33..00000000 --- a/app/Http/Controllers/Api/ApiScopeController.php +++ /dev/null @@ -1,140 +0,0 @@ -service->update($id, ['active' => true]); - - return $this->updated(SerializerRegistry::getInstance()->getSerializer($scope)->serialize()); - } catch (ValidationException $ex1) { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } catch (EntityNotFoundException $ex2) { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function deactivate($id) - { - try { - $scope = $this->service->update($id, ['active' => false]); - - return $this->updated(SerializerRegistry::getInstance()->getSerializer($scope)->serialize()); - } catch (ValidationException $ex1) { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } catch (EntityNotFoundException $ex2) { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @return array - */ - protected function getUpdatePayloadValidationRules(): array - { - return [ - 'id' => 'required|integer', - 'name' => 'sometimes|required|scopename|max:512', - 'description' => 'sometimes|required|freetext', - 'short_description' => 'sometimes|required|freetext|max:512', - 'active' => 'sometimes|required|boolean', - 'system' => 'sometimes|required|boolean', - 'default' => 'sometimes|required|boolean', - 'assigned_by_groups' => 'sometimes|boolean', - ]; - } - - /** - * @return array - */ - protected function getCreatePayloadValidationRules(): array - { - return [ - 'name' => 'required|scopename|max:512', - 'short_description' => 'required|freetext|max:512', - 'description' => 'required|freetext', - 'active' => 'required|boolean', - 'default' => 'required|boolean', - 'system' => 'required|boolean', - 'api_id' => 'required|integer', - 'assigned_by_groups' => 'required|boolean', - ]; - } - - /** - * @return array - */ - protected function getFilterRules():array - { - return [ - 'name' => ['=@', '=='], - 'is_assigned_by_groups' => ['=='], - 'api_id' => ['=='], - ]; - } - - /** - * @return array - */ - protected function getFilterValidatorRules():array{ - return [ - 'name' => 'sometimes|required|string', - 'is_assigned_by_groups' => 'sometimes|required|boolean', - 'api_id' => 'sometimes|required|integer', - ]; - } - -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ApiScopeGroupController.php b/app/Http/Controllers/Api/ApiScopeGroupController.php deleted file mode 100644 index 6e4866ba..00000000 --- a/app/Http/Controllers/Api/ApiScopeGroupController.php +++ /dev/null @@ -1,123 +0,0 @@ -service->update($id, ['active' => true]); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($entity)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array( $ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function deactivate($id){ - try - { - $entity = $this->service->update($id, ['active' => false]); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($entity)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array( $ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @return array - */ - protected function getUpdatePayloadValidationRules(): array - { - return [ - 'name' => 'required|text|max:512', - 'active' => 'required|boolean', - 'scopes' => 'required', - 'users' => 'required|user_ids', - ]; - } - - /** - * @return array - */ - protected function getCreatePayloadValidationRules(): array - { - return [ - 'name' => 'required|text|max:512', - 'active' => 'required|boolean', - 'scopes' => 'required', - 'users' => 'required|user_ids', - ]; - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/AsymmetricKeyApiController.php b/app/Http/Controllers/Api/AsymmetricKeyApiController.php deleted file mode 100644 index 201b4820..00000000 --- a/app/Http/Controllers/Api/AsymmetricKeyApiController.php +++ /dev/null @@ -1,63 +0,0 @@ - 'required|integer', - 'active' => 'required|boolean', - ]; - } - -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ClientApiController.php b/app/Http/Controllers/Api/ClientApiController.php deleted file mode 100644 index 2199e652..00000000 --- a/app/Http/Controllers/Api/ClientApiController.php +++ /dev/null @@ -1,695 +0,0 @@ -scope_service = $scope_service; - $this->token_service = $token_service; - $this->auth_service = $auth_service; - $this->access_token_repository = $access_token_repository; - $this->refresh_token_repository = $refresh_token_repository; - } - - /** - * @param $id - * @param $scope_id - * @return mixed - */ - public function addAllowedScope($id, $scope_id) - { - try - { - $client = $this->service->addClientScope($id, $scope_id); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($client)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessages())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @param $scope_id - * @return mixed - */ - public function removeAllowedScope($id, $scope_id) - { - try - { - $client = $this->service->deleteClientScope($id, $scope_id); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($client)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessages())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - protected function applyExtraFilters(Filter $filter):Filter{ - $current_user = Auth::user(); - if(!is_null($current_user)) - $filter->addFilterCondition(FilterElement::makeEqual("user_id", $current_user->getId())); - $filter->addFilterCondition(FilterElement::makeEqual('resource_server_not_set', true)); - return $filter; - } - - /** - * @param $id - * @return mixed - */ - public function activate($id) - { - try { - $client = $this->service->activateClient($id, true); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($client)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @return mixed - */ - public function deactivate($id) - { - try { - $client = $this->service->activateClient($id, false); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($client)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @return mixed - */ - public function regenerateClientSecret($id) - { - try - { - $client = $this->service->regenerateClientSecret($id); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($client)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @param $use_refresh_token - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function setRefreshTokenClient($id, $use_refresh_token) - { - try { - $use_refresh_token = strtolower($use_refresh_token); - $use_refresh_token = ( $use_refresh_token == "false" || $use_refresh_token == "0") ? false : true; - - $client = $this->service->setRefreshTokenUsage($id, $use_refresh_token); - - return $this->updated(SerializerRegistry::getInstance()->getSerializer($client)->serialize()); - - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @param $rotate_refresh_token - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function setRotateRefreshTokenPolicy($id, $rotate_refresh_token) - { - try { - - $rotate_refresh_token = strtolower($rotate_refresh_token); - $rotate_refresh_token = ($rotate_refresh_token == "false" || $rotate_refresh_token == "0") ? false : true; - - $client = $this->service->setRotateRefreshTokenPolicy($id, $rotate_refresh_token); - - return $this->updated(SerializerRegistry::getInstance()->getSerializer($client)->serialize()); - - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @param $value - * @param $hint - * @return mixed - */ - public function revokeToken($id, $value, $hint) - { - try { - $client = $this->repository->getClientByIdentifier($id); - if(is_null($client)) - throw new EntityNotFoundException(); - - switch ($hint) { - case 'access-token': { - $token = $this->token_service->getAccessToken($value, true); - if (is_null($token)) { - throw new EntityNotFoundException(); - } - if ($token->getClientId() !== $client->getClientId()) { - throw new ValidationException(sprintf('access token %s does not belongs to client id !', $value, $id)); - } - $this->token_service->revokeAccessToken($value, true); - } - break; - case 'refresh-token': { - $token = $this->token_service->getRefreshToken($value, true); - - if (is_null($token)) { - throw new EntityNotFoundException(); - } - - if ($token->getClientId() !== $client->getClientId()) { - throw new ValidationException(sprintf('refresh token %s does not belongs to client id !', $value, $id)); - } - $this->token_service->revokeRefreshToken($value, true); - } - break; - default: - break; - } - - return $this->ok(); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @return mixed - */ - public function getAccessTokens($id) - { - $values = Input::all(); - $rules = [ - - 'page' => 'integer|min:1', - 'per_page' => sprintf('required_with:page|integer|min:%s|max:%s', PagingConstants::MinPageSize, PagingConstants::MaxPageSize), - ]; - - try { - $validation = Validator::make($values, $rules); - - if ($validation->fails()) { - $ex = new ValidationException(); - throw $ex->setMessages($validation->messages()->toArray()); - } - - // default values - $page = 1; - $per_page = PagingConstants::DefaultPageSize;; - - if (Input::has('page')) { - $page = intval(Input::get('page')); - $per_page = intval(Input::get('per_page')); - } - - $client = $this->repository->getClientByIdentifier($id); - - if(is_null($client)) - throw new EntityNotFoundException(); - - $data = $this->access_token_repository->getAllValidByClientIdentifier($id, new PagingInfo($page, $per_page)); - - return $this->ok - ( - $data->toArray - ( - Request::input('expand', ''), - [], - [], - [] - ) - ); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @return mixed - */ - public function getRefreshTokens($id) - { - $values = Input::all(); - $rules = [ - - 'page' => 'integer|min:1', - 'per_page' => sprintf('required_with:page|integer|min:%s|max:%s', PagingConstants::MinPageSize, PagingConstants::MaxPageSize), - ]; - - try { - $validation = Validator::make($values, $rules); - - if ($validation->fails()) { - $ex = new ValidationException(); - throw $ex->setMessages($validation->messages()->toArray()); - } - - // default values - $page = 1; - $per_page = PagingConstants::DefaultPageSize;; - - if (Input::has('page')) { - $page = intval(Input::get('page')); - $per_page = intval(Input::get('per_page')); - } - - $client = $this->repository->getClientByIdentifier($id); - - if(is_null($client)) - throw new EntityNotFoundException(); - - $data = $this->refresh_token_repository->getAllValidByClientIdentifier($id, new PagingInfo($page, $per_page)); - - return $this->ok - ( - $data->toArray - ( - Request::input('expand', ''), - [], - [], - [] - ) - ); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @return mixed - */ - public function getAccessTokensByCurrentUser() - { - $values = Input::all(); - $rules = [ - - 'page' => 'integer|min:1', - 'per_page' => sprintf('required_with:page|integer|min:%s|max:%s', PagingConstants::MinPageSize, PagingConstants::MaxPageSize), - ]; - - try { - $validation = Validator::make($values, $rules); - - if ($validation->fails()) { - $ex = new ValidationException(); - throw $ex->setMessages($validation->messages()->toArray()); - } - - // default values - $page = 1; - $per_page = PagingConstants::DefaultPageSize;; - - if (Input::has('page')) { - $page = intval(Input::get('page')); - $per_page = intval(Input::get('per_page')); - } - - $user = $this->auth_service->getCurrentUser(); - - $data = $this->access_token_repository->getAllValidByUserId($user->getId(), new PagingInfo($page, $per_page)); - return $this->ok - ( - $data->toArray - ( - Request::input('expand', ''), - [], - [], - [] - ) - ); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @return mixed - */ - public function getRefreshTokensByCurrentUser() - { - $values = Input::all(); - $rules = [ - - 'page' => 'integer|min:1', - 'per_page' => sprintf('required_with:page|integer|min:%s|max:%s', PagingConstants::MinPageSize, PagingConstants::MaxPageSize), - ]; - - try { - $validation = Validator::make($values, $rules); - - if ($validation->fails()) { - $ex = new ValidationException(); - throw $ex->setMessages($validation->messages()->toArray()); - } - - // default values - $page = 1; - $per_page = PagingConstants::DefaultPageSize;; - - if (Input::has('page')) { - $page = intval(Input::get('page')); - $per_page = intval(Input::get('per_page')); - } - - $user = $this->auth_service->getCurrentUser(); - - $data = $this->refresh_token_repository->getAllValidByUserId($user->getId(), new PagingInfo($page, $per_page)); - - return $this->ok - ( - $data->toArray - ( - Request::input('expand', ''), - [], - [], - [] - ) - ); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @return mixed - */ - public function unlock($id) - { - try { - $client = $this->service->unlockClient($id); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($client)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @return array - */ - protected function getUpdatePayloadValidationRules(): array - { - return [ - //'application_type' => 'required|application_type', - 'app_name' => 'sometimes|required|freetext|max:255', - 'app_description' => 'sometimes|required|freetext|max:512', - 'website' => 'nullable|url', - 'active' => 'sometimes|required|boolean', - 'locked' => 'sometimes|required|boolean', - 'use_refresh_token' => 'sometimes|required|boolean', - 'rotate_refresh_token' => 'sometimes|required|boolean', - 'contacts' => 'nullable|email_set', - 'logo_uri' => 'nullable|url', - 'tos_uri' => 'nullable|url', - 'redirect_uris' => 'nullable|custom_url_set:application_type', - 'policy_uri' => 'nullable|url', - 'post_logout_redirect_uris' => 'nullable|ssl_url_set', - 'allowed_origins' => 'nullable|ssl_url_set', - 'logout_uri' => 'nullable|url', - 'logout_session_required' => 'sometimes|required|boolean', - 'logout_use_iframe' => 'sometimes|required|boolean', - 'jwks_uri' => 'nullable|url', - 'default_max_age' => 'sometimes|required|integer', - 'require_auth_time' => 'sometimes|required|boolean', - 'token_endpoint_auth_method' => 'sometimes|required|token_endpoint_auth_method', - 'token_endpoint_auth_signing_alg' => 'sometimes|required|signing_alg', - 'subject_type' => 'sometimes|required|subject_type', - 'userinfo_signed_response_alg' => 'sometimes|required|signing_alg', - 'userinfo_encrypted_response_alg' => 'sometimes|required|encrypted_alg', - 'userinfo_encrypted_response_enc' => 'sometimes|required|encrypted_enc', - 'id_token_signed_response_alg' => 'sometimes|required|signing_alg', - 'id_token_encrypted_response_alg' => 'sometimes|required|encrypted_alg', - 'id_token_encrypted_response_enc' => 'sometimes|required|encrypted_enc', - 'admin_users' => 'nullable|int_array', - ]; - } - - /** - * @return array - */ - protected function getCreatePayloadValidationRules(): array - { - return [ - 'app_name' => 'required|freetext|max:255', - 'app_description' => 'required|freetext|max:512', - 'application_type' => 'required|applicationtype', - 'website' => 'nullable|url', - 'admin_users' => 'nullable|int_array', - ]; - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ClientPublicKeyApiController.php b/app/Http/Controllers/Api/ClientPublicKeyApiController.php deleted file mode 100644 index a3cd6750..00000000 --- a/app/Http/Controllers/Api/ClientPublicKeyApiController.php +++ /dev/null @@ -1,95 +0,0 @@ -extra_create_payload_params); - } - - private $extra_create_payload_params = []; - /** - * @param int $client_id - * @return mixed - */ - public function _create($client_id) - { - $this->extra_create_payload_params['client_id'] = $client_id; - return $this->create(); - } - - /** - * @param int $client_id - * @param int $public_key_id - * @return mixed - */ - public function _update($client_id, $public_key_id) - { - return $this->update($public_key_id); - } - - /** - * @param int $client_id - * @param int $public_key_id - * @return mixed - */ - public function _delete($client_id, $public_key_id){ - return $this->delete($public_key_id); - } - - /** - * @return array - */ - protected function getCreatePayloadValidationRules(): array - { - return [ - 'client_id' => 'required|integer', - 'kid' => 'required|text|max:255', - 'active' => 'required|boolean', - 'valid_from' => 'required|date_format:m/d/Y', - 'valid_to' => 'required|date_format:m/d/Y|after:valid_from', - 'pem_content' => 'required|public_key_pem|public_key_pem_length', - 'usage' => 'required|public_key_usage', - 'type' => 'required|public_key_type', - 'alg' => 'required|key_alg:usage', - ]; - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/GroupApiController.php b/app/Http/Controllers/Api/GroupApiController.php deleted file mode 100644 index 539e3822..00000000 --- a/app/Http/Controllers/Api/GroupApiController.php +++ /dev/null @@ -1,271 +0,0 @@ -user_repository = $user_repository; - } - - /** - * @return array - */ - protected function getFilterRules():array - { - return [ - 'name' => ['=@', '=='], - 'slug' => ['=@', '=='], - 'active' => [ '=='], - ]; - } - - /** - * @return array - */ - protected function getOrderRules():array{ - return [ - 'id', - 'name', - 'slug' - ]; - } - - /** - * @return array - */ - protected function getFilterValidatorRules():array - { - return [ - 'name' => 'sometimes|required|string', - 'slug' => 'sometimes|required|string', - 'active' => 'sometimes|required|boolean', - ]; - } - - /** - * @return array - */ - protected function getUpdatePayloadValidationRules(): array - { - return [ - 'name' => 'sometimes|required|string|max:512', - 'slug' => 'sometimes|alpha_dash|string|max:254', - 'active' => 'sometimes|required|boolean', - 'default' => 'sometimes|required|boolean', - ]; - } - - /** - * @return array - */ - protected function getCreatePayloadValidationRules(): array - { - - return [ - 'name' => 'required|string|max:512', - 'slug' => 'required|alpha_dash|max:254', - 'active' => 'required|boolean', - 'default' => 'required|boolean', - ]; - } - - /** - * @param $group_id - * @param $user_id - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function addUserToGroup($group_id, $user_id){ - try { - $group = $this->repository->getById($group_id); - if(is_null($group)) - return $this->error404(); - $this->service->addUser2Group($group, $user_id); - return $this->updated(); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412($ex1->getMessages()); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(['message' => $ex2->getMessage()]); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $group_id - * @param $user_id - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function removeUserFromGroup($group_id, $user_id){ - try { - $group = $this->repository->getById($group_id); - if(is_null($group)) - return $this->error404(); - $this->service->removeUserFromGroup($group, $user_id); - return $this->deleted(); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412($ex1->getMessages()); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(['message' => $ex2->getMessage()]); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $group_id - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function getUsersFromGroup($group_id) - { - $values = Input::all(); - $rules = [ - - 'page' => 'integer|min:1', - 'per_page' => sprintf('required_with:page|integer|min:%s|max:%s', PagingConstants::MinPageSize, PagingConstants::MaxPageSize), - ]; - - try { - - $validation = Validator::make($values, $rules); - - if ($validation->fails()) { - $ex = new ValidationException(); - throw $ex->setMessages($validation->messages()->toArray()); - } - - // default values - $page = 1; - $per_page = PagingConstants::DefaultPageSize;; - - if (Input::has('page')) { - $page = intval(Input::get('page')); - $per_page = intval(Input::get('per_page')); - } - - $filter = null; - - if (Input::has('filter')) { - $filter = FilterParser::parse(Input::get('filter'), [ - 'first_name' => ['=@', '=='], - 'last_name' => ['=@', '=='], - 'email' => ['=@', '=='], - 'full_name' => ['=@', '=='], - ]); - } - - if(is_null($filter)) $filter = new Filter(); - - $filter_validator_rules = [ - 'first_name' => 'nullable|string', - 'last_name' => 'nullable|string', - 'email' => 'nullable|string', - 'full_name' => 'nullable|string', - ]; - - if(count($filter_validator_rules)) { - $filter->validate($filter_validator_rules); - } - - $order = null; - - if (Input::has('order')) - { - $order = OrderParser::parse(Input::get('order'), [ - - ]); - } - - $filter->addFilterCondition(FilterElement::makeEqual("group_id", $group_id)); - - $data = $this->user_repository->getAllByPage(new PagingInfo($page, $per_page), $filter, $order); - - return $this->ok - ( - $data->toArray - ( - Input::get('expand', ''), - [], - [], - [], - SerializerRegistry::SerializerType_Private - ) - ); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412($ex1->getMessages()); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(['message' => $ex2->getMessage()]); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/JsonController.php b/app/Http/Controllers/Api/JsonController.php deleted file mode 100644 index e05fd4f4..00000000 --- a/app/Http/Controllers/Api/JsonController.php +++ /dev/null @@ -1,103 +0,0 @@ -log_service = $log_service; - } - - protected function error500(Exception $ex){ - $this->log_service->error($ex); - return Response::json(array( 'error' => 'server error'), 500); - } - - protected function created($data='ok'){ - $res = Response::json($data, 201); - //jsonp - if(Input::has('callback')) - $res->setCallback(Input::get('callback')); - return $res; - } - - protected function updated($data = 'ok', $has_content = true) - { - $res = Response::json($data, $has_content ? 201 : 204); - //jsonp - if (Input::has('callback')) { - $res->setCallback(Input::get('callback')); - } - return $res; - } - - protected function deleted($data='ok'){ - $res = Response::json($data, 204); - //jsonp - if(Input::has('callback')) - $res->setCallback(Input::get('callback')); - return $res; - } - - protected function ok($data = 'ok'){ - $res = Response::json($data, 200); - //jsonp - if(Input::has('callback')) - $res->setCallback(Input::get('callback')); - return $res; - } - - protected function error400($data = ['message' => 'Bad Request']){ - return Response::json($data, 400); - } - - protected function error404($data = array('message' => 'Entity Not Found')){ - return Response::json($data, 404); - } - - protected function error403($data = array('message' => 'Forbidden')) - { - return Response::json($data, 403); - } - - /** - * { - "message": "Validation Failed", - "errors": [ - { - "resource": "Issue", - "field": "title", - "code": "missing_field" - } - ] - } - * @param $messages - * @return mixed - */ - protected function error412($messages){ - - return Response::json(array('error'=>'validation' , 'messages' => $messages), 412); - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/OAuth2/OAuth2DisqusSSOApiController.php b/app/Http/Controllers/Api/OAuth2/OAuth2DisqusSSOApiController.php deleted file mode 100644 index 9ce167cd..00000000 --- a/app/Http/Controllers/Api/OAuth2/OAuth2DisqusSSOApiController.php +++ /dev/null @@ -1,66 +0,0 @@ -service = $service; - } - - /** - * @param string $forum_slug - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function getUserProfile(string $forum_slug){ - try{ - $profile = $this->service->getUserProfile($forum_slug); - return $this->ok($profile->serialize()); - } - catch (ValidationException $ex) { - Log::warning($ex); - return $this->error412([$ex->getMessage()]); - } - catch(EntityNotFoundException $ex) - { - Log::warning($ex); - return $this->error404(['message'=> $ex->getMessage()]); - } - catch (\Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/OAuth2/OAuth2ProtectedController.php b/app/Http/Controllers/Api/OAuth2/OAuth2ProtectedController.php deleted file mode 100644 index 272e9a08..00000000 --- a/app/Http/Controllers/Api/OAuth2/OAuth2ProtectedController.php +++ /dev/null @@ -1,48 +0,0 @@ -resource_server_context = $resource_server_context; - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/OAuth2/OAuth2RocketChatSSOApiController.php b/app/Http/Controllers/Api/OAuth2/OAuth2RocketChatSSOApiController.php deleted file mode 100644 index 8e7d82cb..00000000 --- a/app/Http/Controllers/Api/OAuth2/OAuth2RocketChatSSOApiController.php +++ /dev/null @@ -1,65 +0,0 @@ -service = $service; - } - - /** - * @param string $forum_slug - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function getUserProfile(string $forum_slug){ - try{ - $profile = $this->service->getUserProfile($forum_slug); - return $this->ok($profile->serialize()); - } - catch (ValidationException $ex) { - Log::warning($ex); - return $this->error412([$ex->getMessage()]); - } - catch(EntityNotFoundException $ex) - { - Log::warning($ex); - return $this->error404(['message'=> $ex->getMessage()]); - } - catch (\Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/OAuth2/OAuth2StreamChatSSOApiController.php b/app/Http/Controllers/Api/OAuth2/OAuth2StreamChatSSOApiController.php deleted file mode 100644 index 9eaf8b8d..00000000 --- a/app/Http/Controllers/Api/OAuth2/OAuth2StreamChatSSOApiController.php +++ /dev/null @@ -1,66 +0,0 @@ -service = $service; - } - - /** - * @param string $forum_slug - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function getUserProfile(string $forum_slug){ - try{ - $profile = $this->service->getUserProfile($forum_slug); - return $this->ok($profile->serialize()); - } - catch (ValidationException $ex) { - Log::warning($ex); - return $this->error412([$ex->getMessage()]); - } - catch(EntityNotFoundException $ex) - { - Log::warning($ex); - return $this->error404(['message'=> $ex->getMessage()]); - } - catch (\Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/OAuth2/OAuth2UserApiController.php b/app/Http/Controllers/Api/OAuth2/OAuth2UserApiController.php deleted file mode 100644 index 4e97e0fc..00000000 --- a/app/Http/Controllers/Api/OAuth2/OAuth2UserApiController.php +++ /dev/null @@ -1,284 +0,0 @@ - ['=@', '=='], - 'last_name' => ['=@', '=='], - 'email' => ['=@', '=='], - 'primary_email' => ['=@', '=='], - ]; - } - - public function getOrderRules(): array - { - return []; - } - - /** - * @return array - */ - protected function getFilterValidatorRules(): array - { - return [ - 'first_name' => 'sometimes|required|string', - 'last_name' => 'sometimes|required|string', - 'email' => 'sometimes|required|string', - 'primary_email' => 'sometimes|required|string', - ]; - } - - /** - * @var IUserService - */ - private $user_service; - - /** - * @var IClientRepository - */ - private $client_repository; - - /** - * @var IdTokenBuilder - */ - private $id_token_builder; - - /** - * @var IOpenIdUserService - */ - private $openid_user_service; - - - /** - * OAuth2UserApiController constructor. - * @param IUserRepository $repository - * @param IUserService $user_service - * @param IResourceServerContext $resource_server_context - * @param ILogService $log_service - * @param IOpenIdUserService $openid_user_service - * @param IClientRepository $client_repository - * @param IdTokenBuilder $id_token_builder - */ - public function __construct - ( - IUserRepository $repository, - IUserService $user_service, - IResourceServerContext $resource_server_context, - ILogService $log_service, - IOpenIdUserService $openid_user_service, - IClientRepository $client_repository, - IdTokenBuilder $id_token_builder - ) - { - parent::__construct($resource_server_context, $log_service); - $this->repository = $repository; - $this->user_service = $user_service; - $this->client_repository = $client_repository; - $this->id_token_builder = $id_token_builder; - $this->openid_user_service = $openid_user_service; - } - - /** - * Gets User Basic Info - * @return mixed - */ - public function me() - { - try { - $data = $this->user_service->getCurrentUserInfo(); - return $this->ok($data); - } catch (Exception $ex) { - $this->log_service->error($ex); - return $this->error500($ex); - } - } - - protected function curateUpdatePayload(array $payload): array - { - // remove possible fields that an user can not update - // from this endpoint - if(isset($payload['groups'])) - unset($payload['groups']); - - if(isset($payload['email_verified'])) - unset($payload['email_verified']); - - if(isset($payload['active'])) - unset($payload['active']); - - return HTMLCleaner::cleanData($payload, [ - 'bio', 'statement_of_interest' - ]); - } - - public function UpdateMe(){ - try { - if(!Request::isJson()) return $this->error400(); - if(!$this->resource_server_context->getCurrentUserId()){ - return $this->error403(); - } - $payload = Input::json()->all(); - // Creates a Validator instance and validates the data. - - $validation = Validator::make($payload, UserValidationRulesFactory::build($payload, true)); - if ($validation->fails()) { - $ex = new ValidationException(); - throw $ex->setMessages($validation->messages()->toArray()); - } - - $user = $this->openid_user_service->update($this->resource_server_context->getCurrentUserId(), $this->curateUpdatePayload($payload)); - - return $this->updated(SerializerRegistry::getInstance()->getSerializer($user, SerializerRegistry::SerializerType_Private)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412($ex1->getMessages()); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(['message' => $ex2->getMessage()]); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - public function UpdateMyPic(LaravelRequest $request){ - try { - if (!$this->resource_server_context->getCurrentUserId()) { - return $this->error403(); - } - - $file = $request->hasFile('file') ? $request->file('file'):null; - if(is_null($file)){ - throw new ValidationException('file is not present'); - } - $user = $this->openid_user_service->updateProfilePhoto($this->resource_server_context->getCurrentUserId(), $file); - - return $this->updated(SerializerRegistry::getInstance()->getSerializer($user, SerializerRegistry::SerializerType_Private)->serialize()); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412($ex1->getMessages()); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(['message' => $ex2->getMessage()]); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - public function userInfo() - { - try { - $claims = $this->user_service->getCurrentUserInfoClaims(); - $client_id = $this->resource_server_context->getCurrentClientId(); - $client = $this->client_repository->getClientById($client_id); - - // The UserInfo Claims MUST be returned as the members of a JSON object unless a signed or encrypted response - // was requested during Client Registration. - $user_info_response_info = $client->getUserInfoResponseInfo(); - - $sig_alg = $user_info_response_info->getSigningAlgorithm(); - $enc_alg = $user_info_response_info->getEncryptionKeyAlgorithm(); - $enc = $user_info_response_info->getEncryptionContentAlgorithm(); - - if ($sig_alg || ($enc_alg && $enc)) { - $jwt = $this->id_token_builder->buildJWT($claims, $user_info_response_info, $client); - $http_response = Response::make($jwt->toCompactSerialization(), 200); - $http_response->header('Content-Type', HttpContentType::JWT); - $http_response->header('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate'); - $http_response->header('Pragma', 'no-cache'); - return $http_response; - } else { - // return plain json - return $this->ok($claims->toArray()); - } - } catch (Exception $ex) { - $this->log_service->error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function get($id) - { - try { - $user = $this->repository->getById(intval($id)); - if (is_null($user)) { - throw new EntityNotFoundException(); - } - return $this->ok(SerializerRegistry::getInstance()->getSerializer($user, SerializerRegistry::SerializerType_Private)->serialize()); - } catch (ValidationException $ex1) { - Log::warning($ex1); - return $this->error412($ex1->getMessages()); - } catch (EntityNotFoundException $ex2) { - Log::warning($ex2); - return $this->error404(['message' => $ex2->getMessage()]); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/OAuth2/OAuth2UserRegistrationRequestApiController.php b/app/Http/Controllers/Api/OAuth2/OAuth2UserRegistrationRequestApiController.php deleted file mode 100644 index 80f00ea9..00000000 --- a/app/Http/Controllers/Api/OAuth2/OAuth2UserRegistrationRequestApiController.php +++ /dev/null @@ -1,97 +0,0 @@ -user_service = $user_service; - } - - public function register(){ - try { - - if(!Request::isJson()) return $this->error400(); - $payload = Input::json()->all(); - - // Creates a Validator instance and validates the data. - $validation = Validator::make($payload, [ - 'first_name' => 'required|string|max:255', - 'last_name' => 'required|string|max:255', - 'email' => 'required|string|email|max:255', - 'country' => 'sometimes|required|string|country_iso_alpha2_code', - ]); - - if ($validation->fails()) { - $messages = $validation->messages()->toArray(); - - return $this->error412 - ( - $messages - ); - } - - $registration_request = $this->user_service->createRegistrationRequest - ( - $this->resource_server_context->getCurrentClientId(), - $payload - ); - - return $this->created(SerializerRegistry::getInstance()->getSerializer($registration_request)->serialize()); - } - catch (ValidationException $ex1) { - Log::warning($ex1); - return $this->error412([$ex1->getMessage()]); - } - catch(EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(['message'=> $ex2->getMessage()]); - } - catch (\Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ServerPrivateKeyApiController.php b/app/Http/Controllers/Api/ServerPrivateKeyApiController.php deleted file mode 100644 index d7410cb5..00000000 --- a/app/Http/Controllers/Api/ServerPrivateKeyApiController.php +++ /dev/null @@ -1,55 +0,0 @@ - 'required|text|min:5|max:255', - 'active' => 'required|boolean', - 'valid_from' => 'date_format:m/d/Y', - 'valid_to' => 'date_format:m/d/Y|after:valid_from', - 'pem_content' => 'sometimes|required|private_key_pem:password|private_key_pem_length:password', - 'usage' => 'required|public_key_usage', - 'type' => 'required|public_key_type', - 'alg' => 'required|key_alg:usage', - 'password' => 'min:5|max:255|private_key_password:pem_content', - ]; - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Api/UserApiController.php b/app/Http/Controllers/Api/UserApiController.php deleted file mode 100644 index 310e7743..00000000 --- a/app/Http/Controllers/Api/UserApiController.php +++ /dev/null @@ -1,270 +0,0 @@ -token_service = $token_service; - } - - /** - * @return array - */ - protected function getFilterRules(): array - { - return [ - 'first_name' => ['=@', '=='], - 'last_name' => ['=@', '=='], - 'full_name' => ['=@', '=='], - 'email' => ['=@', '=='], - ]; - } - - /** - * @return array - */ - protected function getFilterValidatorRules(): array - { - return [ - 'first_name' => 'nullable|string', - 'last_name' => 'nullable|string', - 'full_name' => 'nullable|string', - 'email' => 'nullable|string', - ]; - } - - /** - * @return array - */ - protected function getOrderRules():array{ - return [ - 'first_name', - 'last_name', - 'email', - 'identifier', - 'last_login_date', - 'spam_type' - ]; - } - - /** - * @param $id - * @return mixed - */ - public function unlock($id) - { - try { - $entity = $this->service->unlockUser($id); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($entity)->serialize()); - } catch (ValidationException $ex1) { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } catch (EntityNotFoundException $ex2) { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $id - * @return mixed - */ - public function lock($id) - { - try { - $entity = $this->service->lockUser($id); - return $this->updated(SerializerRegistry::getInstance()->getSerializer($entity)->serialize()); - } catch (ValidationException $ex1) { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } catch (EntityNotFoundException $ex2) { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - protected function getAllSerializerType(): string - { - return SerializerRegistry::SerializerType_Private; - } - - /** - * @param $id - * @param $value - * @return mixed - */ - public function revokeMyToken($value) - { - - try { - $hint = Input::get('hint', 'none'); - - switch ($hint) { - case 'access-token': - { - $this->token_service->revokeAccessToken($value, true); - } - break; - case 'refresh-token': - $this->token_service->revokeRefreshToken($value, true); - break; - default: - throw new Exception(sprintf("hint %s not allowed", $hint)); - break; - } - return $this->deleted(); - } catch (ValidationException $ex1) { - Log::warning($ex1); - return $this->error412(array($ex1->getMessage())); - } catch (EntityNotFoundException $ex2) { - Log::warning($ex2); - return $this->error404(array('message' => $ex2->getMessage())); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @return array - */ - protected function getUpdatePayloadValidationRules(): array - { - return UserValidationRulesFactory::build([], true, true); - } - - protected function curateUpdatePayload(array $payload): array - { - if(in_array("bio", $payload)){ - $payload["bio"] = strip_tags($payload["bio"]); - } - if(in_array("statement_of_interest", $payload)){ - $payload["statement_of_interest"] = strip_tags($payload["statement_of_interest"]); - } - return $payload; - } - - protected function curateCreatePayload(array $payload): array - { - if(in_array("bio", $payload)){ - $payload["bio"] = strip_tags($payload["bio"]); - } - if(in_array("statement_of_interest", $payload)){ - $payload["statement_of_interest"] = strip_tags($payload["statement_of_interest"]); - } - return $payload; - } - - /** - * @return array - */ - protected function getCreatePayloadValidationRules(): array - { - return UserValidationRulesFactory::build([], false, true); - } - - /** - * @param LaravelRequest $request - * @return \Illuminate\Http\JsonResponse|mixed - */ - public function updateMe(LaravelRequest $request) - { - if (!Auth::check()) - return $this->error403(); - - $myId = Auth::user()->getId(); - return $this->update($myId); - } - - /** - * @return array - */ - protected function getUpdatePayload():array{ - $payload = request()->all(); - if(isset($payload['user'])){ - $payload = json_decode($payload['user'],true); - if(is_null($payload)){ - Log::warning(sprintf("UserApiController::getUpdatePayload can not decode %s ", $payload['user'])); - return []; - } - } - return $payload; - } - - /** - * @param $id - * @param $payload - * @return \models\utils\IEntity - */ - protected function onUpdate($id, $payload){ - $user = parent::onUpdate($id, $payload); - $file = request()->file('pic'); - if (!is_null($file)) { - $user = $this->service->updateProfilePhoto($id, $file); - } - return $user; - } - - protected function serializerType(): string - { - return SerializerRegistry::SerializerType_Private; - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Auth/EmailVerificationController.php b/app/Http/Controllers/Auth/EmailVerificationController.php deleted file mode 100644 index 15d8e190..00000000 --- a/app/Http/Controllers/Auth/EmailVerificationController.php +++ /dev/null @@ -1,114 +0,0 @@ -user_service = $user_service; - } - - public function showVerificationForm() - { - return view('auth.email_verification'); - } - - /** - * @param string $token - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View - */ - public function verify($token) - { - try { - $user = $this->user_service->verifyEmail($token); - return view('auth.email_verification_success', ['user' => $user]); - } - catch (EntityNotFoundException $ex){ - Log::warning($ex); - } - catch (ValidationException $ex){ - Log::warning($ex); - } - catch (\Exception $ex){ - Log::error($ex); - } - return view('auth.email_verification_error'); - } - - - /** - * Get a validator for an incoming registration request. - * - * @param array $data - * @return \Illuminate\Contracts\Validation\Validator - */ - protected function validator(array $data) - { - return Validator::make($data, [ - 'email' => 'required|string|email|max:255', - 'g-recaptcha-response' => 'required|recaptcha', - ]); - } - - public function resend(LaravelRequest $request) - { - try { - $payload = $request->all(); - $validator = $this->validator($payload); - - if (!$validator->passes()) { - return Redirect::action('Auth\EmailVerificationController@showVerificationForm')->withErrors($validator); - } - - $user = $this->user_service->resendVerificationEmail($payload); - - return view("auth.email_verification_resend_success", ['user' => $user]); - } - catch (EntityNotFoundException $ex){ - Log::warning($ex); - } - catch (ValidationException $ex){ - Log::warning($ex); - foreach ($ex->getMessages() as $message){ - $validator->getMessageBag()->add('validation', $message); - } - return Redirect::action('Auth\EmailVerificationController@showVerificationForm')->withErrors($validator); - } - catch(\Exception $ex){ - Log::error($ex); - } - return view("auth.email_verification_error"); - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php deleted file mode 100644 index 26ad70bd..00000000 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ /dev/null @@ -1,170 +0,0 @@ -middleware('guest'); - $this->user_service = $user_service; - $this->client_repository = $client_repository; - } - - /** - * @param LaravelRequest $request - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View - */ - public function showLinkRequestForm(LaravelRequest $request) - { - try { - $params = [ - "redirect_uri" => '', - "client_id" => '', - ]; - // check if we have explicit params at query string - if ($request->has("redirect_uri") && $request->has("client_id")) { - $redirect_uri = $request->get("redirect_uri"); - $client_id = $request->get("client_id"); - - $client = $this->client_repository->getClientById($client_id); - if (is_null($client)) - throw new ValidationException("client does not exists"); - - if (!$client->isUriAllowed($redirect_uri)) - throw new ValidationException(sprintf("redirect_uri %s is not allowed on associated client", $redirect_uri)); - - $params['redirect_uri'] = $redirect_uri; - $params['client_id'] = $client_id; - } - return view('auth.passwords.email', $params); - } catch (\Exception $ex) { - Log::warning($ex); - } - return view("auth.passwords.email_error"); - } - - /** - * Send a reset link to the given user. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse - */ - public function sendResetLinkEmail(LaravelRequest $request) - { - try { - $payload = $request->all(); - $validator = $this->validator($payload); - - if (!$validator->passes()) { - return back() - ->withInput($request->only('email', 'client_id', 'redirect_uri')) - ->withErrors($validator); - } - - $this->user_service->requestPasswordReset($payload); - - $params = [ - 'client_id' => '', - 'redirect_uri' => '', - ]; - // check redirect uri with associated client - if($request->has("redirect_uri") && $request->has("client_id")){ - $redirect_uri = $request->get("redirect_uri"); - $client_id = $request->get("client_id"); - $client = $this->client_repository->getClientById($client_id); - - if(is_null($client)) - throw new ValidationException("client does not exists"); - - if(!$client->isUriAllowed($redirect_uri)) - throw new ValidationException(sprintf("redirect_uri %s is not allowed on associated client", $redirect_uri)); - - $params['client_id'] = $client_id; - $params['redirect_uri'] = $redirect_uri; - } - - $params['status'] = 'Reset link sent'; - return back()->with($params); - - } catch (ValidationException $ex) { - Log::warning($ex); - foreach ($ex->getMessages() as $message) { - $validator->getMessageBag()->add('validation', $message); - } - return back() - ->withInput($request->only(['email', 'client_id', 'redirect_uri'])) - ->withErrors($validator); - } catch (\Exception $ex) { - Log::warning($ex); - } - return view("auth.passwords.email_error"); - } - - /** - * Get a validator for an incoming registration request. - * - * @param array $data - * @return \Illuminate\Contracts\Validation\Validator - */ - protected function validator(array $data) - { - return Validator::make($data, [ - 'email' => 'required|string|email|max:255', - ]); - } - - /** - * Get the response for a successful password reset link. - * - * @param string $response - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse - */ - protected function sendResetLinkResponse($response) - { - - } - -} \ No newline at end of file diff --git a/app/Http/Controllers/Auth/PasswordSetController.php b/app/Http/Controllers/Auth/PasswordSetController.php deleted file mode 100644 index 3e4541b0..00000000 --- a/app/Http/Controllers/Auth/PasswordSetController.php +++ /dev/null @@ -1,216 +0,0 @@ -middleware('guest'); - $this->user_service = $user_service; - $this->user_registration_request_repository = $user_registration_request_repository; - $this->client_repository = $client_repository; - } - - /** - * @param $token - * @param LaravelRequest $request - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View - */ - public function showPasswordSetForm($token, LaravelRequest $request) - { - try { - - $user_registration_request = $this->user_registration_request_repository->getByHash($token); - - if(is_null($user_registration_request)) - throw new EntityNotFoundException("request not found"); - - if($user_registration_request->isRedeem()) { - - // check redirect uri - if($request->has("redirect_uri") && $request->has("client_id")){ - $redirect_uri = $request->get("redirect_uri"); - $client_id = $request->get("client_id"); - $client = $this->client_repository->getClientById($client_id); - - if(is_null($client)) - throw new ValidationException("client does not exists"); - - if(!$client->isUriAllowed($redirect_uri)) - throw new ValidationException(sprintf("redirect_uri %s is not allowed on associated client", $redirect_uri)); - - $params['client_id'] = $client_id; - $params['redirect_uri'] = $redirect_uri; - $params['email'] = $user_registration_request->getEmail(); - - return view("auth.passwords.set_success", $params); - } - - throw new ValidationException("request already redeem!"); - } - - $params = [ - "email" => $user_registration_request->getEmail(), - "token" => $token, - "redirect_uri" => '', - "client_id" => '', - ]; - - if($request->has("redirect_uri") && $request->has("client_id")){ - $redirect_uri = $request->get("redirect_uri"); - $client_id = $request->get("client_id"); - - $client = $this->client_repository->getClientById($client_id); - if(is_null($client)) - throw new ValidationException("client does not exists"); - - if(!$client->isUriAllowed($redirect_uri)) - throw new ValidationException(sprintf("redirect_uri %s is not allowed on associated client", $redirect_uri)); - - $params['redirect_uri'] = $redirect_uri; - $params['client_id'] = $client_id; - } - - return view('auth.passwords.set', $params); - } - catch(EntityNotFoundException $ex){ - Log::warning($ex); - } - catch(ValidationException $ex){ - Log::warning($ex); - } - catch (\Exception $ex){ - Log::error($ex); - } - return view('auth.passwords.set_error'); - } - - /** - * Get a validator for an incoming registration request. - * - * @param array $data - * @return \Illuminate\Contracts\Validation\Validator - */ - protected function validator(array $data) - { - return Validator::make($data, [ - 'token' => 'required', - 'password' => 'required|string|confirmed|password_policy', - 'g-recaptcha-response' => 'required|recaptcha', - ]); - } - - /** - * @param LaravelRequest $request - * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\View\View - */ - public function setPassword(LaravelRequest $request) - { - try { - $payload = $request->all(); - $validator = $this->validator($payload); - - if (!$validator->passes()) { - return back() - ->withInput($request->only(['token','client_id', 'redirect_uri', 'email'])) - ->withErrors($validator); - } - - $user_registration_request = $this->user_service->setPassword($payload['token'], $payload['password']); - $params = [ - 'client_id' => '', - 'redirect_uri' => '', - 'email' => '', - ]; - - // check redirect uri with associated client - if($request->has("redirect_uri") && $request->has("client_id")){ - $redirect_uri = $request->get("redirect_uri"); - $client_id = $request->get("client_id"); - $client = $this->client_repository->getClientById($client_id); - - if(is_null($client)) - throw new ValidationException("client does not exists"); - - if(!$client->isUriAllowed($redirect_uri)) - throw new ValidationException(sprintf("redirect_uri %s is not allowed on associated client", $redirect_uri)); - - $params['client_id'] = $client_id; - $params['redirect_uri'] = $redirect_uri; - $params['email'] = $user_registration_request->getEmail(); - } - - Auth::login($user_registration_request->getOwner(), true); - - return view("auth.passwords.set_success", $params); - } - catch (EntityNotFoundException $ex){ - Log::warning($ex); - } - catch (ValidationException $ex){ - Log::warning($ex); - foreach ($ex->getMessages() as $message){ - $validator->getMessageBag()->add('validation', $message); - } - return back() - ->withInput($request->only(['token','client_id', 'redirect_uri', 'email'])) - ->withErrors($validator); - } - catch(\Exception $ex){ - Log::warning($ex); - } - - return view("auth.passwords.reset_error"); - - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php deleted file mode 100644 index 598c4651..00000000 --- a/app/Http/Controllers/Auth/RegisterController.php +++ /dev/null @@ -1,263 +0,0 @@ -middleware('guest'); - $this->user_service = $user_service; - $this->client_repository = $client_repository; - $this->memento_service = $memento_service; - } - - /** - * @param LaravelRequest $request - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View - * @throws ValidationException - */ - public function showRegistrationForm(LaravelRequest $request) - { - try { - - $params = [ - "redirect_uri" => '', - "email" => '', - "first_name" => '', - "last_name" => '', - "client_id" => '', - 'countries' => CountryList::getCountries() - ]; - - // check if we have a former oauth2 request - if ($this->memento_service->exists()) { - - Log::debug("RegisterController::showRegistrationForm exist a oauth auth request on session"); - - $oauth_auth_request = OAuth2AuthorizationRequestFactory::getInstance()->build - ( - OAuth2Message::buildFromMemento($this->memento_service->load()) - ); - - if ($oauth_auth_request->isValid()) { - - $redirect_uri = $oauth_auth_request->getRedirectUri(); - $client_id = $oauth_auth_request->getClientId(); - - Log::debug(sprintf( "RegisterController::showRegistrationForm exist a oauth auth request is valid for client id %s", $client_id)); - $client = $this->client_repository->getClientById($client_id); - if (is_null($client)) - throw new ValidationException("client does not exists"); - - if (!$client->isUriAllowed($redirect_uri)) - throw new ValidationException(sprintf("redirect_uri %s is not allowed on associated client", $redirect_uri)); - - $this->memento_service->serialize($oauth_auth_request->getMessage()->createMemento()); - } - } - - // check if we have explicit params at query string - if ($request->has("redirect_uri") && $request->has("client_id")) { - $redirect_uri = $request->get("redirect_uri"); - $client_id = $request->get("client_id"); - - $client = $this->client_repository->getClientById($client_id); - if (is_null($client)) - throw new ValidationException("client does not exists"); - - if (!$client->isUriAllowed($redirect_uri)) - throw new ValidationException(sprintf("redirect_uri %s is not allowed on associated client", $redirect_uri)); - - $params['redirect_uri'] = $redirect_uri; - $params['client_id'] = $client_id; - } - - if($request->has('email')){ - $params['email'] = $request->get("email"); - } - - if($request->has('first_name')){ - $params['first_name'] = $request->get("first_name"); - } - - if($request->has('last_name')){ - $params['last_name'] = $request->get("last_name"); - } - - return view('auth.register', $params); - } - catch(\Exception $ex){ - Log::warning($ex); - } - return view("auth.register_error"); - } - - /** - * Get a validator for an incoming registration request. - * - * @param array $data - * @return \Illuminate\Contracts\Validation\Validator - */ - protected function validator(array $data) - { - $rules = [ - 'first_name' => 'required|string|max:100', - 'last_name' => 'required|string|max:100', - 'country_iso_code' => 'required|string|country_iso_alpha2_code', - 'email' => 'required|string|email|max:255', - 'password' => 'required|string|confirmed|password_policy', - 'g-recaptcha-response' => 'required|recaptcha', - ]; - - if(!empty(Config::get("app.code_of_conduct_link", null))){ - $rules['agree_code_of_conduct'] = 'required|string|in:on'; - } - - return Validator::make($data, $rules); - } - - /** - * Handle a registration request for the application. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function register(LaravelRequest $request) - { - $validator = null; - try { - $payload = $request->all(); - $validator = $this->validator($payload); - - if (!$validator->passes()) { - return back() - ->withInput($request->only(['first_name', 'last_name', 'country_iso_code','email','client_id', 'redirect_uri'])) - ->withErrors($validator); - } - - $user = $this->user_service->registerUser($payload); - - $params = [ - 'client_id' => '', - 'redirect_uri' => '', - ]; - - // check if we have a former oauth2 request - if ($this->memento_service->exists()) { - - Log::debug("RegisterController::register exist a oauth auth request on session"); - $oauth_auth_request = OAuth2AuthorizationRequestFactory::getInstance()->build - ( - OAuth2Message::buildFromMemento($this->memento_service->load()) - ); - - if ($oauth_auth_request->isValid()) { - $redirect_uri = $oauth_auth_request->getRedirectUri(); - $client_id = $oauth_auth_request->getClientId(); - Log::debug(sprintf( "RegisterController::register exist a oauth auth request is valid for client id %s", $client_id)); - $client = $this->client_repository->getClientById($client_id); - if (is_null($client)) - throw new ValidationException("client does not exists"); - - if (!$client->isUriAllowed($redirect_uri)) - throw new ValidationException(sprintf("redirect_uri %s is not allowed on associated client", $redirect_uri)); - - $this->memento_service->serialize($oauth_auth_request->getMessage()->createMemento()); - - $params['redirect_uri'] = action('OAuth2\OAuth2ProviderController@auth'); - - Auth::login($user, false); - } - } - // check redirect uri with associated client - if($request->has("redirect_uri") && $request->has("client_id")){ - $redirect_uri = $request->get("redirect_uri"); - $client_id = $request->get("client_id"); - $client = $this->client_repository->getClientById($client_id); - - if(is_null($client)) - throw new ValidationException("client does not exists"); - - if(!$client->isUriAllowed($redirect_uri)) - throw new ValidationException(sprintf("redirect_uri %s is not allowed on associated client", $redirect_uri)); - - $params['client_id'] = $client_id; - $params['redirect_uri'] = $redirect_uri; - Auth::login($user, false); - } - - return view("auth.register_success", $params); - } - catch (ValidationException $ex){ - Log::warning($ex); - - if(!is_null($validator)) { - $validator->getMessageBag()->add('validation', sprintf - ( - "It looks like a user with this email address already exists." . - "You can either sign in or reset your password if you've forgotten it.", - URL::action("UserController@getLogin"), - URL::action("Auth\ForgotPasswordController@showLinkRequestForm") - )); - } - - return back() - ->withInput($request->only(['first_name', 'last_name', 'country_iso_code','email'])) - ->withErrors($validator); - } - catch(Exception $ex){ - Log::warning($ex); - } - return view("auth.register_error"); - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php deleted file mode 100644 index 6df5d271..00000000 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ /dev/null @@ -1,148 +0,0 @@ -middleware('guest'); - $this->user_service = $user_service; - $this->user_password_reset_request_repository = $user_password_reset_request_repository; - } - - - /** - * @param $token - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View - */ - public function showResetForm($token) - { - try { - $request = $this->user_password_reset_request_repository->getByToken($token); - - if(is_null($request)) - throw new EntityNotFoundException(sprintf("Request not found for token %s.", $token)); - - if(!$request->isValid()) - throw new ValidationException("Request is void."); - - if($request->isRedeem()){ - throw new ValidationException("Request is already redeem."); - } - - return view('auth.passwords.reset')->with( - [ - 'token' => $token, - 'email' => $request->getOwner()->getEmail() - ]); - } - catch (EntityNotFoundException $ex){ - Log::warning($ex); - } - catch (ValidationException $ex){ - Log::warning($ex); - } - catch(\Exception $ex){ - Log::error($ex); - } - return view("auth.passwords.reset_error"); - } - - /** - * Get a validator for an incoming registration request. - * - * @param array $data - * @return \Illuminate\Contracts\Validation\Validator - */ - protected function validator(array $data) - { - return Validator::make($data, [ - 'token' => 'required', - 'password' => 'required|string|confirmed|password_policy', - 'g-recaptcha-response' => 'required|recaptcha', - ]); - } - - /** - * Reset the given user's password. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse - */ - public function reset(LaravelRequest $request) - { - try { - $payload = $request->all(); - $validator = $this->validator($payload); - - if (!$validator->passes()) { - return back() - ->withInput($request->only(['token', 'email'])) - ->withErrors($validator); - } - - $this->user_service->resetPassword($payload['token'], $payload['password']); - - return view("auth.passwords.reset_success"); - } - catch (ValidationException $ex){ - Log::warning($ex); - foreach ($ex->getMessages() as $message){ - $validator->getMessageBag()->add('validation', $message); - } - return back() - ->withInput($request->only(['token', 'email'])) - ->withErrors($validator); - } - catch(\Exception $ex){ - Log::warning($ex); - } - return view("auth.passwords.reset_error"); - - } - -} \ No newline at end of file diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php deleted file mode 100644 index e7b97c16..00000000 --- a/app/Http/Controllers/Controller.php +++ /dev/null @@ -1,25 +0,0 @@ - 'sometimes|string', - 'last_name' => 'sometimes|string', - 'email' => 'sometimes|email', - 'identifier' => 'sometimes|string', - 'bio' => 'nullable|string', - 'address1' => 'nullable|string', - 'address2' => 'nullable|string', - 'city' => 'nullable|string', - 'state' => 'nullable|string', - 'post_code' => 'nullable|string', - 'country_iso_code' => 'nullable|country_iso_alpha2_code', - 'second_email' => 'nullable|email', - 'third_email' => 'nullable|email', - 'gender' => 'nullable|string', - 'gender_specify' => 'nullable|string', - 'statement_of_interest' => 'nullable|string', - 'irc' => 'nullable|string', - 'linked_in_profile' => 'nullable|string', - 'github_user' => 'nullable|string', - 'wechat_user' => 'nullable|string', - 'twitter_name' => 'nullable|string', - 'language' => 'nullable|string', - 'birthday' => 'nullable|date_format:U', - 'password' => 'sometimes|string|confirmed|password_policy', - 'phone_number' => 'nullable|string', - 'company' => 'nullable|string', - 'job_title' => 'nullable|string', - // admin fields - 'email_verified' => 'nullable|boolean', - 'active' => 'nullable|boolean', - 'groups' => 'sometimes|int_array', - 'public_profile_show_photo' => 'sometimes|boolean', - 'public_profile_show_fullname' => 'sometimes|boolean', - 'public_profile_show_email' => 'sometimes|boolean', - ]; - - if(!$is_admin){ - $rules['current_password'] = 'required_with:password'; - } - - return $rules; - } - - return [ - 'first_name' => 'required|string', - 'last_name' => 'required|string', - 'email' => 'required|email', - 'identifier' => 'sometimes|string', - 'bio' => 'nullable|string', - 'address1' => 'nullable|string', - 'address2' => 'nullable|string', - 'city' => 'nullable|string', - 'state' => 'nullable|string', - 'post_code' => 'nullable|string', - 'country_iso_code' => 'nullable|country_iso_alpha2_code', - 'second_email' => 'nullable|email', - 'third_email' => 'nullable|email', - 'gender' => 'nullable|string', - 'statement_of_interest' => 'nullable|string', - 'irc' => 'nullable|string', - 'linked_in_profile' => 'nullable|string', - 'github_user' => 'nullable|string', - 'wechat_user' => 'nullable|string', - 'twitter_name' => 'nullable|string', - 'language' => 'nullable|string', - 'birthday' => 'nullable|date_format:U', - 'password' => 'sometimes|string|confirmed|password_policy', - 'phone_number' => 'nullable|string', - 'company' => 'nullable|string', - 'job_title' => 'nullable|string', - // admin fields - 'email_verified' => 'nullable|boolean', - 'active' => 'nullable|boolean', - 'groups' => 'sometimes|int_array', - 'public_profile_show_photo' => 'sometimes|boolean', - 'public_profile_show_fullname' => 'sometimes|boolean', - 'public_profile_show_email' => 'sometimes|boolean', - ]; - } -} \ No newline at end of file diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php deleted file mode 100644 index 463f0c99..00000000 --- a/app/Http/Controllers/HomeController.php +++ /dev/null @@ -1,47 +0,0 @@ -discovery = $discovery; - } - - public function index() - { - - if ($this->isDiscoveryRequest()) - return $this->discovery->idp(); - if (Auth::guest()) { - Session::flush(); - Session::regenerate(); - return View::make("home"); - } - else - return Redirect::action("UserController@getProfile"); - } -} \ No newline at end of file diff --git a/app/Http/Controllers/OAuth2/OAuth2ProviderController.php b/app/Http/Controllers/OAuth2/OAuth2ProviderController.php deleted file mode 100644 index d0c9a554..00000000 --- a/app/Http/Controllers/OAuth2/OAuth2ProviderController.php +++ /dev/null @@ -1,294 +0,0 @@ -oauth2_protocol = $oauth2_protocol; - $this->auth_service = $auth_service; - $this->client_repository = $client_repository; - } - - /** - * Authorize HTTP Endpoint - * The authorization server MUST support the use of the HTTP "GET" - * method [RFC2616] for the authorization endpoint and MAY support the - * use of the "POST" method as well. - * @return mixed - */ - public function auth() - { - try - { - $response = $this->oauth2_protocol->authorize - ( - OAuth2AuthorizationRequestFactory::getInstance()->build - ( - new OAuth2Message - ( - Input::all() - ) - ) - ); - - if ($response instanceof OAuth2Response) { - $strategy = OAuth2ResponseStrategyFactoryMethod::buildStrategy - ( - $this->oauth2_protocol->getLastRequest(), - $response - ); - return $strategy->handle($response); - } - - return $response; - } - catch(OAuth2BaseException $ex1) - { - return Response::view - ( - 'errors.400', - array - ( - 'error' => $ex1->getError(), - 'error_description' => $ex1->getMessage() - ), - 400 - ); - } - catch(Exception $ex) - { - Log::error($ex); - return Response::view - ( - 'errors.400', - array - ( - 'error' => "Bad Request", - 'error_description' => "Generic Error" - ), - 400 - ); - } - } - - /** - * Token HTTP Endpoint - * @return mixed - */ - public function token() - { - - $response = $this->oauth2_protocol->token - ( - new OAuth2TokenRequest - ( - new OAuth2Message - ( - Input::all() - ) - ) - ); - - if ($response instanceof OAuth2Response) - { - $strategy = OAuth2ResponseStrategyFactoryMethod::buildStrategy - ( - $this->oauth2_protocol->getLastRequest(), - $response - ); - return $strategy->handle($response); - } - - return $response; - } - - /** - * Revoke Token HTTP Endpoint - * @return mixed - */ - public function revoke() - { - $response = $this->oauth2_protocol->revoke - ( - new OAuth2TokenRevocationRequest - ( - new OAuth2Message - ( - Input::all() - ) - ) - ); - - if ($response instanceof OAuth2Response) - { - $strategy = OAuth2ResponseStrategyFactoryMethod::buildStrategy - ( - $this->oauth2_protocol->getLastRequest(), - $response - ); - return $strategy->handle($response); - } - - return $response; - } - - /** - * @see http://tools.ietf.org/html/draft-richer-oauth-introspection-04 - * Introspection Token HTTP Endpoint - * @return mixed - */ - public function introspection() - { - - $response = $this->oauth2_protocol->introspection - ( - new OAuth2AccessTokenValidationRequest - ( - new OAuth2Message - ( - Input::all() - ) - ) - ); - - if ($response instanceof OAuth2Response) - { - $strategy = OAuth2ResponseStrategyFactoryMethod::buildStrategy - ( - $this->oauth2_protocol->getLastRequest(), - $response - ); - return $strategy->handle($response); - } - - return $response; - } - - /** - * OP's JSON Web Key Set [JWK] document. - * @return string - */ - public function certs() - { - - $doc = $this->oauth2_protocol->getJWKSDocument(); - $response = Response::make($doc, 200); - $response->header('Content-Type', HttpContentType::Json); - - return $response; - } - - public function discovery() - { - - $doc = $this->oauth2_protocol->getDiscoveryDocument(); - $response = Response::make($doc, 200); - $response->header('Content-Type', HttpContentType::Json); - - return $response; - } - - /** - * @see http://openid.net/specs/openid-connect-session-1_0.html#OPiframe - */ - public function checkSessionIFrame() - { - $data = []; - return View::make("oauth2.session.check-session", $data); - } - - /** - * @see http://openid.net/specs/openid-connect-session-1_0.html#RPLogout - */ - public function endSession() - { - $request = new OAuth2LogoutRequest - ( - new OAuth2Message - ( - Input::all() - ) - ); - - if(!$request->isValid()) - { - Log::error('invalid OAuth2LogoutRequest!'); - return Response::view('errors.400', [ - 'error' => 'Invalid logout request.', - 'error_description' => $request->getLastValidationError() - ], 400); - } - - $response = $this->oauth2_protocol->endSession($request); - - if (!is_null($response) && $response instanceof OAuth2Response) { - $strategy = OAuth2ResponseStrategyFactoryMethod::buildStrategy($request, $response); - return $strategy->handle($response); - } - - return View::make('oauth2.session.session-ended'); - } -} \ No newline at end of file diff --git a/app/Http/Controllers/OpenId/DiscoveryController.php b/app/Http/Controllers/OpenId/DiscoveryController.php deleted file mode 100644 index 5d9d9f9c..00000000 --- a/app/Http/Controllers/OpenId/DiscoveryController.php +++ /dev/null @@ -1,88 +0,0 @@ -openid_protocol = $openid_protocol; - $this->auth_service = $auth_service; - $this->server_config_service = $server_config_service; - } - - /** - * XRDS discovery(eXtensible Resource Descriptor Sequence) - * @return xrds document on response - */ - public function idp() - { - $response = Response::make($this->openid_protocol->getXRDSDiscovery(IOpenIdProtocol::OpenIdXRDSModeIdp), 200); - $this->setDiscoveryResponseType($response); - return $response; - } - - /** - * If the Claimed Identifier was not previously discovered by the Relying Party - * (the "openid.identity" in the request was "http://specs.openid.net/auth/2.0/identifier_select" - * or a different Identifier, or if the OP is sending an unsolicited positive assertion), - * the Relying Party MUST perform discovery on the Claimed Identifier in - * the response to make sure that the OP is authorized to make assertions about the Claimed Identifier. - * @param $identifier - * @return mixed - */ - public function user($identifier) - { - $user = $this->auth_service->getUserByOpenId($identifier); - if (is_null($user)) - return View::make("errors.404"); - - $local_identifier = $this->server_config_service->getUserIdentityEndpointURL($identifier); - $response = Response::make($this->openid_protocol->getXRDSDiscovery(IOpenIdProtocol::OpenIdXRDSModeUser, $local_identifier), 200); - $this->setDiscoveryResponseType($response); - return $response; - } - -} \ No newline at end of file diff --git a/app/Http/Controllers/OpenId/OpenIdController.php b/app/Http/Controllers/OpenId/OpenIdController.php deleted file mode 100644 index 1c665aa4..00000000 --- a/app/Http/Controllers/OpenId/OpenIdController.php +++ /dev/null @@ -1,39 +0,0 @@ -header('Content-Type', implode('; ', array(XRDSDocumentBuilder::ContentType, XRDSDocumentBuilder::Charset))); - } -} \ No newline at end of file diff --git a/app/Http/Controllers/OpenId/OpenIdProviderController.php b/app/Http/Controllers/OpenId/OpenIdProviderController.php deleted file mode 100644 index 88698c60..00000000 --- a/app/Http/Controllers/OpenId/OpenIdProviderController.php +++ /dev/null @@ -1,105 +0,0 @@ -openid_protocol = $openid_protocol; - $this->memento_service = $memento_service; - } - - /** - * @return OpenIdResponse - * @throws Exception - * @throws InvalidOpenIdMessageException - */ - public function endpoint() - { - try { - $msg = new OpenIdMessage(Input::all()); - - if (!$msg->isValid() && $this->memento_service->exists()) { - $msg = OpenIdMessage::buildFromMemento($this->memento_service->load()); - } - - if (!$msg->isValid()) - throw new InvalidOpenIdMessageException(OpenIdErrorMessages::InvalidOpenIdMessage); - - //get response and manage it taking in consideration its type (direct or indirect) - $response = $this->openid_protocol->handleOpenIdMessage($msg); - - if ($response instanceof OpenIdResponse) { - $strategy = OpenIdResponseStrategyFactoryMethod::buildStrategy($response); - return $strategy->handle($response); - } - return $response; - } - catch(OpenIdBaseException $ex1){ - Log::warning($ex1); - return Response::view - ( - 'errors.400', - array - ( - 'error' => "Bad Request", - 'error_description' => $ex1->getMessage() - ), - 400 - ); - } - catch(Exception $ex){ - Log::error($ex); - return Response::view - ( - 'errors.400', - array - ( - 'error' => "Bad Request", - 'error_description' => "Generic Error" - ), - 400 - ); - } - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Traits/GetAllTrait.php b/app/Http/Controllers/Traits/GetAllTrait.php deleted file mode 100644 index c4537345..00000000 --- a/app/Http/Controllers/Traits/GetAllTrait.php +++ /dev/null @@ -1,140 +0,0 @@ - 'integer|min:1', - 'per_page' => sprintf('required_with:page|integer|min:%s|max:%s', PagingConstants::MinPageSize, PagingConstants::MaxPageSize), - ]; - - try { - - $validation = Validator::make($values, $rules); - - if ($validation->fails()) { - $ex = new ValidationException(); - throw $ex->setMessages($validation->messages()->toArray()); - } - - // default values - $page = 1; - $per_page = PagingConstants::DefaultPageSize;; - - if (Input::has('page')) { - $page = intval(Input::get('page')); - $per_page = intval(Input::get('per_page')); - } - - $filter = null; - - if (Input::has('filter')) { - $filter = FilterParser::parse(Input::get('filter'), $this->getFilterRules()); - } - - if(is_null($filter)) $filter = new Filter(); - - $filter_validator_rules = $this->getFilterValidatorRules(); - if(count($filter_validator_rules)) { - $filter->validate($filter_validator_rules); - } - - $order = null; - - if (Input::has('order')) - { - $order = OrderParser::parse(Input::get('order'), $this->getOrderRules()); - } - - $data = $this->repository->getAllByPage(new PagingInfo($page, $per_page), $this->applyExtraFilters($filter), $order); - - return $this->ok - ( - $data->toArray - ( - Input::get('expand', ''), - [], - [], - [], - $this->getAllSerializerType() - ) - ); - } - catch (ValidationException $ex1) - { - Log::warning($ex1); - return $this->error412($ex1->getMessages()); - } - catch (EntityNotFoundException $ex2) - { - Log::warning($ex2); - return $this->error404(['message' => $ex2->getMessage()]); - } - catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } -} \ No newline at end of file diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php deleted file mode 100644 index c7df2091..00000000 --- a/app/Http/Controllers/UserController.php +++ /dev/null @@ -1,472 +0,0 @@ -openid_memento_service = $openid_memento_service; - $this->oauth2_memento_service = $oauth2_memento_service; - $this->auth_service = $auth_service; - $this->server_configuration_service = $server_configuration_service; - $this->trusted_sites_service = $trusted_sites_service; - $this->discovery = $discovery; - $this->user_service = $user_service; - $this->user_action_service = $user_action_service; - $this->client_repository = $client_repository; - $this->scope_repository = $scope_repository; - $this->token_service = $token_service; - $this->resource_server_service = $resource_server_service; - $this->utils_configuration_service = $utils_configuration_service; - $this->security_context_service = $security_context_service; - - $this->middleware(function ($request, $next) { - if ($this->openid_memento_service->exists()) - { - //openid stuff - $this->login_strategy = new OpenIdLoginStrategy - ( - $this->openid_memento_service, - $this->user_action_service, - $this->auth_service - ); - - $this->consent_strategy = new OpenIdConsentStrategy - ( - $this->openid_memento_service, - $this->auth_service, - $this->server_configuration_service, - $this->user_action_service - ); - - } - else if ($this->oauth2_memento_service->exists()) - { - - $this->login_strategy = new OAuth2LoginStrategy - ( - $this->auth_service, - $this->oauth2_memento_service, - $this->user_action_service, - $this->security_context_service - ); - - $this->consent_strategy = new OAuth2ConsentStrategy - ( - $this->auth_service, - $this->oauth2_memento_service, - $this->scope_repository, - $this->client_repository - ); - } - else - { - //default stuff - $this->login_strategy = new DefaultLoginStrategy($this->user_action_service, $this->auth_service); - $this->consent_strategy = null; - } - - return $next($request); - }); - } - - public function getLogin() - { - return $this->login_strategy->getLogin(); - } - - public function cancelLogin() - { - return $this->login_strategy->cancelLogin(); - } - - public function postLogin() - { - $max_login_attempts_2_show_captcha = $this->server_configuration_service->getConfigValue("MaxFailed.LoginAttempts.2ShowCaptcha"); - $login_attempts = 0; - $username = ''; - try - { - - $data = Input::all(); - - if(isset($data['username'])) - $data['username'] = trim($data['username']); - if(isset($data['password'])) - $data['password'] = trim($data['password']); - - $login_attempts = intval(Input::get('login_attempts')); - // Build the validation constraint set. - $rules = array - ( - 'username' => 'required|email', - 'password' => 'required', - ); - if ($login_attempts >= $max_login_attempts_2_show_captcha) - { - $rules['g-recaptcha-response'] = 'required|recaptcha'; - } - // Create a new validator instance. - $validator = Validator::make($data, $rules); - - if ($validator->passes()) - { - $username = $data['username']; - $password = $data['password']; - $remember = Input::get("remember"); - - $remember = !is_null($remember); - if ($this->auth_service->login($username, $password, $remember)) - { - return $this->login_strategy->postLogin(); - } - - //failed login attempt... - $user = $this->auth_service->getUserByUsername($username); - - if (!is_null($user)) - { - $login_attempts = $user->getLoginFailedAttempt(); - } - - return $this->login_strategy->errorLogin - ( - array - ( - 'max_login_attempts_2_show_captcha' => $max_login_attempts_2_show_captcha, - 'login_attempts' => $login_attempts, - 'username' => $username, - 'error_message' => "We are sorry, your username or password does not match an existing record." - ) - ); - } - // validator errors - return $this->login_strategy->errorLogin - ( - array - ( - 'max_login_attempts_2_show_captcha' => $max_login_attempts_2_show_captcha, - 'login_attempts' => $login_attempts, - 'validator' => $validator - ) - ); - } - catch(UnverifiedEmailMemberException $ex1) - { - Log::warning($ex1); - return $this->login_strategy->errorLogin - ( - array - ( - 'max_login_attempts_2_show_captcha' => $max_login_attempts_2_show_captcha, - 'login_attempts' => $login_attempts, - 'username' => $username, - 'error_message' => $ex1->getMessage() - ) - ); - } - catch(AuthenticationException $ex2){ - Log::warning($ex2); - return Redirect::action('UserController@getLogin'); - } - catch (Exception $ex) - { - Log::error($ex); - return Redirect::action('UserController@getLogin'); - } - } - - public function getConsent() - { - if (is_null($this->consent_strategy)) - { - return View::make("errors.400"); - } - - return $this->consent_strategy->getConsent(); - } - - public function postConsent() - { - try - { - $data = Input::all(); - $rules = array - ( - 'trust' => 'required|oauth2_trust_response', - ); - // Create a new validator instance. - $validator = Validator::make($data, $rules); - if ($validator->passes()) - { - if (is_null($this->consent_strategy)) - { - return View::make("errors.404"); - } - - return $this->consent_strategy->postConsent(Input::get("trust")); - } - return Redirect::action('UserController@getConsent')->withErrors($validator); - } - catch (Exception $ex) - { - Log::error($ex); - return Redirect::action('UserController@getConsent'); - } - } - - public function getIdentity($identifier) - { - try - { - $user = $this->auth_service->getUserByOpenId($identifier); - if (is_null($user)) - { - return View::make("errors.404"); - } - - if ($this->isDiscoveryRequest()) - { - /* - * If the Claimed Identifier was not previously discovered by the Relying Party - * (the "openid.identity" in the request was "http://specs.openid.net/auth/2.0/identifier_select" - * or a different Identifier, or if the OP is sending an unsolicited positive assertion), - * the Relying Party MUST perform discovery on the Claimed Identifier in - * the response to make sure that the OP is authorized to make assertions about the Claimed Identifier. - */ - return $this->discovery->user($identifier); - } - - $redirect = Session::get('backurl'); - if (!empty($redirect)) { - Session::forget('backurl'); - Session::save(); - return Redirect::to($redirect); - } - - $current_user = $this->auth_service->getCurrentUser(); - $another_user = false; - if ($current_user && $current_user->getIdentifier() != $user->getIdentifier()) - { - $another_user = true; - } - - $assets_url = $this->utils_configuration_service->getConfigValue("Assets.Url"); - $pic_url = $user->getPic(); - $pic_url = str_contains($pic_url, 'http') ? $pic_url : $assets_url . $pic_url; - - $params = [ - - 'show_fullname' => $user->getShowProfileFullName(), - 'username' => $user->getFullName(), - 'show_email' => $user->getShowProfileEmail(), - 'email' => $user->getEmail(), - 'identifier' => $user->getIdentifier(), - 'show_pic' => $user->getShowProfilePic(), - 'pic' => $pic_url, - 'another_user' => $another_user, - ]; - - return View::make("identity", $params); - } - catch (Exception $ex) - { - Log::error($ex); - return View::make("errors.404"); - } - } - - public function logout() - { - $this->user_action_service->addUserAction - ( - $this->auth_service->getCurrentUser()->getId(), - IPHelper::getUserIp(), - IUserActionService::LogoutAction - ); - $this->auth_service->logout(); - Session::flush(); - Session::regenerate(); - return Redirect::action("UserController@getLogin"); - } - - public function getProfile() - { - $user = $this->auth_service->getCurrentUser(); - $sites = $user->getTrustedSites(); - $actions = $user->getLatestNActions(10); - - // init database - $isoCodes = new IsoCodesFactory(); - - // get languages database - $languages = $isoCodes->getLanguages()->toArray(); - $lang2Code = []; - foreach ($languages as $lang){ - if(!empty($lang->getAlpha2())) - $lang2Code[] = $lang; - } - - return View::make("profile", [ - 'user' => $user, - "openid_url" => $this->server_configuration_service->getUserIdentityEndpointURL($user->getIdentifier()), - "sites" => $sites, - 'actions' => $actions, - 'countries' => CountryList::getCountries(), - 'languages' => $lang2Code, - ]); - } - - public function deleteTrustedSite($id) - { - $this->trusted_sites_service->delete($id); - return Redirect::action("UserController@getProfile"); - } - -} \ No newline at end of file diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php deleted file mode 100644 index 0146ebfd..00000000 --- a/app/Http/Kernel.php +++ /dev/null @@ -1,80 +0,0 @@ - [ - \App\Http\Middleware\EncryptCookies::class, - CookiesSameSiteNoneKnownIncompatibleClients::class, - \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, - \Illuminate\Session\Middleware\StartSession::class, - \Illuminate\View\Middleware\ShareErrorsFromSession::class, - SecurityHTTPHeadersWriterMiddleware::class, - ], - - 'api' => [ - 'ssl', - 'oauth2.endpoint', - ], - ]; - - /** - * The application's route middleware. - * - * These middleware may be assigned to groups or used individually. - * - * @var array - */ - protected $routeMiddleware = [ - 'auth' => \App\Http\Middleware\Authenticate::class, - 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, - 'ssl' => \App\Http\Middleware\SSLMiddleware::class, - 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, - 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, - 'csrf' => \App\Http\Middleware\VerifyCsrfToken::class, - 'oauth2.endpoint' => \App\Http\Middleware\OAuth2BearerAccessTokenRequestValidator::class, - 'oauth2.currentuser.serveradmin' => \App\Http\Middleware\CurrentUserIsOAuth2ServerAdmin::class, - 'oauth2.currentuser.serveradmin.json' => \App\Http\Middleware\CurrentUserIsOAuth2ServerAdminJson::class, - 'openstackid.currentuser.serveradmin' => \App\Http\Middleware\CurrentUserIsOpenIdServerAdmin::class, - 'openstackid.currentuser.serveradmin.json' => \App\Http\Middleware\CurrentUserIsOpenIdServerAdminJson::class, - 'oauth2.currentuser.allow.client.edition' => \App\Http\Middleware\CurrentUserCanEditOAuth2Client::class, - 'oauth2.currentuser.owns.client' => \App\Http\Middleware\CurrentUserOwnsOAuth2Client::class, - ]; -} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php deleted file mode 100644 index 38d77ba0..00000000 --- a/app/Http/Middleware/Authenticate.php +++ /dev/null @@ -1,49 +0,0 @@ -guest()) { - Session::put('backurl', URL::full()); - Session::save(); - return Redirect::action('UserController@getLogin'); - } - $redirect = Session::get('backurl'); - if (!empty($redirect)) { - Session::forget('backurl'); - Session::save(); - return Redirect::to($redirect); - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/CORSMiddleware.php b/app/Http/Middleware/CORSMiddleware.php deleted file mode 100644 index f8034a4e..00000000 --- a/app/Http/Middleware/CORSMiddleware.php +++ /dev/null @@ -1,381 +0,0 @@ -endpoint_repository = $endpoint_repository; - $this->cache_service = $cache_service; - $this->allowed_headers = Config::get('cors.allowed_headers', self::DefaultAllowedHeaders); - $this->allowed_methods = Config::get('cors.allowed_methods', self::DefaultAllowedMethods); - } - - /** - * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed - */ - public function handle($request, Closure $next) - { - if ($response = $this->preProcess($request)) { - return $response; - } - //normal processing - $response = $next($request); - $this->postProcess($request, $response); - return $response; - } - - private function generatePreflightCacheKey($request) - { - $cache_id = 'pre-flight-' . $request->getClientIp() . '-' . $request->getRequestUri() . '-' . $request->getMethod(); - return $cache_id; - } - - /** - * @param Request $request - * @return Response - */ - public function preProcess(Request $request) - { - $actual_request = false; - if ($this->isValidCORSRequest($request)) { - /* Step 01 : Determine the type of the incoming request */ - $type = $this->getRequestType($request); - /* Step 02 : Process request according to is type */ - switch ($type) { - case CORSRequestPreflightType::REQUEST_FOR_PREFLIGHT: { - // HTTP request send by client to preflight a further 'Complex' request - // sets the original method on request in order to be able to find the - // correct route - $real_method = $request->headers->get('Access-Control-Request-Method'); - - $route_path = RequestUtils::getCurrentRoutePath($request); - if (strpos($route_path, '/') != 0) - $route_path = '/' . $route_path; - - $request->setMethod($real_method); - - if (!$route_path || !$this->checkEndPoint($route_path, $real_method)) { - $response = new Response(); - $response->setStatusCode(403); - return $response; - } - // ----Step 2b: Store pre-flight request data in the Cache to keep (mark) the request as correctly followed the request pre-flight process - $data = new CORSRequestPreflightData($request, $this->current_endpoint->supportCredentials()); - $cache_id = $this->generatePreflightCacheKey($request); - $this->cache_service->storeHash($cache_id, $data->toArray(), CORSRequestPreflightData::$cache_lifetime); - // ----Step 2c: Return corresponding response - This part should be customized with application specific constraints..... - return $this->makePreflightResponse($request); - } - break; - case CORSRequestPreflightType::COMPLEX_REQUEST: { - $cache_id = $this->generatePreflightCacheKey($request);; // ----Step 2a: Check if the current request has an entry into the preflighted requests Cache - $data = $this->cache_service->getHash($cache_id, CORSRequestPreflightData::$cache_attributes); - if (!count($data)) { - $response = new Response(); - $response->setStatusCode(403); - return $response; - } - // ----Step 2b: Check that pre-flight information declared during the pre-flight request match the current request on key information - $match = false; - // ------Start with comparison of "Origin" HTTP header (according to utility method impl. used to retrieve header reference cannot be null)... - if ($request->headers->get('Origin') === $data['origin']) { - // ------Continue with HTTP method... - if ($request->getMethod() === $data['expected_method']) { - // ------Finish with custom HTTP headers (use an method to avoid manual iteration on collection to increase the speed)... - $x_headers = self::getCustomHeaders($request); - $x_headers_pre = explode(',', $data['expected_custom_headers']); - sort($x_headers); - sort($x_headers_pre); - if (count(array_diff($x_headers, $x_headers_pre)) === 0) { - $match = true; - } - } - } - if (!$match) { - $response = new Response(); - $response->setStatusCode(403); - return $response; - } - $actual_request = true; - } - break; - case CORSRequestPreflightType::SIMPLE_REQUEST: { - // origins, do not set any additional headers and terminate this set of steps. - if (!$this->isAllowedOrigin($request)) { - $response = new Response(); - $response->setStatusCode(403); - - return $response; - } - $actual_request = true; - // If the resource supports credentials add a single Access-Control-Allow-Origin header, with the value - // of the Origin header as value, and add a single Access-Control-Allow-Credentials header with the - // case-sensitive string "true" as value. - // Otherwise, add a single Access-Control-Allow-Origin header, with either the value of the Origin header - // or the string "*" as value. - } - break; - } - } - if ($actual_request) { - // Save response headers - $cache_id = $this->generatePreflightCacheKey($request); - // ----Step 2a: Check if the current request has an entry into the preflighted requests Cache - $data = $this->cache_service->getHash($cache_id, CORSRequestPreflightData::$cache_attributes); - $this->headers['Access-Control-Allow-Origin'] = $request->headers->get('Origin'); - if ((isset($data['allows_credentials']) && (bool)$data['allows_credentials'])) { - $this->headers['Access-Control-Allow-Credentials'] = 'true'; - } - /** - * During a CORS request, the getResponseHeader() method can only access simple response headers. - * Simple response headers are defined as follows: - ** Cache-Control - ** Content-Language - ** Content-Type - ** Expires - ** Last-Modified - ** Pragma - * If you want clients to be able to access other headers, - * you have to use the Access-Control-Expose-Headers header. - * The value of this header is a comma-delimited list of response headers you want to expose - * to the client. - */ - $exposed_headers = Config::get('cors.exposed_headers', 'Content-Type, Expires'); - if (!empty($exposed_headers)) { - $this->headers['Access-Control-Expose-Headers'] = $exposed_headers; - } - } - } - - public function postProcess(Request $request, Response $response) - { - // add CORS response headers - if (count($this->headers) > 0) { - $response->headers->add($this->headers); - } - return $response; - } - - /** - * @param Request $request - * @return Response - */ - private function makePreflightResponse(Request $request) - { - $response = new Response(); - if (!$this->isAllowedOrigin($request)) { - $response->headers->set('Access-Control-Allow-Origin', 'null'); - $response->setStatusCode(403); - return $response; - } - $response->headers->set('Access-Control-Allow-Origin', $request->headers->get('Origin')); - // The Access-Control-Request-Method header indicates which method will be used in the actual - // request as part of the preflight request - // check request method - if ($request->headers->get('Access-Control-Request-Method') != $this->current_endpoint->getHttpMethod()) { - $response->setStatusCode(405); - return $response; - } - // The Access-Control-Allow-Credentials header indicates whether the response to request - // can be exposed when the omit credentials flag is unset. When part of the response to a preflight request - // it indicates that the actual request can include user credentials. - if ($this->current_endpoint->supportCredentials()) { - $response->headers->set('Access-Control-Allow-Credentials', 'true'); - } - if (Config::get('cors.use_pre_flight_caching', false)) { - // The Access-Control-Max-Age header indicates how long the response can be cached, so that for - // subsequent requests, within the specified time, no preflight request has to be made. - $response->headers->set('Access-Control-Max-Age', Config::get('cors.max_age', 32000)); - } - // The Access-Control-Allow-Headers header indicates, as part of the response to a preflight request, - // which header field names can be used during the actual request - $response->headers->set('Access-Control-Allow-Headers', $this->allowed_headers); - - //The Access-Control-Allow-Methods header indicates, as part of the response to a preflight request, - // which methods can be used during the actual request. - $response->headers->set('Access-Control-Allow-Methods', $this->allowed_methods); - // The Access-Control-Request-Headers header indicates which headers will be used in the actual request - // as part of the preflight request. - $headers = $request->headers->get('Access-Control-Request-Headers'); - if ($headers) { - $headers = trim(strtolower($headers)); - $allow_headers = explode(', ', $this->allowed_headers); - foreach (preg_split('{, *}', $headers) as $header) { - //if they are simple headers then skip them - if (in_array($header, self::$simple_headers, true)) { - continue; - } - //check is the requested header is on the list of allowed headers - if (!in_array($header, $allow_headers, true)) { - $response->setStatusCode(400); - $response->setContent('Unauthorized header ' . $header); - break; - } - } - } - //OK - No Content - $response->setStatusCode(204); - return $response; - } - - /** - * @param Request $request - * @returns bool - */ - private function isValidCORSRequest(Request $request) - { - /** - * The presence of the Origin header does not necessarily mean that the request is a cross-origin request. - * While all cross-origin requests will contain an Origin header, - * Origin header on same-origin requests. But Chrome and Safari include an Origin header on - * same-origin POST/PUT/DELETE requests (same-origin GET requests will not have an Origin header). - */ - return $request->headers->has('Origin'); - } - - private function checkEndPoint($endpoint_path, $http_method) - { - $this->current_endpoint = $this->endpoint_repository->getApiEndpointByUrlAndMethod($endpoint_path, $http_method); - if (is_null($this->current_endpoint)) { - return false; - } - if (!$this->current_endpoint->supportCORS() || !$this->current_endpoint->isActive()) { - return false; - } - return true; - } - - /** - * @param string $origin - * @return bool - */ - private function isAllowedOrigin($origin) - { - return true; - } - - private static function getRequestType(Request $request) - { - - $type = CORSRequestPreflightType::UNKNOWN; - $http_method = $request->getMethod(); - $content_type = strtolower($request->getContentType()); - $http_method = strtoupper($http_method); - - if ($http_method === 'OPTIONS' && $request->headers->has('Access-Control-Request-Method')) { - $type = CORSRequestPreflightType::REQUEST_FOR_PREFLIGHT; - } else { - if (self::hasCustomHeaders($request)) { - $type = CORSRequestPreflightType::COMPLEX_REQUEST; - } elseif ($http_method === 'POST' && !in_array($content_type, self::$simple_content_header_values, true)) { - $type = CORSRequestPreflightType::COMPLEX_REQUEST; - } elseif (!in_array($http_method, self::$simple_http_methods, true)) { - $type = CORSRequestPreflightType::COMPLEX_REQUEST; - } else { - $type = CORSRequestPreflightType::SIMPLE_REQUEST; - } - } - return $type; - } - - - private static function getCustomHeaders(Request $request) - { - $custom_headers = []; - foreach ($request->headers->all() as $k => $h) { - if (starts_with('X-', strtoupper(trim($k)))) { - array_push($custom_headers, strtoupper(trim($k))); - } - } - return $custom_headers; - } - - private static function hasCustomHeaders(Request $request) - { - return count(self::getCustomHeaders($request)) > 0; - } -} \ No newline at end of file diff --git a/app/Http/Middleware/CORSRequestPreflightData.php b/app/Http/Middleware/CORSRequestPreflightData.php deleted file mode 100644 index 7c2a0aa6..00000000 --- a/app/Http/Middleware/CORSRequestPreflightData.php +++ /dev/null @@ -1,82 +0,0 @@ -sender = $request->getClientIp(); - $this->uri = $request->getRequestUri(); - $this->origin = $request->headers->get('Origin'); - $this->expected_method = $request->headers->get('Access-Control-Request-Method'); - $this->allows_credentials = $allows_credentials; - - $tmp = $request->headers->get("Access-Control-Request-Headers"); - if (!empty($tmp)) - { - $hs = explode(',', $tmp); - foreach ($hs as $h) - { - array_push($this->expected_custom_headers, strtoupper(trim($h))); - } - } - } - - /** - * @return array - */ - public function toArray() - { - $res = []; - $res['sender'] = $this->sender; - $res['uri'] = $this->uri; - $res['origin'] = $this->origin; - $res['allows_credentials'] = $this->allows_credentials; - $res['expected_method'] = $this->expected_method; - $res['expected_custom_headers'] = implode(',', $this->expected_custom_headers); - return $res; - } - -} \ No newline at end of file diff --git a/app/Http/Middleware/CORSRequestPreflightType.php b/app/Http/Middleware/CORSRequestPreflightType.php deleted file mode 100644 index 4dcf2a82..00000000 --- a/app/Http/Middleware/CORSRequestPreflightType.php +++ /dev/null @@ -1,36 +0,0 @@ -headers->getCookies() as $cookie) { - $sameSite = $cookie->getSameSite(); - if($sameSite == Cookie::SAMESITE_NONE){ - // check if we could use it or not - if(CookieSameSitePolicy::isSameSiteNoneIncompatible()){ - // replace the cookie with a compatible version ( unset sameSite value) - - // make a clone - $compatibleCookie = Cookie::create - ( - $cookie->getName(), - $cookie->getValue(), - $cookie->getExpiresTime(), - $cookie->getPath(), - $cookie->getDomain(), - $cookie->isSecure(), - $cookie->isHttpOnly(), - $cookie->isRaw(), - null - ); - // and overwrite it - $response->headers->setCookie($compatibleCookie); - } - } - } - return $response; - } -} \ No newline at end of file diff --git a/app/Http/Middleware/CurrentUserCanEditOAuth2Client.php b/app/Http/Middleware/CurrentUserCanEditOAuth2Client.php deleted file mode 100644 index bff893c1..00000000 --- a/app/Http/Middleware/CurrentUserCanEditOAuth2Client.php +++ /dev/null @@ -1,81 +0,0 @@ -client_repository = $client_repository; - $this->auth_service = $auth_service; - } - - /** - * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @param string|null $guard - * @return mixed - */ - public function handle($request, Closure $next, $guard = null) - { - try{ - $route = Route::getCurrentRoute(); - $client_id = $route->parameter('id'); - - if(is_null($client_id)) - $client_id = $route->parameter('client_id'); - - if(is_null($client_id)) - $client_id = Input::get('client_id',null);; - - $client = $this->client_repository->getClientByIdentifier($client_id); - $user = $this->auth_service->getCurrentUser(); - - if (is_null($client) || !$client->canEdit($user)) - throw new Exception('invalid client id for current user'); - - } catch (Exception $ex) { - Log::error($ex); - return Response::json(array('error' => 'operation not allowed.'), 400); - } - return $next($request); - } -} \ No newline at end of file diff --git a/app/Http/Middleware/CurrentUserIsOAuth2ServerAdmin.php b/app/Http/Middleware/CurrentUserIsOAuth2ServerAdmin.php deleted file mode 100644 index 2d3c3a07..00000000 --- a/app/Http/Middleware/CurrentUserIsOAuth2ServerAdmin.php +++ /dev/null @@ -1,44 +0,0 @@ -guest()) - { - return Response::view('errors.404', [], 404); - } - if(!Auth::user()->isOAuth2ServerAdmin()) - { - return Response::view('errors.404', [], 404); - } - return $next($request); - } -} \ No newline at end of file diff --git a/app/Http/Middleware/CurrentUserIsOAuth2ServerAdminJson.php b/app/Http/Middleware/CurrentUserIsOAuth2ServerAdminJson.php deleted file mode 100644 index 10faf622..00000000 --- a/app/Http/Middleware/CurrentUserIsOAuth2ServerAdminJson.php +++ /dev/null @@ -1,45 +0,0 @@ -guest()) - { - return Response::json(array('error' => 'you are not allowed to perform this operation'), 403); - } - if(!Auth::user()->isOAuth2ServerAdmin()) - { - return Response::json(array('error' => 'you are not allowed to perform this operation'), 403); - } - - return $next($request); - } -} \ No newline at end of file diff --git a/app/Http/Middleware/CurrentUserIsOpenIdServerAdmin.php b/app/Http/Middleware/CurrentUserIsOpenIdServerAdmin.php deleted file mode 100644 index d862b780..00000000 --- a/app/Http/Middleware/CurrentUserIsOpenIdServerAdmin.php +++ /dev/null @@ -1,44 +0,0 @@ -guest()) - { - return Response::view('errors.404', [], 404); - } - if(!Auth::user()->isOpenIdServerAdmin()) - { - return Response::view('errors.404', [], 404); - } - return $next($request); - } -} \ No newline at end of file diff --git a/app/Http/Middleware/CurrentUserIsOpenIdServerAdminJson.php b/app/Http/Middleware/CurrentUserIsOpenIdServerAdminJson.php deleted file mode 100644 index f51d81f1..00000000 --- a/app/Http/Middleware/CurrentUserIsOpenIdServerAdminJson.php +++ /dev/null @@ -1,44 +0,0 @@ -guest()) - { - return Response::json(['error' => 'you are not allowed to perform this operation']); - } - if(!Auth::user()->isOpenIdServerAdmin()) - { - return Response::json(['error' => 'you are not allowed to perform this operation']); - } - return $next($request); - } -} \ No newline at end of file diff --git a/app/Http/Middleware/CurrentUserOwnsOAuth2Client.php b/app/Http/Middleware/CurrentUserOwnsOAuth2Client.php deleted file mode 100644 index 83583235..00000000 --- a/app/Http/Middleware/CurrentUserOwnsOAuth2Client.php +++ /dev/null @@ -1,80 +0,0 @@ -client_repository = $client_repository; - $this->auth_service = $auth_service; - } - - /** - * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @param string|null $guard - * @return mixed - */ - public function handle($request, Closure $next, $guard = null) - { - try{ - $route = Route::getCurrentRoute(); - $client_id = $route->parameter('id'); - - if(is_null($client_id)) - $client_id = $route->parameter('client_id'); - - if(is_null($client_id)) - $client_id = Input::get('client_id',null);; - - $client = $this->client_repository->getClientByIdentifier($client_id); - $user = $this->auth_service->getCurrentUser(); - if (is_null($client) || !$client->isOwner($user)) - throw new Exception('invalid client id for current user'); - - } catch (Exception $ex) { - Log::error($ex); - return Response::json(array('error' => 'operation not allowed.'), 400); - } - return $next($request); - } -} \ No newline at end of file diff --git a/app/Http/Middleware/ETagsMiddleware.php b/app/Http/Middleware/ETagsMiddleware.php deleted file mode 100644 index f7c4abf1..00000000 --- a/app/Http/Middleware/ETagsMiddleware.php +++ /dev/null @@ -1,51 +0,0 @@ -getStatusCode() === 200 && $request->getMethod() === 'GET') - { - $etag = md5($response->getContent()); - $requestETag = str_replace('"', '', $request->getETags()); - $requestETag = str_replace('-gzip', '', $requestETag); - - if ($requestETag && $requestETag[0] == $etag) - { - Log::debug('ETAG 304'); - $response->setNotModified(); - } - $response->setEtag($etag); - } - - return $response; - } -} \ No newline at end of file diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php deleted file mode 100644 index 0493dbc7..00000000 --- a/app/Http/Middleware/EncryptCookies.php +++ /dev/null @@ -1,59 +0,0 @@ -cookies as $key => $cookie) { - if ($this->isDisabled($key)) { - continue; - } - - try { - $request->cookies->set($key, $this->decryptCookie($key, $cookie)); - } catch (DecryptException $e) { - $request->cookies->set($key, null); - } - catch(\ErrorException $e1){ - $request->cookies->set($key, null); - } - } - - return $request; - } - -} diff --git a/app/Http/Middleware/OAuth2BearerAccessTokenRequestValidator.php b/app/Http/Middleware/OAuth2BearerAccessTokenRequestValidator.php deleted file mode 100644 index 73415929..00000000 --- a/app/Http/Middleware/OAuth2BearerAccessTokenRequestValidator.php +++ /dev/null @@ -1,350 +0,0 @@ -context = $context; - $this->headers = $this->getHeaders(); - $this->endpoint_repository = $endpoint_repository; - $this->token_service = $token_service; - $this->client_repository = $client_repository; - $this->log_service = $log_service; - $this->checkpoint_service = $checkpoint_service; - } - - /** - * @param \Illuminate\Http\Request $request - * @param Closure $next - * @return OAuth2WWWAuthenticateErrorResponse - */ - public function handle($request, Closure $next) - { - Log::debug(sprintf("OAuth2BearerAccessTokenRequestValidator::handle %s %s", $request->getMethod(), $request->getRequestUri())); - - $url = $request->getRequestUri(); - $method = $request->getMethod(); - $realm = $request->getHost(); - - try { - $route_path = RequestUtils::getCurrentRoutePath($request); - if (strpos($route_path, '/') != 0) - $route_path = '/' . $route_path; - - if (!$route_path) { - throw new OAuth2ResourceServerException( - 400, - OAuth2Protocol::OAuth2Protocol_Error_InvalidRequest, - sprintf('API endpoint does not exits! (%s:%s)', $url, $method) - ); - } - - Log::debug($request->headers->__toString()); - // http://tools.ietf.org/id/draft-abarth-origin-03.html - $origin = $request->headers->has('Origin') ? $request->headers->get('Origin') : null; - if (!empty($origin)) { - $nm = new Normalizer($origin); - $origin = $nm->normalize(); - } - - //check first http basic auth header - $auth_header = isset($this->headers['authorization']) ? $this->headers['authorization'] : null; - if (!is_null($auth_header) && !empty($auth_header)) { - $access_token_value = BearerAccessTokenAuthorizationHeaderParser::getInstance()->parse($auth_header); - } else { - // http://tools.ietf.org/html/rfc6750#section-2- 2 - // if access token is not on authorization header check on POST/GET params - $access_token_value = Input::get(OAuth2Protocol::OAuth2Protocol_AccessToken, ''); - } - - if (is_null($access_token_value) || empty($access_token_value)) { - //if access token value is not set, then error - throw new OAuth2ResourceServerException( - 400, - OAuth2Protocol::OAuth2Protocol_Error_InvalidRequest, - 'missing access token' - ); - } - - $endpoint = $this->endpoint_repository->getApiEndpointByUrlAndMethod($route_path, $method); - - //api endpoint must be registered on db and active - if (is_null($endpoint) || !$endpoint->isActive()) { - throw new OAuth2ResourceServerException( - 400, - OAuth2Protocol::OAuth2Protocol_Error_InvalidRequest, - sprintf('API endpoint does not exits! (%s:%s)', $route_path, $method) - ); - } - - $access_token = $this->token_service->getAccessToken($access_token_value); - //check lifetime - if (is_null($access_token)) { - throw new InvalidGrantTypeException(OAuth2Protocol::OAuth2Protocol_Error_InvalidToken); - } - Log::debug(sprintf("token lifetime %s", $access_token->getRemainingLifetime())); - //check token audience - Log::debug('checking token audience ...'); - $audience = explode(' ', $access_token->getAudience()); - if ((!in_array($realm, $audience))) { - throw new InvalidGrantTypeException(OAuth2Protocol::OAuth2Protocol_Error_InvalidToken); - } - - //check client existence - $client_id = $access_token->getClientId(); - $client = $this->client_repository->getClientById($client_id); - - if(is_null($client)) - throw new OAuth2ResourceServerException - ( - 400, - OAuth2Protocol::OAuth2Protocol_Error_InvalidRequest, - 'invalid client' - ); - //if js client , then check if the origin is allowed .... - if($client->getApplicationType() == IClient::ApplicationType_JS_Client) - { - if(!empty($origin) && !$client->isOriginAllowed($origin)) - throw new OAuth2ResourceServerException - ( - 403, - OAuth2Protocol::OAuth2Protocol_Error_UnauthorizedClient, - 'invalid origin' - ); - } - //check scopes - Log::debug('checking token scopes ...'); - $endpoint_scopes = explode(' ', $endpoint->getScope()); - $token_scopes = explode(' ', $access_token->getScope()); - - //check token available scopes vs. endpoint scopes - if (count(array_intersect($endpoint_scopes, $token_scopes)) == 0) { - Log::warning( - sprintf( - 'access token scopes (%s) does not allow to access to api url %s , needed scopes %s', - $access_token->getScope(), - $url, - implode(' OR ', $endpoint_scopes) - ) - ); - - throw new OAuth2ResourceServerException( - 403, - OAuth2Protocol::OAuth2Protocol_Error_InsufficientScope, - 'the request requires higher privileges than provided by the access token', - implode(' ', $endpoint_scopes) - ); - } - Log::debug('setting resource server context ...'); - //set context for api and continue processing - $context = array - ( - 'access_token' => $access_token_value, - 'expires_in' => $access_token->getRemainingLifetime(), - 'client_id' => $client_id, - 'scope' => $access_token->getScope(), - 'application_type' => $client->getApplicationType() - ); - - if (!is_null($access_token->getUserId())) - { - $context['user_id'] = $access_token->getUserId(); - } - - $this->context->setAuthorizationContext($context); - - } - catch(OAuth2ResourceServerException $ex1) - { - $this->log_service->warning($ex1); - $this->checkpoint_service->trackException($ex1); - $response = new OAuth2WWWAuthenticateErrorResponse($realm, - $ex1->getError(), - $ex1->getErrorDescription(), - $ex1->getScope(), - $ex1->getHttpCode() - ); - $http_response = Response::json($response->getContent(), $response->getHttpCode()); - $http_response->header('WWW-Authenticate',$response->getWWWAuthenticateHeaderValue()); - return $http_response; - } - catch(InvalidGrantTypeException $ex2) - { - $this->log_service->warning($ex2); - $this->checkpoint_service->trackException($ex2); - $response = new OAuth2WWWAuthenticateErrorResponse($realm, - OAuth2Protocol::OAuth2Protocol_Error_InvalidToken, - 'the access token provided is expired, revoked, malformed, or invalid for other reasons.', - null, - 401 - ); - $http_response = Response::json($response->getContent(), $response->getHttpCode()); - $http_response->header('WWW-Authenticate',$response->getWWWAuthenticateHeaderValue()); - return $http_response; - } - catch(ExpiredAccessTokenException $ex3) - { - $this->log_service->warning($ex3); - $this->checkpoint_service->trackException($ex3); - $response = new OAuth2WWWAuthenticateErrorResponse($realm, - OAuth2Protocol::OAuth2Protocol_Error_InvalidToken, - 'the access token provided is expired, revoked, malformed, or invalid for other reasons.', - null, - 401 - ); - $http_response = Response::json($response->getContent(), $response->getHttpCode()); - $http_response->header('WWW-Authenticate',$response->getWWWAuthenticateHeaderValue()); - return $http_response; - } - catch(RevokedAccessTokenException $ex4) - { - $this->log_service->warning($ex4); - $this->checkpoint_service->trackException($ex4); - $response = new OAuth2WWWAuthenticateErrorResponse($realm, - OAuth2Protocol::OAuth2Protocol_Error_InvalidToken, - 'the access token provided is expired, revoked, malformed, or invalid for other reasons.', - null, - 401 - ); - $http_response = Response::json($response->getContent(), $response->getHttpCode()); - $http_response->header('WWW-Authenticate',$response->getWWWAuthenticateHeaderValue()); - return $http_response; - } - catch(Exception $ex) - { - $this->log_service->error($ex); - $this->checkpoint_service->trackException($ex); - $response = new OAuth2WWWAuthenticateErrorResponse($realm, - OAuth2Protocol::OAuth2Protocol_Error_InvalidRequest, - 'invalid request', - null, - 400 - ); - $http_response = Response::json($response->getContent(), $response->getHttpCode()); - $http_response->header('WWW-Authenticate',$response->getWWWAuthenticateHeaderValue()); - return $http_response; - } - $response = $next($request); - - return $response; - } - - /** - * @return array - */ - protected function getHeaders() - { - $headers = []; - if (function_exists('getallheaders')) { - foreach (getallheaders() as $name => $value) { - $headers[strtolower($name)] = $value; - } - } - if(empty($headers)){ - // @codeCoverageIgnoreEnd - foreach ($_SERVER as $name => $value) { - if (substr($name, 0, 5) == 'HTTP_') { - $name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))); - $headers[strtolower($name)] = $value; - } - } - foreach (Request::header() as $name => $value) { - if (!array_key_exists($name, $headers)) { - $headers[strtolower($name)] = $value[0]; - } - } - } - - return $headers; - } -} \ No newline at end of file diff --git a/app/Http/Middleware/ParseMultipartFormDataInputForNonPostRequests.php b/app/Http/Middleware/ParseMultipartFormDataInputForNonPostRequests.php deleted file mode 100644 index ac7b4399..00000000 --- a/app/Http/Middleware/ParseMultipartFormDataInputForNonPostRequests.php +++ /dev/null @@ -1,56 +0,0 @@ -method() == 'POST' OR $request->method() == 'GET') { - return $next($request); - } - - if (preg_match('/multipart\/form-data/', $request->headers->get('Content-Type')) or - preg_match('/multipart\/form-data/', $request->headers->get('content-type')) - ) { - $parser = new ParseMultiPartFormDataInputStream(file_get_contents('php://input')); - $params = $parser->getInput(); - $data = $params['parameters']; - $files = $params['files']; - if (count($files) > 0) { - Log::debug("ParseMultipartFormDataInputForNonPostRequests: files ".json_encode($files)); - $request->files->add($files); - } - - if (count($data) > 0) { - Log::debug("ParseMultipartFormDataInputForNonPostRequests: parameters ".json_encode($data)); - $request->request->add($data); - } - } - return $next($request); - } -} \ No newline at end of file diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php deleted file mode 100644 index ba568125..00000000 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ /dev/null @@ -1,38 +0,0 @@ -check()) { - return redirect('/'); - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/SSLMiddleware.php b/app/Http/Middleware/SSLMiddleware.php deleted file mode 100644 index d8513aa8..00000000 --- a/app/Http/Middleware/SSLMiddleware.php +++ /dev/null @@ -1,33 +0,0 @@ -headers->set('X-Content-Type-Options','nosniff'); - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection - $response->headers->set('X-XSS-Protection','1; mode=block'); - // cache - /** - * Whenever possible ensure the cache-control HTTP header is set with no-cache, no-store, must-revalidate; - * and that the pragma HTTP header is set with no-cache. - */ - $response->headers->set('Pragma','no-cache'); - $response->headers->set('Expires','0'); - $response->headers->set('Cache-Control','no-cache, no-store, must-revalidate, private'); - return $response; - } -} \ No newline at end of file diff --git a/app/Http/Middleware/SingleAccessPoint.php b/app/Http/Middleware/SingleAccessPoint.php deleted file mode 100644 index 5604d06c..00000000 --- a/app/Http/Middleware/SingleAccessPoint.php +++ /dev/null @@ -1,49 +0,0 @@ -getService(UtilsServiceCatalog::CheckPointService); - if ($checkpoint_service instanceof ICheckPointService && !$checkpoint_service->check()) { - return Response::view('errors.404', [], 404); - } - } catch (Exception $ex) { - Log::error($ex); - return Response::view('errors.404', [], 404); - } - } - return $next($request); - } -} \ No newline at end of file diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php deleted file mode 100644 index 5a50e7b5..00000000 --- a/app/Http/Middleware/TrimStrings.php +++ /dev/null @@ -1,18 +0,0 @@ -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

4$y&@xqh>-skAyeW`C3gCLhw`95cH}r5ZI*1N z6SQ9S{jU&k)mIpo`FmJ^N_VeQ{?(~d>0KY(qdWfXs=&RTg{~?T|8`#>_C8;Qz1Uxs zek;nOZsTZ!c6Kli=>N@W69Z@;+rW>g=4NsSXiaEK78w<7b2Jamn9|E@d}^4xl=pNM6%72{~Dmv%<&S) zW2GiNR9MZLgM$-PrhUMq;s)^|#VEIVnwQ|!tuS#i7Y}6E7Q_Qn!$aZkFfqr0uezWBRA~12=TUr87DUyA6fgX}rS@JHiKW~v&<3-RT7T1_ z@Y2ZnR9#J{_n7;Eizp_JD`0K6$dDdO`Pl*@7gZ3Ik=)$RjOWsc7nrG?twho#+Ax(FUPGcvmzK6{ zc@p!}Rn`Dx-A&X#P>BwkAk%68FU-muA7*s^|@>cbzp3kQYXc23irD%*OAV zEjcdNVelEl|GRMeM#}1E@A- z&F>EfmCyZN3Kz^QG9Z!TYnV57i75YYS1`CT9B^e6in6XKdF2Oieg@paF5crdUQwS) z?R5!Fjz#}6d=jCQd3kOOQ3cnb4Mx)Eh?XmOu_U^8-{^zqbI4-gm>}vqa>7AesI@b<$eQRIN z_6TGMTi=mD=2AN|hV$yzu75wBB!v9@Lb8{fM^{Y2K4Q-3Bl6iCf8(g;>}h!Gn0wv1 zhnnB=%vTsCyDzuGIFFb~EvO;NAXaQFUb39?1c;({RqnL5ww5DAJV7Krj3to_P2>X@ ztv3WQ-~Hf}%DhuLfaZDnbxmX++~g>x6EDqq`62@cG|9Mkbma#H8Fi&^XogYce@WUM zf&t@zVr_I{0b5PRWnzDpQ3&R@J!%-bNi^#HG`V`Db-6gS!PaT-&9O0}1+pfxFM{+< z`z4h?nwy)yyF^7rp$EX*xVQO{f%qq~G<)AHNFWxw6a`b24%w zP`-BIdek8K9sR_$px9V>Bs#q$MV7YU$Q7-!T#m4}CbIy1-1#Vb%A2vbadWKz_s0nf zH+Sxwyv`U=?jnZ5p#@swN|LM5*PI?-s|))PU70YV$4b|J3(d#xqh1kqG+A9_LZ3br z<7R?OM)7|%?p~J5rl?2to)W-(ei9S*pn-PH&{K!ZApZn^lBD(w;h$N6q6$jgU8Uck z|9xnE$-a)i_GA9TgShcZFhvQ=p0=fHg5r#BTNGbR&3>VIZ}qoj<I`9oX8{kFit z6VD0#Mox)~)FIEa;!}<)k%^xsJ5|N%P^dw*V$bmBLYmr$F?e${AfvLGwdATyR!wRU@D9J2JFlV=)DItAn;kS{Pn z0fEW6ISAXr`S~OwrX+z7*V7*}N(qv4{EKAYp0h*urI zNJ~1MWzCKqB_9Pr+Hf*CaAI2h)zM~<)f?sGnQ)yF#nE+WCvh1&b3?0Z8Obs7=X@I3 z`9prwC!2LXULw_fALm-n=DBwx%p<{l?zDHUb$`cP@Dr@zrrm2=sr{_1235FinfQSk z*}C3@nG**Ltl!cqy-VZog@&^Bd5=C)p5@^J~R9rkp>2!+dppgYQg;A9hpT(eVg++jAu0VwW zTU1O9WFiXw;kf}*xE$#HV#4A7?Ao%=b?&TMe^7k^O5I>Iyr+?4Jcj=E;o_c>@ey9v zxw{O`fo~HraB2GPV()GetRaJZGEK>s))|*?nYeE#CezDq)Lvg=MU}L5LJ<*9rN7_H zfDl`ibv9m`Qs39^vwdSr2%?nK+uf{IIGwlHg52t$BHXKXf}y7jEOF|fG+Ovgf=YhB zXBie72Q7zA^M@uU@pYsdbm!<6h9Lg1wwu)tG~wT41wNzbdzpKatoF#E(eSAjL9UWn zz2@bwrOz~#qgBcdzbjCM&V|9kR>EMcSke;%b4{}@OY!xSd!Vnce;*&afoQPTmzRM{ z&~=xd7R@_9f1~Lk64;!EG0+Ws7&eyv2REPrant&Ma_3`b_7wA*Fmc4ndTSP+I90O= z6$jMs%L=X6wBI(aF_D7lui z8PcU*swFn6czsnld-$wk^kW)bh@h&grNcgH5k!E}xG1+~t*JmoP&PKim8NlRE6LhK zCD2EYiU3ov3q1ESMCQx8_M&>d>$E!ROi_NKIk!p9M>1Sn?X zYx=q~1=4Yfsrz#r1d^U@P$kGME2sE~3G8>Y6G5eUq}p}`Dy$i72j6G3wd^`nUbK6momzWo_(qwz{;JkaH?tC&en;|5 zMU~8H^C5@dbE7lmgBVy=+(D%@`zzV4<&e1ffc#Bnj11CQ$wke1PZs4d9C{;$kKY#` zyJPs~H^vp@tO5BESpxG#l#|XY=0fsBq#gHZ7Z^}CNjle3lj3Q77Cq0=*+H6zw)~>; z($~0}-A9Fj!*VC|o~SUN{I5xF*E9iMW$5u?n&Nx({{Rzozm~rK3?Y9~n3%hmlW5qJ zVFnE^rU;+u=$9w{&Qho&_P&IizBg4N-&ydnxyOt4tu{P(=@_M@u{R%}j`=vDBxQ%* z{dPNFep@a9NCbF)=B;)a_yswn;o#-V&*_9Zu1hX2fAER9E{%QGt?vN@qNDo+--9+u^W_?O)B+I}RSgaqZP{=QUfh!)xVVAjOb~*{H(0HrQ{g3dO(u=>~1j za=*kkBX~FTT-B0wu<3ztg()fxC)}etTa5}hc?>>Q+&~0FHHNsv(Gg!l!;5G17_7)d zk@S}oqIzGuaxK1Kk$g(^LT%`|uMuX*hOmltRX#*B>&j75<#pf0 za_VZ98zjf*-`XnkfZFU}3SAo)JEyD4*x&gE){d@5O*H&`x|p$8SeZdJ=f`OfeZLg& zaKIs#$#j6rNWlj4L|~L-rTtt(;y+TE1|GXgMi}7?bnp*GuH{4g_~+bQ-mQUsx0p#; zOsYD^j^o=tfE%%sq;C2y`sbqRz%BwU9njf^9bhAWx0~mB4in7kfQA$_Sf9=G#Fvib zkN88ky`P*N2dWHw7oEN8sYac3#JM;cPoqwK{z3`FTsK)`;0O4{?l#{ac&`1ZZ}kMb zJm%$aTuD*EZXS&nmM8;x4_iTve}8WfWeGXj0olVYcrXQ*6{x|6W+PaK^TtoVJkNm2E2RJ#UN-4mzRzjf+l51;VzRXBD0P90K94%lKND_%inZe z<21M*PJEG(W&^g!NG7Mk*S<5$YlJQIT?w%PoA^5)2;6b%ov#FX=To^iK}hc1uD;~X zrE;J2^?sv|*-_vR`cu+U{?2!z7cp?~XPCOYOIYO^* zT_Sfq6F1rDs_3mKX}k5h+^2lKOWA_8ar_xD7@-9wEgOJK!n578|D(Xaq%r9qWo15Y zntjPd@r&r)t(zlwapX(L2H#uNi4&@OYgunS-k)wN0!5JMXeD~g6`dveKorhmefG+H ze>vP-SvAbo{@!8V=-EC?aqAuREh;WJfq_M^X=eyK{?xF$prY{_rOj-f;%ScBym_DJ zK>R{FlP$ z|ILwm%L?@8NMQ4i^Z(ABdrMgK=gt3QBl_d<1>XFjGWzG_;P0FNTVZ%%4{_imBY>v# zwSC}za?ArbUnbIfN+qZ3fP12_fNKob*;2*!Q z#On=+X%WiXVnmA@*0v0vY0*r&sH{y>+(#G58=LudI_^Ql9P%w##%Pkk^uvj_KnIu3 z{vr6N4_+Lg*BZk)1kP6gPOf5VvP~xeKXBaP%--7V&3vabNi>}tNi8irIMwSxw5can zda`iyyLqf?9?#Ke5pD})v4n3+8cpEA(R402eJ~P8SH8=efYUJ0YFIE51{{HuPHa^b za;5gs!DYg-ScgaZYl-3ZVd>>N9^~*q<5-^zIUIfA;W)n^iTJL1iO9l%vQ_!YokA%}(~V`P{p z5gq1LQ@J0qQ4r?evkQdaQZdD2zTC3NDBw=DL*=QiFV(*&;H~{gGv0gV zBSQW@Lxl;FKXOg~lN?Q*|8JNja2AhMVmD_7%KM`tfSVyO&S3$D%im_rF-r z*3Dd|_;PQ3S^fpy_3v+No|*1zPA{GAZ!QaJ8r{0cX8=|~yHw{qzIcS^J$!P;n+mK2 zY>@m?*KE{=;-6s$&o`y7Z%&lgwzsK0nuss2!DuaklmWF@vSZh{JP|65Nd%C|@Wps2 zWe2kn_~7GL>zvp*IYe<-)+(uv{;NFQ__*ijPpi7BI;c0Xdxk4mUY_|RzlH=STG^7J zeCvTW|LUy&JmIIW<~LlEd%g|)&z%-p9cJcw%Y_WL5rS-ODC2Am27WUv&3Iky*4yf$ zweVpEXer)(P5N%#>p(817ly1~a!GZbmofh?wiE80pmjLDoKR|m)9t(SLyvXe`lbPy zprks_9#xU*XzlPpd=FpoT<9jL+-57f%ciw<>#hdAbnNNQPYym1FO@9pFPIMQc?_fm z!|#{h`^iP`zvNjRywFwZ{bIYviJ7?LBN!3@{}CJSoj0Go;oN~Llz{W6*pl73#~Np6a@ztTz>Z|60bv{NAc(~a z#cid2VOa3xVv;Qh zocDdU*jvB!tw2_tW9=R1i>73?{2;6?xBk9-GvH7T-jw4`^s$RuXaD`xf3i@7brscZ zV)5jZS)WI(IJ)Kwh`2|HA`EpEMfvkXtpV$Bwl-c5%&4;UEcu(VQ-0Mnu_ir^CJ4jQ zPN*UMd?47^p|so+Znu3lUC0_L^@qq#~lizInsu)~^dVc1gjVE7x5^O;jJ@8!~n| z!)YlJRut{`VuRt~BA;LT9cBR8A9rw5-#Vl-!QJ(;dp?%K^%-LtS|%xc+ezxv|F*2$ zdEYKI4+kJ)V?nRi@9~BZ{XJ!-wcko@Ji}aY0a&V_w?=P`elu(XEH{9Unwgsxi3ge( zv~{r+1GMN+3!~kp+ul6-@K2A!csbT6NQp^x)&%WRi(!TY;~!FQ8?@HB#`VDSII;Mr z7Ya$vq!!)v-Sw8k)R?b^D^T@K?m8@W*WJgJ2ZEshIT9S)=s+WB^3^w{CAy_eF1c%E zG|=>Lg~)(H8ysA44j8Rz(XXUfxYKaV=fw`{p2{@>t>;Pl*;}Kse|r{niaB`V_Bzi& zIagFqxvgElldlxIWdR3wP7SoBC~Fu!gLNQg{<`1M@jI-R+mRDKxoW%lthbX{tThMd zoe-=4z2XIBI`c-Af7BOmUam)<#yDg3oRm`S%?WsZWyd=D6%S~GK?6`0kI+EJdAr<= z8QQ0GJ@PtpZ_CF_>vBfD+C(lZQR)NXlC{pYiE*ideV@v;2*(EK*F0*B1v0(S4&rsJ z1REng4C|KUz+b{IPdHf&1Je(zw29iEZRrycGsWA4TCxwz$r62fpBx59CNuf&Ua|V5 zI(lDj6-%}_lySqHZx(%Y)u>La&;|zRONBf%)JVW+DI)N0BT@<>?HJN%RB-R4-pj|# zz`xl<3lm2khDYa6Z;h=-L1WTkdXN!nW8<;sK9%=$3=q8FF9c}#eHbXmWuB%D^r(w|KQ?27 z3*9@uI2{mMYvs5jMd@9)R<<&H?)tj<#;elHs>bIl+t)!l^xwxD#LiLnWW6StbyODo zi^AL zev1s7O8-oi1v#p8NDT!uaUj0~dxV}u8uZr{Z<5R7=9yjbB?sSVudeEP1_B$5QytFr6{Rm);>BtFF?c zS++MX&}xleza1Ek;7d!}OIWd%IUvKviyZb9Vk6?j*I~$m9BhckFbT0l4Pd4)`0x)#ykx+bdVTBp`}SEf$&h*MUL>&V;QfwP%~>B=XlUCf0Po6^pZ-Q3Ey zKu#5(46%ly7iFA-)ttA5@R*hxt!Aq9O19>VZZ-Xc@;a@s6&fqml*yZ1j6UNk$QX)~ zXB@JV-+%t-r#Ywf!$7oQ4Pl|PL7eoW%}u70?yu>**l_E1Mpd&o7S_g-Pn7-c`4x=h zK!VnZ&Ii#0-jGh@kvC=sO@TK^gS6P?@H6{uZ+Osqx}4rRIME0QET95_&+|@JRB2Q& z+HThd9vl++j~XHzFM=Cz%>-Tz564U4JzbosZQmr5pmRfF`J`KN02?3XwDb3eP@LF;hrl17;xK^ zgkg%F`lwgidx(K}h5;Kf6Zi>oMWWS*o-tA)->}v#k*<%!KetEvtcNi7gq#l+6HsO3 zz{Ic$0O`INLi*COmqjf!Kd4uR zN#LP&6Xn-wryTh*Tf{I&>~Y{Rv#8vZsJQ}WWF`{(jAn^zRSChLfZ$8kPL0mjo>kuoqmhV<>g6DJ%Z@Jw+e2DRKalLN(d%uP;X#V(9}_;ujn zylN4_x}2??<$-iv1r=;)7xaivaieS3ynMyv6$-2c^_XSE+Ec?f-{9F?nf5Cj#kR?$ z-aNA;E7I#9x624QqnKDFhVZw4CX57V$;vSI^hai-eYSIHlP=CB%bK4~>iIlH7}y3m zeh7VT;ZMmO_$CG&z?9ZOT3t z)6sXX{>tOa9t7u8FDGWD*UBwm{`h!8OicRQQvt)Sq391$z;#K-u3gs>5z5V4FZ>H6 z+xIkWLGavf{r&bA#Eg!mh;ZVi{My|*i^Z>c6J8w_P1WMGGf%&@K*i>_I>Gs{T`iHQO~!10>}{JCQiuze z-${Ekw)DKfjGa4bkD5Dq>xMH$;G%Gf#&-9IDS0W{AZ!ZShvoNEMYN*$dOLCjaNzFA8hDRWQtXrjmQs}S)Z%1O`0cLNkA$> zBU3%xsIWzL8>31g2lAS)u!!F*H3)L0A7EDlx49H|1SjidY$uB}R2ukxd@60ohFlPO z92k8zo`|lgh`?{EkYf;A(@YV>R+3@dcPPrqF(1FoSvQ{oYhC#3zwo!^K6l(@Na$W_KEae?e}RdmaA;M zac{l}7_KlChs#6-pz?XeK_f(><-{GlJ1!WOzYO}W;^HW#xDIvtD^g!BzwB>jM8=Er zq3ZPiCaPKxq1C|=Fi?wGsQ4N!j+r81P2Z@u#mPpf$&d$K*0tQW{_q0$^5{f%k2UUQ zK^7h@WZHVIkNEmlN992L4_~>CuQilz?b8YyeYFGTbJ*U?Oo;q)%W}wdOkChW`WFRO z@CZNvGN0HOW#C5_eq{T(bxtP#}I)iqwivDh=!dtTScN$yj#Fx zlCP_R14~$8&i!oz%ACYRtH1gN{7ynyw{G1Gaj{u7)FC`xD_c?T#qLRM;cmz4@^gt; zaHAK80GHh)*LqozduZtb@$ry1RC4X5Z8o8V@(UNq&6iWLWyOmEH@M1P@RYwQ1!|a? z#Nb%Y;b@)^kLJpe&?`SeN5Jn;XGTYQL>CsAC7m7S(+k41@643N+}*}Lj)yTm?h=~y zCs)=u(>~MJ6V$WbsqrMVQBQqUKKE-un3E&J^r+E$8xti#LX3n&H$+75 z(R=hddKaQZ?|m5g&XDK5@4er>UpYU+KD(~H_gd>5v;S)??E=C!1=uWlpZ@cMJ2BMj z@o$l*-zR78nB1uIVU6qBrFcW23Kc;I9R~*>mzDK@uU*1k*v+_83yrHToxERDsOyl&{iNTHYP0%?f>e_FcDzHHAf?aucn^mV$Wip563iBV9UNpsEQ;6d zfd6;k`}4u*`E4_YDd407F&26 zH0l{}hZ%s+g5sdG)gu-mVXjRx7uL76wL0Yc$jKbvRyL^2L{JB;`uXJ*0-phoPsA<~ zg*#39M4DJHVyuq~jt+aY<@9#-#HRQOTlk*^YFw~9q@a$%A95=S9-sJg_Mo^I{v5c* zi98yj{+Rbu+|6)w+MfSY+q00hbL7slk67rgc!r5VhGqw?h8$XRtQ2?_wced5(#6GJ zoajcrT^SUFP9NoUdF3)6*of7pF2r`#xUCE=1d+)|^LF020$nFc93LCYy@id*ugx%r zyqCF3=F(WFQkT*%8cA`lmTJ!Pj;*A{T~Nil1$(0I2(d z_sB8)#j3L_QZq9t7+yQ4O#ie`h|99z@R#{cE{j4(Sy*W?S@9NZku~92&ed|w6%+S@ ziX|ZUF0`Py<>`BFUkFLm?&Q#x?OoEXt(K}2!vR+NN}oJ4J#B$mlcaoa5W$Synw7P6 z<>{iu*wuwc(=UuZ*pckMCVSrtUlTI*N4AITwLZVE*kf>G;r6Vc;}3y}mY$ylT@$^q zWtRDfNziM*0pc012#-)CvAVZb066D!RT^a;8%f>!-sB@`%qyiuGFqlD=-p!vKC!t2 z(pR3Y2MNWSmU9=TF6pry3d=60ofuX=Wox~WCl4e16nJRw2DxM##kH=%x*NepjZH6z zHImvYXR+Vy9|A5n!ye4x{=vt<`2%k*D(_M=J#@Et+!Qx?ScXV+>G(mpHayS2x?|Yv zuxU8gA|X~s{9C0e5Jw5b5;MO|Lh?ynvc>_oyBjxQ*#plhcYjeK7T=*)$hvzuQbU7S zk&^4Nk1q%*w~cXO{_4tw!gJ8Z1gfedH4{5JDui_8K;(x5V=?W-qu(8e4y+9~hjOSMF) zE@k+8ZNJa)@k9Ioun~+)*Vb6r))YkT#9dAiv7o3CJsxN>IAT}!KN$hSrQ(S5m>e_e z_*wU^Vk0~j7n0Fxtoh%@JjpA|OdPrNO|rR_rB_JX=^Rb3jeCo8>A7RC2-0?{t?Cg5^jgE3g zN#mPAd{fbl$)`e8k(?3b-k?_Nnkyo`*2xgYN_oF$N0y&f_N?7pD8du?tyPLpwc~GN zeDj{>@yzZV_47S%z9Zkfr_xadaJn7vc1nNz$wgQZ2;jqq0&H_`Ww&Th#cEXKv~QYz zIibMbZb}ce81rjDkrg*h;7?VeQPuutD!QB_(u;b`;pcC<+?OjCGcmUAc>`PE zqb?%z=@~uTRL^^Hp_m1BUl2Yy@<|M0lWOuKw<8Hn1BhniC1>WAtgjD0etv}MK8C!~ zQ)SFrn)xMc5W$=RX_LCDd#a&;{;Q+G4A>X}DsQ_Y&lX5f>|Q8fFM7Hy5jMLt#W11K zn8pw;!LKBPel>1M_`UV6z-H`QbE|4~=AIWMakpu>L&$fRxYWdyU@|F$DS9!yP=A{2 zmwjoodaQnFyk54`tcG>mq!YxWo1ynVKOaiJn%H?SWWNUt?&>zK$tlQQ@8xy#)KUt|5b~&5#nWN`mS!Wi~ojq}PZ_X5Q8}f5F*Wi(WHGP_=avZpZ zlhl2A$nEkx$sTsdJmN4w+MQCiQs=~_nD&*)znGC6pw)_DzV(5M+ElaFBdMj8db`G0 zmpR!c{%RQ|#WyeC$+*xmL=xsne&bG%FnUC%V^yK9b`l(YG3j#n?7=Y4nd@HPqa-?{R`#;I7nPON2nF)|cY5HFhFZW=*3d5dKh`Uk0mp3c?H?i!LJt2S@h6_d z)w#I`(ttO|@insH3)rZjb&q<$!4VNC*$@H}@P(=$Qc4J#ES%%gxaTLyda*B;S%mBrTtrFWxoym^edM zCpRlSW=6R+0A4W9BAq&noT#|7AG#e}6qzbKmdkP1Kvq%za~24|gYgu9_UjO=iB z;+MGVyw9~^?vIZ3Dd)U#%-@5Nj(c>mGFK0!pAcD8 z=vQN~#)Gx5#;>44E0QBaHy6{MVW^@UM=zFyX5sZeXff@LzV^@G8jBWK@T(q-9@&o8{4SZieqFufq8q{qZn z=be1-r)NvTBVQCY;{H(gIz{y0!{Jp)zW1j&nT(Pvzc*iLab%)jL8xZsB6hwQ+dt~f z&uiKGsx&OJFvO~lx-9^Jm@qa0`pl;X<3fl*SH$*0LrHa|9@4|ZLp01&eR>AIKi7`g z=5|+fuqB?Iw>|N+C`a^^c%JNV4xlQ-UhD_I+i|p^T?Iw&q629Fz_-dbCAais_4;;b2 zHOa%iKNZ(WO+qx>z@61;gy7)__-%$bM`Mk8iLUN2rz7SShhK!Qz?#bp?f^k=p7>!i zxJIrFM~IW|Qmnz~cDL2UZ9{MXl#hV?DhM5!d1x0F2)kZ=GAC0`CMX!~DZoU(#X3 z`%#hRkY&;1uh9?w;uuv8*DCNSj|l(mw^vL)rat`kd+9OevDFT*LK=;A5$mDX zQ57rcJ#rPuL$%nz`vDk?1}AMUH)b{+0^}OH=x-ak79W|$o1Vd1_ln+F>e$H*?=j3` zU)|2l^)>~<=$HadmQuyt?%}=)AQw7Y+o0J_ZeVlnrJOIwX!bg-3gk!tA72HxAkBcI zQ~_+D0JelZGGh?%y2Z1U)7KP{i|&m4P^F{mXX0tO1}vmhL~vr?o`%u@{7!S43Ird8 zC>`m>KxI81bhp7pwz*6I<#;Q~9zW;NYkND2Q`+t?hAXhi&fKE{<~`z~hhJN*x+KfE zm&rc$Qxi3FQ$e4-XW+nSbz^xexbG~87QOdZVtq&z!LRP11l|uaqQ7&`^L1Vpm#mG#hYwC+Z)Msdz-V8quk?#ux0KW zJcNrL#WRvP#{tYqfPNRk(NxfE$mqkiW03j!hiut8_M^X_q1w<@+APN`;!R1w;>oDjJ2HMdKEJ(WzF*8HvHV zI~oTQIT?qqFw%os(8$;Nz`<^VKtCAt4PvD;@q`hzk-A%$dtj>9fdS6Ys0BO9K#Qi> zOKuk`y~=;Tz!KE$HuQPv+nZy#H zS(yjI0>CIf4`Dw9jJ3s$qX0ZWKRDs5@%T7c!%KY_-L24kMKL<`qHj$a#5gM7x^{JO zr&#u^3x0UROv1dQpm`$TbtKk4E7CDF5*Uas?u=sE5RA$0Z5+r5n+!O;*)`R>ZC=c% zeey&E!~?}4()obSvU+CDsl71ZI{D3bWknkWJPm(ajVJ>o@yGn9iAw>4JzA)J&`{!p z927kk763`eoK2`&Z|8gzIi}Cfr_N0K-!p%7z_oQ~m?QU%#QnzV z#5U8LzuEC^ey>~7!N05Chs7$5TwmoA!y;n364P9)B&sABIze^2ibwdEcPA!O9~=qt ze>in-)w;{f3Q&@kDy3YGk2Ax(|1&!=I&m`3T`Dd{{mL5`8E^e(v2oGaP5}C}3*X+8 zjEv0NdF$<097k&z=&&u3B@RTcs7_b>DU|(dfeNo_cSitQv(&o#VQ_n(Yy7Y4Yl7O)T&e39e-yi^7%ojjG^@A5B@qvo|_c})Z;JN+@kpv9#UmA)37i`=a#_oSa z(w$-K{(<2Q?rC`EW}adAz5~#`Zwgxfl>GNFyuScF0I3H60RL0te0Q=YiUu_XCENVF z1bildwXoQND$Q`5G3FYrsT-w8kZEd~OG0c)}wumc#)1Mn{u z7~;e1mIM%^2?BseL1&+(pp9(=^trX?x^(ryYL!7A0f4In+BB@{TBr3}jhAHa$S_k6 zuejoy14Wx;rghxq3vQKWK2Y>cqCq5+n!&A(KJTft*Mp&vdMksG_7;r%M}nCpVs z2T8V4c_IL~gYP{a`NVBm0bQ}no%h855hl z6*i_`9R&%3$bsT;q(dT+?|<3ypZ|u2{NFK;|M*xqF9D3x|8atl`9EVG|8cEw4yDAS zE&nlw|EDp9w|i);9Nj$v7pVu=ifLE*8%N4OjK^G`T5W#FmXQvJUoRul-V`^ox3$>X zp?U51P(|V0W}D>0UxeSvCOqj0&VYYxe0bpB9Kic$P(Z}IS9Oi--9&HeHc(xyI}|OQ z@?*)R9S^?)UYavIfbdj6e$DnI2SEP~l0oMQKlu%}PW$%W2T-Uc><6k5+VhAFgs%ghl1JQti z{0FMQ2IISLkhPFnfV&&ujasf%-i$!UwSOYE(^_6G6`;($(E0By*XjW&7f%+7{3DBb9*D?^Rs`{9-pVe~N{yDc6^+&io>%aw&1g zsmn_js^8XbUxPj;lFF#4KpD5AvUXnv%0{m#>>_ zG2B7Kq3<23$8Mymrk3-ym-ZoUb(yIP+;=vJE&75`;f1&*b`bDSgiLNMyZ1-h*|D}} zINSj~lECL_ti+>oPw~m3eK^T%PXHw7bgqBB_G=S^1<+!m2)mWv;Wmt{Ja*rX6C4EB{m4S2co~C2 z6=koXE7frTG&Dm4cc?q=HoW{%0|(0ff_3C$2-1D8mP^xxbnmel&24Kqu;Z4g6uAwE;X~9_CM%QEQ-7_J+AF?2`;g0E^cnSfczGDj}N7r@roq!@OO`sm*e><1M zuI|wlC92ozF0B3>aM0wwnti}DNr^AF?>q^p?G7=!ZG)jT`K@Vz*MuQx(qL7#1n=Sg z@?Y&}hG*>8*iGOJ3(W7cw>)T5dn6I3JsorKI5A#FT?ef>D0l<^c zy*)+AyON^OTk>Zpvjxoo@FdHm{s~uUo*#f#Qn`!UG^U?d8*t*eOL7iu3w#1|ad&Yq zh+qbmgN^sBJzX(#-+t!A_RhPUPq4EQ#fy^{{n2 zkJ$i#xM;xeiTMjNlLX(H!8PEO4c9Z-J4rP(nGC4;Z-5pG;t3)Z!J9+_!^XeECRe6Z zhM?#6D;ybt?!x`gn!nSfev=Lu?cyPCYC!h_q52zBgT>9565ImU!54n_<=FN0GOi%} zYTUCc6Kco>D);WaC!E45q)}W z>+J{~=EP;V$trP-~dGe6zJr@8DL8EXn3X-qSXUVV}1g^{;b?#oueE1DveqlB4 z;Pbesy52?SrZTh7qwlD?%t8|B-n^?!LMnJ&+KLWgdQ4=+_zc+bcq4s7B<5L>bu`-XGn z1EvLwqSFvqNsE}}7jfV3^(AeGi@UWS%qohfcG7uHTk!042-yFwh&{Py9G&JTAUlu| z?&15%gZMkxm$>hb0KXwGEG*M^L+igq+-qVn-VApA5nCC*VaypeGstkzI@ zsBJGa;cJZHl;nazYUH8?)9&oIP_3vC@2uWiz<=E~%ngQzGB%gZ>N2OP^q3C5b&-)Z z-*P!{5DcmM7%_dKVlv4y+J(q}u$vP3L_`5Lc_qkK_^uP{)I*OCl)65iLp!2yjQ#JL zEfAMydjuV}EiJVrNLdE%)(H~-e6uy}*VR_f>pIDb3u|4s9j+3Hx7}0-abj%bZem|2 zS?S3k>d#Qky-%tSYujO`0lo?aP=7GD95@Z+s%OZF)g?$T>dAfHUQFa-%jL?k@|?q} zAxtW3^lP4L;{M3KVa4h3vh9`xl5D#qhC)wjx3|d1CojVm(<*0ZFxE`3RDP~z3Vz@D z&g$FZlMJa-8~;;@LMnJ>3Q92Wgs>%w9&4h&Hz%5Ap_5YcjO|yrAjDAiStAm6%W?Ly zQs_%!+*~=@eVlnwBp;F|7B@>DbQgA?H}x(|Ssunh>GlY@|FYee?tlkGdlIbuAT$NN zKRM?iC#3La%2l<$)5#jCCa-9Td zsF$Mx*-a71DwDg@8C4W`s@nZ1xg^s=YW=mvoO0iL7j`-G$v(3n;ih>IzLlGV&NdBz z`CAKJxP{Hw2LA*(G&qRMe_YzAucJRGY2<#Leh;P>pz2FAC{@CKC57@s@zdlI&zdW^ zo>@i0^|nujf>Bv(CD(wMnCka=uVW?ov63I^bGKTbLhqVa7HXU9KkJOA{~fAg2xiR{ zNS~h6shCc@ii?a1;WeHAPFksZjT>l~@v{e$x8myF#GXzSdPCBbj50C}AvW|&xqCS? z7n0kVQXA`2_{KRI9lxoTGBrw*U*Yq1ZnQ|UUrQ)f=HMdEVO3FJ96j=-CFrL0^vxB- zi}yZeA$2x0J6k&o+FeWfqr*r3d3HVU`H2UozwBO8?)H;yUBdCCM$+P#nQ;gbtYkrb zt|N$UrFq4O9Nn}Z?e>&3$R+<0rxKNO^QSu)EziBrCC#<|8z}8u2W72jNoqZGQU1-x_T4i<4Y}S5k3oXs#0{yR*0b(`XxvNR-+~; zt@}h2QAcsBVQ(?*RS<;ic+Y{e{y8Hz#$;RO;8ktS<64YHDFuG}o_s;8_FzuPDw}85 zs=u7XaJx;;%;7oo&c)sS7mmRtEcxAKTI5(yO|%^GdYw-?=#kNt)1?l+U_eUlzeRqN zhdHyX#@4kJ15QB1ZQ}97o4-bS@l)%siA^MTSv2wy;~uIpx6eg2C13l8;Y6-uW4ern zcN<&ACVQIy3S7%fcvEt~Gm^j3s@`*EOZ(_)WtPsRzx=PmTqxnf{4YkJ!xp$5pdW|5 zcseTJxF4YZ%C=N+ct!cUCB!i%%U7PgNucw|uj!Ju;u?BB#|J27wG@HVH`R%{+q zQ(JZ7Qc#AD@Gd_VfefF`AX9vIr^CyKJ7{y#>8Q8JA}=p5O^|v%zk7AMK@4L?*=*9t z5K8)oakakYHpA+CC+`M7^z~uYn9r(s$9z0lrS3n|@}yWyyJJCvc6a-+@JJQ0ysA}$ ztu7K-1n13xlB5UMM?fDlCvzGtm~jIf3uz_wOPLx&>&Txt>Z*_2HDzTW(#e+Q_bF(y zF$w%iCQxF3jkfEf1+Vs(9;wmHjK38og~X$$GFldJJ3GRpvjO_@u;b?G$)ckD0k@|; ziem_<=azqMFe+ikh@Sng$Z=p9H--WajdJqct4d^exHAhMCu)ejd=vkv*8QF&CF9Mx z0z2l052p$CQ5_?N=%-oP4vwD1d@IG-L4^imuTD>*s&|GzWxku)R2>2a0nVl$}OOyVyHj}`|63?CdAO1Lh6s;+*}p!N<-OL>G+=I!Ew z$0#P6vb3E{PF6znY7l$V)7W3ha7?H9NtIyRJ?z^ilL8AR?4>Kv1WYgQBDuLu{q%dB z&yb~(i3rHITGF3jR+&>XzmT5c#Kl34p^jLj=AJp=2EX>R@+65t6^HsJ`DT*cT|*Q@ z-4`%zek*MRzYyC-e_oK^2j$SY^7NG~W1U;LO-LS~9!=j}HRp^6F=Q{*f#x}o+gDM1 z>+clnKoA*eq_S?0VAum0&hFuOPvl8$e$t-`9haA3vOgXgRn>QXa2|`9dqW`SPc=Q< zjIQOsdgFqw42Y|a=-Y?n;b;aKwxgkPXBt9E2UkQwjDvp+n*O560u4PMKxPT#>QlK}VYVytg{s{94j5gfQilY$Wu zcHC~d8kSm+gDA!{r-he(^y7=b`RI=*#yXIG^E+xo2OoN(0Us`6k!2{YLMd51eSJW? zOJ`kS_e}TH_52%m`(kMb_`o)7_G(Hq86sAMgkWMKZ8!fbec-(5{lm?xveJG2@FV^e zX+JFvV~{2r3O??4kC5=^k4M{|=ZqA?_3BkR{RM+6%VE%{!ygHHul+c;R!Q(`4B>kN2Gc+<%5|RURnDbLQ+^{1ZCI7U59Is2ukrO*4 zCn~$gmJ0cdB#iYMQ@Esyf4?S1!MB8XMj3`5-jof!594q5m9HdY&PmI>Ya0GK zdbU}Bp>7P!xCLrbc2r&pN^6yyvpxECk^c9NeapVFiN6XAF9#vJ&hdSigdpdP?iyC+ zcZHtHCYO76t&}{|?;JS4btyU7bdFVD-$G?h3q4MS5ag1htbW9+PG?6Txqt;X$@=P9 z#e@jHfT;ec5w*`IY3;th7i>9&vd>teiE#A4ESg$3XOn1zzx*|LeUgT!%69rk4Waze zmg=98{(NtrPyf1-iY|Gk<3n~}t>E8jq%8C}d*;P-#YReM-86BvaDR*z^G7PVHy@Gr zF9_R9=QF5v$~}=u*I{hU8{H0ARGb*|E*e!#RyZRo3i-a9+Y+|G zUmN-fX;g>_^m9jjJ5_NylNXzVuV}I&zsdrMMP+yG!!=bDrpx=_vl|W}LTTEb#-PTS zo+6x+LLqtXl9||x4CHlO2MIWXiWF$iW1#I6tt)VI&qR#w;Xh!-o zBKli)Lr#LJZV=U1k_0Q({m%C1?T^RzcAA8u2h#dbGHPow3C?cdxuo{~`>;icMoZa6 zs2CxzAsS1{%2SRF!*Dkw3o|ppl`|cs!{3K7Petzu7<{UbaaJcQG2$h}U>%8I@@8^U zB0m@jQYC+KycIG9H6NKZ3vi;BY?V>mq9VGC5zCSG4up=jd^nGdK=H!T*FjE=?sa#B z{U<4wf(l&2tYl!Pt|*IK-x$_~&Zx>FWIQ;xH||!B-whk6L7RTPV>v4@(O|s)Ty{369Iv zUagYfV0+<{{uTXnaZ4bFnsPZC(oL4F5pU+3dWYS}*EhzNmZgOgDU%VzK&r;B0P?cp zXDY4$tGb(Ok&?1$sDN(K3@F(vT{TPOm~yFeSozZj_%}CXvM8MB-*^G|B&M`uC@qb8 z^t_WE96Z@~uZ~m2C}TH(&(sj}<`TDxKS9rr4sUNZV*3x@Ex$AW#}+iFLf$#8Oja)! zgiMMFsDy2^bZgj;=8pmfmar&L%VG&aDe+_dg~L(v@E2966lX64Na6It>TSd2 zVA-Z;nVhOU&1wm^H7%4(IPFEmY)9;-Id1UenU=E*)930D%=$|5z8|@-&+?PSHYO)2JLld^g zzWeR*H+e!0q4aB`>YjYO`f?rKT_))76S=@P*#`G=RmDsJg=naH~&(*Cw*Yb(%e5qpZ`?nP8kgU(e0Qo8qD48zy3#W*gj`oe0a}THfrSj z@m|D+TeNom5tj7BaQrR_j$PgF-K8l|Mp$G&1=6!&2$qW{?8+YewS6Jg;KYuwRu zk;pLlt$NghzfUUohuw&oo&r8-H79n&d*u%GxEx6;dhN@<^qOaUAK(o2`E|+4GRaCu zGCIh~rP~61aNs#1`@RqUPVxD@H+SAC+APgf)!s_>e_pHps>Gk-U(alvujqkwu@J}6 zkv*YPGS(&Tt07Hpcd@FDJn0TH=`?5eCLfSu*KuFnN}qk~XwD^z(ECTzb2lYx#nWhx zkn)}HFVI=neOSh%ZTwtSR)_`zgk|=Sx~B44rPqImrUQ}oJHh;oNk_1BD zbsHi7BFJL44@{r&&8_tP7>j1h+BKAl)6eF28xExG*La z%UkW4buZkSxrnRP1a1E~?BICHU0Q5Cn?cjVt$GR$H@k5(cM>1pm~_}>K3jO{`~FGE zxa1c|IsETB=@P_b!cFsaUinn`nS?(;#nTjN(C5iYNP@z zNFH`^vNB}}o71n6yZVE`&ZC_7PdvT-M=dfT^c~h^wMoR6WXmFde>tOLx1&I9} zA`W(he_}n_n-X-x@A+Cw7B}~Rk8-7Tw)K^=rdtjjB|TJ-RSLjN=LrRlnHISMje!MS!bW)K8Ev^XjkXYDx7D)0n zN;&LBxOCsW1d9xiyUixMadk;&6U?Uc)N%G1C>)64ZnAkbpVTWA2uX5?~ z5@!`>XrQHH_NW@x?JeHhO|nIZ_}@fZj@uzfh#dGrmvrKW;twzQPWb`GPcRsDkJc!B z(Sl%dOyk-aNvX-`4e>Zm#?=a$M%n&}rCTSy=Dus!bpvFZVqSC9ZvTG#s;F7H^)^u% zxwKC{0VMmW6mc&`oyx5%M*+XgPZk$IixwBW-JN%d77MJ$Qast9LTnhL#Ka~Qf0#3) z_FK$qw1p#v5*O;|lh^I`Ywm<~VQ0%$s^~!vSi6=uETAprM`zS4)gOuohu3JRQ>REx z*Na4-&nKtIKdFlgvF_H_@H-<#xLed(pUbTbOL0~f5n?9a_pRoTA(H%6R$AU7b36;} z0aMlXPk9;c@?s@(>jgOfLtSN8O9zz)TQ!+Oa4|WuRqjM7O4g`Pj#4RtYfSQQ5~L1h zn0wRSSbW~eAd@*J9lDf%P1l2UGBzbWC~kgz)sdw;^pvHg5@AJOT2q!_|NA})^-2B2 zth7Hy^;NEGsT+P3!pLy^uku&6>u4##LR})R46V>x)^u@^T62!E8~wF+O{vsPhIddZ|4ac0guVCnd-4 zk@b8UFEeP6mk~Ovdb#&+)jz#_uK{Jr`v#eK5o@)v&S&cQ+N}|dmi?N;_x7DjiB(m96()|`O^k!s>}sNYg-rTCv6+IBCu zGzbij_2w39!9a@HNdBO^Z!Fd2_lSI#Ed&QqlL^*qyOovuh(O@bdG{-DKKwv)1b%)P z{1!M2o-7}F%rZNs`go71Cu_OINky}j<@~sJ<|%NDTRzlHKMS1x`eY#uYHM!+eIw5M z=JwiiuGJgEH}}cGWt`0hIHpbym*GoC0w>^HImlJ~RL3UqB&(m1oblzH1%`p^M*x3|s*K<$EsuG#Bef*9C;bC!4 zoycL+z9vjLWy|!VBwr_%`HCGH{k-;JV&dI5YYQ`5Tb7~}Q$I&sg#fSt&l*M$0IK|8 zqa-yFeZKVcoz8{^W|m6kO{v2Hv8#(~_xcrP8_VPe$vkUnzp8mnyEk`8K4xYTK9Ap# zsgh(y`3(x(>lJ&uj0s!pjWO)+Z`f^s{C#wRv zt3GV_!>y|zH?!DptuGsdzK$l@jt{4YyKyLy0MH({=Df?Gx|S);_Y~(Y;_zUgGhcE4 zeF7g~1auA<0uWCBN}L0ffSmt6(FX>K+}&2?NCA&7a?vo?wVQMpm7qf8E;Gmo z08#A)0O!RzKo9?O!U*SkUgzHuKvU2V80g{up3s4v*XaynAqVIHfsSg$6aq8%`T-x{ zx-hL`B=BnxNDskR((oCBSSy^S)>%3Sa4?6{1Pb>ww1BiO4EU7^q*v0;GhX7pBhNB& z&_i&bCm@aQ6-eix|Mt2EL`y#(=0_MyD}H$Loiu?D=r3mf|1$vA30Nt)Art^oS|M8@ z1LXtf{{M3VSn2aRb=Z1f(Sgcm38VeBBnmki@}#8OD#nnRa6d|=B=Tovj&h00)t;9v zo~)kwT>O9L2Fj%tAnMB*>W%H3L;jCkw8?>+izho{mp<^ys2~w&+E@u4gM66-;1iHS zeFUJJOV!es2mox|Lh(?^gU~Gy5^(-E@wDbiJHd(8ecsp8;};*httF8f(FA{)rg+Kc zr!hE9NTs7dK(7$hc7+8OLSw*~}}7^!DSiKMODT0geS@x1J-lel1&(4GjLZ6?s15TBIIobTK$PIQ_18$bce5vN+ zIZt@;L2d9qXEFe+(to`@TM58>5`f&pmjbuI5B?UP1EgU9MiS2ipt(O|6Ux=^sxA2T5|4((mfb5-(*7~RTlCb7k=l^*OeCPj< zWBer&|L4EZao)k3|LhX*A}EF$FSmFx1-KS3?7+|2Es*m++~OPHOMwQaxc_@A9av`# zOPmlTfR@F%8CSixpfM%RiGKXtk_Fc^#3QNa@kNaR7r}T$<3Es2IlON(0RM94 zSQAi8Sb}NRA=meYFLS8Q@SYyus-abs2aEQ&dWSw)LUBsdNx?lC$h);M~$~yadpM07I0zGPlINs;XFg zyuWs}?JZmAtOJDbT`xIbAkUoC)7b@T9>iUK@2~VP*@+2_xT*x&lE_hl>Wd*3JfykCFdf>u1Hn`~Kx zzAkycj++;gG_;PbOiTMa@^@SBYOCgWK|Uokw#g#f5Mh!9d@j<3s`Co8&fb}DAtL=$N2!OTpQ z3Y z&EZ!yT;VL*%<@hQ;8X4_L-Q=-od#m86!6Z9pF`l|Ge>?OLNL{m=Tl%iZ-reyJ##w? zbS&3-=AG}#>_7bo-9PJx>0gV*`R&XHt$d(9UPl2fD9*j!VJz_e{O}o1&NI+>Z+UnX z#}$3%dzOP9{oMI)mDj*1do?XP<$~{Q6VX|Gh(Djb!_3OZfT%Q3CA^Svk0MwF5D&lgKhSq?PS}JsCb(@$Mw+#X$H^F)0+p1v&Ns^7%zLytT_E0j zG?~lNl18B)T|QA2nYM2s;bIX;Zrzvf3+NXcw|ue_8tdA>c~hI|>&S;3o*11@Nw300 zG|Rz}s5`0A;qHt4tf7uJuHLi_2@Dv#qibI)5LHf>e!nMg=tjTQ54FeG^&PYFhwE+k zaT&YLy{;P;Mezqd3*U7abRNF^Bni6}4;vltSOLC?`O882DzL;6trhp-!F28AhqQ2k zql|_cveZ3ObVMwyufC_k8!10S=V6Oc4F7+jfQ{k0Zx+f%*?=s3w;R$co`g& zMPCi6+UG7O)mZd#5l8X1;*u%NG9&P{(j5L+siSf4xS`V{c~_)l}Q zd}|GC+ry`JGa3g@k4f9dy_CGgG9c0ZUDurWM6&`Vg+U!0X_^V1tRbaD>t5UXW@*(iV1z^m$nFul@3p(C30(LYyR!!-K zv$VAx%0T^Oh2-6WPUXRvz8voM{vC!v7)Pmr5U3RRGY6ZTg47)9xl9`FcP9+z@R6sS zkTD?%Trw{0+0t&2<;tCaSl1g;90F)K20xLbsD;$FO76!y_})1EPF1aZ$(`*U)X**h^!hsfVt@3^vTT`CRQb(QZ2b@hG;*Y);sLA z?_8L2XZgu}^&1n<=L;3R2f@)3KOS>=no9u(j(597?j_oe-G@n^(BAg94V1ISE7>wPk`D0T2?pkJ*3p^3F zg<3m)kfqi9DietkcgsND#a{r~PM~Fr(rcCBf+J||8<)S(fscHMxDZ^dl2Yv+-KJ92 zk`hVEC{(}Vb;8B!CV!Mw$d>1?Ij$>&pZYV=c~5VChCUM*r+`FkKA)F8WTB*<2|V%q zDYl74bXUO*9^9_E0S^UZPSj}QyRDWNqH5BD*7OfKnbqD2V$2tq_5!**5yEZbmMPm4 zZK_P+z?Xn3VKwY6v)^ZBG(DbPmt9Qc;$i>kY1MjLf~zd~7~(Nq&_=A-Sf+OCgNCH^ ziMps-?fC683q`z*;@!K{^0?JsC%-!!uddwTgsJivM0W`Z&TW9b{I63|UpaX^*FBtd z<%%iI1^G8^EPCJzQ}-wf?pu5|i0P7O54!*TF^TI_)e@q%A2ez=d`xUV&b6{4uk&Ak zk{2n4tD(R@Cac6chw~#Y7B%p_{4KgCa_zL@e!h%&=>SH#A{a!I;s1D+Q}M@#RtF_ieUCsu&tA}HjncV1Na~a z!L7g2(XtaGO=@6LGJ?BoH)zCpY1f(sND&U=Tvwvm{H5yYm(qekKj_sm-s^U*sBNh;42(V!Q!*l zGwzmh^EO!!gHNb=ufo?go-d{DwVRHR5xnj<4iBREFsPIK{+1B~B>u4`wQkx8HN2Br zb$cxX&A?1~X)Evjneipw{E~x%3@{G$c>x^PbUe8z2H052>g6oTgN@&e-LC>S5sN@G zEFf2(rmlkDrSWAq4~OfqAidoD1_@+U7!z}_$uYO|)nOT$iQ4zJOp!t9s%YCiMOnjo zf?E|~CKqdeO=Y1OI4G%SB_(San;Q6A$H~G_wl9AB|svq?A zQ;|L5f?ejR-YUV9s_2yqc*E6mw%AWXy50WW-~6UN+9o;)9`(SKDmRUKH(9}gZ}r!G z67jqKE6FM_4Vjq5`i*H9Cw+Qk&~?5;7QTldTl-ao#<|z#CDvx#^eM72yBQbQnh_;~ zaDH%t&FYt!Di?5*8)5nY+*{e3+T*c-E*a!IK+kUS`$>bf+}x0cJSM8h56oVz;{L2$ zm-=P5pmX1gE7H0=F9axP$sZt~_i_9iO6NwEXX02Wz89b~`eDlo?9n`JW3y^97bN22 z)b2!B9zpS;ElGmyBk^alNyV=)z=$;ztg7Xpc-`mz%;w~TPh$5|B4dYb8*ZN-@iu2A zc+HhPjf3Ky65Ycud9015O8cSa08~&9{uR!#1GW8MjC}_&nB4 zn{fuml0L5S%?DQz^%sm3|FI5hKF!&@BXqp_X8x6T-c_A}8dH9%M@{)PipI^_i>V2# zmFob%S~@P@o6f7_7qAKYXb2eDsjA|vp4-`8L=RikglE?ke!O;zMfvUq1<}+Y>%};U z0ECdsozC1?Xz>NZ#9W77|6fPezdT+5KeF`+Swkx<50^Si z{Adn@JeT+kka~*OPO>-SiHo|WPYDh)X&!QNvGo*8ttYaD@&grCp%7N?dsnz@vpvT` zMRX-RQiaS*d-|GsVZ^%mjGADyDb~5(ZVJtaPnQ^xw!oB_b$WrF)y_S;M`F)2dKk{oKrepj;CxRkA{y=Udo<~OyD*Wk)oV|Z+cBo z3Sg87hqRUCr456e?Lic2)WxUJE@>@3L z>7${(XCwVRr^&S}Z(-x{qiilt<%{rPVt%53ZC=kSk@?O?75oX80R*G)fe-Wb)5XS~cz3=L%G`NTNhr~Nr_^v_?y}rq$LT8` zmtT(2bYsV_1Z2kdXlo`>)?fA~-~DnJGFz^MxXTZyZ zsHPM=h+?re0+EC6N|D*;PYsnhl+XLdw`KM-;db)pqBW0jn1^+xOSUspElRPd^I*HN zk(_TKO4Oba{LA?7iJ(E@#8hX&NTYkf%y)nlK8TWS&%XZY^Q)JdFrqvEVybj_r^hQz zRT$PB6Fe~eIFOmo5KA7XS#SUsKu(J0qzh)MW7uHo24Wv<;QAeu^h9$n%k=cyJl2-= z{RYGa;LVdB6l3ZRuRb77i|e65NRgn&kfvn4&09X9dsv?d=ayiCpsOy+r!Z~g9<`M; z-=OXU0kBHaCQlCeI`1_iH<;!44?YJ;Ngz$Wu$%KmFSuvIwH_Gp5kgz8+#;<>q_T%| zQCMY}%xe0g_-x(7v+a*3sn(^EKf?!PEq3L1fPe(zh?#8xmE{&Yso#R;0_ObCAhBg8 z&D`NkxGc|vQ-lhzXaN6EmAW3PoxL3I=CPcHoG^VS5ks7O_Ge~3TyVj=1CJ{Kv(;y_ zN46(vKRUMiy^tD}TWVf9ES20v(<2qJTj_l&9Es_LbmQD$gYgK4+Nfqk20EwGY)VC% z2QyJ!8ppn%58euIb{neshKF+foX;>46`6LZJRC)9!Si#NYAIXBVfwzR4_NX+I`h#q@p8uyupCu0u zt_YnU&}>zBxJY1S0KLh-zbopo!w4Yl6 zU*dTNxz2KdgD?Q#TWO@3Y&5Rd!JPT`T&@xaKQhd?2jJC`lm9*FrbDme!T%=u=fwB! z`T))T`#)!Jsp~U1(*Exu7j5MR9M_(|gL(Vm%^}+)_xf0FZjErG0Z?>N=Wenaw3y&u zr2iZz@}6Ex0A&6-#pEepr|YkwU4SF^%a_*`DY&8VU{FO6D8p9AP!KV}A<8pO`q?)! z4UVSci}tf-YgFibL&8RA({P2J4uC&_l0z)^Hq%bg6UZ1*HnG!FC!lHjmzv&He*#)(7`%tUdZXV~hc8-@~Lehr&bmmK{)F z(D$FWP$Gp^NnVGhNi2t=#D~zW2F`@_k>l)`n>(4E_FuTW_8#3g=;9`zXpZ|d4AHoj zcAS`#z=14)cn2lr0h$JU{%1D7f|1UA9wTt6PtJ>-Mxf6@2ges8SOI{DEQSIeG{XzRqpUG}(-ZQ~EE~2c^@pQi#X?kx*ZVLe!zf2>3hTzkY30>65Kq zm4?MH_=uhgKa<}7gY*+gN_a#5Y&JLJ{TCr$l@s)JH-CFM-io(bbp-&_(9jM(7q9^i z*ucM0KqEDGxxbV=Ju#uBudlDCr>;<3RP=uJ&mU_u!vxTr$E&Bxme^I_DVLH9(E&Xr zI$Bk~has6iPtLsIbMMbiTuN#r_I>_Qc{sw2CSPKhK++HUFD7OzAGeQH(j`eW*56AK zxr*A<7GU#v1K>CSl|KrtFRFG+&0Xi`e<;sMUHKv|JjH|L`M4Z|M)kea;#o4Pob`&a z+Z%x@!*+F`N>5YOB6v1H^o2tnmj>6qtSDM^Q&%%3kha~ZSyCFDv@w=Nzku#)88 z&z{|gvFBc(IHM{gjY3>ODf3a=eIvk$+%?sW3} z0<)hb1@9R05w;Wj%{F=hI6+_2vbVQx|9ni{Oiv9o%>7g6u)QqAXgnrRA80V(e2*qB z#aEK)DtH=NcuJG{Orxp#DF3^U1?5yJoYI+RE3uCs3}m{d)i7U)0LW{ug{?=f)1)Oi zK-=qt*DOXcJ5Ij?Eui$t^9nf6}4$voP z)Uo#bSH2JcK*fRhxrWFXR7i|aF{+1on0v>IFu5Mdn(}I*qinP2Q`ueyz)?VNTD?sn zOUTaV*+N;84kMao{I({H;Wflq&i)bx4uS~sIGuF}sjBp93pDuLh>cW&W<<7wU-hX2 zvN$(M5~NM=j!7|LmdfSR>Y_3L)f&;-oNO4Ue^0z~bTqIn3t}Zl-6=X8UZyxP`iBpE z9jC@;(L_%}qr1**ZZVl+snLQuP8MQ8Ns)XV)1~C@-%Jc9dJI@p<3B~V)^aSgRIOG{ zA6ZcHJ{CcTj5z=efZMrq5%>beO+I5g85B28#GK5JVtD2 zVQum1uW<-2&$j=r!F>u>JD6wT!Z!mr27q+L0l|SZadnl?LhNff(sCgj zJta@tS&oy_(bq-|HIc z($*8rXqKjl=~hpbEGBq?NJAx#7Mt}D>S9xEYMY_b2VN~|8mkx8ws&QyU7m44hrO}Z zyN->?oG(mwJYOUML6wliHpn~M)jd&4hxoyHXF6Tg+h)01nldsO_nctV$Z>?;bd%3t|!1mktzd;D2Axh?bi;Oc*&3(yoBihBf(XRdG(Ez{v))OktC_QEX zge397tb^T_>s1qrf#YzQ;%B4WOaR^mBA@uG5IKpoTm3jyY{PDK!OfA^}!?V1eNVAeU@f7*NG$7mJN{)gQZE zCP1tbHv(<9hMugg)$UzA1B=+)^My=py^_mBmg^pyB_0)|^(ZP*=stS%J|*3A2c*_-jWxVbG#)LGdAaA0JINvT`B_~6QPJQwSdH7`(x+HZzGClUdt{- zk^>UO{5p!rH91hlmYvE_cJAQ*YX;KK{$$}Prwy}X)z00cOoI(8|1BCo{!ld0Gtn~_ zTdMf9bx(Q6CHU9r)D-PdS$6@rxtzT(^*9PDpE%V_S1Ec>99I+}`$Klx4IZ8jUv{qw zGH1iBv|O@DFRmyu`U~*_yl??fJQTVf4^K*l>s@9cTb-%^122L?)8W+Q&a`wqQzMK! zq-lvoLU4HM)y%qIkW|_E~>*aJM@C~0yKSSP#jltkT4K= zZ>SA=cu>ItQ2O5JNchpogrwZI`6q))Ao^r-7~x+Ut5k;e2+4KI0RQ=$H>obf@{gxw z_KK1M9vx*H-6{QS)U;tfT#w_gFXeJEVSe%bWFkv6Oo;Y@&QxWVb}ug=0Fz3o4$D&f zxg*_^^}$l#nCpHd6X{4*S>Y>Gyap8Cjc_a}49A3qgoYH04cm*gch!Fs^&W{2kncFk zG0ID8@YmPqa#Wt5E$J&fR-Am`-tBQd>{&H8$%$zEjU1y82ZvQ0RDsk1`t9ahuv?z5#$W!2`6B>$AO5++2>XwM zXUq`OdJ7A!LZ=MiTOC$S(3oTEdD2iyjPL9fY5Ixo`dn4%M1V0Nmihfx~TE0OVu6|TWS#^G^(A2$C|qIJ5uL(@Ba9q zph`A()(kE#Els+{aZ0S%8?55L2~>gBT4bs>H6?XD4jO*I^vU6XxeS+0GbaYD%OpE^ z5$VWvs=^}u{jsSE*L>pQ@)8@7_0lFbrN zc7q(B$VvzQ03W4||F%ej<@bIcL1c{e0{%GpI>EP813;51t5 zcbQgyUmvE@fwsbfwv46J)AQQ8Up2*Q?!^{SJ#_**{LNaP1F->Ob=8OMx{B@2uCYz_ zOPy<9pC6$QV1>_3O&Rw~Nx+Pll~b4R6Sn(`ApRTzu2Cw25#`Rl8J5ANHGy9Pr|q{j9L;P=k>aFa&Rbr0QWqrk!HBR6 zFYURON{4jaNHxl~nBg)>mkqVV!&>uTbMA;){Yr8jiP*+;4|r zuYrC$F|gs|na4?Cw5kkyHX8@_h~M3K^lLQK*uTJ?BvKG?{-Nw-KrZSfvvy9P6MUw{ zIJOIl?va{t_*US~kX>QjGKqUpmR>UdK`pMQ)Mne$zW)3n2s z$;~$bYJ}I%|1=x8EBjrs&ksIwLAh@qLx_;i(X-V}<=+|SFMml`$x^36BrKtfpF?_S zFUR5ob;F6c<6XiLPfW#vPw}ACywAJ9X*R_ znv1g7BkA>6pV7BjV1U0WsV*k0YDBUZdQA05tHxP+07FwOAA0DW532`!c7%4I+k#A; zZcP}NhXqwJyZ7PmF%S$Zf8@2Kivn4tpN&(lF+0EfN!}+jLWBWfntH7(%L2MZ_k;zG z`4BlQ1tSLkd1zk1Lf7e5?{`=xi>((y8%MGx`Atw2l~<(r^pABBZF?gzZ_sv1+Gq)O! zHZd0Q`*dO$!s1|}52{+?KKsu#+Yb%&rQWEJJ?T#4&?&uDI=6&_hQ))v_GMZ>a+t*b zt%|f!tJHnyk3IYW%w7hxi&me0=XiQ8e>lc3aT7sHWyFE@FmV|<`mss%vzUO<)oD?Od#n` zpVh(n6K!a%mfl;c@c?1SL4473E`t=aN<&35lMmQ0>4)snnb$&3L$u^%`+`r(Fw+A` zM=Ju=(izr*FnEH#LRc`w+Pqx7q9y5BF!vaEQi%3?46(1m zK6LwzCvG%%vKGGSycnlAad_vXA}*?PSA=B}w@DMDlZbO^3Tx9MQIWN&VqKuW;`<&+ zFFs|J!|>Z*Qct%*;idN0sS+^83M#|x)<9!CqIwt>F*t+feB-TrSbq{GHVzZz`{+I? z0=loUxl+R6bPqDnyd;h8Ub)x5-?1AM0}Cr0sXp}u(J)uQ@u0TUrpN_!M`?3BPOf-K zfuU1$t`{2VU<^^@W2xtP?e~f2jc78#yTm<$-?*I5#NA>R95R+vh-oks8ihYf&u z)|_;wOZ>ivp5Lm1<@gp6Z5WA-MzKfxV0KG;w33Qlo((~t9`F6Xk& zW3tJjD!NVyQfZEv_6xX$B6Nn>i)A*FHlxNZDu5&tG{@iTxR;y)E?40x%>67!AdG7Ceh94RM<=8l$6ZJ&}Dm!zYE-R>&zW-WWcD(I5N#@a+e?hygKLf**q* z@N#ekhtTc)8fb8bi~Abxc6)%a*g2E0K`Gc2lZTEBsn_xGzdKl1;$BHd&zwQFQ42jo zUJ3gggmS7e~G~{-fm6P zj}gzy_uBntKkDGxaStN012rE?!6-d(Rr~KdVf>01W;5198|UY1-?x ztT$Y~%DdYUSYT}TJN9_LRogVHPToyDF$&eA`{ocscAe zEWtCDu&*Vp!fP>(ByzqW<1l#ML2$xIsyA2sS23m&;)SnbSQ{&(X=eQ*!nkWdPc`1| z@s0cnRKmCr?S=jLz5jgJZu*PF71%Lv5}u?iN}aO;0Tndg_)f1zh`J z1=u-@y)1Gt!CMWyK6%R<{I&rJuj5o>^)iSt^+w#aV~r!f_}xhlJalDI-IWpVr67}i z8h9nv&(JgSCQ!Sc1++ODCbvg?k*9atm+^-mC(h?tcl%)`9{NA5MQUUqrwgyV)KgHU z5Rzdta1hwgW9*f}0i@}Ty`OmRgW0&rWHkam)?uBjq@MOU9DVbj1w}MRR1?shlxRInwIRvc9UAX^<3Akm>+AFsvN9d)3_SmWiQ^u3I;e3JQ*hVHDl$#d| z5@E3p{FX*@VV8HGql{=*=9`?1uK0aN=?rjA(1VIc2syjeB;CP&!wnq@;g&{r8F{gA z7v@Y-O!xP21Njf_xFNpU7%@8!q5mecsl|lnrMiOcP|q*Q82gXs`@%H1kZAT++TUAP z$PYO^3bpt=G@Mzi&y3nt>>eEEt@FP0m-_H6a*44ytD;op1bs?k9k%5|+C{XGV30;D zeK%-_IJyPcF~3a_qxKAa!-1Xk4h*pdnwJD^*aw!P~dN&EK7-( z`4y{N5?Er#+>S*v5G2V@oUVuwDdK0%pv;ETpz(-(sh{dBj?=2I%w*rxWsWEYkBNI~ z#j)oKn~vg69nNwlkOVP1zG)P^jgX37K@)CIFy`#Y_%36YfV~EgEf8z*Ge$<Ke{We5X2(=XOaI64e)2u7k%-vPQkP>`jrQwH`jGoAEUo5t( z81{Jn`vU8LnrPBlp^Y(z3-dM;rM7dW)>9Y!B}!l3MWv_naz6KX5ob^9p?mv+#_Ja& z4EaqCj`$FMF7N@suK`}WCQ}%+BH)+gtfd>oMgNMqFr;eunEYMY^GWvS_bbrXc^woxSsiOGZ z4YJ;c51>nan}3m%K(XCbTVJ2r*{1wt!c_0dd}qsTCNGowoH6}7*AxHefpGSHTs*Kh zny<$bYE61ca|ubMrycPTvYt%oJ_NTSzIDI%$;)vOnS@R~AOy2ywQKJt4jcNCiZtLWYlVTkBP%dezwP zeN??SzOokBUJr3j!P;A-;e56<<>}@Czl-biadzU6{%?pPAi`H}MSy-nKP+#vv~jz< zNbcS^bfRvm#w+tu6OmQE$rP%8KK&MQwi1$jZ0C7a_fh{p)lIchAMGddZynB2ANdJz z>Uvb!=MxU}%A(oZ%Y4Yi968$8tBtL1*ZX1I!x1y&nANjp9Lho+Tn-!_93@pQvsSd6PaPs(^Qy4 zKt_v)bM*O;;|~_Q)zZ1b4oC@s>Ulv4EAKnq)Luy3cG3l-Xwu`Nth9p*#U}&pC0XCA zM(XzkLk=2qx)oD5yL7e>oJ{7i&2`t&E5Fils(} zV#PkXaJL_PXr#Rgg5`fEZa2{uNN*H$mo5&$9MaLy#J&~q9xU<9gGfxoE*Wu#br1XE zb7SD(uRq4r2gAhDB;O9y(mu}z>h7D4KR7M6cIo&R`SdFSQc|AH7ZijuNL0{S>oJ=w z6>Rob*?+{i2t|D3gr6?Zl@YnA1}TT??^65X``;pOyep)F^FvBRnTp0c}4UE zXUx@s@M2-v_YBSD$6Xj%U>&oN;KRbiM;^utzL(;@z8){d@nt~(VypWtWcQpHYh3zd zVEphBDULKoZ$^kY?ZvKZ@Phv)FGQS;9|;LUW6R{Q=Rua|_4>KfxWLo`(<4V!-K{2)vY zI3=zrA1U_PKqpfIZ{3<1N+12jszdt-m}?LJ96cWS*1is z?e|&9T7u9kx^rL*(2h}!J1Y^GK7h~WkDNX-x42?&t%x0*i>>DJ>u{6`s4)_;BwXq_ zR~;+sNe-Q6rWHMsqP{SChJj>+{_&dgbl{R2j5Q%qi*@vG(w&p0aoqj|!0& zgZg?F$-fmTP~uf)U#=P>P;wy&6Or;1$nC+tATZtp6W%LYS5?m z=cv;xX|?y-Dryj{t}smj2qjAVJ%&ruoiO{XfK2XCPG5d;89k|crlgF{Xd>c}eEO=$ zAyps9gU{Gl*t^t0cngGI=Bh;~7TNAHX5sOCDyQudl5@egSs6crRkiema2U}0P(BpfhZ2NW!`5RRPS+ZGc|7Z-A?783w$ z{o|$JTrplwWa71oEcGwm1KMR$K*#&N9mtlFzIWp%0J3-{&VKOhMyYl1v+G(5UBwx6lrxke`%rzB@`(r=y&*07i^r{Tlcolocl&U z_OapQ+YK%30Q7>|#)NM^6$w6mvTf8^-5&=!%jF57BYNsdTlJOA$ppXF-5+wuBEo41bhMOo@J18i#&Z*GO z%~mf}sd3uTh`hBvRl8_$SsNjuP3|D2OqK)<%%wZH5S}In zOUg40?u&kTAA!lVEH?*O8&ow=3+Qqhsu3uN=oOAm8}CJp)ftPHcXnJkK`E0vPs$B+ zw<;z^wf5u>nkV&4w7F!#k{E#L!NAlTtxs>iav?AHEcIx7MEj+F^Y)~!9#9{syU-=2 z1U5Ka4Tt6o7qdT(mUo-+-rnf5uH>7tEeU8>Vcn@pLs>5jAm2>5iZ++LCmxblB^#>~ zOc>K{h94UfY;Dy|&o;arS;umY%M1rGp#zRSCk~RkPtluWe}6R$MtQ3NAHbmD|8fC5 zbCc)a7r-^Zf57+uesN;lMTCX2S@1bGyvNXv%)fS81#Ci4Mj(KX;AZZPUC7N3*A^qd z4>!Jwfbqz+?Z{tqkVCZ_M?}DiKca|60L#qtRDclX25y{Jftk0R>6^L z5gc1%&4^fLg!Qi;2;L&IJ)H!UML;pb*=e5h4mM&=`d#r|OM92W$9PhlXxC10K9xCX zq8pPyz}9ECV~#cj4b4}D%-T5Kei2JvM?!G56yH}70W{e;J8g11 zf50IXzD`Oq>ccx+#dmEzWusmv^#7~SlX&II9S;CRHs<*a!8CQp`4e-K9d4R!@JBH0wavBh7^><& zC7Z!3anB2`Eyu(G6z4qv6ahtM;Enb!Xi4zJbtlt7Lguzy*Iif}6YU>NUe&%S+vao3 zFLTO(Tf3$J*3Yk?uiT-aJ3Hd`JL32LC^3te-e+|QRw`-5AA9$HUFq&8g{Y$^Ru4$a zBAD#To-iz*n2*jnRi(H$s3m&}vizc^(%0|ZK3HnG|KNurSv?1skE+JBXc^s2eAiP$qgh;OJ`4x6>_cGAmT zo+{CQ`)Hi4p3z0!?9ADlZ&vT|rsA7?y0NZ4Z*7f>g0ZPvDh$=nZ@kblkB31GVb8-WixbSY|F zSf|u<(l%c}tjOz6k=T>rGzG6)z7)v;=vQ~T%3U4?GiEAt4FV1$Gi?eL&%dA*VDqP5 z-8{Z1w8YkOWF5b{vIW^{ib-eBHL|C1pbl6(k8>C;y$eQ6_SJlVUVMO3OjkD^mKn@= zt7f93=1wbjnmxJY{LZq3%CSYl`+|^R?n|QZHnULH%VW;^-TO$yBc!A9c1!Ro%=41! zdYXyWA7gY-#aBf^lkLTR>U0!Y=d6RWp#~n*59LE(-(R)9E)L;3vq~V$R8GrMKCY=K z*7kmJDf3Iv`I@iM!d*KbU@xoo*SQ-O{@gzgA2SppY;Sb|3+)57F(6|m!)94Gl*wd> zu2<0XeseulGO;--%^k}_K{w(UrnL55{#+xc7=?3cVvhsS06)O7lJkQ?5!@I!81!{0rWrSV>uFHS_=%k zveGv9yLZ~XadALgtCbSK3N$kxs<>HOoM5lfGC5Rv4Xp*f*M1%r4aeb z2-Y!h>E;JK+8bgPxpn^LFw>LYH}^|BT7KNv-mw?X?b%{QJqB1_;jW%F2k9l;&QvbW zRNf14o|xRId)DvNIW>)#SepSG)z>R6JfV#*-$9T45NQA*D; zNl7Mm{+Qp;{bwE9%+}RB1ZL?iGuU+s*&-R{p1G2OkxU-Ce1IN?Lqj$Tn}h0}Cf_hO z_fmnzCaZ(}xfhhsqsEbX1*#B0r*$@BX(A_`CM%tG{`Ae4lCG`WD4y`)c-7evy7|tb zzv@@^`a}YkPRsgX>P%t)Yj#3FMkY6b%(51k)awnMSFnpspNuqX>~$SJN=f$E5`fj& z3uTW2LnA-{F$VdG-Rw!d5@m=Jb2((!FI&?%{dk>lF!ypW*VUs*?DEe|eQ}jzD}0>u z-akVNWr}lM#}&E4TKpFqPa!`6vNc{b99TFiAT0C{-8;PX%g3qLtp0j2w1=`i)bg-8 z|1hQna$)(?yf}OY@>CjV;&L=NQ<*fYU+~_lOCFKi2_|ZbMC0Q$)BE^cY42$ zGjQpbd?m%jea4-!IcjElKkF1`G&(AsDP?r>p~GdpBv|i)LZf*Gb3XtSG8lL0uj9R5 z5_ZFz4o)rZe{4TFfE7txVTxM08ywakD%M~FFGu)Zi-qhB+)MA2sc!|qx#_v?(EPV)(p;9n@{-?~O+CI?YX3XUS~079 zWyVkyQeQ~@g5$E_&4f|q=+UIX^^+V9HbmkyUH@s_kwl*T9tm@SeSW7?vaCnNzAC83?SQP4QT7IdGS>VMJvtyqD*)2Bav-_ClOw3o$I>P01ufDSRZ z4JemHL)BsCA?EWBb`s>O<;d=%LC^XZeS162283;+Ytb5_pdxVQMvGwPLU_%Ez~fJr zv6g677YrBTJ+IJr(~nxmszkr|YfdrzCh}nk(-{SkgV2O&aatXYlas!L@V=hwHRLeF zBF-&8AVO0jetZf&XIN(P;?V7V1jm%>$jBj<#A7&Qd{3-DT6fD|Vzf?uX@l*pm`7KE z(ddS2J|d~W2$pJG?%H4{3|l810g)1!0|Dg(P7a2eK9gg#-e&Ql^z^gzAcO|_iPGTx zishQQ9Y!>nSUSSu=PzMXGuGIg3)camn^@`zY>^VV-TqBPA0ucK9Juq5dV=};ipG7g&=0}0%eTKg$&h(?Ekn^}^LjDqi+&KY@ z2ED?Ij5iY?%+}xgzt2A_zqlyMDTMHkvyZbnLQj>)t}-Wi&`qqlbg>R!Niyew=ir6z zo3D_ACCiCJxM=eXuT#?Df@M-2ugW`L)cHu}0`axX0)v@<9-2t;m{f||Q)A+ZaXmxM z6wR4*huo&qLF0HBA|wy)k%pkt8$~Mvj2?j`k<9BHt?4B1szh;KHnrx?^BsXXTc+;$ zd4O)fY;^c?jJ7RvydMpfxJbtqrd9y|pba}mOK&q`@j=7N7#3cyR0M*{1jHBr;lL*L zDMBuOBb@!{A1#ps|GDm%372&0nL|f=K=ioMes0flkE8k-dPKBv3Q-dgAey%<^-F9npAx6lejtbh0VY=eK$?TILlljNz*1ksOWa zhHeH5bd5noezs3Z6}tPY;9zG+4FV&qA70$9-8q)gL_X$0(aho~tO{#e-@Oa{7AO)| zged0$_nqzXmQbyxkT(OsLC5umjmrKe&&-EyF|_10-8sD~HkgAm|6wZ?V08i(0f4Dg zH%`raqH?ZA-n3}4WfcVcxwlH=^V>uSv>yG)^V9aCUbqtSJ-=b`xoHT!i|cDI&XTlF z<;smfHq^kBn0s$@-7=hfk9&-@L;95#I^P8$9^Z22K^vpCgoq>`qerA6@FRioxMt?- zT0b7;bvi-x`sem8TbQ(iGC$~#mPszIst}6Qw17@~2870sIJ|jt;K0}rSU)R7^3;=t zf)uqv#o7W>xSkzPlz|>UroQKitx^&r#6mWrtRhNV045bq$-Dkad(qP#MbYBccc}IA z#LftO)}cmow3q;@ChGEb6?{R3$xWrS!sf++rjY$y?Juv;IDI+(%O~KEM^?1lA3F;i zyk8VPo_f)q7r-hVrjZ>&KtNzZJFvFK;=^^R2p{U&hk2|H-Rt-yYXooOko+vj{vv|B zDN%+u32#}6+hZtz8-}*#RVQEc-EO+-PHSbNxR5rzeUe!eIxjH=F=vhaJ9+1(QYU$i zH;Zl~atHaHqn!LU@r1oX?i#{}W16EiSz0H9ZY@Zj%g87YB5<=BL$fJ!CdPQZw=S7xt^i+hxIeOe{uTqUHLE-jIgoCLz$2M`j zJ%#(8kt?$0KkAk0(k0%@wypXTor&&HOWf7iy zqZBY$27;ap$34g!kkHE+s&m)v2 zA|1p-^Ni%4xVG+@9qDX1T}i4XI{_Wb3V$S?NH{*gNBuuCd`#Un@&tYc_oiOr4Ktb9q#&-7b%r{oN=Zl zWwh368nsOA^RS=vzL4m9q5wt6Z=QYiCwpsW52msTDaAhiQgyYk-xE#|Y-ZwY|9oey zYcQ2TTUltI(d&FqE)?1Xzi_7&&|g_v5TU_G&u1n0#uN4mNvRaLN6{!?VOCKcHqswP zEAsH+L+$`5BbpbAFDp2*z&#anrL{HDIJc%RfDV(3KyVS5T}FjgfvtOep$XoE~}x$4@7PYPatHI_~^Y31qo*~g2B zUgdK4wgt-%OtSaNiB?V6dfG0Z`jpUYE0HhKEWSAS#-<^=9Zmm+eW#-zA3H zKHGx2i^qET4`fu^2K4vII@_}N$OMs-xJkZvOG;u z@eJ;)=Jpx{b?s_(HU^hH{2A$AAP(!e*B%|xyWnr}V#-sFfwowc^=p=H!5~O^;ZC|- z?vIn8Ef#U6IyG4s0$rEmfKpS&pNCUmo7DsjcAp%N1jk!_AevAPM!kNkrLiKl3XN}W zm|IJa>!2Wres*W>F~V*5bNE1i`ao_dd?OHgTk*C!*U*Fxsw3CzD0`Xx(g^aj6o)-D z;7@p_!|ZmG=+&#`uDTcR;Ap~FZY)P*i(MLYC(qI3>TWE%)i&EdD&R`b-spH$BPKX6$l#~5l#r*f)_1<6VBF@HQ4hF)aL6gc<-4q(IG|I|AFQeF3DD2|6}an|JSh~XAuM4; zse*z@y)VSm)CTj-Co3(x`CoKe6q!Xa$1n9b+PK)_uBl1GZl7YXtUmW-MWmT2uhZCo z;Zb7vCaY&BXPC@H10=`{`1WOyVt8fOy!5=Cp2M0{?@HyA*qiQuc*h+i*M8zxF#lSs zaQM_C@lt^Lm7Y{4I0z(if-sBBF=tLkHFcUtQo&9@K!4J)G;th_-BX26K!aYuD3$@X;+<^D;P z6lFe79Qvg**k8YMsx^T@q9=Q^ltwp z@j&1&gTxvC$>}LwSy)<__pRYYwug{K5eUz`Q#0na9pk-iG(RoBcV~9wTIT&d` zI-CweB!PH0a=ha0ZlD^rXO(z}PyqHz>IuRH*-x||?f0}H>k(@VeLxYz%XbX2O+{5^ z8>qRzgfX z1tr}aKYYcse<{36Vd}{u{2nm4;&yy;5rq2z09h<*$EfS~@53G=JqMRYKYRC{2cTNwO~`B-UsGV!3FO*ZSpl^$E^}I*)S~NAqVF{ySg~pM+=;=NY z^n%nanL>__;uP1qYz;~+LT~HEM|zi!sRu8PROJGzOW`?rYB!gsYU1ki23&E>WBfW? zDg7N&OsbV%ct1#x3@cLa1BZ>(=yKYvD4K&j1Y;$W<%)m>>804dB+SIYncoFi(-P@Z zO#$10BSaftJGPGR)_Vr7J$n7;r2VcGPXl9#!7E?ZP}3<(m?~u}a@+Ag^Qj_$ijZ%U z3g=io3!Kw{V=gu-^F)qJS%eeR?_Mw%KHtf|OsSbwuK!Aph-2gtyoE=fp9zsK3)@#q zVO>mBF%~1s2M-Bn!l+N~3^0r^_J4dy&%X#A$n=57{9<)~f$@R`rx|bmWu3HyLmq1L zbW=?|NI96%#S!c1D_t)QKKRZzjm>>4A8g~D3IhxqfhAxtnL=~#Gkn7bTF^bVoTGH< zQvG*-jH^x@EKA8AEPEyYmaivu+|NTc?Jy<;pKA@&^=3xRve|_C5{FlhWJpvLss$RD?AIkA4BN1~J5P1~TkzTNse&LxRLaI}4 zT8RCuy(&KL!-?Go-z_`948UtJyew>>|EaK_(QWgiw`Ng_lq_VBz(T}35fwVoy1-s9 zthlY&pV{QH z4fkUiNliAr5F^|@jE7mjVfzx!G9o7vm%Z**XTqC`!S!_Nu!jL#x$<>urf-F7&?BsW zzfy!Rdm%;(kgOgh`{l`DUZrCz6E)D^k$-aF2#j^|k3e?`P40=_UZ!WB#<=ao}VXa`DNO zRIk6F?eKk){ex}_-V)-;56)GTUD1gAG?~iE&+s_eXXd?;z4_p2MAzs3M8=HDmGA2# z;l-F0esf)u6M=|wp&$@~ZrKaa`=AQ$94cdR&pPNc^#x4oQ7%-ADA6V}Z;7+ju|xbU zKf9L|nRPzK0h5;%bqrKMvy$EVfMaJ#9y#&k(IK)4&}gCj4|mTk5*)TOAY0Zn-j3VT zp3wVC#uoiOj$&?bK!Q2D&CXjgmTsVNyvHGA`2smnrHgd^(OAHj402LFGz|P($N&d2 z&&nbJDq5=0j&cC|Uf23qceZ%;l5>dp^}1SdlR6lPYkJ*kiiCi5slzLaiOn;}mULjs z|LW_y!ZgEHr5WBuJI0NR!@|BE?XJfQ4S9#72#RbfslMT2ML& zB!rGg5s)M_1wu;*+)3E|zWw9g`;doZ^3I$&bLPC0cTV}u)T6e_l&_UkIzOLrOyc7K z3x0g77P>n-en#PQ4#VxnI2u{8r$mJ@LQ5&h2e&m^%I^?^&K`T709Df!!2MIlthWRu zO;2=?V^oAEf#*A&mhxm`kWY2GGgN~b3dFHCw%}C(7-8fI-cJk1ev*#OR<<{f|5`c3 zwLc9(MP0{UXVw&H7D^Vbj`uqA57)9eHnf-0^Un~xE1MobbHE?RD(sFuYe)k0ypF(W zv*pGNbKs2weube*=?^0dFPu#>c7&(CmBhNDV_Esjf3uLeGATCgAfJrUJ4lZ0EfLx* zkdBSL^gUbIR90kauYlsVUfJOuh&b5}bM^sd8cZ|D<^;Ck8o#(x&!?_$Yku$EK8|a~ zrq8QP>>Je$dw#&@>+Rc${3fKlobC&=-A~z-IcgQV-?``z=aW4;JcFxL>!JC5W5UEa zjWxE{_Wme*@&4WtM2^kET9*5|!yRwrH-i;Ea84H z^Cw-M;ho(8S(!#D(5|vi4#~-0{q`*{g)TXo$7%)%om@A8{ECF$ih_Ervd{gQN4wear+j{7f$IW~#s zajD_T?PYQfn~kw^vrW00U*5v<@k(cI-|GO*LNTe zMCp(h1^(@p2KuTd8XM%{Zc{{6S$rtP2#n~x0=S*71<^_b>G=+su1X{0UnySo!jr=v zTCA2f;l-pVs9hu!tL7nZT4br?oWjN!g*7$D#yQ0jdQ58SDSH09vdi8(+>Z%j=IXYP z`ag-3qI1@$0Wph+^0;h+q2a2~rB6Nr#dwiUyQX^8FWP!XLlKp({*$d(#Lg<(V9&P* zEC~@olIjfS7iMb9=M8+W!ZBUR_s+ziQx)65<#>l1S2>|O5@5JzHfPie3avd0L!Zuq z8wNQxi)Z*55?UwEGX|sI2u%x*yIEZN%Ur*BJ*f05#U$OUnI0zSsUFw0QtLO?7K8rd zl>IaELxsyTw32uXYfTE~*hmWIaB2#MZ7v0Kq%g%Gbg~r^-0I|IqW22*dOjQFn{-#{ zLri=siHS3VP75!;|Iu;fyqL_XIA2=+_%C9>Vk~QLapS8wf77EU4$GZ%Z0xo3VQAN$ zA|1}pV!v4mRe!j(%aksMCZ!rM2FM7C077KONPr@EF^Y_D7@z-L{9ofL9s}(B#{je> z+$P~ARc@1JqIwW4JB;M;$AAj>(PsP{g4Lg~Br|ec!5ib^|6Awpi{Onx0MKC)m}PnF z&=0tpW$|BIeA8lc@@S){&Hk`EFJRiC>R0!xpL?Ok5vsa|8&;Zzro#s$KA{VVd>_W$ z*L8~1xB(wvDBJly7AyXPUT5e+BWElDX>fl#y+_~uYDLZ+cm!yJX?vD~Ca%ceGQcZm zzmWY!3;sNA@U*PXvKYX%08yRnph`GEqKHcPG$sD{SHV5cUOD8KSEQ;H0iQdATml)Q zUbH4erBGIaKL;L-?i{JG*u4@-hJ4IjO@9@9&3@#w>@Ad^3KK#3OCA~W%0YXweHERS zMogxl`1{5vTT;6?Gj`b^l81&4czO4309DX>*b$c^r)>pq~qm*n!(-L_PM# zm;8UnDKVXf45#PcAxsQ6C3rE4jBgm9x55T*!GhL(EI<(m=*@jG;b3P5N;yy=YnSo? ze=V`U3%=NO|Dkmxmsfu{hM^iuGS4gW zb5kdW6KouYrER)e&Y{^qUvS!3Mnf1=^ocAWS@GT@^%CSC)7O|Z1Bq1duLQZmFc8Y&eJMFmE((=)9s_QXYxceUPWrw;q*JMsFN7^oFLvS758Cav2qz`RSLh5asuqnZ@c1ky^W z<(QeJl~D+TqY2)?^_X5A?iQO3v;9JDnV7xig&cpLI+}4MFi+@Y(j#-3H^XXY&%Ft~ z*tRk2C5XcUgj?&q6iXSD5Cj@`VPk`Wboj}y3w>yQ@Qjapl{5iki;)Ul< zt(o{eS@5yNnL%$^LuQwIh6a6Wx<-lEKwjiQ9wfEKbQIR~uu5-NRq?$zlr86R{D>35 zse}OWK*@&qT~mpQtS;I`lb>H{!dv)2s7F<()5_&=7EKm@Iy1y!g7;Q0tckpJkHYtm zLjLtGI5M)?Hj#PDOeppaOJ9&(xJlvDrL>P&&|FePn2=|x z0RH0-MnHTRAWy26yde3NmEbf_fc&bfi;pZQ;0zg3MDgTSh&~?BJVZS(o7XaXovWsF zzZ+CF&d#i@b4*ROG?`qkcKmdvZM>zT+Yyg!x0`+$UXFaz5<{M2!uiI<=hVguKQxQX z*Wjz#-yS>=gIxOuV=;2#(3J!6F|9i2of^t{g=cJ~zP=KTsRtQQ&|H0kl^b73zj`O(0Xrlc?*@{6a z6M*m~sulJ(92cjY*mmt98g9-y1|uA_(3i27AsAGM9u?+^AMA|XQPp730idGSM*CdK zS21%CQ6xW4{F?OI6{W}_%W>S)ayI;=z|;M|5FdQp9K5O1qd~gJ4gnPOIHZg#51sV6 z;6K=gE>UVKs98$Y%kfFpt56|g8Djc(K25AW-HL7{R(t|LsY;)ADw7h*TEgrgyk zJFT2OPVYXKgi^>9#g0Vi3VrixydMwU_Gyok^bE@i{43-+?H|##-BZ^+z)N?DM$e$w(4Xf3Bo>F27DB01xiin*BH)2^pC?R{L4b1};YG?EO4^94T&2G#wl zBT5)K8)b5`MP7*K4p_HXKYN21?1lc6ne>y7XVP=-3eTd!`0!8^Ps5C7?WK#-H0ywj zmw5m8IKjlV&kJ=LBqa&--RTI)zb?DwJ$P&8q(|nuI*6V!PU)IaWr&?A_w?z2=V$#5 z>XO^^(Bt&+pwrP#e-*Q^G;w}ZmEQ1-WmQwZ3S(!fImAgtawwliY8A{z&_y#w<3^|1 zVtQmBQ6vQR10{@MV{`|*Gik)T=l?u%;#>@2I-%3kgT{| zc3%4Sy|z*%q1v!L4a>h52gi&ba!PZIT)Dm;9k~Cc>!wUBFtHR+qlCrT4;ziZc`r!r4IKGY228wBGIGLE-Z%st3g@L|YtOFoRh-y2sGe~7U2vQBp^HF< z*Rf#_en>UvQ4eFd^ds~I)`UjY4+wM1YrJaUFl=3Kiup600+iiTSu3sNhSGDR8+2=g zD5uc==m-Ek+{b==)+vb0dByh4`4p|EOuSsU+70mr_fX$HNbR2oE@%Un znBe1WZ8|I-|G5CIyP$jhEVR8>T7dJZn#z9dBW`RXwoln1wFxjG!_~%`#4P{3-ad6j z_TsmJwoUAXch2YDIOjdNCiyhf&iuo&ZFvLxo%;Du>JRI|1nPP1SxChl0U(Yu_~$EO zqwap^{#g!^Z}|54d7d7Gy@$^(y<39JT-9uVyoykLnvnHGt6>?;&omoXNW-f5yI?I_ z>ccb3M^+m-&?kSy%G>gA!4kFNl(^;lo9FpCafoC20^u|miY;-A?R3Lv6DQBjt>41; zY(u4@BcgDnDKi^K4U1-s8_D;4;4<-ic$4$Er=<%)w5^RE$fUkkD{U04Ior0sVokHa znQkdN3EbOHtho#z*su*2@2CU?*vdZcn0uLFCs?($cx+p)4Sh(0sd;lJozye>n2UZ? zEitf)#$OJ$b&KJAwz2#Ucrdk#Pkcl zGbM49cgZawcO4TV5Gh^?#D4jQ5oroRLR_K>OAjTB`~|kydX?LkVL5QEp4_^Km|K=w z0y)8%+SYjy32TTSuH6c&E66gXsrrw&6M`yBUw!qxZtn3C*7V9@KO3E(aOS7_@ktH= z7`$`U`stz7*skF&Khxi(Tao$lqHH%`Lq~&OKQgN|{4Z{5)x?3@Dp|Vd`i7aKriaqc zv!+VfhYj=HQ+bAT!zF}u^Ocpzs~a6kPk_-zk@^l9b+UB$`+tF`_q4K#7fV<@AR8E~ zphS?FC)aFfCwo{{8{LbKXXC-?Y@E!coq@OBbx#Gj`Han|dK2&Q95Mxz{6e&N2bG~3 z%pV=OATeaoV~SVfYsOm6z=NI!-bu=4NcO+_TQ+v@99O05rBHrISfq7iQTQ~dFs#_v ze}Sue%oqP!d>bqRqbj+p+@uNt5}=Mb<#Jwn(7%p5nCWpTcP#4CYj}^RP1094=Ky^1 zX5np>@dA&wb5IfTO7_;WHT{ot0j$7larQ31X2lbpKc|SxEA&;GX$DwS*sIhhgsr$) zH~fv#6RX^PWzi1!YOMR4vwP2Gbaf~x1a6Mq@uHMdtE=m%*FuszalP|mJ|<@@DUzA$ z&t>dhL-RB2;kN;r=jwkXbnN}8d)C30OUUiKV2-;na=c=}W4=y`V>ta8VUl!J%+Ghp z(JW+y#=80asDllw3FHayN}j!uUn~?ThqZv_fJC`VvqaxH*|SBga=d?r)76%KA2L?Z zb=CE*Ofqd${AL<5rYKNMiMnrUm7KC1lJ}3GQ*>TAe6|^wqGK?=`i<;TDMVxg)vHh7Yec zzSJXV?knXaaGechW9?S<=C2TFc_n#G<83^9^!c~%17}Nk-9R@kzQJqmbMF7@=4)A# zff7C={toB{puyi&5zCFcf2ZxOcLKtKe%n7yb3xPD!EK{qrUcFE)wtfYq#QapI!MX? zbNSwzvlsi=i5uPZQ|5P7xIfvVcpIUR{=+s|m?!(9Go>ua>glVv4a0fzT+H9n4KDRt z7yTG&b241+Jn6pMEy2n?25;`C4nNU2CFgmuv_#>YXk=J+x=EBuugSMu{nxg*eV30$ zz|LF5R!Lem*mH*5s802$dlL6j;fl-6!Z@gm4`HB#^0R}2=sV+3R*!Je$Mv~)S>>R` z$MRikX4CVPhO6Y;MOdo(E*1LBR-V{jj*!lj&3|q% za%H^SPg`j`8!f(~-J9<>P@O?Z|8`Yj*`^nHk#3(1&v2wxqFig1r7sIFz5l~-F+VPC z?z$;N4HCaPQq~NAFo$YQ`=FAti1|iB1oEkUEJxny_53!=;SGgBI*gdC773?^KxPm&NvgfIk6|*dOSNn$0 zIN4iafw}7#@-#i2r02QnFHGHfN-{7Gbl4$d>n(v{7;Gvr!{UQM3v9j`XrFkf%yk}!1yr^PW#u}5c_JLD$&YuZ%jmN*h-0C0LGpv^e>)!^i!etEldHkpJFCFG`NiciiP6&eCN5Ri#Vv?s^r#0MqXSF23?I~e+n*QwU}>=*Z$ zbGMBf{et9 zrr6%09q2A|h*6qz0QI|443q|DXVd3i956UD>}C}^i||VHSPV2U3VIde=nGYfH;7!I z0pl=379)MqU2o68{3`3JEI*vc#N#sIe(iIlY0;sU2^_U=>V14L?@Ll_Gt)r?xlg1>3E&n*8kkaZg zmozK!`<3VG3suoC|0?A^Cx#=WfBBgkNM}%|iDfs%J7&USMY4W61}qe1;?pzXN>lw- z{&5hyj@`j2QGTh=>BesiF+Mdo4^v8&Hf4Bbp*Ev6z*qp8l0&Xu1gZ;$$}dg?Im7~w zsm5O}>}$T*E%{6G=R-;26U4>bCkXM@CkWAqCz#8$Cn%lj%_e2z&Wj&UbWQ$T{YkTH zaWT|s{{`|S7y`CSgnX;`I7gLdtKSGC_e$TruhX8gE3Tb&iIQcpN8RD*7ne^2G3NuA f#6Y9}=l>yrB-!&Z{6c1Cj9S_n`mmxK)=&QjJP%hj diff --git a/app/Http/Requests/Request.php b/app/Http/Requests/Request.php deleted file mode 100644 index 76b2ffd4..00000000 --- a/app/Http/Requests/Request.php +++ /dev/null @@ -1,10 +0,0 @@ -setUserAgent($user_agent); - $os = $parser->platform(); - $os_version = $parser->version($os); - $os_version = explode( '_', $os_version); - return $os=="iOS" && count($os_version) > 0 && intval($os_version[0]) == $major; - } - - /** - * @param string $user_agent - * @param int $major - * @param int $minor - * @return bool - */ - public static function isMacOSXVersion(string $user_agent, int $major, int $minor):bool{ - - $parser = new Agent(); - $parser->setUserAgent($user_agent); - $os = $parser->platform(); - $os_version = $parser->version($os); - $os_version = explode( '_', $os_version); - return $os == "OS X" && count($os_version) > 1 && intval($os_version[0]) == $major && intval($os_version[1]) == $minor; - } - - /** - * @param string $user_agent - * @return bool - */ - public static function isSafari(string $user_agent):bool{ - $parser = new Agent(); - $parser->setUserAgent($user_agent); - return $parser->browser() == 'Safari'; - } - - /** - * @param string $user_agent - * @return bool - */ - public static function isMacEmbeddedBrowser(string $user_agent):bool{ - $parser = new Agent(); - $parser->setUserAgent($user_agent); - return $parser->match("^Mozilla\/[\.\d]+ \(Macintosh;.*Mac OS X [_\d]+\) AppleWebKit\/[\.\d]+ \(KHTML, like Gecko\)$"); - } - - /** - * @param string $user_agent - * @return bool - */ - public static function dropsUnrecognizedSameSiteCookies(string $user_agent):bool { - if(self::isUcBrowser($user_agent)) - return self::isUcBrowserVersionAtLeast($user_agent, 12, 13,2); - return self::isChromiumBased($user_agent) - && self::isChromiumVersionAtLeast($user_agent, 51) - && !self::isChromiumVersionAtLeast($user_agent, 67); - } - - /** - * @param string $user_agent - * @return bool - */ - public static function isUcBrowser(string $user_agent):bool { - $parser = new Agent(); - $parser->setUserAgent($user_agent); - return $parser->browser() == 'UCBrowser'; - } - - /** - * @param string $user_agent - * @param int $major - * @param int $minor - * @param int $build - * @return bool - */ - public static function isUcBrowserVersionAtLeast(string $user_agent, int $major, int $minor, int $build):bool{ - $parser = new Agent(); - $parser->setUserAgent($user_agent); - $browser = $parser->browser(); - $browser_version = $parser->version($browser); - $browser_version = explode( '.', $browser_version); - if(count($browser_version) < 3) return false; - $major_version = intval($browser_version[0]); - $minor_version = intval($browser_version[1]); - $build_version = intval($browser_version[2]); - if($browser != 'UCBrowser') return false; - if($major_version != $major) - return $major_version > $major; - if($minor_version != $minor) - return $minor_version > $minor; - return $build_version >= $build; - } - - public static function isChromiumBased(string $user_agent):bool { - $parser = new Agent(); - $parser->setUserAgent($user_agent); - $browser = $parser->browser(); - return $browser == 'Chrome'; - } - - /** - * @param string $user_agent - * @param int $major - * @return bool - */ - public static function isChromiumVersionAtLeast(string $user_agent, int $major):bool { - $parser = new Agent(); - $parser->setUserAgent($user_agent); - $browser = $parser->browser(); - $browser_version = $parser->version($browser); - $browser_version = explode( '.', $browser_version); - if(count($browser_version) < 1) return false; - $major_version = intval($browser_version[0]); - return $browser == 'Chrome' && $major_version >= $major; - } -} \ No newline at end of file diff --git a/app/Http/Utils/CountryList.php b/app/Http/Utils/CountryList.php deleted file mode 100644 index 0d0327cc..00000000 --- a/app/Http/Utils/CountryList.php +++ /dev/null @@ -1,37 +0,0 @@ -getName()); - $bl = strtolower($b->getName()); - if ($al == $bl) { - return 0; - } - return ($al > $bl) ? +1 : -1; - } - - public static function getCountries(){ - // init database - $isoCodes = new IsoCodesFactory(); - $countries = $isoCodes->getCountries()->toArray(); - usort($countries, array('App\Http\Utils\CountryList','countrySort')); - return $countries; - } -} \ No newline at end of file diff --git a/app/Http/Utils/DateUtils.php b/app/Http/Utils/DateUtils.php deleted file mode 100644 index 52493c49..00000000 --- a/app/Http/Utils/DateUtils.php +++ /dev/null @@ -1,32 +0,0 @@ -= $start2; - } -} \ No newline at end of file diff --git a/app/Http/Utils/FileTypes.php b/app/Http/Utils/FileTypes.php deleted file mode 100644 index a80afcd6..00000000 --- a/app/Http/Utils/FileTypes.php +++ /dev/null @@ -1,24 +0,0 @@ -folder_service = $folder_service; - $this->bucket = $bucket; - } - - /** - * @param UploadedFile $file - * @param $folder_name - * @param bool $is_image - * @return File - * @throws \Exception - */ - public function build(UploadedFile $file, $folder_name, $is_image = false){ - $attachment = new File(); - try { - - $local_path = Storage::putFileAs(sprintf('/public/%s', $folder_name), $file, $file->getClientOriginalName()); - $folder = $this->folder_service->findOrMake($folder_name); - $local_path = Storage::disk()->path($local_path); - $attachment->setParent($folder); - $attachment->setName($file->getClientOriginalName()); - $attachment->setFilename(sprintf("assets/%s/%s", $folder_name, $file->getClientOriginalName())); - $attachment->setTitle(str_replace(array('-', '_'), ' ', preg_replace('/\.[^.]+$/', '', $file->getClientOriginalName()))); - $attachment->setShowInSearch(true); - if ($is_image) // set className - $attachment->setImage(); - - $this->bucket->put($attachment, $local_path); - $attachment->setCloudMeta('LastPut', time()); - $attachment->setCloudStatus('Live'); - $attachment->setCloudSize(filesize($local_path)); - - } - catch (\Exception $ex){ - Log::error($ex); - throw $ex; - } - return $attachment; - } -} \ No newline at end of file diff --git a/app/Http/Utils/FilterAvailableSummitsStrategy.php b/app/Http/Utils/FilterAvailableSummitsStrategy.php deleted file mode 100644 index e97efaed..00000000 --- a/app/Http/Utils/FilterAvailableSummitsStrategy.php +++ /dev/null @@ -1,34 +0,0 @@ -getCurrentScope(); - $current_realm = Config::get('app.scope_base_realm'); - $needed_scope = sprintf(SummitScopes::ReadAllSummitData, $current_realm); - return in_array($needed_scope, $scopes); - } -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/AbstractFilterElement.php b/app/Http/Utils/Filters/AbstractFilterElement.php deleted file mode 100644 index 028a3f62..00000000 --- a/app/Http/Utils/Filters/AbstractFilterElement.php +++ /dev/null @@ -1,36 +0,0 @@ -operator = $operator; - } - - /** - * @return string - */ - public function getOperator(){ - return $this->operator; - } -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/DoctrineCaseFilterMapping.php b/app/Http/Utils/Filters/DoctrineCaseFilterMapping.php deleted file mode 100644 index 0280d1cb..00000000 --- a/app/Http/Utils/Filters/DoctrineCaseFilterMapping.php +++ /dev/null @@ -1,57 +0,0 @@ -value = $value; - $this->condition = $condition; - } - - /** - * @return string - */ - public function getValue() - { - return $this->value; - } - - /** - * @return string - */ - public function getCondition() - { - return $this->condition; - } -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/DoctrineFilterMapping.php b/app/Http/Utils/Filters/DoctrineFilterMapping.php deleted file mode 100644 index cd7a8f8f..00000000 --- a/app/Http/Utils/Filters/DoctrineFilterMapping.php +++ /dev/null @@ -1,90 +0,0 @@ -getParameters()->count() + 1; - $where = $this->where; - $has_param = false; - if(strstr($where,":value")) { - $where = str_replace(":value", ":value_" . $param_count, $where); - $has_param = true; - } - - if(strstr($where,":operator")) - $where = str_replace(":operator", $filter->getOperator(), $where); - - $query = $query->andWhere($where); - - if($has_param){ - $query = $query->setParameter(":value_".$param_count, $filter->getValue()); - } - return $query; - } - - /** - * @param QueryBuilder $query - * @param FilterElement $filter - * @return string - */ - public function applyOr(QueryBuilder $query, FilterElement $filter){ - $param_count = $query->getParameters()->count() + 1; - $where = $this->where; - $has_param = false; - - if(strstr($where,":value")) { - $where = str_replace(":value", ":value_" . $param_count, $where); - $has_param = true; - } - - if(strstr($where,":operator")) - $where = str_replace(":operator", $filter->getOperator(), $where); - - if($has_param){ - $query = $query->setParameter(":value_".$param_count, $filter->getValue()); - } - - return $where; - } -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/DoctrineInstanceOfFilterMapping.php b/app/Http/Utils/Filters/DoctrineInstanceOfFilterMapping.php deleted file mode 100644 index af4ef544..00000000 --- a/app/Http/Utils/Filters/DoctrineInstanceOfFilterMapping.php +++ /dev/null @@ -1,66 +0,0 @@ -class_names = $class_names; - parent::__construct($alias, sprintf("%s %s :class_name", $alias, self::InstanceOfDoctrine)); - } - - /** - * @param FilterElement $filter - * @throws \Exception - */ - public function toRawSQL(FilterElement $filter) - { - throw new \Exception; - } - - const InstanceOfDoctrine = 'INSTANCE OF'; - - private function translateClassName($value){ - if(isset($this->class_names[$value])) return $this->class_names[$value]; - return $value; - } - /** - * @param QueryBuilder $query - * @param FilterElement $filter - * @return QueryBuilder - */ - public function apply(QueryBuilder $query, FilterElement $filter){ - $where = str_replace(":class_name", $this->translateClassName($filter->getValue()), $this->where); - return $query->andWhere($where); - } - - /** - * @param QueryBuilder $query - * @param FilterElement $filter - * @return string - */ - public function applyOr(QueryBuilder $query, FilterElement $filter){ - $where = str_replace(":class_name", $this->translateClassName($filter->getValue()), $this->where); - return $where; - } - -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/DoctrineJoinFilterMapping.php b/app/Http/Utils/Filters/DoctrineJoinFilterMapping.php deleted file mode 100644 index 6654a45d..00000000 --- a/app/Http/Utils/Filters/DoctrineJoinFilterMapping.php +++ /dev/null @@ -1,105 +0,0 @@ -alias = $alias; - } - - /** - * @param FilterElement $filter - * @throws \Exception - */ - public function toRawSQL(FilterElement $filter) - { - throw new \Exception; - } - - /** - * @param QueryBuilder $query - * @param FilterElement $filter - * @return QueryBuilder - */ - public function apply(QueryBuilder $query, FilterElement $filter){ - $param_count = $query->getParameters()->count() + 1; - $where = $this->where; - $has_param = false; - - if(strstr($where,":value")) { - $where = str_replace(":value", ":value_" . $param_count, $where); - $has_param = true; - } - - if(strstr($where,":operator")) - $where = str_replace(":operator", $filter->getOperator(), $where); - - if(!in_array($this->alias, $query->getAllAliases())) - $query->innerJoin($this->table, $this->alias, Join::WITH); - - $query = $query->andWhere($where); - - if($has_param){ - $query = $query->setParameter(":value_".$param_count, $filter->getValue()); - } - - return $query; - - } - - /** - * @param QueryBuilder $query - * @param FilterElement $filter - * @return string - */ - public function applyOr(QueryBuilder $query, FilterElement $filter){ - $param_count = $query->getParameters()->count() + 1; - $where = $this->where; - $has_param = false; - - if(strstr($where,":value")) { - $where = str_replace(":value", ":value_" . $param_count, $where); - $has_param = true; - } - - if(strstr($where,":operator")) - $where = str_replace(":operator", $filter->getOperator(), $where); - - if(!in_array($this->alias, $query->getAllAliases())) - $query->innerJoin($this->table, $this->alias, Join::WITH); - - if($has_param){ - $query->setParameter(":value_".$param_count, $filter->getValue()); - } - return $where; - } -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/DoctrineLeftJoinFilterMapping.php b/app/Http/Utils/Filters/DoctrineLeftJoinFilterMapping.php deleted file mode 100644 index 89982311..00000000 --- a/app/Http/Utils/Filters/DoctrineLeftJoinFilterMapping.php +++ /dev/null @@ -1,81 +0,0 @@ -getParameters()->count() + 1; - $where = $this->where; - $has_param = false; - - if(strstr($where,":value")) { - $where = str_replace(":value", ":value_" . $param_count, $where); - $has_param = true; - } - - if(strstr($where,":operator")) - $where = str_replace(":operator", $filter->getOperator(), $where); - - if(!in_array($this->alias, $query->getAllAliases())) - $query->leftJoin($this->table, $this->alias, Join::WITH); - - $query = $query->andWhere($where); - - if($has_param){ - $query = $query->setParameter(":value_".$param_count, $filter->getValue()); - } - - return $query; - } - - /** - * @param QueryBuilder $query - * @param FilterElement $filter - * @return string - */ - public function applyOr(QueryBuilder $query, FilterElement $filter){ - $param_count = $query->getParameters()->count() + 1; - $where = $this->where; - $has_param = false; - - if(strstr($where,":value")) { - $where = str_replace(":value", ":value_" . $param_count, $where); - $has_param = true; - } - - if(strstr($where,":operator")) - $where = str_replace(":operator", $filter->getOperator(), $where); - - if(!in_array($this->alias, $query->getAllAliases())) - $query->leftJoin($this->table, $this->alias, Join::WITH); - - if(!in_array($this->alias, $query->getAllAliases())) - $query->leftJoin($this->table, $this->alias, Join::WITH); - - if($has_param){ - $query->setParameter(":value_".$param_count, $filter->getValue()); - } - return $where; - } -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/DoctrineSwitchFilterMapping.php b/app/Http/Utils/Filters/DoctrineSwitchFilterMapping.php deleted file mode 100644 index 76613537..00000000 --- a/app/Http/Utils/Filters/DoctrineSwitchFilterMapping.php +++ /dev/null @@ -1,63 +0,0 @@ -case_statements = $case_statements; - } - - /** - * @param FilterElement $filter - * @return string - */ - public function toRawSQL(FilterElement $filter) - { - throw new \Exception; - } - - /** - * @param QueryBuilder $query - * @param FilterElement $filter - * @return QueryBuilder - */ - public function apply(QueryBuilder $query, FilterElement $filter){ - if(!isset($this->case_statements[$filter->getValue()])) return $query; - $case_statement = $this->case_statements[$filter->getValue()]; - return $query->andWhere($case_statement->getCondition()); - } - - /** - * @param QueryBuilder $query - * @param FilterElement $filter - * @return string - */ - public function applyOr(QueryBuilder $query, FilterElement $filter){ - if(!isset($this->case_statements[$filter->getValue()])) return $query; - $case_statement = $this->case_statements[$filter->getValue()]; - return $case_statement->getCondition(); - } -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/Filter.php b/app/Http/Utils/Filters/Filter.php deleted file mode 100644 index 2751ff3b..00000000 --- a/app/Http/Utils/Filters/Filter.php +++ /dev/null @@ -1,452 +0,0 @@ -filters = $filters; - } - - /** - * @param FilterElement $filter - * @return $this - */ - public function addFilterCondition(FilterElement $filter) - { - $this->filters[] = $filter; - return $this; - } - - /** - * will return an array of filter elements, OR filters are returned on a sub array - * @param string $field - * @return null|FilterElement[] - */ - public function getFilter($field) - { - $res = []; - foreach ($this->filters as $filter) { - - if ($filter instanceof FilterElement && $filter->getField() === $field) { - $res[] = $filter; - } - else if (is_array($filter)) { - // OR - $or_res = []; - foreach ($filter as $e) { - if ($e instanceof FilterElement && $e->getField() === $field) { - $or_res[] = $e; - } - } - if (count($or_res)) $res[] = $or_res; - } - } - return $res; - } - - /** - * @param string $field - * @return null|FilterElement - */ - public function getUniqueFilter($field){ - $res = $this->getFilter($field); - return count($res) == 1 ? $res[0]:null; - } - - - /** - * @param string $field - * @return bool - */ - public function hasFilter($field){ - return count($this->getFilter($field)) > 0; - } - - /** - * @param string $field - * @return null|FilterElement[] - */ - public function getFlatFilter($field) - { - $res = []; - foreach ($this->filters as $filter) { - - if ($filter instanceof FilterElement && $filter->getField() === $field) { - $res[] = $filter; - } - else if (is_array($filter)) { - // OR - foreach ($filter as $e) { - if ($e instanceof FilterElement && $e->getField() === $field) { - $res[] = $e; - } - } - - } - } - return $res; - } - - /** - * @return array - */ - public function getFiltersKeyValues(){ - $res = []; - foreach ($this->filters as $filter) { - - if ($filter instanceof FilterElement) { - $res[$filter->getField()] = $filter->getValue(); - } - else if (is_array($filter)) { - // OR - foreach ($filter as $e) { - if ($e instanceof FilterElement) { - if(!isset($res[$e->getField()])) $res[$e->getField()] = []; - $res[$e->getField()][] = $e->getValue(); - } - } - } - } - return $res; - } - - /** - * @param array $rules - * @param array $messages - * @throws ValidationException - */ - public function validate(array $rules, array $messages = []){ - $filter_key_values = $this->getFiltersKeyValues(); - foreach($rules as $field => $rule) { - if(!isset($filter_key_values[$field])) continue; - $values = $filter_key_values[$field]; - if(!is_array($values)) $values = [$values]; - foreach ($values as $val) { - $validation = Validator::make - ( - [$field => $val], - [$field => $rule], - $messages - ); - if ($validation->fails()) { - $ex = new ValidationException(); - throw $ex->setMessages($validation->messages()->toArray()); - } - } - } - } - - /** - * @param Criteria $criteria - * @param array $mappings - * @return Criteria - */ - public function apply2Criteria(Criteria $criteria, array $mappings) - { - foreach ($this->filters as $filter) { - if ($filter instanceof FilterElement) { - if (isset($mappings[$filter->getField()])) { - $mapping = $mappings[$filter->getField()]; - - if ($mapping instanceof FilterMapping) { - continue; - } - - $mapping = explode(':', $mapping); - $value = $filter->getValue(); - - if (count($mapping) > 1) { - $value = $this->convertValue($value, $mapping[1]); - } - $criteria->andWhere(Criteria::expr()->eq($mapping[0], $value)); - } - } else if (is_array($filter)) { - // OR - - foreach ($filter as $e) { - if ($e instanceof FilterElement && isset($mappings[$e->getField()])) { - $mapping = $mappings[$e->getField()]; - if ($mapping instanceof FilterMapping) { - continue; - } - $mapping = explode(':', $mapping); - $value = $filter->getValue(); - if (count($mapping) > 1) { - $value = $this->convertValue($value, $mapping[1]); - } - $criteria->orWhere(Criteria::expr()->eq($mapping[0], $value)); - - } - } - - } - } - return $criteria; - } - - /** - * @param QueryBuilder $query - * @param array $mappings - * @return $this - */ - public function apply2Query(QueryBuilder $query, array $mappings) - { - $param_prefix = "param_%s"; - $param_idx = 1; - $bindings = []; - - foreach ($this->filters as $filter) { - if ($filter instanceof FilterElement && isset($mappings[$filter->getField()])) { - $mapping = $mappings[$filter->getField()]; - - if ($mapping instanceof DoctrineJoinFilterMapping) { - $query = $mapping->apply($query, $filter); - continue; - } - if ($mapping instanceof DoctrineSwitchFilterMapping) { - $query = $mapping->apply($query, $filter); - continue; - } - if ($mapping instanceof DoctrineFilterMapping) { - $query = $mapping->apply($query, $filter); - continue; - } - if ($mapping instanceof DoctrineInstanceOfFilterMapping) { - $query = $mapping->apply($query, $filter); - continue; - } - else if(is_array($mapping)){ - $condition = ''; - foreach ($mapping as $mapping_or){ - $mapping_or = explode(':', $mapping_or); - $value = $filter->getValue(); - if (count($mapping_or) > 1) { - $value = $this->convertValue($value, $mapping_or[1]); - } - - if(!empty($condition)) $condition .= ' OR '; - $bindings[sprintf($param_prefix, $param_idx)] = $value; - $condition .= sprintf("%s %s :%s", $mapping_or[0], $filter->getOperator(), sprintf($param_prefix, $param_idx)); - ++$param_idx; - } - $query->andWhere($condition); - } - else { - $mapping = explode(':', $mapping); - $value = $filter->getValue(); - - if (count($mapping) > 1) { - $value = $this->convertValue($value, $mapping[1]); - } - $bindings[sprintf($param_prefix, $param_idx)] = $value; - $query = $query->andWhere(sprintf("%s %s :%s", $mapping[0], $filter->getOperator(), sprintf($param_prefix, $param_idx))); - ++$param_idx; - } - } - else if (is_array($filter)) { - // OR - $sub_or_query = ''; - foreach ($filter as $e) { - if ($e instanceof FilterElement && isset($mappings[$e->getField()])) { - - $mapping = $mappings[$e->getField()]; - if ($mapping instanceof DoctrineJoinFilterMapping) { - $condition = $mapping->applyOr($query, $e); - if(!empty($sub_or_query)) $sub_or_query .= ' OR '; - $sub_or_query .= $condition; - continue; - } - if ($mapping instanceof DoctrineSwitchFilterMapping) { - $condition = $mapping->applyOr($query, $e); - if(!empty($sub_or_query)) $sub_or_query .= ' OR '; - $sub_or_query .= $condition; - continue; - } - if ($mapping instanceof DoctrineFilterMapping) { - $condition = $mapping->applyOr($query, $e); - if(!empty($sub_or_query)) $sub_or_query .= ' OR '; - $sub_or_query .= $condition; - continue; - } - if ($mapping instanceof DoctrineInstanceOfFilterMapping) { - $condition = $mapping->applyOr($query, $e); - if(!empty($sub_or_query)) $sub_or_query .= ' OR '; - $sub_or_query .= $condition; - continue; - } - else if(is_array($mapping)){ - $condition = ''; - foreach ($mapping as $mapping_or){ - $mapping_or = explode(':', $mapping_or); - $value = $e->getValue(); - if (count($mapping_or) > 1) { - $value = $this->convertValue($value, $mapping_or[1]); - } - - if(!empty($condition)) $condition .= ' OR '; - $bindings[sprintf($param_prefix, $param_idx)] = $value; - $condition .= sprintf(" %s %s :%s ", $mapping_or[0], $e->getOperator(), sprintf($param_prefix, $param_idx)); - ++$param_idx; - } - if(!empty($sub_or_query)) $sub_or_query .= ' OR '; - $sub_or_query .= ' ( '.$condition.' ) '; - } - else { - $mapping = explode(':', $mapping); - $value = $e->getValue(); - - if (count($mapping) > 1) { - $value = $this->convertValue($value, $mapping[1]); - } - - if(!empty($sub_or_query)) $sub_or_query .= ' OR '; - - $bindings[sprintf($param_prefix, $param_idx)] = $value; - $sub_or_query .= sprintf(" %s %s :%s ", $mapping[0], $e->getOperator(), sprintf($param_prefix, $param_idx)); - ++$param_idx; - } - } - } - $query->andWhere($sub_or_query); - } - } - foreach($bindings as $param => $value) - $query->setParameter($param, $value); - return $this; - } - - /** - * @param string $value - * @param string $original_format - * @return mixed - */ - private function convertValue($value, $original_format) - { - switch ($original_format) { - case 'datetime_epoch': - $datetime = new \DateTime("@$value"); - return sprintf("%s", $datetime->format("Y-m-d H:i:s")); - break; - case 'json_int': - return intval($value); - break; - case 'json_string': - return sprintf("%s",$value); - break; - default: - return $value; - break; - } - } - - /** - * @return array - */ - public function getSQLBindings() - { - return $this->bindings; - } - - /** - * @param array $mappings - * @return string - */ - public function toRawSQL(array $mappings) - { - $sql = ''; - $this->bindings = []; - $param_prefix = "param_%s"; - $param_idx = 1; - - foreach ($this->filters as $filter) { - if ($filter instanceof FilterElement) { - if (isset($mappings[$filter->getField()])) { - - $mapping = $mappings[$filter->getField()]; - $mapping = explode(':', $mapping); - $value = $filter->getValue(); - $op = $filter->getOperator(); - if (count($mapping) > 1) { - $filter->setValue($this->convertValue($value, $mapping[1])); - } - $cond = sprintf(' %s %s :%s', $mapping[0], $op, sprintf($param_prefix, $param_idx)); - $this->bindings[sprintf($param_prefix, $param_idx)] = $filter->getValue(); - ++$param_idx; - if (!empty($sql)) $sql .= " AND "; - $sql .= $cond; - } - } else if (is_array($filter)) { - // OR - $sql .= " ( "; - $sql_or = ''; - foreach ($filter as $e) { - if ($e instanceof FilterElement && isset($mappings[$e->getField()])) { - $mapping = $mappings[$e->getField()]; - $mapping = explode(':', $mapping); - $value = $e->getValue(); - $op = $e->getOperator(); - if (count($mapping) > 1) { - $e->setValue($this->convertValue($value, $mapping[1])); - } - $cond = sprintf(" %s %s :%s", $mapping[0], $op, sprintf($param_prefix, $param_idx)); - $this->bindings[sprintf($param_prefix, $param_idx)] = $e->getValue(); - ++$param_idx; - if (!empty($sql_or)) $sql_or .= " OR "; - $sql_or .= $cond; - } - } - $sql .= $sql_or . " ) "; - } - } - return $sql; - } - - /** - * @param string $field - * @return array - */ - public function getFilterCollectionByField($field){ - $list = []; - $filter = $this->getFilter($field); - - if(is_array($filter)){ - if(is_array($filter[0])){ - foreach ($filter[0] as $filter_element) - $list[] = intval($filter_element->getValue()); - } - else{ - $list[] = intval($filter[0]->getValue()); - } - } - return $list; - } -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/FilterElement.php b/app/Http/Utils/Filters/FilterElement.php deleted file mode 100644 index bb9a0f8a..00000000 --- a/app/Http/Utils/Filters/FilterElement.php +++ /dev/null @@ -1,106 +0,0 @@ -field = $field; - $this->value = $value; - } - - /** - * @param mixed $value - * @return $this - */ - public function setValue($value) - { - $this->value = $value; - return $this; - } - - /** - * @return string - */ - public function getField() - { - return $this->field; - } - - /** - * @return string - */ - public function getValue() - { - switch($this->operator) - { - case 'like': - return empty($this->value) ? '' : "%".$this->value."%"; - break; - default: - return $this->value; - break; - } - } - - public static function makeEqual($field, $value) - { - return new self($field, $value, '='); - } - - public static function makeGreather($field, $value) - { - return new self($field, $value, '>'); - } - - public static function makeGreatherOrEqual($field, $value) - { - return new self($field, $value, '>='); - } - - public static function makeLower($field, $value) - { - return new self($field, $value, '<'); - } - - public static function makeLowerOrEqual($field, $value) - { - return new self($field, $value, '<='); - } - - public static function makeNotEqual($field, $value) - { - return new self($field, $value, '<>'); - } - - public static function makeLike($field, $value) - { - return new self($field, $value, 'like'); - } -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/FilterMapping.php b/app/Http/Utils/Filters/FilterMapping.php deleted file mode 100644 index dd95ead9..00000000 --- a/app/Http/Utils/Filters/FilterMapping.php +++ /dev/null @@ -1,48 +0,0 @@ -table = $table; - $this->where = $where; - } - - /** - * @param FilterElement $filter - * @return string - */ - public abstract function toRawSQL(FilterElement $filter); -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/FilterParser.php b/app/Http/Utils/Filters/FilterParser.php deleted file mode 100644 index aeaec48c..00000000 --- a/app/Http/Utils/Filters/FilterParser.php +++ /dev/null @@ -1,133 +0,0 @@ - 1) { - $f = []; - foreach ($or_filters as $of) { - - //single filter - preg_match('/[=<>][=>@]{0,1}/', $of, $matches); - - if (count($matches) != 1) - throw new FilterParserException(sprintf("invalid OR filter format %s (should be [:FIELD_NAME:OPERAND:VALUE])", $of)); - - $op = $matches[0]; - $operands = explode($op, $of); - $field = $operands[0]; - $value = $operands[1]; - - if (!isset($allowed_fields[$field])){ - throw new FilterParserException(sprintf("filter by field %s is not allowed", $field)); - } - if (!in_array($op, $allowed_fields[$field])){ - throw new FilterParserException(sprintf("%s op is not allowed for filter by field %s",$op, $field)); - } - - $f_or = self::buildFilter($field, $op, $value); - if (!is_null($f_or)) - $f[] = $f_or; - } - } else { - //single filter - preg_match('/[=<>][=>@]{0,1}/', $filter, $matches); - - if (count($matches) != 1) - throw new FilterParserException(sprintf("invalid filter format %s (should be [:FIELD_NAME:OPERAND:VALUE])", $filter)); - - $op = $matches[0]; - $operands = explode($op, $filter); - $field = $operands[0]; - $value = $operands[1]; - - if (!isset($allowed_fields[$field])){ - throw new FilterParserException(sprintf("filter by field %s is not allowed", $field)); - } - if (!in_array($op, $allowed_fields[$field])){ - throw new FilterParserException(sprintf("%s op is not allowed for filter by field %s",$op, $field)); - } - - if(in_array($field, $and_fields)) - throw new FilterParserException(sprintf("filter by field %s is already on an and expression", $field)); - - $and_fields[] = $field; - $f = self::buildFilter($field, $op, $value); - } - - if (!is_null($f)) - $res[] = $f; - } - return new Filter($res); - } - - /** - * Factory Method - * - * @param string $field - * @param string $op - * @param string $value - * @return FilterElement|null - */ - public static function buildFilter($field, $op, $value) - { - switch ($op) { - case '==': - return FilterElement::makeEqual($field, $value); - break; - case '=@': - return FilterElement::makeLike($field, $value); - break; - case '>': - return FilterElement::makeGreather($field, $value); - break; - case '>=': - return FilterElement::makeGreatherOrEqual($field, $value); - break; - case '<': - return FilterElement::makeLower($field, $value); - break; - case '<=': - return FilterElement::makeLowerOrEqual($field, $value); - break; - case '<>': - return FilterElement::makeNotEqual($field, $value); - break; - } - return null; - } -} \ No newline at end of file diff --git a/app/Http/Utils/Filters/FilterParserException.php b/app/Http/Utils/Filters/FilterParserException.php deleted file mode 100644 index 0750646b..00000000 --- a/app/Http/Utils/Filters/FilterParserException.php +++ /dev/null @@ -1,26 +0,0 @@ -set('CSS.AllowedProperties', []); - $purifier = new \HTMLPurifier($config); - foreach($fields as $field){ - if(!isset($data[$field])) continue; - $data[$field] = $purifier->purify($data[$field]); - } - return $data; - } -} \ No newline at end of file diff --git a/app/Http/Utils/IBucket.php b/app/Http/Utils/IBucket.php deleted file mode 100644 index aaaa82e4..00000000 --- a/app/Http/Utils/IBucket.php +++ /dev/null @@ -1,30 +0,0 @@ -from = $from; - $this->to = is_array($to) ? $to : array($to); - $this->subject = $subject; - $this->addHeader(sprintf('From: %s', $from)); - $this->maxColumnWidth = $maxColumnWidth; - $this->cacheService = $cacheService; - } - - /** - * Add headers to the message - * - * @param string|array $headers Custom added headers - * @return self - */ - public function addHeader($headers) - { - foreach ((array) $headers as $header) { - if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) { - throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons'); - } - $this->headers[] = $header; - } - - return $this; - } - - /** - * Add parameters to the message - * - * @param string|array $parameters Custom added parameters - * @return self - */ - public function addParameter($parameters) - { - $this->parameters = array_merge($this->parameters, (array) $parameters); - - return $this; - } - - /** - * {@inheritdoc} - */ - protected function send($content, array $records) - { - $content = wordwrap($content, $this->maxColumnWidth); - - $subject = $this->subject; - if ($records) { - $subjectFormatter = new LineFormatter($this->subject); - $subject = $subjectFormatter->format($this->getHighestRecord($records)); - } - - // to avoid bloating inboxes/quotas - if($this->cacheService){ - if($this->cacheService->exists(self::SENT_ERROR_EMAIL)){ - // short circuit - Log::debug(sprintf("LaravelMailerHandler::send skipping exception %s %s", $subject, $content)); - return; - } - $this->cacheService->setSingleValue(self::SENT_ERROR_EMAIL, self::SENT_ERROR_EMAIL, LaravelMailerHandler::TIME_BETWEEN_ERRORS); - } - - foreach ($this->to as $to) { - Mail::raw($content, function(Message $message) use($to, $subject, $content){ - $message - ->to($to) - ->subject($subject) - ->setBody($content, 'text/html') - ->setFrom($this->from); - }); - } - } - - /** - * @return string $contentType - */ - public function getContentType() - { - return $this->contentType; - } - - /** - * @return string $encoding - */ - public function getEncoding() - { - return $this->encoding; - } - - /** - * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML - * messages. - * @return self - */ - public function setContentType($contentType) - { - if (strpos($contentType, "\n") !== false || strpos($contentType, "\r") !== false) { - throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection'); - } - - $this->contentType = $contentType; - - return $this; - } - - /** - * @param string $encoding - * @return self - */ - public function setEncoding($encoding) - { - if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) { - throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection'); - } - - $this->encoding = $encoding; - - return $this; - } -} diff --git a/app/Http/Utils/Order.php b/app/Http/Utils/Order.php deleted file mode 100644 index db3e7f4e..00000000 --- a/app/Http/Utils/Order.php +++ /dev/null @@ -1,90 +0,0 @@ -ordering = $ordering; - } - - /** - * @param QueryBuilder $query - * @param array $mappings - * @return $this - */ - public function apply2Query(QueryBuilder $query, array $mappings) - { - foreach ($this->ordering as $order) { - if ($order instanceof OrderElement) { - if (isset($mappings[$order->getField()])) { - $mapping = $mappings[$order->getField()]; - $orders[$mapping] = $order->getDirection(); - $query->addOrderBy($mapping, $order->getDirection()); - } - } - } - return $this; - } - - /** - * @param Criteria $criteria - * @param array $mappings - * @return $this - */ - public function apply2Criteria(Criteria $criteria, array $mappings) - { - $orders = []; - foreach ($this->ordering as $order) { - if ($order instanceof OrderElement) { - if (isset($mappings[$order->getField()])) { - $mapping = $mappings[$order->getField()]; - $orders[$mapping] = $order->getDirection(); - } - } - } - if(count($orders) > 0) - $criteria->orderBy($orders); - return $this; - } - - - /** - * @param array $mappings - * @return string - */ - public function toRawSQL(array $mappings) - { - $sql = ' ORDER BY '; - foreach ($this->ordering as $order) { - if ($order instanceof OrderElement) { - if (isset($mappings[$order->getField()])) { - $mapping = $mappings[$order->getField()]; - $sql .= sprintf('%s %s, ', $mapping, $order->getDirection()); - } - } - } - return substr($sql, 0 , strlen($sql) - 2); - } -} \ No newline at end of file diff --git a/app/Http/Utils/OrderElement.php b/app/Http/Utils/OrderElement.php deleted file mode 100644 index 713a183f..00000000 --- a/app/Http/Utils/OrderElement.php +++ /dev/null @@ -1,72 +0,0 @@ -field = $field; - $this->direction = $direction; - } - - public static function buildAscFor($field) - { - return new OrderElement($field, 'ASC'); - } - - public static function buildDescFor($field) - { - return new OrderElement($field, 'DESC'); - } - - /** - * @return string - */ - public function getField() - { - return $this->field; - } - - public function isAsc() - { - return $this->direction === 'ASC'; - } - - /** - * @return string - */ - public function getDirection() - { - return $this->direction; - } -} \ No newline at end of file diff --git a/app/Http/Utils/OrderParser.php b/app/Http/Utils/OrderParser.php deleted file mode 100644 index 20650ab0..00000000 --- a/app/Http/Utils/OrderParser.php +++ /dev/null @@ -1,60 +0,0 @@ -= MinPageSize and <= MaxPageSize - const MinPageSize = 5; - const MaxPageSize = 100; -} \ No newline at end of file diff --git a/app/Http/Utils/PagingInfo.php b/app/Http/Utils/PagingInfo.php deleted file mode 100644 index dedddd3c..00000000 --- a/app/Http/Utils/PagingInfo.php +++ /dev/null @@ -1,67 +0,0 @@ -page = $page; - $this->per_page = $per_page; - } - - /** - * @return int - */ - public function getCurrentPage() - { - return $this->page; - } - - /** - * @return int - */ - public function getPerPage() - { - return $this->per_page; - } - - /** - * @return int - */ - public function getOffset() - { - return ($this->page - 1) * $this->per_page; - } - - /** - * @param int $count - * @return int - */ - public function getLastPage($count){ - return intval(ceil($count/$this->per_page)); - } -} \ No newline at end of file diff --git a/app/Http/Utils/PagingResponse.php b/app/Http/Utils/PagingResponse.php deleted file mode 100644 index 41e183bf..00000000 --- a/app/Http/Utils/PagingResponse.php +++ /dev/null @@ -1,129 +0,0 @@ -total = $total; - $this->per_page = $per_page; - $this->page = $page; - $this->last_page = $last_page; - $this->items = $items; - } - - public function getTotal() - { - return $this->total; - } - - public function getTotalPages():int{ - return $this->per_page > 0 ? intval(ceil($this->total / $this->per_page)) : 0; - } - - /** - * @return int - */ - public function getPerPage() - { - return $this->per_page; - } - - /** - * @return int - */ - public function getCurrentPage() - { - return $this->page; - } - - /** - * @return int - */ - public function getLastPage() - { - return $this->last_page; - } - - /** - * @return array - */ - public function getItems() - { - return $this->items; - } - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @param string $serializer_type - * @return array - */ - public function toArray($expand = null, array $fields = [], array $relations = [], array $params = [], $serializer_type = SerializerRegistry::SerializerType_Public ) - { - $items = []; - foreach($this->items as $i) - { - if($i instanceof IEntity) - { - $i = SerializerRegistry::getInstance()->getSerializer($i, $serializer_type)->serialize($expand, $fields, $relations, $params); - } - $items[] = $i; - } - - return - [ - 'total' => $this->total, - 'per_page' => $this->per_page, - 'current_page' => $this->page, - 'last_page' => $this->last_page, - 'data' => $items, - ]; - } -} \ No newline at end of file diff --git a/app/Http/Utils/ParseMultiPartFormDataInputStream.php b/app/Http/Utils/ParseMultiPartFormDataInputStream.php deleted file mode 100644 index a95b3046..00000000 --- a/app/Http/Utils/ParseMultiPartFormDataInputStream.php +++ /dev/null @@ -1,375 +0,0 @@ -input = $input; - } - - /** - * @return array - */ - public function getInput(){ - - $boundary = $this->boundary(); - - if (!strlen($boundary)) { - return [ - 'parameters' => $this->parse(), - 'files' => [] - ]; - } - - $blocks = $this->split($boundary); - - return $this->blocks($blocks); - } - - /** - * @function boundary - * @returns string - */ - private function boundary() - { - if(!isset($_SERVER['CONTENT_TYPE'])) { - return null; - } - - preg_match('/boundary=(.*)$/', $_SERVER['CONTENT_TYPE'], $matches); - return $matches[1]; - } - - /** - * @function parse - * @returns array - */ - private function parse() - { - parse_str(urldecode($this->input), $result); - return $result; - } - - /** - * @function split - * @param $boundary string - * @returns array - */ - private function split($boundary) - { - $result = preg_split("/-+$boundary/", $this->input); - array_pop($result); - return $result; - } - - /** - * @function blocks - * @param $array array - * @returns array - */ - private function blocks($array) - { - $results = [ - 'parameters' => [], - 'files' => [] - ]; - - foreach($array as $key => $value) - { - if (empty($value)) - continue; - - $block = $this->decide($value); - - foreach ($block['parameters'] as $key => $val ) { - $results['parameters'][$key] = $val; - } - - foreach ( $block['files'] as $key => $val ) { - $results['files'][$key] = $val; - } - } - - return $results; - } - - /** - * @function decide - * @param $string string - * @returns array - */ - private function decide($string) - { - if (strpos($string, 'application/octet-stream') !== FALSE) - { - return [ - 'parameters' => $this->file($string), - 'files' => [] - ]; - } - - if (strpos($string, 'filename') !== FALSE) - { - return [ - 'parameters' => [], - 'files' => $this->file_stream($string) - ]; - } - - return [ - 'parameters' => $this->parameter($string), - 'files' => [] - ]; - } - - /** - * @function file - * - * @param $string - * - * @return array - */ - private function file($string) - { - preg_match('/name=\"([^\"]*)\".*stream[\n|\r]+([^\n\r].*)?$/s', $string, $match); - return [ - $match[1] => ($match[2] !== NULL ? $match[2] : '') - ]; - } - - /** - * @function file_stream - * - * @param $string - * - * @return array - */ - private function file_stream($data) - { - $result = []; - $data = ltrim($data); - - $idx = strpos( $data, "\r\n\r\n" ); - if ( $idx === FALSE ) { - Log::warning( "ParseMultiPartFormDataInputStream.file_stream(): Could not locate header separator in data:" ); - Log::warning( $data ); - } else { - $headers = substr( $data, 0, $idx ); - $content = substr( $data, $idx + 4, -2 ); // Skip the leading \r\n and strip the final \r\n - - $name = '-unknown-'; - $filename = '-unknown-'; - $filetype = 'application/octet-stream'; - - $header = strtok( $headers, "\r\n" ); - while ( $header !== FALSE ) { - if ( substr($header, 0, strlen("Content-Disposition: ")) == "Content-Disposition: " ) { - // Content-Disposition: form-data; name="attach_file[TESTING]"; filename="label2.jpg" - if ( preg_match('/name=\"([^\"]*)\"/', $header, $nmatch ) ) { - $name = $nmatch[1]; - } - if ( preg_match('/filename=\"([^\"]*)\"/', $header, $nmatch ) ) { - $filename = $nmatch[1]; - } - } elseif ( substr($header, 0, strlen("Content-Type: ")) == "Content-Type: " ) { - // Content-Type: image/jpg - $filetype = trim( substr($header, strlen("Content-Type: ")) ); - } else { - Log::debug( "PARSEINPUTSTREAM: Skipping Header: " . $header ); - } - - $header = strtok("\r\n"); - } - - if ( substr($data, -2) === "\r\n" ) { - $data = substr($data, 0, -2); - } - - $path = sys_get_temp_dir() . '/php' . substr( sha1(rand()), 0, 6 ); - - $bytes = file_put_contents( $path, $content ); - - if ( $bytes !== FALSE ) { - $file = new UploadedFile( $path, $filename, $filetype, $bytes, UPLOAD_ERR_OK ); - $result = array( $name => $file ); - } - } - - return $result; - } - - /** - * @function parameter - * - * @param $string - * - * @return array - */ - private function parameter($string) - { - $string = trim($string); - $data = []; - if ( preg_match('/name=\"([^\"]*)\"[\n|\r]+([^\n\r].*)$/s', $string, $match) ) { - $val = ($match[2] !== NULL ? $match[2] : ''); - if(!empty($val) && is_bool($val)) - $val = boolval($val); - if(!empty($val) && is_string($val) && self::checkBool($val)) - $val = self::boolVal($val); - if(!empty($val) && is_int($val)) - $val = intval($val); - if(!empty($val) && is_double($val)) - $val = doubleval($val); - if (preg_match('/^(.*)\[\]$/i', $match[1], $tmp)) { - $data[$tmp[1]][] = $val; - } else { - $data[$match[1]] = $val; - } - } - return $data; - } - - static function checkBool($string){ - $string = strtolower($string); - return (in_array($string, array("true", "false", "1", "0", "yes", "no"), true)); - } - - static function boolVal($string){ - $string = strtolower($string); - if(in_array($string, ["true", "1", "yes"])) return true; - return false; - } - - /** - * @function merge - * @param $array array - * - * Ugly ugly ugly - * - * @returns array - */ - private function merge($array) - { - $results = [ - 'parameters' => [], - 'files' => [] - ]; - - if (count($array['parameters']) > 0) { - foreach($array['parameters'] as $key => $value) { - foreach($value as $k => $v) { - if (is_array($v)) { - foreach($v as $kk => $vv) { - $results['parameters'][$k][] = $vv; - } - } else { - $results['parameters'][$k] = $v; - } - } - } - } - - if (count($array['files']) > 0) { - foreach($array['files'] as $key => $value) { - foreach($value as $k => $v) { - if (is_array($v)) { - foreach($v as $kk => $vv) { - if(is_array($vv) && (count($vv) === 1)) { - $results['files'][$k][$kk] = $vv[0]; - } else { - $results['files'][$k][$kk][] = $vv[0]; - } - } - } else { - $results['files'][$k][$key] = $v; - } - } - } - } - - return $results; - } - - function parse_parameter( &$params, $parameter, $value ) { - if ( strpos($parameter, '[') !== FALSE ) { - $matches = array(); - if ( preg_match( '/^([^[]*)\[([^]]*)\](.*)$/', $parameter, $match ) ) { - $name = $match[1]; - $key = $match[2]; - $rem = $match[3]; - - if ( $name !== '' && $name !== NULL ) { - if ( ! isset($params[$name]) || ! is_array($params[$name]) ) { - $params[$name] = array(); - } else { - } - if ( strlen($rem) > 0 ) { - if ( $key === '' || $key === NULL ) { - $arr = array(); - $this->parse_parameter( $arr, $rem, $value ); - $params[$name][] = $arr; - } else { - if ( !isset($params[$name][$key]) || !is_array($params[$name][$key]) ) { - $params[$name][$key] = array(); - } - $this->parse_parameter( $params[$name][$key], $rem, $value ); - } - } else { - if ( $key === '' || $key === NULL ) { - $params[$name][] = $value; - } else { - $params[$name][$key] = $value; - } - } - } else { - if ( strlen($rem) > 0 ) { - if ( $key === '' || $key === NULL ) { - // REVIEW Is this logic correct?! - $this->parse_parameter( $params, $rem, $value ); - } else { - if ( ! isset($params[$key]) || ! is_array($params[$key]) ) { - $params[$key] = array(); - } - $this->parse_parameter( $params[$key], $rem, $value ); - } - } else { - if ( $key === '' || $key === NULL ) { - $params[] = $value; - } else { - $params[$key] = $value; - } - } - } - } else { - Log::warning( "ParseMultiPartFormDataInputStream.parse_parameter() Parameter name regex failed: '" . $parameter . "'" ); - } - } else { - $params[$parameter] = $value; - } - } -} \ No newline at end of file diff --git a/app/Http/Utils/SwiftBucket.php b/app/Http/Utils/SwiftBucket.php deleted file mode 100644 index d05fd9ea..00000000 --- a/app/Http/Utils/SwiftBucket.php +++ /dev/null @@ -1,102 +0,0 @@ -container)) { - - $configOptions = [ - 'authUrl' => Config::get("cloudstorage.auth_url"), - 'region' => Config::get("cloudstorage.region"), - ]; - - $userName = Config::get("cloudstorage.user_name"); - $userPassword = Config::get("cloudstorage.api_key"); - - if(!empty($userName) && !empty($userPassword)){ - $configOptions['user'] = [ - 'name' => $userName, - 'password' => $userPassword, - 'domain' => ['id' => Config::get("cloudstorage.user_domain", "default")] - ]; - - $configOptions['scope' ] = [ - 'project' => [ - 'name' => Config::get("cloudstorage.project_name"), - 'domain' => ['id' => Config::get("cloudstorage.project_domain", "default")] - ], - ]; - } - - $appCredentialId = Config::get("cloudstorage.app_credential_id"); - $appCredentialSecret = Config::get("cloudstorage.app_credential_secret"); - - if(!empty($appCredentialId) && !empty($appCredentialSecret)){ - $configOptions['application_credential'] = [ - 'id' => $appCredentialId, - 'secret' => $appCredentialSecret, - ]; - } - - $openstack = new OpenStack($configOptions); - - $this->container = $openstack->objectStoreV1()->getContainer( Config::get("cloudstorage.assets_container")); - } - - return $this->container; - } - - /** - * @param File $f - * @param string $local_path - * @return object|StorageObject - * @throws Exception - */ - public function put(File $f, $local_path) - { - - $fp = fopen($local_path, 'r'); - if (!$fp) { - throw new Exception("Unable to open file: " . $f->getFilename()); - } - - $options = [ - 'name' => $f->getRelativeLinkFor(), - 'stream' => new Stream($fp) - ]; - - return $this->getContainer()->createObject($options); - } - - -} \ No newline at end of file diff --git a/app/Http/Utils/UserIPHelperProvider.php b/app/Http/Utils/UserIPHelperProvider.php deleted file mode 100644 index c5c8c48f..00000000 --- a/app/Http/Utils/UserIPHelperProvider.php +++ /dev/null @@ -1,26 +0,0 @@ - 'App\Http\Controllers', 'middleware' => 'web' ], function() { - - // openid endpoints - Route::group(array('middleware' => ['ssl']), function () { - - Route::get('/', "HomeController@index"); - - // OpenId endpoints - - Route::group(['namespace' => 'OpenId' ], function() { - - Route::get('/discovery', "DiscoveryController@idp"); - Route::get("/discovery/users/{identifier}","DiscoveryController@user")->where(array('identifier' => '[\d\w\.\#]+')); - //op endpoint url - Route::post('/accounts/openid2', 'OpenIdProviderController@endpoint'); - Route::get('/accounts/openid2', 'OpenIdProviderController@endpoint'); - }); - - //user interaction - Route::group(array('prefix' => 'auth'), function () { - Route::group(array('prefix' => 'login'), function () { - Route::get('', "UserController@getLogin"); - Route::post('', ['middleware' => 'csrf', 'uses' => 'UserController@postLogin']); - Route::get('cancel', "UserController@cancelLogin"); - }); - - // registration routes - Route::group(array('prefix' => 'register'), function () { - Route::get('', 'Auth\RegisterController@showRegistrationForm'); - Route::post('', ['middleware' => 'csrf', 'uses' => 'Auth\RegisterController@register']); - }); - - Route::group(array('prefix' => 'verification'), function () { - Route::get('', 'Auth\EmailVerificationController@showVerificationForm'); - Route::get('{token}', 'Auth\EmailVerificationController@verify')->name("verification_verify"); - Route::post('', ['middleware' => 'csrf', 'uses' => 'Auth\EmailVerificationController@resend']); - }); - - // password reset routes - - Route::group(array('prefix' => 'password'), function () { - Route::group(array('prefix' => 'set'), function () { - Route::get('{token}', 'Auth\PasswordSetController@showPasswordSetForm')->name('password.set'); - Route::post('', ['middleware' => 'csrf', 'uses' => 'Auth\PasswordSetController@setPassword']); - }); - - Route::group(array('prefix' => 'reset'), function () { - Route::get('', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request'); - Route::get('{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset'); - Route::post('', ['middleware' => 'csrf', 'uses' => 'Auth\ResetPasswordController@reset']); - }); - - Route::post('email', ['middleware' => 'csrf', 'uses' => 'Auth\ForgotPasswordController@sendResetLinkEmail'])->name('password.email'); - }); - - }); - - /* - * If the Claimed Identifier was not previously discovered by the Relying Party - * (the "openid.identity" in the request was "http://specs.openid.net/auth/2.0/identifier_select" - * or a different Identifier, or if the OP is sending an unsolicited positive assertion), - * the Relying Party MUST perform discovery on the Claimed Identifier in - * the response to make sure that the OP is authorized to make assertions about the Claimed Identifier. - */ - Route::get("/{identifier}", "UserController@getIdentity"); - }); - - //oauth2 endpoints - - Route::group(['namespace'=> 'OAuth2', 'middleware' => ['ssl']], function () { - Route::get('/.well-known/openid-configuration', "OAuth2ProviderController@discovery"); - }); - - Route::group(['namespace' => 'OAuth2' , 'prefix' => 'oauth2', 'middleware' => ['ssl']], function () { - - Route::get('/check-session', "OAuth2ProviderController@checkSessionIFrame"); - Route::get('/end-session', "OAuth2ProviderController@endSession"); - Route::post('/end-session', "OAuth2ProviderController@endSession"); - - //authorization endpoint - Route::any('/auth', "OAuth2ProviderController@auth"); - // OIDC - // certificates - Route::get('/certs', "OAuth2ProviderController@certs"); - // discovery document - Route::get('/.well-known/openid-configuration', "OAuth2ProviderController@discovery"); - //token endpoint - Route::group(array('prefix' => 'token'), function () { - Route::post('/', "OAuth2ProviderController@token"); - Route::post('/revoke', "OAuth2ProviderController@revoke"); - Route::post('/introspection', "OAuth2ProviderController@introspection"); - }); - }); - - Route::group(array('middleware' => ['ssl', 'auth']), function () { - Route::get('/accounts/user/consent', "UserController@getConsent"); - Route::post('/accounts/user/consent', ['middleware' => 'csrf', 'uses' => 'UserController@postConsent']); - Route::any("/accounts/user/logout", "UserController@logout"); - Route::get("/accounts/user/profile", "UserController@getProfile"); - Route::any("/accounts/user/profile/trusted_site/delete/{id}", "UserController@deleteTrustedSite"); - }); - - Route::group(['prefix' => 'admin', 'middleware' => ['ssl', 'auth']], function () { - //client admin UI - Route::get('clients/edit/{id}', ['middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'AdminController@editRegisteredClient']); - Route::get('clients', 'AdminController@listOAuth2Clients'); - Route::get('/grants', 'AdminController@editIssuedGrants'); - - //oauth2 server admin UI - Route::group(['middleware' => ['oauth2.currentuser.serveradmin']], function () { - Route::get('/api-scope-groups', 'AdminController@listApiScopeGroups'); - Route::get('/api-scope-groups/{id}', 'AdminController@editApiScopeGroup'); - Route::get('/resource-servers', 'AdminController@listResourceServers'); - Route::get('/resource-server/{id}', 'AdminController@editResourceServer'); - Route::get('/api/{id}', 'AdminController@editApi'); - Route::get('/scope/{id}', 'AdminController@editScope'); - Route::get('/endpoint/{id}', 'AdminController@editEndpoint'); - Route::get('/locked-clients', 'AdminController@listLockedClients'); - // server private keys - Route::get('/private-keys', 'AdminController@listServerPrivateKeys'); - //security - Route::group(array('prefix' => 'users'), function () { - Route::get('', 'AdminController@listUsers'); - Route::group(array('prefix' => '{user_id}'), function () { - Route::get('', 'AdminController@editUser')->name("edit_user"); - }); - }); - - Route::group(array('prefix' => 'groups'), function () { - Route::get('', 'AdminController@listGroups'); - Route::group(array('prefix' => '{group_id}'), function () { - Route::get('', 'AdminController@editGroup'); - }); - }); - }); - - Route::group(array('middleware' => ['openstackid.currentuser.serveradmin']), function () { - Route::get('server-config', 'AdminController@listServerConfig'); - Route::post('server-config', 'AdminController@saveServerConfig'); - Route::get('banned-ips', 'AdminController@listBannedIPs'); - }); - }); - - // Admin Backend Services - - Route::group([ - 'namespace' => 'Api', - 'prefix' => 'admin/api/v1', - 'middleware' => ['ssl', 'auth']], function () { - - Route::group(['prefix' => 'users'], function () { - - Route::delete('/me/tokens/{value}',"UserApiController@revokeMyToken"); - Route::get('' , "UserApiController@getAll"); - Route::post('', ['middleware' => ['openstackid.currentuser.serveradmin.json'], 'uses' => "UserApiController@create"]); - Route::put('me', "UserApiController@updateMe"); - - Route::group(['prefix' => '{id}'], function(){ - - Route::group(['prefix' => 'locked'], function(){ - Route::put('', ['middleware' => ['openstackid.currentuser.serveradmin.json'], 'uses' => 'UserApiController@unlock']); - Route::delete('', ['middleware' => ['openstackid.currentuser.serveradmin.json'], 'uses' => 'UserApiController@lock']); - }); - - Route::get('', ['middleware' => ['openstackid.currentuser.serveradmin.json'], 'uses' => "UserApiController@get"]); - Route::delete('', ['middleware' => ['openstackid.currentuser.serveradmin.json'], 'uses' =>"UserApiController@delete"]); - Route::put('', ['middleware' => ['openstackid.currentuser.serveradmin.json'], 'uses' =>"UserApiController@update"]); - }); - }); - - Route::group(['prefix' => 'groups', 'middleware' => ['openstackid.currentuser.serveradmin.json']], function () { - Route::get('', "GroupApiController@getAll"); - Route::post('', "GroupApiController@create"); - Route::group(['prefix' => '{id}'], function(){ - Route::get('', "GroupApiController@get"); - Route::delete('', "GroupApiController@delete"); - Route::put('', "GroupApiController@update"); - Route::group(['prefix' => 'users'], function(){ - Route::get('', "GroupApiController@getUsersFromGroup"); - Route::group(['prefix' => '{user_id}'], function(){ - Route::put('','GroupApiController@addUserToGroup'); - Route::delete('','GroupApiController@removeUserFromGroup'); - }); - }); - }); - }); - - Route::group(['prefix' => 'banned-ips', 'middleware' => ['openstackid.currentuser.serveradmin.json']], function () { - Route::get('/', "ApiBannedIPController@getAll"); - Route::group(['prefix' => '{id?}'], function(){ - Route::get('', "ApiBannedIPController@get"); - Route::delete('', "ApiBannedIPController@delete"); - }); - }); - - //client api - Route::group(array('prefix' => 'clients'), function () { - - Route::get('', 'ClientApiController@getAll'); - Route::post('', 'ClientApiController@create'); - - Route::group(['prefix' => '{id}'], function(){ - Route::get('', "ClientApiController@get"); - Route::put('', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@update')); - Route::delete('', array('middleware' => ['oauth2.currentuser.owns.client'], 'uses' => 'ClientApiController@delete')); - // particular settings - - Route::delete('lock', array('middleware' => ['openstackid.currentuser.serveradmin.json'], 'uses' => 'ClientApiController@unlock')); - Route::put('secret', array('middleware' => ['oauth2.currentuser.owns.client'], 'uses' => 'ClientApiController@regenerateClientSecret')); - Route::put('use-refresh-tokens/{use_refresh_token}', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@setRefreshTokenClient')); - Route::put('rotate-refresh-tokens/{rotate_refresh_token}', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@setRotateRefreshTokenPolicy')); - Route::get('access-tokens', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@getAccessTokens')); - Route::get('refresh-tokens', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@getRefreshTokens')); - - // public keys - Route::group(['prefix' => 'public_keys'], function(){ - Route::post('', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientPublicKeyApiController@_create')); - Route::get('', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientPublicKeyApiController@getAll')); - Route::group(['prefix' => '{public_key_id}'], function(){ - Route::delete('', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientPublicKeyApiController@_delete')); - Route::put('', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientPublicKeyApiController@_update')); - }); - }); - //allowed redirect uris endpoints - Route::group(['prefix' => 'uris'], function(){ - Route::get('', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@getRegisteredUris')); - Route::post('', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@addAllowedRedirectUri')); - Route::delete('{uri_id}', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@deleteClientAllowedUri')); - }); - - // allowed origins - Route::group(['prefix' => 'origins'], function(){ - Route::post('', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@addAllowedOrigin')); - Route::delete('{origin_id}', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@deleteClientAllowedOrigin')); - - }); - - Route::delete('token/{value}/{hint}', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@revokeToken')); - // scopes - Route::group(['prefix' => 'scopes'], function(){ - Route::put('{scope_id}', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@addAllowedScope')); - Route::delete('{scope_id}', array('middleware' => ['oauth2.currentuser.allow.client.edition'], 'uses' => 'ClientApiController@removeAllowedScope')); - }); - - Route::put('active', array('middleware' => ['oauth2.currentuser.owns.client'], 'uses' => 'ClientApiController@activate')); - Route::delete('active', array('middleware' => ['oauth2.currentuser.owns.client'], 'uses' => 'ClientApiController@deactivate')); - }); - - Route::group(['prefix' => 'me'], function(){ - Route::get('access-tokens', array('middleware' => [], 'uses' => 'ClientApiController@getAccessTokensByCurrentUser')); - Route::get('refresh-tokens', array('middleware' => [], 'uses' => 'ClientApiController@getRefreshTokensByCurrentUser')); - }); - }); - - // resource servers - Route::group(array('prefix' => 'resource-servers', 'middleware' => ['oauth2.currentuser.serveradmin.json']), function () { - - Route::get('', "ApiResourceServerController@getAll"); - Route::post('', "ApiResourceServerController@create"); - - Route::group(['prefix' => '{id}'], function(){ - Route::get('', "ApiResourceServerController@get"); - Route::delete('', "ApiResourceServerController@delete"); - Route::put('', "ApiResourceServerController@update"); - Route::put('client-secret', "ApiResourceServerController@regenerateClientSecret"); - Route::put('active', "ApiResourceServerController@activate"); - Route::delete('active', "ApiResourceServerController@deactivate"); - }); - }); - - // api scope groups - Route::group(['prefix' => 'api-scope-groups', 'middleware' => ['oauth2.currentuser.serveradmin.json']], function () { - Route::get('', "ApiScopeGroupController@getAll"); - Route::post('', "ApiScopeGroupController@create"); - - Route::group(['prefix' => '{id}'], function(){ - Route::put('', "ApiScopeGroupController@update"); - Route::get('', "ApiScopeGroupController@get"); - Route::delete('', "ApiScopeGroupController@delete"); - Route::put('/active', "ApiScopeGroupController@activate"); - Route::delete('/active', "ApiScopeGroupController@deactivate"); - }); - - }); - - // apis - Route::group(['prefix' => 'apis', 'middleware' => ['oauth2.currentuser.serveradmin.json']], function () { - - Route::get('', "ApiController@getAll"); - Route::post('', "ApiController@create"); - - Route::group(['prefix' => '{id}'], function(){ - Route::get('', "ApiController@get"); - Route::delete('', "ApiController@delete"); - Route::put('', "ApiController@update"); - Route::put('/active', "ApiController@activate"); - Route::delete('/active', "ApiController@deactivate"); - }); - }); - - // scopes - Route::group(['prefix' => 'scopes', 'middleware' => ['oauth2.currentuser.serveradmin.json']], function () { - - Route::get('/', "ApiScopeController@getAll"); - Route::post('/', "ApiScopeController@create"); - - Route::group(['prefix' => '{id}'], function(){ - Route::get('', "ApiScopeController@get"); - Route::delete('', "ApiScopeController@delete"); - Route::put('', "ApiScopeController@update"); - Route::put('/active', "ApiScopeController@activate"); - Route::delete('/active', "ApiScopeController@deactivate"); - }); - }); - - // endpoints - Route::group(['prefix' => 'endpoints', 'middleware' => ['oauth2.currentuser.serveradmin.json']], function () { - - Route::get('', "ApiEndpointController@getAll"); - Route::post('', "ApiEndpointController@create"); - - Route::group(['prefix' => '{id}'], function(){ - Route::get('', "ApiEndpointController@get"); - Route::delete('', "ApiEndpointController@delete"); - Route::put('', "ApiEndpointController@update"); - Route::put('/active', "ApiEndpointController@activate"); - Route::delete('/active', "ApiEndpointController@deactivate"); - Route::group(['prefix' => 'scope'], function(){ - Route::group(['prefix' => '{scope_id}'], function(){ - Route::put('', "ApiEndpointController@addRequiredScope"); - Route::delete('', "ApiEndpointController@removeRequiredScope"); - }); - }); - }); - }); - - // private keys - Route::group(array('prefix' => 'private-keys', 'middleware' => ['oauth2.currentuser.serveradmin.json']), function () { - Route::get('', "ServerPrivateKeyApiController@getAll"); - Route::post('', "ServerPrivateKeyApiController@create"); - - Route::group(['prefix' => '{id}'], function(){ - Route::delete('', "ServerPrivateKeyApiController@delete"); - Route::put('', "ServerPrivateKeyApiController@update"); - }); - }); - - }); -}); - -// OAuth2 Protected API - -Route::group( - [ - 'namespace' => 'App\Http\Controllers\Api\OAuth2', - 'prefix' => 'api/v1', - 'middleware' => [ - 'ssl', - 'oauth2.endpoint', - ] - ], function () { - - Route::group(['prefix' => 'users'], function () { - Route::get('', 'OAuth2UserApiController@getAll'); - Route::get('/{id}', 'OAuth2UserApiController@get'); - - Route::group(['prefix' => 'me'], function () { - Route::get('', 'OAuth2UserApiController@me'); - Route::match(['options','put'],'','OAuth2UserApiController@UpdateMe'); - Route::group(['prefix' => 'pic'], function () { - Route::match(['options','put'],'','OAuth2UserApiController@UpdateMyPic'); - }); - }); - - Route::get('/info', 'OAuth2UserApiController@userInfo'); - Route::post('/info', 'OAuth2UserApiController@userInfo'); - }); - - Route::group(['prefix' => 'user-registration-requests'], function(){ - Route::match(['options','post'],'', 'OAuth2UserRegistrationRequestApiController@register'); - }); - - // 3rd Party SSO integrations - - Route::group(['prefix' => 'sso'], function () { - - Route::group(['prefix' => 'disqus'], function () { - Route::group(['prefix' => '{forum_slug}'], function () { - Route::get('profile', 'OAuth2DisqusSSOApiController@getUserProfile'); - }); - }); - - Route::group(['prefix' => 'rocket-chat'], function () { - Route::group(['prefix' => '{forum_slug}'], function () { - Route::get('profile', 'OAuth2RocketChatSSOApiController@getUserProfile'); - }); - }); - - Route::group(['prefix' => 'stream-chat'], function () { - Route::group(['prefix' => '{forum_slug}'], function () { - Route::get('profile', 'OAuth2StreamChatSSOApiController@getUserProfile'); - }); - }); - }); -}); \ No newline at end of file diff --git a/app/Jobs/Job.php b/app/Jobs/Job.php deleted file mode 100644 index 55ece29a..00000000 --- a/app/Jobs/Job.php +++ /dev/null @@ -1,21 +0,0 @@ -user_email = $newUser->getEmail(); - $this->user_id = $newUser->getId(); - Log::debug(sprintf("PublishUserCreated::PublishUserCreated user %s", $this->user_email)); - } - - /** - * Execute the job. - * - * @return void - */ - public function handle() - { - - } -} diff --git a/app/Jobs/PublishUserDeleted.php b/app/Jobs/PublishUserDeleted.php deleted file mode 100644 index 920346c9..00000000 --- a/app/Jobs/PublishUserDeleted.php +++ /dev/null @@ -1,55 +0,0 @@ -user_email = $newUser->getEmail(); - $this->user_id = $newUser->getId(); - Log::debug(sprintf("PublishUserDeleted::PublishUserDeleted user %s", $this->user_email)); - } - - /** - * Execute the job. - * - * @return void - */ - public function handle() - { - - } -} diff --git a/app/Jobs/PublishUserUpdated.php b/app/Jobs/PublishUserUpdated.php deleted file mode 100644 index 0a3bb8be..00000000 --- a/app/Jobs/PublishUserUpdated.php +++ /dev/null @@ -1,55 +0,0 @@ -user_email = $newUser->getEmail(); - $this->user_id = $newUser->getId(); - Log::debug(sprintf("PublishUserUpdated::PublishUserUpdated user %s", $this->user_email)); - } - - /** - * Execute the job. - * - * @return void - */ - public function handle() - { - - } -} diff --git a/app/Listeners/.gitkeep b/app/Listeners/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/app/Listeners/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/app/Mail/OAuth2ClientLocked.php b/app/Mail/OAuth2ClientLocked.php deleted file mode 100644 index 2805ff34..00000000 --- a/app/Mail/OAuth2ClientLocked.php +++ /dev/null @@ -1,82 +0,0 @@ -client_id = $client->getClientId(); - $this->client_name = $client->getApplicationName(); - $this->user_email = $client->getOwner()->getEmail(); - $this->user_fullname = $client->getOwner()->getFullName(); - } - - /** - * Build the message. - * - * @return $this - */ - public function build() - { - $subject = Config::get("mail.verification_email_subject"); - if(empty($subject)) - $subject = sprintf("[%s] Verify Email Address", Config::get('app.app_name')); - Log::warning(sprintf("OAuth2ClientLocked::build to %s", $this->user_email)); - return $this->from(Config::get("mail.from")) - ->to($this->user_email) - ->subject($subject) - ->view('emails.oauth2_client_locked'); - } -} diff --git a/app/Mail/UserEmailVerificationRequest.php b/app/Mail/UserEmailVerificationRequest.php deleted file mode 100644 index 7f71bbbc..00000000 --- a/app/Mail/UserEmailVerificationRequest.php +++ /dev/null @@ -1,85 +0,0 @@ -verification_link = $verification_link; - $this->user_email = $user->getEmail(); - $this->user_fullname = $user->getFullName(); - $this->bio_link = URL::action("UserController@getLogin"); - } - - /** - * Build the message. - * - * @return $this - */ - public function build() - { - - $subject = sprintf("%s email verification needed", Config::get('app.app_name')); - $view = 'emails.auth.email_verification_request'; - if(Config::get("app.tenant_name") == 'FNTECH') { - $view = 'emails.auth.email_verification_request_fn'; - $subject = sprintf("%s email verification needed", Config::get('app.app_name')); - } - Log::debug(sprintf("UserEmailVerificationRequest::build to %s", $this->user_email)); - return $this->from(Config::get("mail.from")) - ->to($this->user_email) - ->subject($subject) - ->view($view); - } -} diff --git a/app/Mail/UserEmailVerificationSuccess.php b/app/Mail/UserEmailVerificationSuccess.php deleted file mode 100644 index b9b88e27..00000000 --- a/app/Mail/UserEmailVerificationSuccess.php +++ /dev/null @@ -1,67 +0,0 @@ -user_email = $user->getEmail(); - $this->user_fullname = $user->getFullName(); - } - - /** - * Build the message. - * - * @return $this - */ - public function build() - { - $subject = Config::get("mail.verification_sucessfull_email_subject"); - if(empty($subject)) - $subject = sprintf("Success! %s email verified", Config::get('app.app_name')); - Log::debug(sprintf("UserEmailVerificationSuccess::build to %s", $this->user_email)); - return $this->from(Config::get("mail.from")) - ->to($this->user_email) - ->subject($subject) - ->view('emails.auth.email_verification_request_success'); - } -} diff --git a/app/Mail/UserLockedEmail.php b/app/Mail/UserLockedEmail.php deleted file mode 100644 index da45a3ac..00000000 --- a/app/Mail/UserLockedEmail.php +++ /dev/null @@ -1,83 +0,0 @@ -support_email = $support_email; - $this->attempts = $attempts; - $this->user_email = $user->getEmail(); - $this->user_fullname = $user->getFullName(); - } - - - /** - * Build the message. - * - * @return $this - */ - public function build() - { - $subject = Config::get("mail.locked_user_email_subject"); - if(empty($subject)) - $subject = sprintf("[%s] Your User has been locked", Config::get('app.app_name')); - Log::warning(sprintf("UserLockedEmail::build to %s", $this->user_email)); - return $this->from(Config::get("mail.from")) - ->to($this->user_email) - ->subject($subject) - ->view('emails.auth.user_locked'); - } -} diff --git a/app/Mail/UserPasswordResetMail.php b/app/Mail/UserPasswordResetMail.php deleted file mode 100644 index 598a4a11..00000000 --- a/app/Mail/UserPasswordResetMail.php +++ /dev/null @@ -1,68 +0,0 @@ -user_email = $user->getEmail(); - $this->user_fullname = $user->getFullName(); - } - - /** - * Build the message. - * - * @return $this - */ - public function build() - { - $subject = Config::get("mail.reset_password_success_email_subject"); - if(empty($subject)) - $subject = sprintf("[%s] Your Password Reset was successful", Config::get('app.app_name')); - Log::debug(sprintf("UserPasswordResetMail::build to %s", $this->user_email)); - return $this->from(Config::get("mail.from")) - ->to($this->user_email) - ->subject($subject) - ->view('emails.auth.reset_password_successfull'); - } -} diff --git a/app/Mail/UserPasswordResetRequestMail.php b/app/Mail/UserPasswordResetRequestMail.php deleted file mode 100644 index a32cd3af..00000000 --- a/app/Mail/UserPasswordResetRequestMail.php +++ /dev/null @@ -1,76 +0,0 @@ -reset_link = $reset_link; - $this->user_email = $user->getEmail(); - $this->user_fullname = $user->getFullName(); - } - - /** - * Build the message. - * - * @return $this - */ - public function build() - { - $subject = Config::get("mail.reset_password_email_subject"); - if(empty($subject)) - $subject = sprintf("[%s] Reset Password Notification", Config::get('app.app_name')); - Log::debug(sprintf("UserPasswordResetRequestMail::build to %s", $this->user_email)); - return $this->from(Config::get("mail.from")) - ->to($this->user_email) - ->subject($subject) - ->view('emails.auth.reset_password_request'); - } -} \ No newline at end of file diff --git a/app/Mail/UserSpammerProcessorResultsEmail.php b/app/Mail/UserSpammerProcessorResultsEmail.php deleted file mode 100644 index cb3e08cc..00000000 --- a/app/Mail/UserSpammerProcessorResultsEmail.php +++ /dev/null @@ -1,55 +0,0 @@ -users = $users; - } - - /** - * Build the message. - * - * @return $this - */ - public function build() - { - - $subject = sprintf("[%s] User Spammer Process Result", Config::get('app.app_name')); - $to = Config::get("mail.user_spam_processor_to"); - $to = explode(',', $to); - return $this->from(Config::get("mail.from")) - ->to($to) - ->subject($subject) - ->view('emails.user_spammer_process_result'); - } - -} \ No newline at end of file diff --git a/app/Mail/WelcomeNewUserEmail.php b/app/Mail/WelcomeNewUserEmail.php deleted file mode 100644 index b8c6d551..00000000 --- a/app/Mail/WelcomeNewUserEmail.php +++ /dev/null @@ -1,88 +0,0 @@ -user_email = $user->getEmail(); - $this->user_fullname = $user->getFullName(); - $this->verification_link = $verification_link; - $this->bio_link = URL::action("UserController@getLogin"); - } - - /** - * Build the message. - * - * @return $this - */ - public function build() - { - - $subject = sprintf("%s email verification needed", Config::get('app.app_name')); - $view = 'emails.welcome_new_user_email'; - - if(Config::get("app.tenant_name") == 'FNTECH') { - $view = 'emails.welcome_new_user_email_fn'; - $subject = sprintf("Thank you for registering for an %s account", Config::get('app.app_name')); - } - Log::debug(sprintf("WelcomeNewUserEmail::build to %s", $this->user_email)); - return $this->from(Config::get("mail.from")) - ->to($this->user_email) - ->subject($subject) - ->view($view); - } - -} diff --git a/app/ModelSerializers/AbstractSerializer.php b/app/ModelSerializers/AbstractSerializer.php deleted file mode 100644 index d9da4921..00000000 --- a/app/ModelSerializers/AbstractSerializer.php +++ /dev/null @@ -1,221 +0,0 @@ -object = $object; - $this->resource_server_context = $resource_server_context; - } - - protected static $array_mappings = []; - - protected static $allowed_fields = []; - - protected static $allowed_relations = []; - - /** - * @return array - */ - protected function getAllowedFields() - { - $mappings = []; - $hierarchy = $this->getClassHierarchy(); - - foreach($hierarchy as $class_name){ - if($class_name === AbstractSerializer::class ) continue; - $class = new $class_name($this->object, $this->resource_server_context); - $mappings = array_merge($mappings, $class->getSelfAllowedFields()); - } - $mappings = array_merge($mappings, $this->getSelfAllowedFields()); - return $mappings; - } - - private function getSelfAllowedFields(){ - return static::$allowed_fields; - } - - /** - * @return array - */ - protected function getAllowedRelations() - { - $mappings = []; - $hierarchy = $this->getClassHierarchy(); - - foreach($hierarchy as $class_name){ - if($class_name === AbstractSerializer::class ) continue; - $class = new $class_name($this->object, $this->resource_server_context); - $mappings = array_merge($mappings, $class->getSelfAllowedRelations()); - } - $mappings = array_merge($mappings, $this->getSelfAllowedRelations()); - return $mappings; - } - - private function getSelfAllowedRelations(){ - return static::$allowed_relations; - } - - /** - * @return array - */ - private function getAttributeMappings() - { - $mappings = []; - $hierarchy = $this->getClassHierarchy(); - - foreach($hierarchy as $class_name){ - if($class_name === AbstractSerializer::class) continue; - $class = new $class_name($this->object, $this->resource_server_context); - $mappings = array_merge($mappings, $class->getSelfMappings()); - } - $mappings = array_merge($mappings, $this->getSelfMappings()); - return $mappings; - } - - private function getSelfMappings(){ - return static::$array_mappings; - } - - /** - * @return array - */ - private function getClassHierarchy(){ - return array_reverse($this->get_class_lineage($this)); - } - - private function get_class_lineage($object) - { - $class_name = get_class($object); - $parents = array_values(class_parents($class_name)); - return array_merge(array($class_name), $parents); - } - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @return array - */ - public function serialize($expand = null, array $fields = [], array $relations = [], array $params = []) - { - $values = []; - $method_prefix = ['get', 'is']; - if(!count($fields)) $fields = $this->getAllowedFields(); - $mappings = $this->getAttributeMappings(); - if (count($mappings)) { - $new_values = []; - foreach ($mappings as $attribute => $mapping) { - $mapping = preg_split('/:/', $mapping); - if(count($fields) > 0 && !in_array($mapping[0], $fields)) continue; - $value = null; - foreach($method_prefix as $prefix){ - if(method_exists($this->object, $prefix.$attribute)){ - $value = call_user_func([$this->object, $prefix.$attribute ]); - break; - } - } - - if(count($mapping) > 1) - { - //we have a formatter ... - switch(strtolower($mapping[1])) - { - case 'datetime_epoch': - { - if(!is_null($value)) { - $value = $value->getTimestamp(); - } - } - break; - case 'json_string': - { - $value = JsonUtils::toJsonString($value); - } - break; - case 'json_boolean': - { - $value = JsonUtils::toJsonBoolean($value); - } - break; - case 'json_int': - { - $value = JsonUtils::toJsonInt($value); - } - break; - case 'json_float': - { - $value = JsonUtils::toJsonFloat($value); - } - break; - case 'json_obfuscated_email': - { - $value = JsonUtils::toObfuscatedEmail($value); - } - case 'json_url':{ - $value = JsonUtils::encodeUrl($value); - } - break; - } - } - $new_values[$mapping[0]] = $value; - } - $values = $new_values; - } - - return $values; - } - - /** - * @param string $expand_str - * @param string $prefix - * @return string - */ - protected static function filterExpandByPrefix($expand_str, $prefix ){ - - $expand_to = explode(',', $expand_str); - $filtered_expand = array_filter($expand_to, function($element) use($prefix){ - return preg_match('/^' . preg_quote($prefix, '/') . '/', strtolower(trim($element))) > 0; - }); - $res = ''; - foreach($filtered_expand as $filtered_expand_elem){ - if(strlen($res) > 0) $res .= ','; - $res .= explode('.', strtolower(trim($filtered_expand_elem)))[1]; - } - - return $res; - } -} \ No newline at end of file diff --git a/app/ModelSerializers/Auth/GroupSerializer.php b/app/ModelSerializers/Auth/GroupSerializer.php deleted file mode 100644 index dd75c96e..00000000 --- a/app/ModelSerializers/Auth/GroupSerializer.php +++ /dev/null @@ -1,27 +0,0 @@ - 'name:json_string', - 'Slug' => 'slug:json_string', - 'Active' => 'active:json_boolean', - 'Default' => 'default:json_boolean', - ]; -} \ No newline at end of file diff --git a/app/ModelSerializers/Auth/UserRegistrationRequestSerializer.php b/app/ModelSerializers/Auth/UserRegistrationRequestSerializer.php deleted file mode 100644 index 6d3f8409..00000000 --- a/app/ModelSerializers/Auth/UserRegistrationRequestSerializer.php +++ /dev/null @@ -1,47 +0,0 @@ - 'email:json_string', - 'FirstName' => 'first_name:json_string', - 'LastName' => 'last_name:json_string', - 'Country' => 'country:json_string', - 'Hash' => 'hash:json_string', - ]; - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @return array - */ - public function serialize($expand = null, array $fields = [], array $relations = [], array $params = []) - { - $request = $this->object; - if(!$request instanceof UserRegistrationRequest) return []; - if(!count($relations)) $relations = $this->getAllowedRelations(); - $values = parent::serialize($expand, $fields, $relations, $params); - $values['set_password_link'] = URL::route("password.set", ["token" => $request->getHash()]); - return $values; - } -} \ No newline at end of file diff --git a/app/ModelSerializers/Auth/UserSerializer.php b/app/ModelSerializers/Auth/UserSerializer.php deleted file mode 100644 index c11a3aa2..00000000 --- a/app/ModelSerializers/Auth/UserSerializer.php +++ /dev/null @@ -1,77 +0,0 @@ - 'first_name:json_string', - 'LastName' => 'last_name:json_string', - 'Pic' => 'pic:json_url', - ]; -} - -final class PublicUserSerializer extends BaseUserSerializer -{ - -} - -final class PrivateUserSerializer extends BaseUserSerializer -{ - - protected static $array_mappings = [ - 'Email' => 'email:json_string', - 'Bio' => 'bio:json_string', - 'Company' => 'company:json_string', - 'JobTitle' => 'job_title:json_string', - 'Gender' => 'gender:json_string', - 'SpamType' => 'spam_type:json_string', - 'Identifier' => 'identifier:json_string', - 'LastLoginDate' => 'last_login_date:datetime_epoch', - 'Active' => 'active:json_boolean', - 'EmailVerified' => 'email_verified:json_boolean' - ]; - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @return array - */ - public function serialize($expand = null, array $fields = [], array $relations = [], array $params = []) - { - $user = $this->object; - if (!$user instanceof User) return []; - - $values = parent::serialize($expand, $fields, $relations, $params); - - $groups = []; - foreach ($user->getGroups() as $group) { - if (!$group instanceof Group) continue; - $groups[] = $group->getSlug(); - } - - $values['groups'] = $groups; - return $values; - } -} \ No newline at end of file diff --git a/app/ModelSerializers/BaseSerializer.php b/app/ModelSerializers/BaseSerializer.php deleted file mode 100644 index 3742b4d2..00000000 --- a/app/ModelSerializers/BaseSerializer.php +++ /dev/null @@ -1,26 +0,0 @@ - 'id:json_int', - 'CreatedAt' => 'created_at:datetime_epoch', - 'UpdatedAt' => 'updated_at:datetime_epoch', - ]; -} \ No newline at end of file diff --git a/app/ModelSerializers/IModelSerializer.php b/app/ModelSerializers/IModelSerializer.php deleted file mode 100644 index 8f289e95..00000000 --- a/app/ModelSerializers/IModelSerializer.php +++ /dev/null @@ -1,30 +0,0 @@ - 'value:json_string', - 'FromIp' => 'from_ip:json_string', - 'RemainingLifetime' => 'remaining_lifetime:json_int', - 'Scope' => 'scope:json_string', - 'Audience' => 'audience:json_string', - 'ClientId' => 'client_id:json_int', - 'OwnerId' => 'user_id:json_int', - 'RefreshTokenId' => 'refresh_token_id:json_int', - ]; - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @return array - */ - public function serialize($expand = null, array $fields = [], array $relations = [], array $params = []) - { - $token = $this->object; - if(!$token instanceof AccessToken) return []; - $values = parent::serialize($expand, $fields, $relations, $params); - $values['client_type'] = $token->getClient()->getApplicationType(); - $values['client_name'] = $token->getClient()->getApplicationName(); - return $values; - } - -} \ No newline at end of file diff --git a/app/ModelSerializers/OAuth2/ApiEndpointSerializer.php b/app/ModelSerializers/OAuth2/ApiEndpointSerializer.php deleted file mode 100644 index a1064404..00000000 --- a/app/ModelSerializers/OAuth2/ApiEndpointSerializer.php +++ /dev/null @@ -1,86 +0,0 @@ - 'name:json_string', - 'Description' => 'description:json_string', - 'Active' => 'active:json_boolean', - 'AllowCors' => 'allow_cors:json_boolean', - 'AllowCredentials' => 'allow_credentials:json_boolean', - 'RateLimit' => 'rate_limit:json_int', - 'RateLimitDeca' => 'rate_limit_decay:json_int', - 'ApiId' => 'api_id:json_int', - ]; - - protected static $allowed_relations = [ - 'scopes', - ]; - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @return array - */ - public function serialize($expand = null, array $fields = [], array $relations = [], array $params = []) - { - $endpoint = $this->object; - if(!$endpoint instanceof ApiEndpoint) return []; - - if(!count($relations)) $relations = $this->getAllowedRelations(); - - $values = parent::serialize($expand, $fields, $relations, $params); - - if(in_array('scopes', $relations)){ - $res = []; - foreach ($endpoint->getScopes() as $scope){ - $res[]= $scope->getId(); - } - $values['scopes'] = $res; - } - - if (!empty($expand)) { - $exp_expand = explode(',', $expand); - foreach ($exp_expand as $relation) { - switch (trim($relation)) { - - case 'scopes': { - $res = []; - unset($values['scopes']); - foreach ($endpoint->getScopes() as $scope){ - $res[]= SerializerRegistry::getInstance()->getSerializer($scope)->serialize(); - } - $values['scopes'] = $res; - } - break; - case 'api': { - unset($values['api_id']); - $values['api'] = SerializerRegistry::getInstance()->getSerializer($endpoint->getApi())->serialize(); - } - break; - } - } - } - return $values; - } -} \ No newline at end of file diff --git a/app/ModelSerializers/OAuth2/ApiScopeGroupSerializer.php b/app/ModelSerializers/OAuth2/ApiScopeGroupSerializer.php deleted file mode 100644 index ee49eed3..00000000 --- a/app/ModelSerializers/OAuth2/ApiScopeGroupSerializer.php +++ /dev/null @@ -1,94 +0,0 @@ - 'name:json_string', - 'Description' => 'description:json_string', - 'Active' => 'active:json_boolean', - ]; - - protected static $allowed_relations = [ - 'scopes', - 'users', - ]; - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @return array - */ - public function serialize($expand = null, array $fields = [], array $relations = [], array $params = []) - { - $group = $this->object; - if(!$group instanceof ApiScopeGroup) return []; - - if(!count($relations)) $relations = $this->getAllowedRelations(); - - $values = parent::serialize($expand, $fields, $relations, $params); - - if(in_array('scopes', $relations)){ - $res = []; - foreach ($group->getScopes() as $scope){ - $res[]= $scope->getId(); - } - $values['scopes'] = $res; - } - - if(in_array('users', $relations)){ - $res = []; - foreach ($group->getUsers() as $user){ - $res[]= $user->getId(); - } - $values['users'] = $res; - } - - if (!empty($expand)) { - $exp_expand = explode(',', $expand); - foreach ($exp_expand as $relation) { - switch (trim($relation)) { - - case 'scopes': { - $res = []; - unset($values['scopes']); - foreach ($group->getScopes() as $scope){ - $res[]= SerializerRegistry::getInstance()->getSerializer($scope)->serialize(); - } - $values['scopes'] = $res; - } - break; - case 'users': { - $res = []; - unset($values['users']); - foreach ($group->getUsers() as $user){ - $res[]= SerializerRegistry::getInstance()->getSerializer($user)->serialize(); - } - $values['users'] = $res; - } - break; - } - } - } - return $values; - } -} \ No newline at end of file diff --git a/app/ModelSerializers/OAuth2/ApiScopeSerializer.php b/app/ModelSerializers/OAuth2/ApiScopeSerializer.php deleted file mode 100644 index e3f19e69..00000000 --- a/app/ModelSerializers/OAuth2/ApiScopeSerializer.php +++ /dev/null @@ -1,85 +0,0 @@ - 'name:json_string', - 'Description' => 'description:json_string', - 'ShortDescription' => 'short_description:json_string', - 'Active' => 'active:json_boolean', - 'Default' => 'default:json_boolean', - 'System' => 'system:json_boolean', - 'AssignedByGroups' => 'assigned_by_groups:json_boolean', - 'ApiId' => 'api_id:json_int', - ]; - - protected static $allowed_relations = [ - 'scope_groups', - ]; - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @return array - */ - public function serialize($expand = null, array $fields = [], array $relations = [], array $params = []) - { - $scope = $this->object; - if(!$scope instanceof ApiScope) return []; - - if(!count($relations)) $relations = $this->getAllowedRelations(); - - $values = parent::serialize($expand, $fields, $relations, $params); - - if(in_array('scope_groups', $relations)){ - $res = []; - foreach ($scope->getScopeGroups() as $scope_group){ - $res[]= $scope_group->getId(); - } - $values['scope_groups'] = $res; - } - if (!empty($expand)) { - $exp_expand = explode(',', $expand); - foreach ($exp_expand as $relation) { - switch (trim($relation)) { - - case 'scope_groups': { - $res = []; - unset($values['scope_groups']); - foreach ($scope->getScopeGroups() as $scope_group){ - $res[]= SerializerRegistry::getInstance()->getSerializer($scope_group)->serialize(); - } - $values['scope_groups'] = $res; - } - break; - case 'api': { - unset($values['api_id']); - $values['api'] = SerializerRegistry::getInstance()->getSerializer($scope->getApi())->serialize(); - } - break; - } - } - } - return $values; - } -} \ No newline at end of file diff --git a/app/ModelSerializers/OAuth2/ApiSerializer.php b/app/ModelSerializers/OAuth2/ApiSerializer.php deleted file mode 100644 index 257f92e7..00000000 --- a/app/ModelSerializers/OAuth2/ApiSerializer.php +++ /dev/null @@ -1,103 +0,0 @@ - 'name:json_string', - 'Description' => 'description:json_string', - 'Active' => 'active:json_boolean', - 'ResourceServerId' => 'resource_server_id:json_int', - ]; - - protected static $allowed_relations = [ - 'scopes', - 'endpoints', - ]; - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @return array - */ - public function serialize($expand = null, array $fields = [], array $relations = [], array $params = []) - { - $api = $this->object; - if(!$api instanceof Api) return []; - - if(!count($relations)) $relations = $this->getAllowedRelations(); - - $values = parent::serialize($expand, $fields, $relations, $params); - - if(in_array('scopes', $relations)){ - $res = []; - foreach ($api->getScopes() as $scope){ - $res[]= $scope->getId(); - } - $values['scopes'] = $res; - } - - if(in_array('endpoints', $relations)){ - $res = []; - foreach ($api->getEndpoints() as $endpoint){ - $res[]= $endpoint->getId(); - } - $values['endpoints'] = $res; - } - - if (!empty($expand)) { - $exp_expand = explode(',', $expand); - foreach ($exp_expand as $relation) { - switch (trim($relation)) { - - case 'scopes': { - unset($values['scopes']); - $res = []; - foreach ($api->getScopes() as $scope){ - $res[]= SerializerRegistry::getInstance()->getSerializer($scope)->serialize(); - } - $values['scopes'] = $res; - } - break; - case 'endpoints': { - unset($values['endpoints']); - $res = []; - foreach ($api->getEndpoints() as $endpoint){ - $res[]= SerializerRegistry::getInstance()->getSerializer($endpoint)->serialize(); - } - $values['endpoints'] = $res; - } - break; - case 'resource_server': { - if($api->haResourceServer()) { - unset($values['resource_server_id']); - $values['resource_server'] = SerializerRegistry::getInstance()->getSerializer($api->getResourceServer())->serialize(); - } - } - break; - - } - } - } - return $values; - } -} \ No newline at end of file diff --git a/app/ModelSerializers/OAuth2/AsymmetricKeySerializer.php b/app/ModelSerializers/OAuth2/AsymmetricKeySerializer.php deleted file mode 100644 index 2b296fc4..00000000 --- a/app/ModelSerializers/OAuth2/AsymmetricKeySerializer.php +++ /dev/null @@ -1,35 +0,0 @@ - 'kid:json_string', - 'PEM' => 'pem:json_string', - 'SHA_256_Thumbprint' => 'sha_256:json_string', - 'Active' => 'active:json_boolean', - 'Expired' => 'expired:json_boolean', - 'ValidFrom' => 'valid_from:datetime_epoch', - 'ValidTo' => 'valid_to:datetime_epoch', - 'Usage' => 'usage:json_string', - 'Type' => 'type:json_string', - 'AlgName' => 'alg:json_string', - 'LastUse' => 'last_used:datetime_epoch', - ]; -} \ No newline at end of file diff --git a/app/ModelSerializers/OAuth2/ClientPublicKeySerializer.php b/app/ModelSerializers/OAuth2/ClientPublicKeySerializer.php deleted file mode 100644 index 51a7c45e..00000000 --- a/app/ModelSerializers/OAuth2/ClientPublicKeySerializer.php +++ /dev/null @@ -1,18 +0,0 @@ - 'app_name:json_string', - 'ApplicationDescription' => 'app_description:json_string', - 'ApplicationType' => 'application_type:json_string', - 'FriendlyApplicationType' => 'friendly_application_type:json_string', - 'Active' => 'active:json_boolean', - 'Locked' => 'locked:json_boolean', - 'ClientId' => 'client_id:json_string', - 'ClientSecret' => 'client_secret:json_string', - 'ClientType' => 'client_type:json_string', - ]; - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @return array - */ - public function serialize($expand = null, array $fields = [], array $relations = [], array $params = []) - { - $client = $this->object; - if(!$client instanceof Client) return []; - - $values = parent::serialize($expand, $fields, $relations, $params); - $current_user = Auth::user(); - if(!is_null($current_user)) - $values['is_own'] = $client->getUserId() == $current_user->getId(); - $values['modified_by'] = $client->getEditedByNice(); - return $values; - } - -} \ No newline at end of file diff --git a/app/ModelSerializers/OAuth2/RefreshTokenSerializer.php b/app/ModelSerializers/OAuth2/RefreshTokenSerializer.php deleted file mode 100644 index acf2ffb2..00000000 --- a/app/ModelSerializers/OAuth2/RefreshTokenSerializer.php +++ /dev/null @@ -1,51 +0,0 @@ - 'value:json_string', - 'FromIp' => 'from_ip:json_string', - 'RemainingLifetime' => 'remaining_lifetime:json_int', - 'Lifetime' => 'lifetime:json_int', - 'Scope' => 'scope:json_string', - 'Audience' => 'audience:json_string', - 'ClientId' => 'client_id:json_int', - 'OwnerId' => 'user_id:json_int', - 'Void' => 'is_void:json_boolean', - ]; - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @return array - */ - public function serialize($expand = null, array $fields = [], array $relations = [], array $params = []) - { - $token = $this->object; - if(!$token instanceof RefreshToken) return []; - $values = parent::serialize($expand, $fields, $relations, $params); - $values['client_type'] = $token->getClient()->getApplicationType(); - $values['client_name'] = $token->getClient()->getApplicationName(); - return $values; - } - -} \ No newline at end of file diff --git a/app/ModelSerializers/OAuth2/ResourceServerSerializer.php b/app/ModelSerializers/OAuth2/ResourceServerSerializer.php deleted file mode 100644 index bbf50511..00000000 --- a/app/ModelSerializers/OAuth2/ResourceServerSerializer.php +++ /dev/null @@ -1,90 +0,0 @@ - 'friendly_name:json_string', - 'Host' => 'host:json_string', - 'Ips' => 'ips:json_string', - 'Active' => 'active:json_boolean', - 'ClientId' => 'client_id:json_int', - ]; - - protected static $allowed_relations = [ - 'apis', - ]; - - - /** - * @param null $expand - * @param array $fields - * @param array $relations - * @param array $params - * @return array - */ - public function serialize($expand = null, array $fields = [], array $relations = [], array $params = []) - { - $resource_server = $this->object; - if (!$resource_server instanceof ResourceServer) return []; - - if (!count($relations)) $relations = $this->getAllowedRelations(); - - $values = parent::serialize($expand, $fields, $relations, $params); - - if (in_array('apis', $relations)) { - $res = []; - foreach ($resource_server->getApis() as $api) { - $res[] = $api->getId(); - } - $values['apis'] = $res; - } - - if (!empty($expand)) { - $exp_expand = explode(',', $expand); - foreach ($exp_expand as $relation) { - switch (trim($relation)) { - - case 'apis': - { - unset($values['apis']); - $res = []; - foreach ($resource_server->getApis() as $api) { - $res[] = SerializerRegistry::getInstance()->getSerializer($api)->serialize(); - } - $values['apis'] = $res; - } - break; - case 'client': - { - - if ($resource_server->hasClient()) { - unset($values['client_id']); - $values['client'] = SerializerRegistry::getInstance()->getSerializer($resource_server->getClient())->serialize(); - } - } - break; - - } - } - } - return $values; - } -} \ No newline at end of file diff --git a/app/ModelSerializers/OAuth2/ServerPrivateKeySerializer.php b/app/ModelSerializers/OAuth2/ServerPrivateKeySerializer.php deleted file mode 100644 index 908dca5a..00000000 --- a/app/ModelSerializers/OAuth2/ServerPrivateKeySerializer.php +++ /dev/null @@ -1,22 +0,0 @@ -resource_server_context = App::make(IResourceServerContext::class); - - // auth mappings - $this->registry["User"] = [ - self::SerializerType_Public => PublicUserSerializer::class, - self::SerializerType_Private => PrivateUserSerializer::class, - ]; - - $this->registry["UserRegistrationRequest"] = UserRegistrationRequestSerializer::class; - - $this->registry["Group"] = [ - self::SerializerType_Public => PublicGroupSerializer::class, - self::SerializerType_Private => PublicGroupSerializer::class, - ]; - - // oauth2 mappings - $this->registry["ResourceServer"] = ResourceServerSerializer::class; - $this->registry["Api"] = ApiSerializer::class; - $this->registry["ApiScope"] = ApiScopeSerializer::class; - $this->registry["ApiEndpoint"] = ApiEndpointSerializer::class; - $this->registry["Client"] = ClientSerializer::class; - $this->registry["AccessToken"] = AccessTokenSerializer::class; - $this->registry["RefreshToken"] = RefreshTokenSerializer::class; - $this->registry["ApiScopeGroup"] = ApiScopeGroupSerializer::class; - $this->registry["ServerPrivateKey"] = ServerPrivateKeySerializer::class; - $this->registry["ClientPublicKey"] = ClientPublicKeySerializer::class; - } - - /** - * @param object $object - * @param string $type - * @return IModelSerializer - */ - public function getSerializer($object, $type = self::SerializerType_Public){ - if(is_null($object)) return null; - $reflect = new ReflectionClass($object); - $class = $reflect->getShortName(); - if(!isset($this->registry[$class])) - throw new \InvalidArgumentException('Serializer not found for '.$class); - - $serializer_class = $this->registry[$class]; - - if(is_array($serializer_class)){ - if(!isset($serializer_class[$type])) - throw new \InvalidArgumentException(sprintf('Serializer not found for %s , type %s', $class, $type)); - $serializer_class = $serializer_class[$type]; - } - - return new $serializer_class($object, $this->resource_server_context); - } -} \ No newline at end of file diff --git a/app/Models/BannedIP.php b/app/Models/BannedIP.php deleted file mode 100644 index b0f38ec7..00000000 --- a/app/Models/BannedIP.php +++ /dev/null @@ -1,146 +0,0 @@ -exception_type; - } - - /** - * @param string $exception_type - */ - public function setExceptionType(string $exception_type): void - { - $this->exception_type = $exception_type; - } - - /** - * @return string - */ - public function getIp(): string - { - return $this->ip; - } - - /** - * @param string $ips - */ - public function setIp(string $ip): void - { - $this->ip = $ip; - } - - /** - * @return int - */ - public function getHits(): int - { - return $this->hits; - } - - /** - * @param int $hits - */ - public function setHits(int $hits): void - { - $this->hits = $hits; - } - - /** - * @return User|null - */ - public function getUser(): ?User - { - return $this->user; - } - - /** - * @param User $user - */ - public function setUser(User $user): void - { - $this->user = $user; - } - - /** - * @return int - */ - public function updateHits():int{ - $this->hits = $this->hits + 1 ; - return $this->hits; - } - - /** - * @return bool - */ - public function hasUser():bool{ - return $this->getUserId() > 0; - } - - public function getUserId():int{ - try { - return !is_null($this->user) ? $this->user->getId() : 0; - } catch (\Exception $ex) { - return 0; - } - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - -} \ No newline at end of file diff --git a/app/Models/Exceptions/EntityNotFoundException.php b/app/Models/Exceptions/EntityNotFoundException.php deleted file mode 100644 index 0e83024c..00000000 --- a/app/Models/Exceptions/EntityNotFoundException.php +++ /dev/null @@ -1,22 +0,0 @@ -messages = $messages; - return $this; - } - - public function getMessages() - { - if(is_null($this->messages)) - { - $this->messages = array($this->getMessage()); - } - return $this->messages; - } - -} \ No newline at end of file diff --git a/app/Models/Factories/ServerConfigurationFactory.php b/app/Models/Factories/ServerConfigurationFactory.php deleted file mode 100644 index eb6abdc0..00000000 --- a/app/Models/Factories/ServerConfigurationFactory.php +++ /dev/null @@ -1,45 +0,0 @@ -setKey($payload['key']); - - if(isset($payload['value'])) - $config->setValue($payload['value']); - - return $config; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/AccessToken.php b/app/Models/OAuth2/AccessToken.php deleted file mode 100644 index 58832573..00000000 --- a/app/Models/OAuth2/AccessToken.php +++ /dev/null @@ -1,348 +0,0 @@ -refresh_tokens = new ArrayCollection(); - } - - /** - * @return RefreshToken|null - */ - public function getRefreshToken() : ?RefreshToken { - return $this->refresh_token; - } - - /** - * @return Client - */ - public function getClient():Client{ - return $this->client; - } - /** - * @return User - */ - public function getUser():User{ - return $this->owner; - } - - - public function getFriendlyScopes():string { - return $this->friendly_scopes; - } - - /** - * @param string $friendly_scopes - */ - public function setFriendlyScopes(string $friendly_scopes){ - $this->friendly_scopes = $friendly_scopes; - } - - /** - * @return int - */ - public function getRemainingLifetime():int - { - //check is refresh token is stills alive... (ZERO is infinite lifetime) - if (intval($this->lifetime) == 0) return 0; - $created_at = clone $this->created_at; - $created_at->setTimezone(new DateTimeZone('UTC')); - $created_at->add(new DateInterval('PT' . intval($this->lifetime) . 'S')); - $now = new DateTime(gmdate("Y-m-d H:i:s", time()), new DateTimeZone("UTC")); - //check validity... - if ($now > $created_at) - return -1; - $seconds = abs($created_at->getTimestamp() - $now->getTimestamp());; - return $seconds; - } - - /** - * @return bool - */ - public function isVoid():bool { - //check lifetime... - $created_at = $this->created_at; - $created_at->add(new DateInterval('PT' . intval($this->lifetime) . 'S')); - $now = new DateTime(gmdate("Y-m-d H:i:s", time()), new DateTimeZone("UTC")); - return ($now > $created_at); - } - - /** - * @return string - */ - public function getFromIp(): string - { - return $this->from_ip; - } - - /** - * @return string - */ - public function getValue(): string - { - return $this->value; - } - - /** - * @return string|null - */ - public function getAssociatedAuthorizationCode(): ?string - { - return $this->associated_authorization_code; - } - - /** - * @return int - */ - public function getLifetime(): int - { - return $this->lifetime; - } - - /** - * @return string - */ - public function getScope(): string - { - return $this->scope; - } - - /** - * @return string - */ - public function getAudience(): string - { - return $this->audience; - } - - /** - * @return User - */ - public function getOwner(): User - { - return $this->owner; - } - - /** - * @param string $from_ip - */ - public function setFromIp(string $from_ip): void - { - $this->from_ip = $from_ip; - } - - /** - * @param string $value - */ - public function setValue(string $value): void - { - $this->value = $value; - } - - /** - * @param string $associated_authorization_code - */ - public function setAssociatedAuthorizationCode(string $associated_authorization_code): void - { - $this->associated_authorization_code = $associated_authorization_code; - } - - /** - * @param int $lifetime - */ - public function setLifetime(int $lifetime): void - { - $this->lifetime = $lifetime; - } - - /** - * @param string $scope - */ - public function setScope(string $scope): void - { - $this->scope = $scope; - } - - /** - * @param string $audience - */ - public function setAudience(string $audience): void - { - $this->audience = $audience; - } - - /** - * @param RefreshToken $refresh_token - */ - public function setRefreshToken(RefreshToken $refresh_token): void - { - $this->refresh_token = $refresh_token; - } - - /** - * @param Client $client - */ - public function setClient(Client $client): void - { - $this->client = $client; - } - - /** - * @param User $owner - */ - public function setOwner(User $owner): void - { - $this->owner = $owner; - } - - /** - * @return int - */ - public function getOwnerId():int{ - try { - return is_null($this->owner) ? 0 : $this->owner->getId(); - } - catch(\Exception $ex){ - return 0; - } - } - - /** - * @return bool - */ - public function hasOwner():bool{ - return $this->getOwnerId() > 0; - } - - /** - * @return int - */ - public function getClientId():int{ - try { - return is_null($this->client) ? 0 : $this->client->getId(); - } - catch(\Exception $ex){ - return 0; - } - } - - /** - * @return bool - */ - public function hasClient():bool{ - return $this->getClientId() > 0; - } - - /** - * @return int - */ - public function getRefreshTokenId():int{ - try { - return is_null($this->refresh_token) ? 0 : $this->refresh_token->getId(); - } - catch(\Exception $ex){ - return 0; - } - } - - /** - * @return bool - */ - public function hasRefreshToken():bool{ - return $this->getRefreshTokenId() > 0; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/Api.php b/app/Models/OAuth2/Api.php deleted file mode 100644 index 2fc05201..00000000 --- a/app/Models/OAuth2/Api.php +++ /dev/null @@ -1,217 +0,0 @@ -scopes = new ArrayCollection(); - $this->endpoints = new ArrayCollection(); - } - - public function getLogo() - { - $url = asset('/assets/img/apis/server.png'); - return $url; - } - - public function getScopesStr():string - { - $scope = ''; - foreach ($this->scopes as $s) { - if (!$s->isActive()) { - continue; - } - $scope = $scope . $s->getName() . ' '; - } - $scope = trim($scope); - - return $scope; - } - - /** - * @return ArrayCollection - */ - public function getScopes() - { - return $this->scopes; - } - - public function addScope(ApiScope $scope){ - if($this->scopes->contains($scope)) return; - $this->scopes->add($scope); - $scope->setApi($this); - } - - /** - * @return ArrayCollection - */ - public function getEndpoints() - { - return $this->endpoints; - } - - /** - * @param ApiEndpoint $endpoint - */ - public function addEndpoint(ApiEndpoint $endpoint){ - - if($this->endpoints->contains($endpoint)) return; - $this->endpoints->add($endpoint); - $endpoint->setApi($this); - } - - - /** - * @return string - */ - public function getName(): string - { - return $this->name; - } - - /** - * @param string $name - */ - public function setName(string $name): void - { - $this->name = $name; - } - - /** - * @return string - */ - public function getDescription(): string - { - return $this->description; - } - - /** - * @param string $description - */ - public function setDescription(string $description): void - { - $this->description = $description; - } - - /** - * @return bool - */ - public function isActive(): bool - { - return $this->active; - } - - /** - * @param bool $active - */ - public function setActive(bool $active): void - { - $this->active = $active; - } - - /** - * @return ResourceServer - */ - public function getResourceServer(): ResourceServer - { - return $this->resource_server; - } - - /** - * @param ResourceServer $resource_server - */ - public function setResourceServer(ResourceServer $resource_server): void - { - $this->resource_server = $resource_server; - } - - /** - * @return bool - */ - public function hasResourceServer():bool{ - return $this->getResourceServerId() > 0; - } - - public function getResourceServerId():int{ - try { - return !is_null($this->resource_server) ? $this->resource_server->getId() : 0; - } catch (\Exception $ex) { - return 0; - } - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - if($name == 'resource_server_id'){ - return $this->getResourceServerId(); - } - return $this->{$name}; - } - -} \ No newline at end of file diff --git a/app/Models/OAuth2/ApiEndpoint.php b/app/Models/OAuth2/ApiEndpoint.php deleted file mode 100644 index 519ef438..00000000 --- a/app/Models/OAuth2/ApiEndpoint.php +++ /dev/null @@ -1,342 +0,0 @@ -rate_limit = 0; - $this->rate_limit_decay = 0; - $this->active = false; - $this->allow_cors = false; - $this->allow_credentials = false; - $this->scopes = new ArrayCollection(); - } - - /** - * @return string - */ - public function getRoute():string - { - return $this->route; - } - - public function getHttpMethod(){ - return $this->http_method; - } - - public function setRoute($route) - { - $this->route = $route; - } - - public function setHttpMethod($http_method) - { - $this->http_method = $http_method; - } - - public function getScope():string - { - $scope = ''; - foreach($this->scopes as $s){ - if(!$s->isActive()) continue; - $scope = $scope .$s->getName().' '; - } - $scope = trim($scope); - return $scope; - } - - public function isActive() - { - return $this->active; - } - - public function setStatus($active) - { - $this->active = $active; - } - - public function getName() - { - return $this->name; - } - - public function setName($name) - { - $this->name= $name; - } - - - public function supportCORS():bool - { - return $this->allow_cors; - } - - /** - * @return bool - */ - public function supportCredentials():bool - { - return $this->allow_credentials; - } - - /** - * @param ApiScope $scope - */ - public function addScope(ApiScope $scope){ - if($this->scopes->contains($scope)) return; - $this->scopes->add($scope); - } - - /** - * @param ApiScope $scope - */ - public function removeScope(ApiScope $scope){ - if(!$this->scopes->contains($scope)) return; - $this->scopes->removeElement($scope); - } - - /** - * @return Api - */ - public function getApi() - { - return $this->api; - } - - /** - * @param Api $api - */ - public function setApi($api) - { - $this->api = $api; - } - - /** - * @return ApiScope[] - */ - public function getScopes() - { - return $this->scopes; - } - - /** - * @param ApiScope[] $scopes - */ - public function setScopes($scopes) - { - $this->scopes = $scopes; - } - - /** - * @return string|null - */ - public function getDescription(): ?string - { - return $this->description; - } - - /** - * @param string $description - */ - public function setDescription(string $description): void - { - $this->description = $description; - } - - /** - * @return bool - */ - public function isAllowCors(): bool - { - return $this->allow_cors; - } - - /** - * @param bool $allow_cors - */ - public function setAllowCors(bool $allow_cors): void - { - $this->allow_cors = $allow_cors; - } - - /** - * @return bool - */ - public function isAllowCredentials(): bool - { - return $this->allow_credentials; - } - - /** - * @param bool $allow_credentials - */ - public function setAllowCredentials(bool $allow_credentials): void - { - $this->allow_credentials = $allow_credentials; - } - - /** - * @return int - */ - public function getRateLimit(): int - { - return $this->rate_limit; - } - - /** - * @param int $rate_limit - */ - public function setRateLimit(int $rate_limit): void - { - $this->rate_limit = $rate_limit; - } - - /** - * @return int - */ - public function getRateLimitDecay(): int - { - return $this->rate_limit_decay; - } - - /** - * @param int $rate_limit_decay - */ - public function setRateLimitDecay(int $rate_limit_decay): void - { - $this->rate_limit_decay = $rate_limit_decay; - } - - /** - * @param ApiScope $scope - * @return bool - */ - public function hasScope(ApiScope $scope):bool{ - return $this->scopes->contains($scope); - } - - /** - * @return bool - */ - public function hasApi():bool{ - return $this->getApiId() > 0; - } - - public function getApiId():int{ - try { - return !is_null($this->api) ? $this->api->getId() : 0; - } catch (\Exception $ex) { - return 0; - } - } - - /** - /** - * @param $name - * @return mixed - */ - public function __get($name) { - if($name == "api_id"){ - return $this->getApiId(); - } - return $this->{$name}; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/ApiScope.php b/app/Models/OAuth2/ApiScope.php deleted file mode 100644 index ef725e64..00000000 --- a/app/Models/OAuth2/ApiScope.php +++ /dev/null @@ -1,286 +0,0 @@ -name = null; - $this->description = null; - $this->short_description = null; - $this->active = false; - $this->default = false; - $this->system = false; - $this->assigned_by_groups = false; - $this->scope_groups = new ArrayCollection(); - } - - public function getScopeGroups(){ - return $this->scope_groups; - } - - /** - * @param ApiScopeGroup $scope_group - */ - public function addToScopeGroup(ApiScopeGroup $scope_group){ - if($this->scope_groups->contains($scope_group)) return; - $this->scope_groups->add($scope_group); - $scope_group->addScope($this); - } - - /** - * @param ApiScopeGroup $scope_group - */ - public function removeFromScopeGroup(ApiScopeGroup $scope_group){ - if(!$this->scope_groups->contains($scope_group)) return; - $this->scope_groups->removeElement($scope_group); - $scope_group->removeScope($this); - } - - /** - * @return Api|null - */ - public function getApi(): ?Api - { - return $this->api; - } - - /** - * @param Api $api - */ - public function setApi(Api $api): void - { - $this->api = $api; - } - - public function hasApi():bool{ - return $this->getApiId() > 0; - } - - public function getApiId():int{ - try { - return !is_null($this->api) ? $this->api->getId() : 0; - } catch (\Exception $ex) { - return 0; - } - } - - /** - * @return string - */ - public function getApiName():string{ - return $this->hasApi() ? $this->getApi()->getName(): null; - } - - /** - * @return string - */ - public function getApiDescription():string{ - return $this->hasApi() ? $this->getApi()->getDescription(): null; - } - - /** - * @return string - */ - public function getApiLogo():string{ - return $this->hasApi() ? $this->getApi()->getLogo(): null; - } - - /** - * @return string - */ - public function getName(): string - { - return $this->name; - } - - /** - * @param string $name - */ - public function setName(string $name): void - { - $this->name = $name; - } - - /** - * @return string - */ - public function getDescription(): string - { - return $this->description; - } - - /** - * @param string $description - */ - public function setDescription(string $description): void - { - $this->description = $description; - } - - /** - * @return string - */ - public function getShortDescription(): string - { - return $this->short_description; - } - - /** - * @param string $short_description - */ - public function setShortDescription(string $short_description): void - { - $this->short_description = $short_description; - } - - /** - * @return bool - */ - public function isActive(): bool - { - return $this->active; - } - - /** - * @param bool $active - */ - public function setActive(bool $active): void - { - $this->active = $active; - } - - /** - * @return bool - */ - public function isDefault(): bool - { - return $this->default; - } - - /** - * @param bool $default - */ - public function setDefault(bool $default): void - { - $this->default = $default; - } - - /** - * @return bool - */ - public function isSystem(): bool - { - return $this->system; - } - - /** - * @param bool $system - */ - public function setSystem(bool $system): void - { - $this->system = $system; - } - - /** - * @return bool - */ - public function isAssignedByGroups(): bool - { - return $this->assigned_by_groups; - } - - /** - * @param bool $assigned_by_groups - */ - public function setAssignedByGroups(bool $assigned_by_groups): void - { - $this->assigned_by_groups = $assigned_by_groups; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - if($name == 'api_id') - return $this->getApiId(); - return $this->{$name}; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/ApiScopeGroup.php b/app/Models/OAuth2/ApiScopeGroup.php deleted file mode 100644 index fbd2b462..00000000 --- a/app/Models/OAuth2/ApiScopeGroup.php +++ /dev/null @@ -1,190 +0,0 @@ -scopes = new ArrayCollection(); - $this->users = new ArrayCollection(); - $this->description = ""; - $this->active = false; - } - - /** - * @return string - */ - public function getName(): string - { - return $this->name; - } - - /** - * @param string $name - */ - public function setName(string $name): void - { - $this->name = $name; - } - - /** - * @return string|null - */ - public function getDescription(): ?string - { - return $this->description; - } - - /** - * @param string $description - */ - public function setDescription(string $description): void - { - $this->description = $description; - } - - /** - * @return bool - */ - public function isActive(): bool - { - return $this->active; - } - - /** - * @param bool $active - */ - public function setActive(bool $active): void - { - $this->active = $active; - } - - /** - * @return ApiScope[] - */ - public function getScopes() - { - return $this->scopes; - } - - public function clearScopes(){ - $this->scopes->clear(); - } - - /** - * @param ApiScope $scope - * @return bool - */ - public function hasScope(ApiScope $scope):bool{ - return $this->scopes->contains($scope); - } - - /** - * @param ApiScope $scope - */ - public function addScope(ApiScope $scope){ - if($this->scopes->contains($scope)) return; - $this->scopes->add($scope); - } - - /** - * @param ApiScope $scope - */ - public function removeScope(ApiScope $scope){ - if(!$this->scopes->contains($scope)) return; - $this->scopes->removeElement($scope); - } - - /** - * @return User[] - */ - public function getUsers() - { - return $this->users; - } - - public function clearUsers(){ - $this->users->clear(); - } - - /** - * @param User $user - */ - public function addUser(User $user){ - if($this->users->contains($user)) return; - $this->users->add($user); - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - -} \ No newline at end of file diff --git a/app/Models/OAuth2/AsymmetricKey.php b/app/Models/OAuth2/AsymmetricKey.php deleted file mode 100644 index a9e1ced6..00000000 --- a/app/Models/OAuth2/AsymmetricKey.php +++ /dev/null @@ -1,328 +0,0 @@ -type; - } - - /** - * @return string - */ - public function getUse():string - { - return $this->usage; - } - - /** - * @return bool - */ - public function isActive():bool - { - return (bool)$this->active; - } - - /** - * @return \DateTime|null - */ - public function getLastUse():?DateTime - { - return $this->last_use; - } - - /** - * @return $this - */ - public function markAsUsed() - { - $this->last_use = new DateTime('now', new \DateTimeZone('UTC')); - return $this; - } - - /** - * @return string - */ - public function getKeyId() - { - return $this->kid; - } - - private function calculateThumbprint($alg) - { - $res = ''; - try { - $pem = str_replace(["\n", "\r"], '', trim($this->getPublicKeyPEM())); - $res = strtoupper(hash($alg, base64_decode($pem))); - } - catch(Exception $ex) - { - $res = 'INVALID'; - } - return $res; - } - - /** - * @return string - */ - public function getSHA_1_Thumbprint() - { - return $this->calculateThumbprint('sha1'); - } - - /** - * @return string - */ - public function getSHA_256_Thumbprint() - { - return $this->calculateThumbprint('sha256'); - } - - abstract public function getPublicKeyPEM(); - - /** - * @return string - */ - public function getPEM() - { - return $this->pem_content; - } - - /** - * checks validity range with now - * @return bool - */ - public function isExpired() - { - $now = new DateTime(); - return ( $this->valid_from <= $now && $this->valid_to >= $now); - } - - - /** - * algorithm intended for use with the key - * @return ICryptoAlgorithm - */ - public function getAlg() - { - $algorithm = DigitalSignatures_MACs_Registry::getInstance()->get($this->alg); - - if(is_null($algorithm)) - { - $algorithm = KeyManagementAlgorithms_Registry::getInstance()->get($this->alg); - } - return $algorithm; - } - - public function getAlgName():string{ - return $this->alg; - } - - /** - * @return string - */ - public function getKid(): string - { - return $this->kid; - } - - /** - * @param string $kid - */ - public function setKid(string $kid): void - { - $this->kid = $kid; - } - - /** - * @return string - */ - public function getPemContent(): string - { - return $this->pem_content; - } - - /** - * @param string $pem_content - */ - public function setPemContent(string $pem_content): void - { - $this->pem_content = $pem_content; - } - - /** - * @return string - */ - public function getUsage(): string - { - return $this->usage; - } - - /** - * @param string $usage - */ - public function setUsage(string $usage): void - { - $this->usage = $usage; - } - - /** - * @return DateTime - */ - public function getValidFrom(): DateTime - { - return $this->valid_from; - } - - /** - * @param DateTime $valid_from - */ - public function setValidFrom(DateTime $valid_from): void - { - $this->valid_from = $valid_from; - } - - /** - * @return DateTime - */ - public function getValidTo(): DateTime - { - return $this->valid_to; - } - - /** - * @param DateTime $valid_to - */ - public function setValidTo(DateTime $valid_to): void - { - $this->valid_to = $valid_to; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - - /** - * @param bool $active - */ - public function setActive(bool $active): void - { - $this->active = $active; - } - - /** - * @param string $type - */ - public function setType(string $type): void - { - $this->type = $type; - } - - /** - * @param string $alg - */ - public function setAlg(string $alg): void - { - $this->alg = $alg; - } - - /** - * @param DateTime $last_use - */ - public function setLastUse(DateTime $last_use): void - { - $this->last_use = $last_use; - } - -} \ No newline at end of file diff --git a/app/Models/OAuth2/Client.php b/app/Models/OAuth2/Client.php deleted file mode 100644 index 0b5571f0..00000000 --- a/app/Models/OAuth2/Client.php +++ /dev/null @@ -1,1606 +0,0 @@ -public_keys = new ArrayCollection(); - $this->access_tokens = new ArrayCollection(); - $this->refresh_tokens = new ArrayCollection(); - $this->admin_users = new ArrayCollection(); - $this->scopes = new ArrayCollection(); - $this->locked = false; - $this->active = false; - $this->use_refresh_token = false; - $this->rotate_refresh_token = false; - $this->token_endpoint_auth_method = OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretBasic; - $this->token_endpoint_auth_signing_alg = JSONWebSignatureAndEncryptionAlgorithms::None; - $this->userinfo_signed_response_alg = JSONWebSignatureAndEncryptionAlgorithms::None; - $this->userinfo_encrypted_response_alg = JSONWebSignatureAndEncryptionAlgorithms::None; - $this->userinfo_encrypted_response_enc = JSONWebSignatureAndEncryptionAlgorithms::None; - $this->id_token_encrypted_response_alg = JSONWebSignatureAndEncryptionAlgorithms::None; - $this->id_token_encrypted_response_enc = JSONWebSignatureAndEncryptionAlgorithms::None; - $this->id_token_signed_response_alg = JSONWebSignatureAndEncryptionAlgorithms::None; - $this->subject_type = IClient::SubjectType_Public; - $this->logout_session_required = false; - $this->logout_use_iframe = false; - $this->require_auth_time = false; - $this->default_max_age = 0; - $this->max_auth_codes_issuance_qty = 0; - $this->max_auth_codes_issuance_basis = 0; - $this->max_access_token_issuance_basis = 0; - $this->max_access_token_issuance_qty = 0; - $this->max_refresh_token_issuance_basis = 0; - $this->max_refresh_token_issuance_qty = 0; - $this->pkce_enabled = false; - } - - public static $valid_app_types = [ - IClient::ApplicationType_Service, - IClient::ApplicationType_JS_Client, - IClient::ApplicationType_Web_App, - IClient::ApplicationType_Native - ]; - - public static $valid_subject_types = [ - IClient::SubjectType_Public, - IClient::SubjectType_Pairwise - ]; - - public static $valid_token_endpoint_auth_methods = [ - OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretBasic, - OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretPost, - OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretJwt, - OAuth2Protocol::TokenEndpoint_AuthMethod_PrivateKeyJwt, - OAuth2Protocol::TokenEndpoint_AuthMethod_None, - ]; - - - /** - * @param $application_type - * @throws \InvalidArgumentException - */ - public function setApplicationType(string $application_type) - { - if(!in_array(strtoupper($application_type), self::$valid_app_types)){ - throw new \InvalidArgumentException("Invalid application_type"); - } - $this->application_type = strtoupper($application_type); - $this->client_type = $this->inferClientTypeFromAppType($this->application_type); - } - - /** - * @return bool - */ - public function canRequestRefreshTokens():bool{ - return - $this->getApplicationType() == IClient::ApplicationType_Native || - $this->getApplicationType() == IClient::ApplicationType_Web_App || - // PCKE - $this->pkce_enabled; - } - - /** - * @param string $app_type - * @return string - */ - private function inferClientTypeFromAppType(string $app_type) - { - switch($app_type) - { - case IClient::ApplicationType_JS_Client: - return IClient::ClientType_Public; - break; - default: - return IClient::ClientType_Confidential; - break; - } - } - - /** - * @return $this - */ - public function removeAllScopes() - { - $this->scopes->clear(); - return $this; - } - - /** - * @return $this - */ - public function removeAllAccessTokens(){ - $this->access_tokens->clear(); - return $this; - } - - /** - * @return $this - */ - public function removeAllRefreshTokens(){ - $this->refresh_tokens->clear(); - return $this; - } - - public function removeAllVoidAccessTokens(): void { - $query = $this->createQuery("delete from Models\OAuth2\AccessToken t - WHERE t.id in (select c.id from Models\OAuth2\Client c where c.id = :client_id ) AND DATEADD(t.created_at, t.lifetime, 'SECOND') <= UTC_TIMESTAMP() - "); - $query - ->setParameter('client_id', $this->getIdentifier()) - ->execute(); - } - - /** - * @return bool - */ - public function hasAccessTokens():bool { - return $this->access_tokens->count() > 0; - } - - public function getClientId() - { - return $this->client_id; - } - - public function getClientSecret() - { - return $this->client_secret; - } - - public function getClientType() - { - return $this->client_type; - } - - /** - * @return ApiScope[] - */ - public function getClientScopes():array - { - $criteria = Criteria::create(); - $criteria->where(Criteria::expr()->eq('active', true)); - $active_scopes = $this->scopes->matching($criteria); - $res = []; - - foreach($active_scopes as $active_scope) - { - if($active_scope->hasApi() && $active_scope->getApi()->isActive()) - $res[] = $active_scope; - } - return $res; - } - - public function getRedirectUris() - { - return explode(',',$this->redirect_uris); - } - - public function getRawRedirectUris() - { - return $this->redirect_uris; - } - - /** - * @param string $name - * @return ApiScope|null - */ - public function getActiveScope(string $name):?ApiScope { - - $criteria = Criteria::create(); - $criteria - ->where(Criteria::expr()->eq('active', true)) - ->andWhere(Criteria::expr()->eq('name', $name)); - $active_scopes = $this->scopes->matching($criteria); - - return $active_scopes->count() > 0 ? $active_scopes->first() : null; - } - - /** - * @param string $scope - * @return bool - */ - public function isScopeAllowed(string $scope):bool - { - if(empty($scope)) return false; - $res = true; - $desired_scopes = explode(" ", $scope); - foreach($desired_scopes as $desired_scope){ - //check if desired scope belongs to application given scopes - $activeScope = $this->getActiveScope($desired_scope); - $api = !is_null($activeScope) ? $activeScope->getApi() : null; - $resource_server = !is_null($api) ? $api->getResourceServer() : null; - - if(is_null($activeScope) ||(!is_null($api) && !$api->isActive()) || (!is_null($resource_server) && !$resource_server->isActive())){ - $res = false; - break; - } - } - return $res; - } - - /** - * @param string $uri - * @return bool - */ - public function isUriAllowed(string $uri):bool - { - $uri = URLUtils::canonicalUrl($uri); - if(empty($uri)) return false; - - if - ( - ($this->application_type !== IClient::ApplicationType_Native && !URLUtils::isHTTPS($uri)) - && (ServerConfigurationService::getConfigValue("SSL.Enable")) - ) - { - Log::debug(sprintf("Client::isUriAllowed url %s is not under ssl schema", $uri)); - return false; - } - - $redirect_uris = explode(',',strtolower($this->redirect_uris)); - $uri = URLUtils::normalizeUrl($uri); - foreach($redirect_uris as $redirect_uri){ - Log::debug(sprintf("Client::isUriAllowed url %s client %s redirect_uri %s", $uri, $this->client_id, $redirect_uri)); - if(str_contains($uri, $redirect_uri)) - return true; - } - - Log::debug(sprintf("Client::isUriAllowed url %s is not allowed as return url for client %s", $uri, $this->client_id)); - return false; - } - - public function getApplicationName() - { - return $this->app_name; - } - - public function getApplicationLogo() - { - $app_logo = $this->app_logo; - if(is_null($app_logo) || empty($app_logo)) - $app_logo = asset('assets/img/oauth2.default.logo.png'); - $app_logo_url = $this->logo_uri; - if(!empty($app_logo_url)) - $app_logo = $app_logo_url; - return $app_logo; - } - - public function getApplicationDescription() - { - return $this->app_description; - } - - public function getDeveloperEmail() - { - $user = $this->user; - $email = $user->getEmail(); - return $email; - } - - /** - * @return bool - */ - public function hasUser():bool{ - return $this->getUserId() > 0; - } - - /** - * @return int - */ - public function getUserId():int{ - try { - return !is_null($this->user) ? $this->user->getId() : 0; - } catch (\Exception $ex) { - return 0; - } - } - - /** - * @return User - */ - public function getOwner():User{ - return $this->user; - } - - public function getId() - { - return $this->id; - } - - public function isLocked() - { - return $this->locked; - } - - public function isActive():bool - { - return $this->active; - } - - public function isResourceServerClient():bool - { - return $this->hasResourceServer(); - } - - /** - * @return int - */ - public function getResourceServerId(): int{ - try { - return is_null($this->resource_server) ? 0 : $this->resource_server->getId(); - } - catch(\Exception $ex){ - return 0; - } - } - - /** - * @return bool - */ - public function hasResourceServer():bool{ - return $this->getResourceServerId() > 0; - } - - public function getResourceServer():ResourceServer - { - return $this->resource_server; - } - - public function getApplicationType():string - { - return $this->application_type; - } - - /** - * @return string - * @throws Exception - */ - public function getFriendlyApplicationType() - { - switch($this->application_type){ - case IClient::ApplicationType_JS_Client: - return 'Client Side (JS)'; - break; - case IClient::ApplicationType_Service: - return 'Service Account'; - break; - case IClient::ApplicationType_Web_App: - return 'Web Server Application'; - break; - case IClient::ApplicationType_Native: - return 'Native Application'; - break; - } - throw new Exception('Invalid Application Type'); - } - - public function getClientAllowedOrigins() - { - return explode(',', $this->allowed_origins); - } - - public function getRawClientAllowedOrigins() - { - return $this->allowed_origins; - } - - /** - * the origin is the triple {protocol, host, port} - * @param $origin - * @return bool - */ - public function isOriginAllowed(string $origin):bool - { - $originWithoutPort = URLUtils::canonicalUrl($origin, false); - if(empty($originWithoutPort)) return false; - if(str_contains($this->allowed_origins, URLUtils::normalizeUrl($originWithoutPort) )) return true; - $originWithPort = URLUtils::canonicalUrl($origin); - return str_contains($this->allowed_origins, URLUtils::normalizeUrl($originWithPort)); - } - - public function getWebsite() - { - $res = $this->website; - if(empty($res)) $res = '#'; - return $res; - } - - /** - * @return DateTime - */ - public function getClientSecretExpiration() - { - $exp_date = $this->client_secret_expires_at; - if(is_null($exp_date)) return null; - - if($exp_date instanceof DateTime) - return $exp_date; - return new DateTime($exp_date); - } - - /** - * @return bool - */ - public function isClientSecretExpired() - { - $now = new DateTime(); - $exp_date = $this->getClientSecretExpiration(); - - if(is_null($exp_date)) return false; - return $exp_date < $now; - } - - /** - * @return string[] - */ - public function getContacts() - { - return explode(',',$this->contacts); - } - - public function getRawContacts(){ - return $this->contacts; - } - - /** - * @return int - */ - public function getDefaultMaxAge() - { - return (int)$this->default_max_age; - } - - /** - * @return bool - */ - public function requireAuthTimeClaim() - { - return $this->require_auth_time; - } - - /** - * @return string - */ - public function getLogoUri() - { - return $this->logo_uri; - } - - /** - * @return string - */ - public function getPolicyUri() - { - $res = $this->policy_uri; - if(empty($res)) $res = '#'; - return $res; - } - - /** - * @return string - */ - public function getTermOfServiceUri() - { - $res = $this->tos_uri; - if(empty($res)) $res = '#'; - return $res; - } - - /** - * @return string[] - */ - public function getPostLogoutUris() - { - return explode(',', $this->post_logout_redirect_uris); - } - - /** - * @return string - */ - public function getLogoutUri() - { - return $this->logout_uri; - } - - /** - * @return JWTResponseInfo - */ - public function getIdTokenResponseInfo() - { - return new JWTResponseInfo - ( - DigitalSignatures_MACs_Registry::getInstance()->get($this->id_token_signed_response_alg), - KeyManagementAlgorithms_Registry::getInstance()->get($this->id_token_encrypted_response_alg), - ContentEncryptionAlgorithms_Registry::getInstance()->get($this->id_token_encrypted_response_enc) - ); - } - - /** - * @return JWTResponseInfo - */ - public function getUserInfoResponseInfo() - { - return new JWTResponseInfo - ( - DigitalSignatures_MACs_Registry::getInstance()->get($this->userinfo_signed_response_alg), - KeyManagementAlgorithms_Registry::getInstance()->get($this->userinfo_encrypted_response_alg), - ContentEncryptionAlgorithms_Registry::getInstance()->get($this->userinfo_encrypted_response_enc) - ); - } - - /** - * @return TokenEndpointAuthInfo - */ - public function getTokenEndpointAuthInfo() - { - return new TokenEndpointAuthInfo( - $this->token_endpoint_auth_method, - DigitalSignatures_MACs_Registry::getInstance()->isSupported($this->token_endpoint_auth_signing_alg) ? - DigitalSignatures_MACs_Registry::getInstance()->get($this->token_endpoint_auth_signing_alg) : - null - ); - } - - /** - * @return string - */ - public function getSubjectType() - { - return $this->subject_type; - } - - /** - * @return IClientPublicKey[] - */ - public function getPublicKeys() - { - return $this->public_keys; - } - - /** - * @return IClientPublicKey[] - */ - public function getPublicKeysByUse($use) - { - $criteria = Criteria::create(); - $criteria->where(Criteria::expr()->eq('usage', $use)); - - return $this->public_keys->matching($criteria); - } - - /** - * @param string $kid - * @return IClientPublicKey|null - */ - public function getPublicKeyByIdentifier($kid) - { - $criteria = Criteria::create(); - $criteria->where(Criteria::expr()->eq('kid', $kid)); - $res = $this->public_keys->matching($criteria)->first(); - return !$res ? null: $res; - } - - /** - * @param ClientPublicKey $public_key - * @return $this - */ - public function addPublicKey(ClientPublicKey $public_key) - { - if($this->public_keys->contains($public_key)) return; - $this->public_keys->add($public_key); - $public_key->setOwner($this); - } - - /** - * @return string - */ - public function getJWKSUri() - { - return $this->jwks_uri; - } - - /** - * @param string $use - * @param string $alg - * @return IClientPublicKey|null - */ - public function getCurrentPublicKeyByUse($use, $alg) - { - $now = new \DateTime('now', new \DateTimeZone('UTC')); - try { - $query = $this->createQuery("SELECT k from Models\OAuth2\ClientPublicKey k - JOIN k.owner c - WHERE - c.id = :client_id AND - k.usage = :use AND - k.alg = :alg AND - k.active = 1 AND - k.valid_from <= :now AND - k.valid_to >= :now - "); - - return $query - ->setParameter('client_id', $this->getIdentifier()) - ->setParameter('use', trim($use)) - ->setParameter('alg', trim($alg)) - ->setParameter('now', $now) - ->getSingleResult(); - } - catch (Exception $ex){ - return null; - } - } - - - /** - * @param string $type - * @param string $use - * @param string $alg - * @param $valid_from - * @param $valid_to - * @return IClientPublicKey|null - */ - public function getCurrentPublicKeyByTypeUseAlgAndRange(string $type, string $use, string $alg, $valid_from, $valid_to) - { - try { - $query = $this->createQuery("SELECT k from Models\OAuth2\ClientPublicKey k - JOIN k.owner c - WHERE - c.id = :client_id AND - k.type = :type AND - k.usage = :use AND - k.alg = :alg AND - k.active = 1 AND - k.valid_from <= :valid_from AND - k.valid_to >= :valid_to - "); - - return $query - ->setParameter('client_id', $this->getIdentifier()) - ->setParameter('use', trim($use)) - ->setParameter('alg', trim($alg)) - ->setParameter('type', trim($type)) - ->setParameter('valid_from', $valid_from) - ->setParameter('valid_to', $valid_to) - ->getSingleResult(); - } - catch (Exception $ex){ - return null; - } - } - - /** - * @param string $post_logout_uri - * @return bool - */ - public function isPostLogoutUriAllowed($post_logout_uri) - { - if(empty($this->post_logout_redirect_uris)) return false; - if(empty($post_logout_uri)) return false; - - if(!filter_var($post_logout_uri, FILTER_VALIDATE_URL)) return false; - if(is_null($this->post_logout_redirect_uris)) return false; - if(empty($this->post_logout_redirect_uris)) return false; - - $parts = @parse_url($post_logout_uri); - - if ($parts == false) { - return false; - } - if($parts['scheme']!=='https') - return false; - - $logout_without_port = $parts['scheme'].'://'.$parts['host']; - - if(str_contains($this->post_logout_redirect_uris, $logout_without_port )) return true; - - if(isset($parts['port'])) - { - $logout_with_port = $parts['scheme'].'://'.$parts['host'].':'.$parts['port']; - return str_contains($this->post_logout_redirect_uris, $logout_with_port ); - } - return false; - } - - public function getAdminUsers(){ - return $this->admin_users; - } - - /** - * @param User $user - * @return $this - */ - public function addAdminUser(User $user) - { - if($this->admin_users->contains($user)) return $this; - $this->admin_users->add($user); - return $this; - } - - /** - * @param User $user - * @return $this - */ - public function removeAdminUser(User $user) - { - if(!$this->admin_users->contains($user)) return $this; - $this->admin_users->removeElement($user); - return $this; - } - - /** - * @return $this - */ - public function removeAllAdminUsers(){ - $this->admin_users->clear(); - return $this; - } - - /** - * @param User $user - * @return bool - */ - public function canEdit(User $user):bool - { - $criteria = Criteria::create(); - $criteria->where(Criteria::expr()->eq('id', $user->getId())); - $is_admin = $this->admin_users->contains($user); - $is_owner = intval($this->user->getId()) === intval($user->getId()); - return $is_owner || $is_admin; - } - - /** - * @param User $user - * @return bool - */ - public function canDelete(User $user):bool - { - return $this->isOwner($user); - } - - /** - * @param User $user - * @return bool - */ - public function isOwner(User $user):bool - { - if(!$this->hasUser()) return false; - return intval($this->user->getId()) === intval($user->getId()); - } - - /** - * @param User $user - * @return $this - */ - public function setOwner(User $user) - { - $this->user = $user; - return $this; - } - - /** - * @param ApiScope $scope - * @return $this - */ - public function addScope(ApiScope $scope) - { - if($this->scopes->contains($scope)) return $this; - $this->scopes->add($scope); - return $this; - } - - /** - * @param ApiScope $scope - * @return $this|void - */ - public function removeScope(ApiScope $scope){ - if(!$this->scopes->contains($scope)) return; - $this->scopes->removeElement($scope); - return $this; - } - - /** - * @param User $editing_user - * @return $this - */ - public function setEditedBy(User $editing_user){ - $this->edited_by = $editing_user; - return $this; - } - - public function getEditedByNice() - { - $user = $this->edited_by; - return is_null($user)? 'N/A':$user->getEmail(); - } - - public function getOwnerNice() - { - $user = $this->user; - return is_null($user)? 'N/A':$user->getEmail(); - } - - /** - * @return bool - */ - public function useRefreshToken():bool - { - return (bool)$this->use_refresh_token; - } - - /** - * @return bool - */ - public function useRotateRefreshTokenPolicy():bool - { - return (bool)$this->rotate_refresh_token; - } - - /** - * @return AccessToken[] - */ - public function getValidAccessTokens():array - { - $query = $this->createQuery("SELECT t from Models\OAuth2\AccessToken t - JOIN t.client c - WHERE c.id = :client_id AND DATEADD(t.created_at, t.lifetime, 'SECOND') >= UTC_TIMESTAMP() - "); - return $query - ->setParameter('client_id', $this->getIdentifier()) - ->getResult(); - } - - /** - * @param string $token_endpoint_auth_method - */ - public function setTokenEndpointAuthMethod(string $token_endpoint_auth_method): void - { - if (!in_array($token_endpoint_auth_method, self::$valid_token_endpoint_auth_methods)) { - throw new \InvalidArgumentException("Invalid token_endpoint_auth_method"); - } - $this->token_endpoint_auth_method = $token_endpoint_auth_method; - } - - /** - * @param string $app_name - */ - public function setAppName(string $app_name): void - { - $this->app_name = $app_name; - } - - /** - * @param string $app_description - */ - public function setAppDescription(string $app_description): void - { - $this->app_description = $app_description; - } - - /** - * @param string $app_logo - */ - public function setAppLogo(string $app_logo): void - { - $this->app_logo = $app_logo; - } - - /** - * @param string $client_id - */ - public function setClientId(string $client_id): void - { - $this->client_id = $client_id; - } - - /** - * @param string $client_secret - */ - public function setClientSecret(string $client_secret): void - { - $this->client_secret = $client_secret; - } - - /** - * @param string $client_type - */ - public function setClientType(string $client_type): void - { - $this->client_type = $client_type; - } - - /** - * @param bool $active - */ - public function setActive(bool $active): void - { - $this->active = $active; - } - - /** - * @param bool $locked - */ - public function setLocked(bool $locked): void - { - $this->locked = $locked; - } - - /** - * @param int $max_auth_codes_issuance_qty - */ - public function setMaxAuthCodesIssuanceQty(int $max_auth_codes_issuance_qty): void - { - $this->max_auth_codes_issuance_qty = $max_auth_codes_issuance_qty; - } - - /** - * @param int $max_access_token_issuance_qty - */ - public function setMaxAccessTokenIssuanceQty(int $max_access_token_issuance_qty): void - { - $this->max_access_token_issuance_qty = $max_access_token_issuance_qty; - } - - /** - * @param int $max_access_token_issuance_basis - */ - public function setMaxAccessTokenIssuanceBasis(int $max_access_token_issuance_basis): void - { - $this->max_access_token_issuance_basis = $max_access_token_issuance_basis; - } - - /** - * @param int $max_refresh_token_issuance_qty - */ - public function setMaxRefreshTokenIssuanceQty(int $max_refresh_token_issuance_qty): void - { - $this->max_refresh_token_issuance_qty = $max_refresh_token_issuance_qty; - } - - /** - * @param int $max_refresh_token_issuance_basis - */ - public function setMaxRefreshTokenIssuanceBasis(int $max_refresh_token_issuance_basis): void - { - $this->max_refresh_token_issuance_basis = $max_refresh_token_issuance_basis; - } - - /** - * @param bool $use_refresh_token - */ - public function setUseRefreshToken(bool $use_refresh_token): void - { - $this->use_refresh_token = $use_refresh_token; - } - - /** - * @param bool $rotate_refresh_token - */ - public function setRotateRefreshToken(bool $rotate_refresh_token): void - { - $this->rotate_refresh_token = $rotate_refresh_token; - } - - /** - * @param string $website - */ - public function setWebsite(string $website): void - { - $this->website = $website; - } - - /** - * @param DateTime $client_secret_expires_at - */ - public function setClientSecretExpiresAt(DateTime $client_secret_expires_at): void - { - $this->client_secret_expires_at = $client_secret_expires_at; - } - - public function setClientSecretNoExpiration():void{ - $this->client_secret_expires_at = null; - } - - /** - * @param string $contacts - */ - public function setContacts(string $contacts): void - { - $this->contacts = $contacts; - } - - /** - * @param string $logo_uri - */ - public function setLogoUri(string $logo_uri): void - { - $this->logo_uri = $logo_uri; - } - - /** - * @param string $tos_uri - */ - public function setTosUri(string $tos_uri): void - { - $this->tos_uri = $tos_uri; - } - - /** - * @param string $post_logout_redirect_uris - */ - public function setPostLogoutRedirectUris(string $post_logout_redirect_uris): void - { - $this->post_logout_redirect_uris = $post_logout_redirect_uris; - } - - /** - * @param string $logout_uri - */ - public function setLogoutUri(string $logout_uri): void - { - $this->logout_uri = $logout_uri; - } - - /** - * @param bool $logout_session_required - */ - public function setLogoutSessionRequired(bool $logout_session_required): void - { - $this->logout_session_required = $logout_session_required; - } - - /** - * @param bool $logout_use_iframe - */ - public function setLogoutUseIframe(bool $logout_use_iframe): void - { - $this->logout_use_iframe = $logout_use_iframe; - } - - /** - * @param string $policy_uri - */ - public function setPolicyUri(string $policy_uri): void - { - $this->policy_uri = $policy_uri; - } - - /** - * @param string $jwks_uri - */ - public function setJwksUri(string $jwks_uri): void - { - $this->jwks_uri = $jwks_uri; - } - - /** - * @param int $default_max_age - */ - public function setDefaultMaxAge(int $default_max_age): void - { - $this->default_max_age = $default_max_age; - } - - /** - * @param bool $require_auth_time - */ - public function setRequireAuthTime(bool $require_auth_time): void - { - $this->require_auth_time = $require_auth_time; - } - - /** - * @param string $token_endpoint_auth_signing_alg - */ - public function setTokenEndpointAuthSigningAlg(string $token_endpoint_auth_signing_alg): void - { - $this->token_endpoint_auth_signing_alg = $token_endpoint_auth_signing_alg; - } - - /** - * @param string $subject_type - */ - public function setSubjectType(string $subject_type): void - { - $this->subject_type = $subject_type; - } - - /** - * @param string $userinfo_signed_response_alg - */ - public function setUserinfoSignedResponseAlg(string $userinfo_signed_response_alg): void - { - $this->userinfo_signed_response_alg = $userinfo_signed_response_alg; - } - - /** - * @param string $userinfo_encrypted_response_alg - */ - public function setUserinfoEncryptedResponseAlg(string $userinfo_encrypted_response_alg): void - { - $this->userinfo_encrypted_response_alg = $userinfo_encrypted_response_alg; - } - - /** - * @param string $userinfo_encrypted_response_enc - */ - public function setUserinfoEncryptedResponseEnc(string $userinfo_encrypted_response_enc): void - { - $this->userinfo_encrypted_response_enc = $userinfo_encrypted_response_enc; - } - - /** - * @param string $id_token_signed_response_alg - */ - public function setIdTokenSignedResponseAlg(string $id_token_signed_response_alg): void - { - $this->id_token_signed_response_alg = $id_token_signed_response_alg; - } - - /** - * @param string $id_token_encrypted_response_alg - */ - public function setIdTokenEncryptedResponseAlg(string $id_token_encrypted_response_alg): void - { - $this->id_token_encrypted_response_alg = $id_token_encrypted_response_alg; - } - - /** - * @param string $id_token_encrypted_response_enc - */ - public function setIdTokenEncryptedResponseEnc(string $id_token_encrypted_response_enc): void - { - $this->id_token_encrypted_response_enc = $id_token_encrypted_response_enc; - } - - /** - * @param string $redirect_uris - */ - public function setRedirectUris(string $redirect_uris): void - { - $this->redirect_uris = $redirect_uris; - } - - /** - * @param string $allowed_origins - */ - public function setAllowedOrigins(string $allowed_origins): void - { - $this->allowed_origins = $allowed_origins; - } - - /** - * @param User $user - */ - public function setUser(User $user): void - { - $this->user = $user; - } - - /** - * @param ResourceServer $resource_server - */ - public function setResourceServer(ResourceServer $resource_server): void - { - $this->resource_server = $resource_server; - } - - /** - * @param ArrayCollection $public_keys - */ - public function setPublicKeys(ArrayCollection $public_keys): void - { - $this->public_keys = $public_keys; - } - - /** - * @param ArrayCollection $access_tokens - */ - public function setAccessTokens(ArrayCollection $access_tokens): void - { - $this->access_tokens = $access_tokens; - } - - /** - * @return ArrayCollection - */ - public function getRefreshTokens() { - return $this->refresh_tokens; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - if($name == 'user_id') - return $this->getUserId(); - return $this->{$name}; - } - - public function isPKCEEnabled():bool{ - return $this->pkce_enabled; - } - - public function enablePCKE(){ - if($this->client_type != self::ClientType_Public){ - throw new ValidationException("Only Public Clients could use PCKE."); - } - $this->pkce_enabled = true; - $this->token_endpoint_auth_method = OAuth2Protocol::TokenEndpoint_AuthMethod_None; - } - - public function disablePCKE(){ - if($this->client_type != self::ClientType_Public){ - throw new ValidationException("Only Public Clients could use PCKE."); - } - $this->pkce_enabled = false; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/ClientPublicKey.php b/app/Models/OAuth2/ClientPublicKey.php deleted file mode 100644 index 4a448537..00000000 --- a/app/Models/OAuth2/ClientPublicKey.php +++ /dev/null @@ -1,108 +0,0 @@ -owner; - } - - /** - * @param \Models\OAuth2\Client $owner - */ - public function setOwner(Client $owner) - { - $this->owner = $owner; - } - - /** - * @param string $kid - * @param string $type - * @param string $use - * @param string $pem - * @param string $alg - * @param bool $active - * @param \DateTime $valid_from - * @param \DateTime $valid_to - * @return IClientPublicKey - */ - static public function buildFromPEM($kid, $type, $use, $pem, $alg, $active, \DateTime $valid_from, \DateTime $valid_to) - { - $pk = new self; - $pk->kid = $kid; - $pk->pem_content = $pem; - $pk->type = $type; - $pk->usage = $use; - $pk->alg = $alg; - $pk->active = $active; - $pk->valid_from = $valid_from; - $pk->valid_to = $valid_to; - return $pk; - } - - public function getPublicKeyPEM() - { - return $this->pem_content; - } - - /** - * @return IJWK - */ - public function toJWK() - { - $jwk = RSAJWKFactory::build - ( - new RSAJWKPEMPublicKeySpecification - ( - $this->getPublicKeyPEM(), - $this->alg - ) - ); - - $jwk->setId($this->kid); - $jwk->setType($this->type); - $jwk->setKeyUse($this->usage); - return $jwk; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/Factories/ApiEndpointFactory.php b/app/Models/OAuth2/Factories/ApiEndpointFactory.php deleted file mode 100644 index 44169442..00000000 --- a/app/Models/OAuth2/Factories/ApiEndpointFactory.php +++ /dev/null @@ -1,57 +0,0 @@ -setName(trim($payload['name'])); - - if(isset($payload['description'])) - $endpoint->setDescription(trim($payload['description'])); - - if(isset($payload['route'])) - $endpoint->setRoute(trim($payload['route'])); - - if(isset($payload['http_method'])) - $endpoint->setHttpMethod(trim($payload['http_method'])); - - if(isset($payload['active'])) - $endpoint->setStatus(boolval($payload['active'])); - - if(isset($payload['allow_cors'])) - $endpoint->setAllowCors(boolval($payload['allow_cors'])); - - if(isset($payload['rate_limit'])) - $endpoint->setRateLimit(intval($payload['rate_limit'])); - - if(isset($payload['api']) && $payload['api'] instanceof Api) { - $api = $payload['api']; - $api->addEndpoint($endpoint); - } - - return $endpoint; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/Factories/ApiFactory.php b/app/Models/OAuth2/Factories/ApiFactory.php deleted file mode 100644 index 67261b80..00000000 --- a/app/Models/OAuth2/Factories/ApiFactory.php +++ /dev/null @@ -1,54 +0,0 @@ -setName(trim($payload['name'])); - - if(isset($payload['description'])) - $api->setDescription(trim($payload['description'])); - - if(isset($payload['active'])) - $api->setActive(boolval($payload['active'])); - - if(isset($payload['resource_server']) && $payload['resource_server'] instanceof ResourceServer){ - $resource_server = $payload['resource_server']; - $resource_server->addApi($api); - } - - return $api; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/Factories/ApiScopeFactory.php b/app/Models/OAuth2/Factories/ApiScopeFactory.php deleted file mode 100644 index 59e894e8..00000000 --- a/app/Models/OAuth2/Factories/ApiScopeFactory.php +++ /dev/null @@ -1,69 +0,0 @@ -setName(trim($payload['name'])); - - if(isset($payload['description'])) - $scope->setDescription(trim($payload['description'])); - - if(isset($payload['short_description'])) - $scope->setShortDescription(trim($payload['short_description'])); - - if(isset($payload['active'])) - $scope->setActive(boolval($payload['active'])); - - if(isset($payload['default'])) - $scope->setDefault(boolval($payload['default'])); - - if(isset($payload['default'])) - $scope->setDefault(boolval($payload['default'])); - - if(isset($payload['system'])) - $scope->setSystem(boolval($payload['system'])); - - if(isset($payload['assigned_by_groups'])) - $scope->setAssignedByGroups(boolval($payload['assigned_by_groups'])); - - if(isset($payload['api']) && $payload['api'] instanceof Api) { - $api = $payload['api']; - $api->addScope($scope); - } - - return $scope; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/Factories/ApiScopeGroupFactory.php b/app/Models/OAuth2/Factories/ApiScopeGroupFactory.php deleted file mode 100644 index f5fabca9..00000000 --- a/app/Models/OAuth2/Factories/ApiScopeGroupFactory.php +++ /dev/null @@ -1,43 +0,0 @@ -setName(trim($payload['name'])); - if(isset($payload['active'])) - $group->setActive(boolval($payload['active'])); - if(isset($payload['description'])) - $group->setDescription(trim($payload['description'])); - return $group; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/Factories/ClientFactory.php b/app/Models/OAuth2/Factories/ClientFactory.php deleted file mode 100644 index 9a54e2e0..00000000 --- a/app/Models/OAuth2/Factories/ClientFactory.php +++ /dev/null @@ -1,217 +0,0 @@ -setActive(true); - if ($client->getClientType() !== IClient::ClientType_Confidential) { - $client->setTokenEndpointAuthMethod(OAuth2Protocol::TokenEndpoint_AuthMethod_None); - } - - return $client; - } - - /** - * @param Client $client - * @param array $payload - * @return Client - * @throws \Exception - */ - public static function populate(Client $client, array $payload):Client - { - $fields_to_uri_normalize = [ - 'post_logout_redirect_uris', - 'logout_uri', - 'policy_uri', - 'jwks_uri', - 'tos_uri', - 'logo_uri', - 'redirect_uris', - 'allowed_origins' - ]; - - foreach($fields_to_uri_normalize as $field){ - if(!isset($payload[$field])) continue; - $value = $payload[$field]; - if (empty($value)) continue; - $urls = explode(',', $value); - $normalized_uris = ''; - foreach ($urls as $url) { - $url = URLUtils::normalizeUrl($url); - if (!empty($normalized_uris)) { - $normalized_uris .= ','; - } - $normalized_uris .= $url; - } - $payload[$field] = $normalized_uris; - } - - if(isset($payload['owner'])) - $client->setOwner($payload['owner']); - - if(isset($payload['app_name'])) - $client->setAppName(trim($payload['app_name'])); - - if(isset($payload['application_type'])) - $client->setApplicationType(trim($payload['application_type'])); - - if(isset($payload['app_description'])) - $client->setAppDescription(trim($payload['app_description'])); - - if(isset($payload['website'])) - $client->setWebsite(trim($payload['website'])); - - if(isset($payload['active'])) - $client->setActive(boolval($payload['active'])); - - if(isset($payload['locked'])) - $client->setLocked(boolval($payload['locked'])); - - if(isset($payload['use_refresh_token'])) - $client->setUseRefreshToken(boolval($payload['use_refresh_token'])); - - if(isset($payload['rotate_refresh_token'])) - $client->setRotateRefreshToken(boolval($payload['rotate_refresh_token'])); - - if(isset($payload['contacts'])) - $client->setContacts(trim($payload['contacts'])); - - if(isset($payload['logo_uri'])) - $client->setLogoUri(trim($payload['logo_uri'])); - - if(isset($payload['tos_uri'])) - $client->setTosUri(trim($payload['tos_uri'])); - - if(isset($payload['post_logout_redirect_uris'])) - $client->setPostLogoutRedirectUris(trim($payload['post_logout_redirect_uris'])); - - if(isset($payload['logout_uri'])) - $client->setLogoutUri(trim($payload['logout_uri'])); - - if(isset($payload['policy_uri'])) - $client->setPolicyUri(trim($payload['policy_uri'])); - - if(isset($payload['jwks_uri'])) - $client->setJwksUri(trim($payload['jwks_uri'])); - - if(isset($payload['default_max_age'])) - $client->setDefaultMaxAge(intval($payload['default_max_age'])); - - if(isset($payload['logout_session_required'])) - $client->setLogoutSessionRequired(boolval($payload['logout_session_required'])); - - if(isset($payload['logout_use_iframe'])) - $client->setLogoutUseIframe(boolval($payload['logout_use_iframe'])); - - if(isset($payload['require_auth_time'])) - $client->setRequireAuthTime(boolval($payload['require_auth_time'])); - - if(isset($payload['token_endpoint_auth_method'])) - $client->setTokenEndpointAuthMethod(trim($payload['token_endpoint_auth_method'])); - - if(isset($payload['token_endpoint_auth_signing_alg'])) - $client->setTokenEndpointAuthSigningAlg(trim($payload['token_endpoint_auth_signing_alg'])); - - if(isset($payload['subject_type'])) - $client->setSubjectType(trim($payload['subject_type'])); - - if(isset($payload['userinfo_signed_response_alg'])) - $client->setUserinfoSignedResponseAlg(trim($payload['userinfo_signed_response_alg'])); - - if(isset($payload['userinfo_encrypted_response_alg'])) - $client->setUserinfoEncryptedResponseAlg(trim($payload['userinfo_encrypted_response_alg'])); - - if(isset($payload['userinfo_encrypted_response_enc'])) - $client->setUserinfoEncryptedResponseEnc(trim($payload['userinfo_encrypted_response_enc'])); - - if(isset($payload['id_token_signed_response_alg'])) - $client->setIdTokenSignedResponseAlg(trim($payload['id_token_signed_response_alg'])); - - if(isset($payload['id_token_encrypted_response_alg'])) - $client->setIdTokenEncryptedResponseAlg(trim($payload['id_token_encrypted_response_alg'])); - - if(isset($payload['id_token_encrypted_response_enc'])) - $client->setIdTokenEncryptedResponseEnc(trim($payload['id_token_encrypted_response_enc'])); - - if(isset($payload['redirect_uris'])) - $client->setRedirectUris(trim($payload['redirect_uris'])); - - if(isset($payload['allowed_origins'])) - $client->setAllowedOrigins(trim($payload['allowed_origins'])); - - if(isset($payload['client_id'])){ - $client->setClientId(trim($payload['client_id'])); - } - - if(isset($payload['client_secret'])){ - $client->setClientSecret(trim($payload['client_secret'])); - } - - if(isset($payload['client_secret_expires_at'])){ - $client_secret_expires_at = $payload['client_secret_expires_at']; - if(is_int($client_secret_expires_at)) - $client_secret_expires_at = new \DateTime("@$client_secret_expires_at"); - $client->setClientSecretExpiresAt($client_secret_expires_at); - } - - if(isset($payload['resource_server']) && $payload['resource_server'] instanceof ResourceServer){ - $resource_server = $payload['resource_server']; - $client->setResourceServer($resource_server); - } - - if(isset($payload['pkce_enabled'])) { - - $pkce_enabled = boolval($payload['pkce_enabled']); - - if($pkce_enabled) - $client->enablePCKE(); - else - $client->disablePCKE(); - } - - $scope_repository = App::make(IApiScopeRepository::class); - //add default scopes - foreach ($scope_repository->getDefaults() as $default_scope) { - if - ( - $default_scope->getName() === OAuth2Protocol::OfflineAccess_Scope - && !$client->canRequestRefreshTokens() - ) { - continue; - } - $client->addScope($default_scope); - } - - return $client; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/Factories/ResourceServerFactory.php b/app/Models/OAuth2/Factories/ResourceServerFactory.php deleted file mode 100644 index 1e69eb94..00000000 --- a/app/Models/OAuth2/Factories/ResourceServerFactory.php +++ /dev/null @@ -1,45 +0,0 @@ -setHost(trim($payload['host'])); - if(isset($payload['ips'])) - $resource_server->setIps(trim($payload['ips'])); - if(isset($payload['friendly_name'])) - $resource_server->setFriendlyName(trim($payload['friendly_name'])); - if(isset($payload['active'])) - $resource_server->setActive(boolval($payload['active'])); - return $resource_server; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/OAuth2TrailException.php b/app/Models/OAuth2/OAuth2TrailException.php deleted file mode 100644 index 24711ca2..00000000 --- a/app/Models/OAuth2/OAuth2TrailException.php +++ /dev/null @@ -1,99 +0,0 @@ -from_ip; - } - - /** - * @param string $from_ip - */ - public function setFromIp(string $from_ip): void - { - $this->from_ip = $from_ip; - } - - /** - * @return string - */ - public function getExceptionType(): string - { - return $this->exception_type; - } - - /** - * @param string $exception_type - */ - public function setExceptionType(string $exception_type): void - { - $this->exception_type = $exception_type; - } - - /** - * @return Client - */ - public function getClient(): Client - { - return $this->client; - } - - /** - * @param Client $client - */ - public function setClient(Client $client): void - { - $this->client = $client; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/RefreshToken.php b/app/Models/OAuth2/RefreshToken.php deleted file mode 100644 index 3b2fcc84..00000000 --- a/app/Models/OAuth2/RefreshToken.php +++ /dev/null @@ -1,314 +0,0 @@ -void = false; - $this->access_tokens = new ArrayCollection(); - } - - /** - * @return Client - */ - public function getClient():Client{ - return $this->client; - } - - /** - * @return User - */ - public function getUser():User{ - return $this->owner; - } - - /** - * @return bool - * @throws \Exception - */ - public function isVoid():bool { - if($this->void) return true; - if(intval($this->lifetime) == 0) return false; - //check lifetime... - $created_at = clone $this->created_at; - $created_at->add(new DateInterval('PT' . intval($this->lifetime) . 'S')); - $now = new DateTime(gmdate("Y-m-d H:i:s", time()), new DateTimeZone("UTC")); - return ($now > $created_at); - } - - /** - * @return int - * @throws \Exception - */ - public function getRemainingLifetime():int - { - //check is refresh token is stills alive... (ZERO is infinite lifetime) - if (intval($this->lifetime) == 0) return 0; - $created_at = clone $this->created_at; - $created_at->add(new DateInterval('PT' . intval($this->lifetime) . 'S')); - $now = new DateTime(gmdate("Y-m-d H:i:s", time()), new DateTimeZone("UTC")); - //check validity... - if ($now > $created_at) - return -1; - $seconds = abs($created_at->getTimestamp() - $now->getTimestamp());; - return $seconds; - } - - public function getFriendlyScopes(){ - return $this->friendly_scopes; - } - - public function setFriendlyScopes($friendly_scopes){ - $this->friendly_scopes = $friendly_scopes; - } - - public function setVoid(){ - $this->void = true; - } - - /** - * @return string - */ - public function getValue(): string - { - return $this->value; - } - - /** - * @return string - */ - public function getFromIp(): string - { - return $this->from_ip; - } - - /** - * @return int - */ - public function getLifetime(): int - { - return $this->lifetime; - } - - /** - * @return string - */ - public function getScope(): string - { - return $this->scope; - } - - /** - * @return string - */ - public function getAudience(): string - { - return $this->audience; - } - - /** - * @return ArrayCollection - */ - public function getAccessTokens(): ArrayCollection - { - return $this->access_tokens; - } - - /** - * @return User - */ - public function getOwner(): User - { - return $this->owner; - } - - /** - * @param string $value - */ - public function setValue(string $value): void - { - $this->value = $value; - } - - /** - * @param string $from_ip - */ - public function setFromIp(string $from_ip): void - { - $this->from_ip = $from_ip; - } - - /** - * @param int $lifetime - */ - public function setLifetime(int $lifetime): void - { - $this->lifetime = $lifetime; - } - - /** - * @param string $scope - */ - public function setScope(string $scope): void - { - $this->scope = $scope; - } - - /** - * @param string $audience - */ - public function setAudience(string $audience): void - { - $this->audience = $audience; - } - - /** - * @param ArrayCollection $access_tokens - */ - public function setAccessTokens(ArrayCollection $access_tokens): void - { - $this->access_tokens = $access_tokens; - } - - public function addAccessToken(AccessToken $accessToken){ - if($this->access_tokens->contains($accessToken)) return; - $this->access_tokens->add($accessToken); - $accessToken->setRefreshToken($this); - } - - public function removeAccessToken(AccessToken $accessToken){ - if(!$this->access_tokens->contains($accessToken)) return; - $this->access_tokens->removeElement($accessToken); - } - - /** - * @param Client $client - */ - public function setClient(Client $client): void - { - $this->client = $client; - } - - /** - * @param User $owner - */ - public function setOwner(User $owner): void - { - $this->owner = $owner; - } - - /** - * @return int - */ - public function getOwnerId():int{ - try { - return is_null($this->owner) ? 0 : $this->owner->getId(); - } - catch(\Exception $ex){ - return 0; - } - } - - /** - * @return bool - */ - public function hasOwner():bool{ - return $this->getOwnerId() > 0; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - -} \ No newline at end of file diff --git a/app/Models/OAuth2/ResourceServer.php b/app/Models/OAuth2/ResourceServer.php deleted file mode 100644 index 1fb365e2..00000000 --- a/app/Models/OAuth2/ResourceServer.php +++ /dev/null @@ -1,215 +0,0 @@ -ips); - return in_array($ip, $ips); - } - - /** - * @return string - */ - public function getIPAddresses() - { - return $this->ips; - } - - public function __construct() - { - parent::__construct(); - $this->active = false; - $this->apis = new ArrayCollection(); - } - - /** - * @return string - */ - public function getFriendlyName(): string - { - return $this->friendly_name; - } - - /** - * @param string $friendly_name - */ - public function setFriendlyName(string $friendly_name): void - { - $this->friendly_name = $friendly_name; - } - - /** - * @return string - */ - public function getHost(): string - { - return $this->host; - } - - /** - * @param string $host - */ - public function setHost(string $host): void - { - $this->host = $host; - } - - /** - * @return string - */ - public function getIps(): string - { - return $this->ips; - } - - /** - * @param string $ips - */ - public function setIps(string $ips): void - { - $this->ips = $ips; - } - - /** - * @return bool - */ - public function isActive(): bool - { - return $this->active; - } - - /** - * @param bool $active - */ - public function setActive(bool $active): void - { - $this->active = $active; - } - - /** - * @return Api[] - */ - public function getApis() - { - return $this->apis; - } - - /** - * @param Api $api - */ - public function addApi(Api $api){ - if($this->apis->contains($api)) return; - $this->apis->add($api); - $api->setResourceServer($this); - } - - /** - * @param Api $api - */ - public function removeApi(Api $api){ - if(!$this->apis->contains($api)) return; - $this->apis->removeElement($api); - } - - public function setClient(Client $client){ - $this->client = $client; - $client->setResourceServer($this); - } - - /** - * @return Client|null - */ - public function getClient():?Client - { - return $this->client; - } - - /** - * @return int - */ - public function getClientId(): int{ - try { - return is_null($this->client) ? 0 : $this->client->getId(); - } - catch(\Exception $ex){ - return 0; - } - } - - /** - * @return bool - */ - public function hasClient():bool{ - return $this->getClientId() > 0; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } -} diff --git a/app/Models/OAuth2/ServerPrivateKey.php b/app/Models/OAuth2/ServerPrivateKey.php deleted file mode 100644 index 252837bf..00000000 --- a/app/Models/OAuth2/ServerPrivateKey.php +++ /dev/null @@ -1,153 +0,0 @@ -password = $password; - } - - /** - * @param string $value - * @return String - */ - private function decrypt($value) - { - $value = base64_decode($value); - return Crypt::decrypt($value); - } - - /** - * @return string - */ - public function getPassword() - { - return $this->password; - } - - /** - * @param string $kid - * @param DateTime $valid_from - * @param DateTime $valid_to - * @param string $type - * @param string $use - * @param bool $active - * @param string $pem_content - * @param null|string $password - * @return IServerPrivateKey - */ - static function build - ( - $kid, - DateTime $valid_from, - DateTime $valid_to, - $type, - $use, - $alg, - $active, - $pem_content, - $password = null - ) - { - $key = new self; - $key->kid = $kid; - $key->valid_from = $valid_from; - $key->valid_to = $valid_to; - $key->type = $type; - $key->usage = $use; - $key->active = $active; - $key->alg = $alg; - $key->pem_content = $pem_content; - $key->password = $password; - - return $key; - } - - public function getPublicKeyPEM() - { - $private_key_pem = $this->pem_content; - $rsa = new RSA(); - - if(!empty($this->password)){ - $rsa->setPassword($this->password); - } - - $rsa->loadKey($private_key_pem); - return $rsa->getPublicKey(); - } - - /** - * @return IJWK - */ - public function toJWK() - { - //load server private key. - $jwk = RSAJWKFactory::build - ( - new RSAJWKPEMPrivateKeySpecification - ( - $this->pem_content, - $this->password, - $this->alg - ) - ); - - $jwk->setId($this->kid); - $jwk->setType($this->type); - $jwk->setKeyUse($this->usage); - - return $jwk; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } -} \ No newline at end of file diff --git a/app/Models/OAuth2/UserConsent.php b/app/Models/OAuth2/UserConsent.php deleted file mode 100644 index a046e871..00000000 --- a/app/Models/OAuth2/UserConsent.php +++ /dev/null @@ -1,111 +0,0 @@ -scopes; - } - - /** - * @return Client - */ - public function getClient():Client - { - return $this->client; - } - - /** - * @return User - */ - public function getUser():User - { - return $this->owner; - } - - /** - * @return User - */ - public function getOwner(): User - { - return $this->owner; - } - - /** - * @param User $owner - */ - public function setOwner(User $owner): void - { - $this->owner = $owner; - } - - /** - * @param string $scope - */ - public function setScope(string $scope): void - { - $this->scopes = $scope; - } - - /** - * @param Client $client - */ - public function setClient(Client $client): void - { - $this->client = $client; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - -} \ No newline at end of file diff --git a/app/Models/OpenId/Factories/OpenIdTrustedSiteFactory.php b/app/Models/OpenId/Factories/OpenIdTrustedSiteFactory.php deleted file mode 100644 index 7b4e3e27..00000000 --- a/app/Models/OpenId/Factories/OpenIdTrustedSiteFactory.php +++ /dev/null @@ -1,45 +0,0 @@ -setRealm(trim($payload['realm'])); - if(isset($payload['policy'])) - $site->setPolicy(trim($payload['policy'])); - if(isset($payload['data'])) - $site->setData(trim($payload['data'])); - return $site; - } -} \ No newline at end of file diff --git a/app/Models/OpenId/Factories/ServerExtensionFactory.php b/app/Models/OpenId/Factories/ServerExtensionFactory.php deleted file mode 100644 index 83c35049..00000000 --- a/app/Models/OpenId/Factories/ServerExtensionFactory.php +++ /dev/null @@ -1,49 +0,0 @@ -setName(trim($payload['name'])); - if(isset($payload['namespace'])) - $ext->setNamespace(trim($payload['namespace'])); - if(isset($payload['extension_class'])) - $ext->setExtensionClass(trim($payload['extension_class'])); - if(isset($payload['description'])) - $ext->setDescription(trim($payload['description'])); - if(isset($payload['view_name'])) - $ext->setViewName(trim($payload['view_name'])); - if(isset($payload['active'])) - $ext->setActive(boolval($payload['active'])); - return $ext; - } -} \ No newline at end of file diff --git a/app/Models/OpenId/OpenIdAssociation.php b/app/Models/OpenId/OpenIdAssociation.php deleted file mode 100644 index 7093a8be..00000000 --- a/app/Models/OpenId/OpenIdAssociation.php +++ /dev/null @@ -1,228 +0,0 @@ -issued; - $void_date->add(new DateInterval('PT' . intval($this->lifetime) . 'S')); - $now = new DateTime('now', new DateTimeZone("UTC")); - //check validity... - if ($now > $void_date) - return -1; - $seconds = abs($void_date->getTimestamp() - $now->getTimestamp());; - return intval($seconds); - } - - /** - * @return string - */ - public function getHandle():string - { - return $this->identifier; - } - - /** - * @return string - */ - public function getIdentifier(): string - { - return $this->identifier; - } - - /** - * @param string $identifier - */ - public function setIdentifier(string $identifier): void - { - $this->identifier = $identifier; - } - - /** - * @return string - */ - public function getMacFunction(): string - { - return $this->mac_function; - } - - /** - * @param string $mac_function - */ - public function setMacFunction(string $mac_function): void - { - $this->mac_function = $mac_function; - } - - /** - * @return string|null - */ - public function getSecret(): ?string - { - if(is_string($this->secret)) - return $this->secret; - if(is_resource($this->secret)) - return stream_get_contents($this->secret); - return null; - } - - /** - * @param string $secret - */ - public function setSecret(string $secret): void - { - $this->secret = $secret; - } - - /** - * @return string|null - */ - public function getRealm(): ?string - { - return $this->realm; - } - - /** - * @param string $realm - */ - public function setRealm(string $realm): void - { - $this->realm = $realm; - } - - /** - * @return int - */ - public function getType(): int - { - return $this->type; - } - - /** - * @param int $type - */ - public function setType(int $type): void - { - $this->type = $type; - } - - /** - * @return int - */ - public function getLifetime(): int - { - return $this->lifetime; - } - - /** - * @param int $lifetime - */ - public function setLifetime(int $lifetime): void - { - $this->lifetime = $lifetime; - } - - /** - * @return DateTime - */ - public function getIssued(): DateTime - { - return $this->issued; - } - - /** - * @param DateTime $issued - */ - public function setIssued(DateTime $issued): void - { - $this->issued = $issued; - } - - /** - * @return bool - * @throws \Exception - */ - public function IsExpired(): bool - { - return $this->getRemainingLifetime() <= 0 ; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } -} \ No newline at end of file diff --git a/app/Models/OpenId/OpenIdTrustedSite.php b/app/Models/OpenId/OpenIdTrustedSite.php deleted file mode 100644 index 4fcde196..00000000 --- a/app/Models/OpenId/OpenIdTrustedSite.php +++ /dev/null @@ -1,154 +0,0 @@ -getData(); - $str = ''; - foreach ($data as $val) { - $str .= $val . ', '; - } - return trim($str, ', '); - } - - /** - * @return mixed|string - */ - public function getData() - { - $res = is_null($this->data)?'[]':$this->data; - return json_decode($res); - } - - /** - * @param string $data - */ - public function setData(string $data){ - $this->data = $data; - } - - /** - * @return User - */ - public function getUser():User - { - return $this->owner; - } - - /** - * @return string - */ - public function getAuthorizationPolicy():string - { - return $this->policy; - } - - /** - * @return string - */ - public function getRealm(): string - { - return $this->realm; - } - - /** - * @param string $realm - */ - public function setRealm(string $realm): void - { - $this->realm = $realm; - } - - /** - * @return string - */ - public function getPolicy(): string - { - return $this->policy; - } - - /** - * @param string $policy - */ - public function setPolicy(string $policy): void - { - $this->policy = $policy; - } - - /** - * @return User - */ - public function getOwner(): User - { - return $this->owner; - } - - /** - * @param User $owner - */ - public function setOwner(User $owner): void - { - $this->owner = $owner; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - -} \ No newline at end of file diff --git a/app/Models/OpenId/ServerExtension.php b/app/Models/OpenId/ServerExtension.php deleted file mode 100644 index 5c014fe7..00000000 --- a/app/Models/OpenId/ServerExtension.php +++ /dev/null @@ -1,166 +0,0 @@ -name; - } - - /** - * @param string $name - */ - public function setName(string $name): void - { - $this->name = $name; - } - - /** - * @return string - */ - public function getNamespace(): string - { - return $this->namespace; - } - - /** - * @param string $namespace - */ - public function setNamespace(string $namespace): void - { - $this->namespace = $namespace; - } - - /** - * @return bool - */ - public function isActive(): bool - { - return $this->active; - } - - /** - * @param bool $active - */ - public function setActive(bool $active): void - { - $this->active = $active; - } - - /** - * @return string - */ - public function getExtensionClass(): string - { - return $this->extension_class; - } - - /** - * @param string $extension_class - */ - public function setExtensionClass(string $extension_class): void - { - $this->extension_class = $extension_class; - } - - /** - * @return string - */ - public function getDescription(): string - { - return $this->description; - } - - /** - * @param string $description - */ - public function setDescription(string $description): void - { - $this->description = $description; - } - - /** - * @return string - */ - public function getViewName(): string - { - return $this->view_name; - } - - /** - * @param string $view_name - */ - public function setViewName(string $view_name): void - { - $this->view_name = $view_name; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - - -} \ No newline at end of file diff --git a/app/Models/Repositories/IDisqusSSOProfileRepository.php b/app/Models/Repositories/IDisqusSSOProfileRepository.php deleted file mode 100644 index 46e3d53a..00000000 --- a/app/Models/Repositories/IDisqusSSOProfileRepository.php +++ /dev/null @@ -1,24 +0,0 @@ -forum_slug; - } - - /** - * @param string $forum_slug - */ - public function setForumSlug(string $forum_slug): void - { - $this->forum_slug = $forum_slug; - } - - /** - * @return string - */ - public function getPublicKey(): string - { - return $this->public_key; - } - - /** - * @param string $public_key - */ - public function setPublicKey(string $public_key): void - { - $this->public_key = $public_key; - } - - /** - * @return string - */ - public function getSecretKey(): string - { - return $this->secret_key; - } - - /** - * @param string $secret_key - */ - public function setSecretKey(string $secret_key): void - { - $this->secret_key = $secret_key; - } - -} \ No newline at end of file diff --git a/app/Models/SSO/Disqus/DisqusUserProfile.php b/app/Models/SSO/Disqus/DisqusUserProfile.php deleted file mode 100644 index e2a87c06..00000000 --- a/app/Models/SSO/Disqus/DisqusUserProfile.php +++ /dev/null @@ -1,110 +0,0 @@ -public_key = $profile->getPublicKey(); - $this->private_key = $profile->getSecretKey(); - $this->user_id = $user->getId(); - $this->user_email = $user->getEmail(); - $this->user_name = $user->getNickName(); - $this->user_avatar = $user->getPic(); - } - - /** - * @param string $data - * @param string $key - * @return string - */ - private function dsq_hmacsha1(string $data, string $key):string { - $blocksize=64; - $hashfunc='sha1'; - if (strlen($key)>$blocksize) - $key=pack('H*', $hashfunc($key)); - $key=str_pad($key,$blocksize,chr(0x00)); - $ipad=str_repeat(chr(0x36),$blocksize); - $opad=str_repeat(chr(0x5c),$blocksize); - $hmac = pack( - 'H*',$hashfunc( - ($key^$opad).pack( - 'H*',$hashfunc( - ($key^$ipad).$data - ) - ) - ) - ); - return bin2hex($hmac); - } - - /** - * @return array - */ - public function serialize(){ - $data = [ - "id" => $this->user_id, - "username" => $this->user_name, - "email" => $this->user_email, - "avatar" => $this->user_avatar - ]; - Log::debug(sprintf("DisqusUserProfile::serialize %s", json_encode($data))); - $message = base64_encode(json_encode($data)); - $timestamp = time(); - $hmac = $this->dsq_hmacsha1($message . ' ' . $timestamp, $this->private_key); - - return [ - 'auth' => $message." ".$hmac." ".$timestamp, - 'public_key' => $this->public_key - ]; - } - -} \ No newline at end of file diff --git a/app/Models/SSO/RocketChat/RocketChatSSOProfile.php b/app/Models/SSO/RocketChat/RocketChatSSOProfile.php deleted file mode 100644 index c55a9fc9..00000000 --- a/app/Models/SSO/RocketChat/RocketChatSSOProfile.php +++ /dev/null @@ -1,91 +0,0 @@ -forum_slug; - } - - /** - * @param string $forum_slug - */ - public function setForumSlug(string $forum_slug): void - { - $this->forum_slug = $forum_slug; - } - - /** - * @return string - */ - public function getBaseUrl(): string - { - return $this->base_url; - } - - /** - * @param string $base_url - */ - public function setBaseUrl(string $base_url): void - { - $this->base_url = $base_url; - } - - /** - * @return string - */ - public function getServiceName(): string - { - return $this->service_name; - } - - /** - * @param string $service_name - */ - public function setServiceName(string $service_name): void - { - $this->service_name = $service_name; - } - -} \ No newline at end of file diff --git a/app/Models/SSO/RocketChat/RocketChatUserProfile.php b/app/Models/SSO/RocketChat/RocketChatUserProfile.php deleted file mode 100644 index 1884974b..00000000 --- a/app/Models/SSO/RocketChat/RocketChatUserProfile.php +++ /dev/null @@ -1,41 +0,0 @@ -payload = $payload; - } - - /** - * @return array - */ - public function serialize():array { - return $this->payload['data'] ?? []; - } -} \ No newline at end of file diff --git a/app/Models/SSO/StreamChat/StreamChatSSOProfile.php b/app/Models/SSO/StreamChat/StreamChatSSOProfile.php deleted file mode 100644 index 8fde1165..00000000 --- a/app/Models/SSO/StreamChat/StreamChatSSOProfile.php +++ /dev/null @@ -1,90 +0,0 @@ -forum_slug; - } - - /** - * @param string $forum_slug - */ - public function setForumSlug(string $forum_slug): void - { - $this->forum_slug = $forum_slug; - } - - /** - * @return string - */ - public function getApiKey(): string - { - return $this->api_key; - } - - /** - * @param string $api_key - */ - public function setApiKey(string $api_key): void - { - $this->api_key = $api_key; - } - - /** - * @return string - */ - public function getApiSecret(): string - { - return $this->api_secret; - } - - /** - * @param string $api_secret - */ - public function setApiSecret(string $api_secret): void - { - $this->api_secret = $api_secret; - } -} \ No newline at end of file diff --git a/app/Models/SSO/StreamChat/StreamChatUserProfile.php b/app/Models/SSO/StreamChat/StreamChatUserProfile.php deleted file mode 100644 index ba7c4eda..00000000 --- a/app/Models/SSO/StreamChat/StreamChatUserProfile.php +++ /dev/null @@ -1,85 +0,0 @@ -user_id = $user_id; - $this->user_name = $user_name; - $this->user_image = $user_image; - $this->token = $token; - $this->api_key = $api_key; - $this->local_role = $local_role; - } - - /** - * @return array - */ - public function serialize(){ - $data = [ - "id" => $this->user_id, - "name" => $this->user_name, - "image" => $this->user_image, - "token" => $this->token, - "api_key" => $this->api_key, - "local_role" => $this->local_role, - ]; - return $data; - } - -} \ No newline at end of file diff --git a/app/Models/ServerConfiguration.php b/app/Models/ServerConfiguration.php deleted file mode 100644 index 38656498..00000000 --- a/app/Models/ServerConfiguration.php +++ /dev/null @@ -1,75 +0,0 @@ -key; - } - - /** - * @param string $key - */ - public function setKey(string $key): void - { - $this->key = $key; - } - - /** - * @return string - */ - public function getValue(): string - { - return $this->value; - } - - /** - * @param string $value - */ - public function setValue(string $value): void - { - $this->value = $value; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } -} \ No newline at end of file diff --git a/app/Models/UserAction.php b/app/Models/UserAction.php deleted file mode 100644 index 641ab4e9..00000000 --- a/app/Models/UserAction.php +++ /dev/null @@ -1,120 +0,0 @@ -realm; - } - - public function hasRealm():bool - { - return !is_null($this->realm); - } - - /** - * @param string $realm - */ - public function setRealm(string $realm): void - { - $this->realm = $realm; - } - - /** - * @return string - */ - public function getFromIp(): string - { - return $this->from_ip; - } - - /** - * @param string $from_ip - */ - public function setFromIp(string $from_ip): void - { - $this->from_ip = $from_ip; - } - - /** - * @return string - */ - public function getUserAction(): string - { - return $this->user_action; - } - - /** - * @param string $user_action - */ - public function setUserAction(string $user_action): void - { - $this->user_action = $user_action; - } - - /** - * @return User - */ - public function getOwner(): User - { - return $this->owner; - } - - /** - * @param User $owner - */ - public function setOwner(User $owner): void - { - $this->owner = $owner; - } - -} \ No newline at end of file diff --git a/app/Models/UserExceptionTrail.php b/app/Models/UserExceptionTrail.php deleted file mode 100644 index 3c908c60..00000000 --- a/app/Models/UserExceptionTrail.php +++ /dev/null @@ -1,120 +0,0 @@ -exception_type; - } - - /** - * @param string $exception_type - */ - public function setExceptionType(string $exception_type): void - { - $this->exception_type = $exception_type; - } - - /** - * @return string - */ - public function getFromIp(): string - { - return $this->from_ip; - } - - /** - * @param string $from_ip - */ - public function setFromIp(string $from_ip): void - { - $this->from_ip = $from_ip; - } - - /** - * @return string - */ - public function getStackTrace(): string - { - return $this->stack_trace; - } - - /** - * @param string $stack_trace - */ - public function setStackTrace(string $stack_trace): void - { - $this->stack_trace = $stack_trace; - } - - /** - * @return User|null - */ - public function getUser(): ?User - { - return $this->user; - } - - /** - * @param User $user - */ - public function setUser(User $user): void - { - $this->user = $user; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } -} \ No newline at end of file diff --git a/app/Models/Utils/BaseEntity.php b/app/Models/Utils/BaseEntity.php deleted file mode 100644 index ddf3d35d..00000000 --- a/app/Models/Utils/BaseEntity.php +++ /dev/null @@ -1,164 +0,0 @@ -id; - } - - /** - * @return int - */ - public function getId() - { - return $this->getIdentifier(); - } - - /** - * @return \DateTime|null - */ - public function getCreatedAt(): ?\DateTime - { - return $this->created_at; - } - - /** - * @param \DateTime $created_at - */ - public function setCreatedAt(\DateTime $created_at): void - { - $this->created_at = $created_at; - } - - /** - * @return \DateTime|null - */ - public function getUpdatedAt(): ?\DateTime - { - return $this->updated_at; - } - - /** - * @param \DateTime $updated_at - */ - public function setUpdatedAt(\DateTime $updated_at): void - { - $this->updated_at = $updated_at; - } - - public function __construct() - { - $now = new \DateTime('now', new \DateTimeZone('UTC')); - $this->id = 0; - $this->created_at = $now; - $this->updated_at = $now; - } - - /** - * @return QueryBuilder - */ - protected function createQueryBuilder(){ - return Registry::getManager(self::EntityManager)->createQueryBuilder(); - } - - /** - * @param string $dql - * @return Query - */ - protected function createQuery($dql){ - return Registry::getManager(self::EntityManager)->createQuery($dql); - } - - /** - * @param string $sql - * @return mixed - */ - protected function prepareRawSQL($sql){ - return Registry::getManager(self::EntityManager)->getConnection()->prepare($sql); - } - - /** - * @param string $sql - * @return mixed - */ - protected static function prepareRawSQLStatic($sql){ - return Registry::getManager(self::EntityManager)->getConnection()->prepare($sql); - } - - /** - * @return EntityManager - */ - protected function getEM(){ - return Registry::getManager(self::EntityManager); - } - - /** - * @return EntityManager - */ - protected static function getEMStatic(){ - return Registry::getManager(self::EntityManager); - } - - const EntityManager = 'model'; - - /** - * @return bool - */ - public function isNew(): bool - { - return $this->id == 0; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } -} \ No newline at end of file diff --git a/app/Models/Utils/IBaseRepository.php b/app/Models/Utils/IBaseRepository.php deleted file mode 100644 index 8541faf1..00000000 --- a/app/Models/Utils/IBaseRepository.php +++ /dev/null @@ -1,55 +0,0 @@ -format('h')); - $start_min = intval($from->format('i')); - - do{ - $aux_to = clone $aux_from; - $aux_to->setTime(23, 59, 59); - - if($aux_to > $to){ - $aux_to = clone $to; - } - $intervals[] = [ - $aux_from, - $aux_to - ]; - $aux_from = clone $aux_from; - $aux_from->add(new \DateInterval('P1D')); - - } while($aux_to < $to); - - return $intervals; - } -} \ No newline at end of file diff --git a/app/Models/Utils/MySQLExtensionsServiceProvider.php b/app/Models/Utils/MySQLExtensionsServiceProvider.php deleted file mode 100644 index 72a05a12..00000000 --- a/app/Models/Utils/MySQLExtensionsServiceProvider.php +++ /dev/null @@ -1,47 +0,0 @@ -extendAll(function (Configuration $configuration) { - $configuration->setCustomDatetimeFunctions( - [ - 'UTC_TIMESTAMP' => UTCTimestamp::class - ] - ); - }); - } - - /** - * Register the service provider. - * @return void - */ - public function register() - { - } - -} \ No newline at end of file diff --git a/app/Models/Utils/PreRemoveEventArgs.php b/app/Models/Utils/PreRemoveEventArgs.php deleted file mode 100644 index 7c1d86f9..00000000 --- a/app/Models/Utils/PreRemoveEventArgs.php +++ /dev/null @@ -1,42 +0,0 @@ -params = $params; - } - - /** - * @return array - */ - public function getParams() - { - return $this->params; - } - -} \ No newline at end of file diff --git a/app/Models/Utils/RandomGenerator.php b/app/Models/Utils/RandomGenerator.php deleted file mode 100644 index d10a7eda..00000000 --- a/app/Models/Utils/RandomGenerator.php +++ /dev/null @@ -1,84 +0,0 @@ -GetRandom(64, 0)); - } - } catch (Exception $ex) { - } - } - - // Fallback to good old mt_rand() - return uniqid(mt_rand(), true); - } - - /** - * Generates a random token that can be used for session IDs, CSRF tokens etc., based on - * hash algorithms. - * - * If you are using it as a password equivalent (e.g. autologin token) do NOT store it - * in the database as a plain text but encrypt it with Member::encryptWithUserSettings. - * - * @param String $algorithm Any identifier listed in hash_algos() (Default: whirlpool) - * - * @return String Returned length will depend on the used $algorithm - */ - public function randomToken($algorithm = 'whirlpool') { - return hash($algorithm, $this->generateEntropy()); - } -} diff --git a/app/Models/Utils/SilverstripeBaseModel.php b/app/Models/Utils/SilverstripeBaseModel.php deleted file mode 100644 index 4ddfbd3c..00000000 --- a/app/Models/Utils/SilverstripeBaseModel.php +++ /dev/null @@ -1,156 +0,0 @@ -created; - } - - /** - * @return \DateTime|null - */ - public function getCreatedUTC(){ - if(is_null($this->created)) return null; - return $this->getDateFromLocalToUTC($this->created); - } - - /** - * @param \DateTime $created - */ - public function setCreated($created) - { - $this->created = $created; - } - - /** - * @return \DateTime - */ - public function getLastEdited() - { - return $this->last_edited; - } - - /** - * @return \DateTime|null - */ - public function getLastEditedUTC(){ - if(is_null($this->last_edited)) return null; - return $this->getDateFromLocalToUTC($this->last_edited); - } - - /** - * @param \DateTime $value - * @return \DateTime|null - */ - protected function getDateFromLocalToUTC(\DateTime $value){ - if(is_null($value)) return null; - $default_timezone = new \DateTimeZone(self::DefaultTimeZone); - $utc_timezone = new \DateTimeZone("UTC"); - $timestamp = $value->format('Y-m-d H:i:s'); - $local_date = new \DateTime($timestamp, $default_timezone); - return $local_date->setTimezone($utc_timezone); - } - - /** - * @param \DateTime $last_edited - */ - public function setLastEdited($last_edited) - { - $this->last_edited = $last_edited; - } - - - public function __construct() - { - $now = new \DateTime('now', new \DateTimeZone(self::DefaultTimeZone)); - $this->created = $now; - $this->last_edited = $now; - } - - /** - * @return QueryBuilder - */ - protected function createQueryBuilder(){ - return Registry::getManager(self::EntityManager)->createQueryBuilder(); - } - - /** - * @param string $dql - * @return Query - */ - protected function createQuery($dql){ - return Registry::getManager(self::EntityManager)->createQuery($dql); - } - - /** - * @param string $sql - * @return mixed - */ - protected function prepareRawSQL($sql){ - return Registry::getManager(self::EntityManager)->getConnection()->prepare($sql); - } - - /** - * @param string $sql - * @return mixed - */ - protected static function prepareRawSQLStatic($sql){ - return Registry::getManager(self::EntityManager)->getConnection()->prepare($sql); - } - - /** - * @return EntityManager - */ - protected function getEM(){ - return Registry::getManager(self::EntityManager); - } - - /** - * @return EntityManager - */ - protected static function getEMStatic(){ - return Registry::getManager(self::EntityManager); - } - - const EntityManager = 'model'; -} \ No newline at end of file diff --git a/app/Models/Utils/TimeZoneEntity.php b/app/Models/Utils/TimeZoneEntity.php deleted file mode 100644 index 4508cfe2..00000000 --- a/app/Models/Utils/TimeZoneEntity.php +++ /dev/null @@ -1,94 +0,0 @@ -time_zone_id; - } - - /** - * @param string $time_zone_id - */ - public function setTimeZoneId($time_zone_id) - { - $this->time_zone_id = $time_zone_id; - } - - /** - * @return DateTimeZone|null - */ - public function getTimeZone() - { - try { - return new DateTimeZone($this->getTimeZoneId()); - } catch (\Exception $ex) { - return null; - } - } - - /** - * @param DateTime $value - * @return null|DateTime - */ - public function convertDateFromUTC2TimeZone(?DateTime $value) - { - if(is_null($value)) return null; - $time_zone = $this->getTimeZone(); - if (is_null($time_zone)) return null; - - $utc_timezone = new DateTimeZone("UTC"); - $timestamp = $value->format('Y-m-d H:i:s'); - $utc_date = new DateTime($timestamp, $utc_timezone); - - return $utc_date->setTimezone($time_zone); - } - - /** - * @param DateTime $value - * @return null|DateTime - */ - public function convertDateFromTimeZone2UTC(?DateTime $value) - { - if(is_null($value)) return null; - $time_zone = $this->getTimeZone(); - if (is_null($time_zone)) return null; - - $utc_timezone = new DateTimeZone("UTC"); - $timestamp = $value->format('Y-m-d H:i:s'); - $local_date = new DateTime($timestamp, $time_zone); - return $local_date->setTimezone($utc_timezone); - } - - /** - * @return array - */ - public function getTimezones() - { - $timezones_list = []; - foreach (DateTimeZone::listIdentifiers() as $timezone_identifier) { - $timezones_list[$timezone_identifier] = $timezone_identifier; - } - return $timezones_list; - } -} \ No newline at end of file diff --git a/app/Models/Utils/UTCTimestamp.php b/app/Models/Utils/UTCTimestamp.php deleted file mode 100644 index 4e9dc2cb..00000000 --- a/app/Models/Utils/UTCTimestamp.php +++ /dev/null @@ -1,35 +0,0 @@ -match(Lexer::T_IDENTIFIER); - $parser->match(Lexer::T_OPEN_PARENTHESIS); - $parser->match(Lexer::T_CLOSE_PARENTHESIS); - } -} \ No newline at end of file diff --git a/app/Models/WhiteListedIP.php b/app/Models/WhiteListedIP.php deleted file mode 100644 index 0c56c03f..00000000 --- a/app/Models/WhiteListedIP.php +++ /dev/null @@ -1,55 +0,0 @@ -ip; - } - - /** - * @param string $ip - */ - public function setIp(string $ip): void - { - $this->ip = $ip; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - -} \ No newline at end of file diff --git a/app/Policies/.gitkeep b/app/Policies/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/app/Policies/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php deleted file mode 100644 index eb4c9064..00000000 --- a/app/Providers/AppServiceProvider.php +++ /dev/null @@ -1,120 +0,0 @@ -getHandlers() as $handler) { - $handler->setLevel(Config::get('log.level', 'error')); - } - - //set email log - $to = Config::get('log.to_email'); - $from = Config::get('log.from_email'); - - if (!empty($to) && !empty($from)) { - $subject = Config::get('log.email_subject', 'openstackid-resource-server error'); - $cacheService = App::make(ICacheService::class); - $handler = new LaravelMailerHandler($cacheService, $to, $subject, $from); - $handler->setLevel(Config::get('log.email_level', 'error')); - $logger->pushHandler($handler); - } - - Validator::resolver(function($translator, $data, $rules, $messages) - { - return new CustomValidator($translator, $data, $rules, $messages); - }); - - Validator::extend('country_iso_alpha2_code', function($attribute, $value, $parameters, $validator) - { - - $validator->addReplacer('country_iso_alpha2_code', function($message, $attribute, $rule, $parameters) use ($validator) { - return sprintf("%s should be a valid country iso code", $attribute); - }); - if(!is_string($value)) return false; - $value = trim($value); - - $isoCodes = new IsoCodesFactory(); - $countries = $isoCodes->getCountries(); - $country = $countries->getByAlpha2($value); - - return !is_null($country); - }); - - Validator::extend('openid.identifier', function($attribute, $value, $parameters, $validator) - { - $validator->addReplacer('openid.identifier', function($message, $attribute, $rule, $parameters) use ($validator) { - return sprintf("%s should be a valid openid identifier", $attribute); - }); - - return preg_match('/^(\w|\.)+$/', $value); - }); - - Validator::extend('int_array', function($attribute, $value, $parameters, $validator) - { - $validator->addReplacer('int_array', function($message, $attribute, $rule, $parameters) use ($validator) { - return sprintf("%s should be an array of integers", $attribute); - }); - if(!is_array($value)) return false; - foreach($value as $element) - { - if(!is_integer($element)) return false; - } - return true; - }); - - Validator::extend("password_policy", function($attribute, $value, $parameters, $validator){ - $min = 8; - $validator->addReplacer('password_policy', function($message, $attribute, $rule, $parameters) use ($validator, $min) { - return sprintf("The %s must be %s–30 characters, and must include a special character", $attribute, $min); - }); - - return preg_match("/^((?=.*?[#?!@()$%^&*=_{}[\]:;\"'|<>,.\/~`±§+-])).{8,30}$/", $value); - }); - } - - /** - * Register any application services. - * - * @return void - */ - public function register() - { - // - } -} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php deleted file mode 100644 index 86d1ff36..00000000 --- a/app/Providers/AuthServiceProvider.php +++ /dev/null @@ -1,57 +0,0 @@ - 'App\Policies\ModelPolicy', - ]; - - /** - * Register any application authentication / authorization services. - * - * @param \Illuminate\Contracts\Auth\Access\Gate $gate - * @return void - */ - public function boot() - { - $this->registerPolicies(); - Auth::provider('custom', function($app, array $config) { - // Return an instance of Illuminate\Contracts\Auth\UserProvider... - return new AuthProvider( - App::make(IUserRepository::class), - App::make(IAuthenticationExtensionService::class), - App::make(OpenIdServiceCatalog::UserService), - App::make(UtilsServiceCatalog::CheckPointService), - App::make(UtilsServiceCatalog::TransactionService) - ); - }); - } -} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php deleted file mode 100644 index ff9ef821..00000000 --- a/app/Providers/EventServiceProvider.php +++ /dev/null @@ -1,169 +0,0 @@ - [ - ], - ]; - - /** - * Register any other events for your application. - * - * @param \Illuminate\Contracts\Events\Dispatcher $events - * @return void - */ - public function boot() - { - parent::boot(); - - Event::listen(UserEmailVerified::class, function($event) - { - $repository = App::make(IUserRepository::class); - $user = $repository->getById($event->getUserId()); - if(is_null($user)) return; - Mail::queue(new UserEmailVerificationSuccess($user)); - }); - - Event::listen(UserCreated::class, function($event) - { - $repository = App::make(IUserRepository::class); - $user = $repository->getById($event->getUserId()); - if(is_null($user)) return; - if(! $user instanceof User) return; - $user_service = App::make(IUserService::class); - if(!$user_service instanceof IUserService) return; - - $user_service->generateIdentifier($user); - - $verification_link = $user_service->sendWelcomeEmail($user); - - if(!$user->isEmailVerified()) { - - if (!$user->hasCreator()) - $user_service->sendVerificationEmail($user, $verification_link); - } - else{ - // email is already verified - Mail::queue(new UserEmailVerificationSuccess($user)); - } - - try { - if(Config::get("queue.enable_message_broker", false) == true) - PublishUserCreated::dispatch($user)->onConnection('message_broker'); - } - catch (\Exception $ex){ - Log::warning($ex); - } - }); - - Event::listen(UserSpamStateUpdated::class, function($event) - { - $repository = App::make(IUserRepository::class); - $user = $repository->getById($event->getUserId()); - if(is_null($user)) return; - if(! $user instanceof User) return; - $user_service = App::make(IUserService::class); - $user_service->recalculateUserSpamType($user); - }); - - Event::listen(UserEmailUpdated::class, function($event) - { - $repository = App::make(IUserRepository::class); - $user = $repository->getById($event->getUserId()); - if(is_null($user)) return; - if(! $user instanceof User) return; - $user_service = App::make(IUserService::class); - $user_service->sendVerificationEmail($user); - }); - - Event::listen(UserPasswordResetRequestCreated::class, function($event){ - $repository = App::make(IUserPasswordResetRequestRepository::class); - $request = $repository->find($event->getUserId()); - if(is_null($request)) return; - }); - - Event::listen(UserLocked::class, function($event){ - $repository = App::make(IUserRepository::class); - $user = $repository->getById($event->getUserId()); - if(is_null($user)) return; - if(!$user instanceof User) return; - - $support_email = Config::get("mail.support_email", null); - if(!empty($support_email)) { - $attempts = $user->getLoginFailedAttempt(); - Mail::queue(new UserLockedEmail($user, $support_email, $attempts)); - } - }); - - Event::listen(UserPasswordResetSuccessful::class, function($event){ - $repository = App::make(IUserRepository::class); - $user = $repository->getById($event->getUserId()); - if(is_null($user)) return; - if(!$user instanceof User) return; - Mail::queue(new UserPasswordResetMail($user)); - }); - - Event::listen(OAuth2ClientLocked::class, function($event){ - $repository = App::make(IClientRepository::class); - $client = $repository->getClientById($event->getClientId()); - if(is_null($client)) return; - if(!$client instanceof Client) return; - Mail::queue(new \App\Mail\OAuth2ClientLocked($client)); - }); - - Event::listen(\Illuminate\Mail\Events\MessageSending::class, function($event){ - $devEmail = env('DEV_EMAIL_TO', null); - if(in_array(App::environment(), ['local','dev','testing']) && !empty($devEmail)){ - $event->message->setTo(explode(",", $devEmail)); - } - return true; - }); - - } -} diff --git a/app/Providers/OAuth2/ClientAuthContextValidatorFactoryProvider.php b/app/Providers/OAuth2/ClientAuthContextValidatorFactoryProvider.php deleted file mode 100644 index ce6f2d0b..00000000 --- a/app/Providers/OAuth2/ClientAuthContextValidatorFactoryProvider.php +++ /dev/null @@ -1,50 +0,0 @@ -app->booted(function () { - ClientAuthContextValidatorFactory::setTokenEndpointUrl - ( - URL::action('OAuth2\OAuth2ProviderController@token') - ); - - ClientAuthContextValidatorFactory::setJWKSetReader - ( - App::make(\OAuth2\Services\IClientJWKSetReader::class) - ); - }); - - } - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - // TODO: Implement register() method. - } -} \ No newline at end of file diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php deleted file mode 100644 index 0dfa5c01..00000000 --- a/app/Providers/RouteServiceProvider.php +++ /dev/null @@ -1,53 +0,0 @@ - new DoctrineJoinFilterMapping - ( - 'e.owner', - 'owner', - "owner.id :operator :value" - ), - 'client_id' => new DoctrineJoinFilterMapping - ( - 'e.client', - 'client', - "client.id :operator :value" - ), - 'is_valid' => new DoctrineFilterMapping( - " DATEADD(e.created_at, e.lifetime, 'SECOND') >= UTC_TIMESTAMP()" - ) - ]; - } - - /** - * @param int $client_identifier - * @param PagingInfo $paging_info - * @return PagingResponse - */ - function getAllByClientIdentifier(int $client_identifier, PagingInfo $paging_info): PagingResponse - { - $filter = new Filter(); - $filter->addFilterCondition(FilterElement::makeEqual("client_id", $client_identifier)); - return $this->getAllByPage($paging_info, $filter); - } - - /** - * @param int $client_identifier - * @param PagingInfo $paging_info - * @return PagingResponse - */ - function getAllValidByClientIdentifier(int $client_identifier, PagingInfo $paging_info): PagingResponse - { - $filter = new Filter(); - $filter->addFilterCondition(FilterElement::makeEqual("client_id", $client_identifier)); - $filter->addFilterCondition(FilterElement::makeEqual("is_valid", true)); - return $this->getAllByPage($paging_info, $filter); - } - - /** - * @param int $user_id - * @param PagingInfo $paging_info - * @return PagingResponse - */ - function getAllByUserId(int $user_id, PagingInfo $paging_info): PagingResponse - { - $filter = new Filter(); - $filter->addFilterCondition(FilterElement::makeEqual("owner_id", $user_id)); - return $this->getAllByPage($paging_info, $filter); - } - - /** - * @param int $user_id - * @param PagingInfo $paging_info - * @return PagingResponse - */ - function getAllValidByUserId(int $user_id, PagingInfo $paging_info): PagingResponse - { - $filter = new Filter(); - $filter->addFilterCondition(FilterElement::makeEqual("owner_id", $user_id)); - $filter->addFilterCondition(FilterElement::makeEqual("is_valid", true)); - return $this->getAllByPage($paging_info, $filter); - } - -} \ No newline at end of file diff --git a/app/Repositories/DoctrineAccessTokenRepository.php b/app/Repositories/DoctrineAccessTokenRepository.php deleted file mode 100644 index ceb713c8..00000000 --- a/app/Repositories/DoctrineAccessTokenRepository.php +++ /dev/null @@ -1,68 +0,0 @@ -findOneBy(['value' => $hashed_value]); - } - - /** - * @param string $hashed_value - * @return AccessToken|null - */ - function getByAuthCode(string $hashed_value): ?AccessToken - { - return $this->findOneBy(['associated_authorization_code' => $hashed_value]); - } - - /** - * @param int $refresh_token_id - * @return AccessToken[] - */ - function getByRefreshToken(int $refresh_token_id):array - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->join("e.refresh_token", "refresh_token") - ->where("refresh_token.id = (:refresh_token_d)") - ->setParameter("refresh_token_d", $refresh_token_id)->getQuery()->execute(); - } - -} \ No newline at end of file diff --git a/app/Repositories/DoctrineApiEndpointRepository.php b/app/Repositories/DoctrineApiEndpointRepository.php deleted file mode 100644 index f5428ab9..00000000 --- a/app/Repositories/DoctrineApiEndpointRepository.php +++ /dev/null @@ -1,103 +0,0 @@ - 'e.name:json_string', - 'http_method' => 'e.http_method:json_string', - 'route' => 'e.route:json_string', - 'active' => 'e.active|json_boolean', - 'api_id' => new DoctrineLeftJoinFilterMapping("e.api", "a" ,"a.id :operator :value") - ]; - } - - /** - * @return string - */ - protected function getBaseEntity() - { - return ApiEndpoint::class; - } - - /** - * @param string $url - * @param string $http_method - * @return ApiEndpoint|null - * @throws \Doctrine\ORM\NonUniqueResultException - */ - public function getApiEndpointByUrlAndMethod(string $url, string $http_method): ?ApiEndpoint - { - return $this->getApiEndpointByUrlAndMethodAndApi($url, $http_method); - } - - /** - * @param string $url - * @param string|null $http_method - * @param Api $api - * @return ApiEndpoint|null - * @throws \Doctrine\ORM\NonUniqueResultException - */ - public function getApiEndpointByUrlAndMethodAndApi(string $url, string $http_method = null, Api $api = null): ?ApiEndpoint - { - $query = $this->getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->innerJoin("e.api", "a"); - - if(!empty($url)){ - $query = $query->andWhere("e.route = :url")->setParameter("url", $url); - } - - if(!empty($http_method)){ - $query = $query->andWhere("e.http_method = :http_method")->setParameter("http_method", $http_method); - } - - if(!is_null($api)){ - $query = $query->andWhere("a.id = :api_id")->setParameter("api_id", $api->getId()); - } - - $res = $query - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - - return $res; - } - - /** - * @param string $url - * @return ApiEndpoint|null - * @throws \Doctrine\ORM\NonUniqueResultException - */ - public function getApiEndpointByUrl(string $url): ?ApiEndpoint - { - $this->getApiEndpointByUrlAndMethodAndApi($url); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineApiRepository.php b/app/Repositories/DoctrineApiRepository.php deleted file mode 100644 index 322012af..00000000 --- a/app/Repositories/DoctrineApiRepository.php +++ /dev/null @@ -1,92 +0,0 @@ - 'e.name:json_string', - 'active' => 'e.active:json_boolean', - 'resource_server_id' => new DoctrineLeftJoinFilterMapping("e.resource_server", "r" ,"r.id :operator :value") - ]; - } - - /** - * @return array - */ - protected function getOrderMappings() - { - return []; - } - - /** - * @return string - */ - protected function getBaseEntity() - { - return Api::class; - } - - /** - * @param string $api_name - * @return Api - */ - public function getByName(string $api_name):?Api - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("a") - ->from($this->getBaseEntity(), "a") - ->where("a.name in (:name)") - ->setParameter("name", trim($api_name)) - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @param string $api_name - * @param int $resource_server_id - * @return Api - */ - public function getByNameAndResourceServer(string $api_name, int $resource_server_id):?Api - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("a") - ->from($this->getBaseEntity(), "a") - ->innerJoin("a.resource_server", "r") - ->where("a.name in (:name)") - ->andWhere("r.id = (:resource_server_id)") - ->setParameter("name", trim($api_name)) - ->setParameter("resource_server_id", $resource_server_id) - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineApiScopeGroupRepository.php b/app/Repositories/DoctrineApiScopeGroupRepository.php deleted file mode 100644 index 4de9a958..00000000 --- a/app/Repositories/DoctrineApiScopeGroupRepository.php +++ /dev/null @@ -1,42 +0,0 @@ -findOneBy( - ['name' => trim($name)] - ); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineApiScopeRepository.php b/app/Repositories/DoctrineApiScopeRepository.php deleted file mode 100644 index a0e0c6cc..00000000 --- a/app/Repositories/DoctrineApiScopeRepository.php +++ /dev/null @@ -1,176 +0,0 @@ - 'e.name:json_string', - 'is_assigned_by_groups' => new DoctrineFilterMapping - ( - " e.assigned_by_groups :operator :value" - ), - 'api_id' => new DoctrineLeftJoinFilterMapping("e.api", "a" ,"a.id :operator :value") - ]; - } - - /** - * @return string - */ - protected function getBaseEntity() - { - return ApiScope::class; - } - - /** - * @param array $scopes_names - * @return ApiScope[] - */ - public function getByNames(array $scopes_names): array - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("s") - ->from(ApiScope::class, "s") - ->where("s.active = 1") - ->andWhere("s.name in (:scopes_names)") - ->setParameter("scopes_names", $scopes_names) - ->getQuery() - ->getResult(); - } - - /** - * @param string $scope_name - * @return ApiScope|null - */ - public function getFirstByName(string $scope_name): ?ApiScope - { - - return $this->findOneBy( - [ - 'active' => true, - 'name' => trim($scope_name) - ] - ); - } - - /** - * @return ApiScope[] - */ - public function getDefaults(): array - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("s") - ->from(ApiScope::class, "s") - ->where("s.active = 1") - ->andWhere("s.default = 1") - ->getQuery() - ->getResult(); - } - - /** - * @return ApiScope[] - */ - public function getActives(): array - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("s") - ->from(ApiScope::class, "s") - ->where("s.active = 1") - ->getQuery() - ->getResult(); - } - - /** - * @return ApiScope[] - */ - public function getAssignableByGroups(): array - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("s") - ->from(ApiScope::class, "s") - ->where("s.active = 1") - ->andWhere("s.assigned_by_groups = 1") - ->getQuery() - ->getResult(); - } - - /** - * @param array $scopes_names - * @return string[] - */ - public function getFriendlyScopesByName(array $scopes_names): array - { - $result = $this->getEntityManager() - ->createQueryBuilder() - ->select("s.short_description") - ->from(ApiScope::class, "s") - ->where("s.active = 1") - ->andWhere("s.name in (:scopes_names)") - ->setParameter("scopes_names", $scopes_names) - ->getQuery() - ->getScalarResult(); - $res = []; - foreach ($result as $item){ - $res[] = $item['short_description']; - } - return $res; - } - - /** - * Get all active scopes (system/non system ones) - * @param bool $system - * @param bool $assigned_by_groups - * @return ApiScope[] - */ - public function getAvailableScopes(bool $system = false, bool $assigned_by_groups = false): array - { - $res = []; - $scopes = $this->getActives(); - - foreach ($scopes as $scope) - { - $api = $scope->getApi(); - if (!is_null($api) && $api->getResourceServer()->isActive() && $api->isActive()) { - if ($scope->isSystem() && !$system) { - continue; - } - if ($scope->isAssignedByGroups() && !$assigned_by_groups) { - continue; - } - $res[] = $scope; - } - } - - return $res; - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineAsymmetricKeyRepository.php b/app/Repositories/DoctrineAsymmetricKeyRepository.php deleted file mode 100644 index 8cd3e62b..00000000 --- a/app/Repositories/DoctrineAsymmetricKeyRepository.php +++ /dev/null @@ -1,142 +0,0 @@ -getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->where("e.pem_content = (:pem)") - ->setParameter("pem", trim($pem)) - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } - catch (\Exception $ex){ - return null; - } - } - - /** - * @param string $type - * @param string $usage - * @params string $alg - * @param \DateTime $valid_from - * @param \DateTime $valid_to - * @param int|null $owner_id - * @return AsymmetricKey[] - */ - public function getByValidityRange($type, $usage, $alg, \DateTime $valid_from, \DateTime $valid_to, $owner_id = null):array - { - // (StartA <= EndB) and (EndA >= StartB) - $query = $this->getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->where("e.type = (:type)") - ->andWhere("e.usage = (:usage)") - ->andWhere("e.alg = (:alg)") - ->andWhere("e.valid_from <= (:valid_to)") - ->andWhere("e.valid_to >= (:valid_from)") - ->andWhere("e.active = 1") - ->setParameter("usage", $usage ) - ->setParameter("type", $type ) - ->setParameter("alg", $alg ) - ->setParameter("valid_to", $valid_to) - ->setParameter("valid_from", $valid_from); - ; - if(!is_null($owner_id)) - { - $query = $query->andWhere('e.oauth2_client.id = (:owner_id)'); - $query->setParameter("owner_id", $owner_id); - } - - return $query->getQuery()->getResult(); - } - - /** - * @return AsymmetricKey[] - */ - public function getActives():array - { - $now = new \DateTime('now', new \DateTimeZone('UTC')); - return $this->getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->where('e.valid_from <= :now1') - ->andWhere('e.valid_to >= :now2') - ->andWhere("e.active = 1") - ->setParameters([ - 'now1' => $now, - 'now2' => $now, - ]) - ->getQuery() - ->getResult(); - } - - /** - * @param string $type - * @param string $usage - * @param string $alg - * @param int|null $owner_id - * @return AsymmetricKey|null - */ - public function getActiveByCriteria(string $type, string $usage, string $alg, int $owner_id = null): ?AsymmetricKey - { - try { - $now = new \DateTime('now', new \DateTimeZone('UTC')); - $query = $this->getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->where("e.type = (:type)") - ->andWhere("e.usage = (:usage)") - ->andWhere("e.alg = (:alg)") - ->andWhere("e.valid_from <= (:valid_to)") - ->andWhere("e.valid_to >= (:valid_from)") - ->andWhere("e.active = 1") - ->setParameter("usage", $usage) - ->setParameter("type", $type) - ->setParameter("alg", $alg) - ->setParameter("valid_to", $now) - ->setParameter("valid_from", $now);; - if (!is_null($owner_id)) { - $query = $query->andWhere('e.oauth2_client.id = (:owner_id)'); - $query->setParameter("owner_id", $owner_id); - } - - return $query->getQuery()->getOneOrNullResult(); - } - catch (\Exception $ex){ - return null; - } - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineBannedIPRepository.php b/app/Repositories/DoctrineBannedIPRepository.php deleted file mode 100644 index ef9ee2d2..00000000 --- a/app/Repositories/DoctrineBannedIPRepository.php +++ /dev/null @@ -1,44 +0,0 @@ -findOneBy([ - 'ip' => $ip - ]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineClientPublicKeyRepository.php b/app/Repositories/DoctrineClientPublicKeyRepository.php deleted file mode 100644 index 9ad92cb2..00000000 --- a/app/Repositories/DoctrineClientPublicKeyRepository.php +++ /dev/null @@ -1,33 +0,0 @@ -findOneBy([ - 'forum_slug' => trim($forum_slug) - ]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineGroupRepository.php b/app/Repositories/DoctrineGroupRepository.php deleted file mode 100644 index fe10538d..00000000 --- a/app/Repositories/DoctrineGroupRepository.php +++ /dev/null @@ -1,86 +0,0 @@ - 'e.id', - 'name' => 'e.name', - 'slug' => 'e.slug', - ]; - } - - /** - * @return array - */ - protected function getFilterMappings() - { - return [ - 'name' => 'e.name:json_string', - 'slug' => 'e.slug:json_string', - 'active' => 'e.active:json_boolean', - ]; - } - - /** - * @return string - */ - protected function getBaseEntity() - { - return Group::class; - } - - /** - * @return Group[] - */ - public function getDefaultOnes(): array - { - return $this->findBy([ - 'default' => true - ]); - } - - /** - * @param string $name - * @return Group|null - */ - public function getOneByName(string $name): ?Group - { - return $this->findOneBy([ - 'name' => trim($name) - ]); - } - - /** - * @param string $slug - * @return Group|null - */ - public function getOneBySlug(string $slug): ?Group - { - return $this->findOneBy([ - 'slug' => trim($slug) - ]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineOAuth2ClientRepository.php b/app/Repositories/DoctrineOAuth2ClientRepository.php deleted file mode 100644 index 5e6f97cb..00000000 --- a/app/Repositories/DoctrineOAuth2ClientRepository.php +++ /dev/null @@ -1,154 +0,0 @@ - [ - "owner.id :operator :value", - "admin_user.id :operator :value" - ], - 'locked' => 'e.locked', - 'client_id' => 'e.client_id', - 'resource_server_not_set' => new DoctrineLeftJoinFilterMapping("e.resource_server", "resource_server", "resource_server is null"), - ]; - } - - /** - * @param QueryBuilder $query - * @return QueryBuilder - */ - protected function applyExtraJoins(QueryBuilder $query) - { - $query = $query - ->leftJoin("e.user", "owner") - ->leftJoin("e.admin_users", "admin_user"); - return $query; - } - - /** - * @return string - */ - protected function getBaseEntity() - { - return Client::class; - } - - /** - * @param string $app_name - * @return Client|null - * @throws \Doctrine\ORM\NonUniqueResultException - */ - public function getByApplicationName(string $app_name):?Client - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->where("e.app_name = (:app_name)") - ->setParameter("app_name", trim($app_name)) - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @param string $client_id - * @return Client|null - * @throws \Doctrine\ORM\NonUniqueResultException - */ - public function getClientById(string $client_id):?Client - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("c") - ->from($this->getBaseEntity(), "c") - ->where("c.client_id = (:client_id)") - ->setParameter("client_id", trim($client_id)) - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @param int $id - * @return Client|null - */ - public function getClientByIdentifier(int $id):?Client - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("c") - ->from($this->getBaseEntity(), "c") - ->where("c.id = (:id)") - ->setParameter("id", intval($id)) - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @param string $origin - * @return Client|null - */ - public function getByOrigin(string $origin):?Client - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("c") - ->from($this->getBaseEntity(), "c") - ->where("c.allowed_origins like :origin") - ->setParameter("origin", '%'.trim($origin).'%') - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @param int $id - * @param string $custom_scheme - * @return bool - */ - public function hasCustomSchemeRegisteredForRedirectUrisOnAnotherClientThan(int $id, string $custom_scheme): bool - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("count(e.id)") - ->from($this->getBaseEntity(), "e") - ->where("e.redirect_uris like :custom_scheme") - ->andWhere("e.id <> :id") - ->setParameter("custom_scheme", '%' . trim($custom_scheme). '://%') - ->setParameter("id", $id) - ->setMaxResults(1) - ->getQuery() - ->getSingleScalarResult() > 0; - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineOAuth2TrailExceptionRepository.php b/app/Repositories/DoctrineOAuth2TrailExceptionRepository.php deleted file mode 100644 index 0772d3b7..00000000 --- a/app/Repositories/DoctrineOAuth2TrailExceptionRepository.php +++ /dev/null @@ -1,58 +0,0 @@ -getEntityManager() - ->createQueryBuilder() - ->select("count(e.id)") - ->from($this->getBaseEntity(), "e") - ->join("e.client", "client") - ->where("client.id = :client_id") - ->andWhere("e.exception_type = :exception_type") - ->andWhere("DATESUB(UTC_TIMESTAMP(), :minutes, 'MINUTE') < e.created_at") - ->setParameters( - [ - 'client_id' => $client->getId(), - 'exception_type' => trim($type), - 'minutes' => $minutes_without_ex, - ] - ) - ->getQuery()->getSingleScalarResult(); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineOpenIdAssociationRepository.php b/app/Repositories/DoctrineOpenIdAssociationRepository.php deleted file mode 100644 index 535572cf..00000000 --- a/app/Repositories/DoctrineOpenIdAssociationRepository.php +++ /dev/null @@ -1,43 +0,0 @@ -findOneBy([ - 'identifier' => trim($handle) - ]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineOpenIdTrustedSiteRepository.php b/app/Repositories/DoctrineOpenIdTrustedSiteRepository.php deleted file mode 100644 index 5e05a254..00000000 --- a/app/Repositories/DoctrineOpenIdTrustedSiteRepository.php +++ /dev/null @@ -1,69 +0,0 @@ -getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->join("e.owner", "owner") - ->where("owner.id = (:user_id)") - ->setParameter("user_id", $user_id); - - //add or condition for all given sub-domains - if (count($sub_domains)) { - - $sub_query = ''; - foreach ($sub_domains as $sub_domain) { - if(!empty($sub_query)) - $sub_query .= ' or '; - $sub_query .= " e.realm = '".$sub_domain."' "; - } - - $query = $query->andWhere($sub_query); - } - - //add conditions for all possible pre approved data - foreach ($data as $value) { - $query = $query->andWhere("e.data LIKE '%" . $value . "%'"); - } - return $query->getQuery() - ->getResult(); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineRefreshTokenRepository.php b/app/Repositories/DoctrineRefreshTokenRepository.php deleted file mode 100644 index 29f6a209..00000000 --- a/app/Repositories/DoctrineRefreshTokenRepository.php +++ /dev/null @@ -1,65 +0,0 @@ - new DoctrineJoinFilterMapping - ( - 'e.owner', - 'owner', - "owner.id :operator :value" - ), - 'client_id' => new DoctrineJoinFilterMapping - ( - 'e.client', - 'client', - "client.id :operator :value" - ), - 'is_valid' => new DoctrineFilterMapping( - "(e.lifetime = 0 AND e.void = false) OR DATEADD(e.created_at, e.lifetime, 'SECOND') >= UTC_TIMESTAMP()" - ) - ]; - } - - /** - * @param string $hashed_value - * @return RefreshToken|null - */ - function getByValue(string $hashed_value):?RefreshToken - { - return $this->findOneBy(['value' => $hashed_value]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineRepository.php b/app/Repositories/DoctrineRepository.php deleted file mode 100644 index a4b05789..00000000 --- a/app/Repositories/DoctrineRepository.php +++ /dev/null @@ -1,312 +0,0 @@ -manager_name); - } - - public function getById($id) - { - return $this->find($id); - } - - /** - * @param int $id - * @return IEntity|null|object - */ - public function getByIdExclusiveLock($id){ - return $this->find($id, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE); - } - - /** - * @param $entity - * @param bool $sync - * @return mixed|void - * @throws \Doctrine\ORM\ORMException - * @throws \Doctrine\ORM\OptimisticLockException - */ - public function add($entity, $sync = false) - { - $this->getEntityManager()->persist($entity); - if($sync) - $this->getEntityManager()->flush($entity); - } - - /** - * @param IEntity $entity - * @return void - */ - public function delete($entity) - { - $this->getEntityManager()->remove($entity); - } - - /** - * @return IEntity[] - */ - public function getAll() - { - return $this->findAll(); - } - - /** - * @return string - */ - protected abstract function getBaseEntity(); - - /** - * @return array - */ - protected abstract function getFilterMappings(); - - /** - * @return array - */ - protected abstract function getOrderMappings(); - - /** - * @param QueryBuilder $query - * @return QueryBuilder - */ - protected abstract function applyExtraFilters(QueryBuilder $query); - - /** - * @param QueryBuilder $query - * @return QueryBuilder - */ - protected abstract function applyExtraJoins(QueryBuilder $query); - - /** - * @param PagingInfo $paging_info - * @param Filter|null $filter - * @param Order|null $order - * @return PagingResponse - */ - public function getAllByPage(PagingInfo $paging_info, Filter $filter = null, Order $order = null){ - - $query = $this->getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e"); - - $query = $this->applyExtraFilters($query); - - $query = $this->applyExtraJoins($query); - - if(!is_null($filter)){ - $filter->apply2Query($query, $this->getFilterMappings()); - } - - if(!is_null($order)){ - $order->apply2Query($query, $this->getOrderMappings()); - } - - $query= $query - ->setFirstResult($paging_info->getOffset()) - ->setMaxResults($paging_info->getPerPage()); - - $paginator = new Paginator($query, $fetchJoinCollection = true); - $total = $paginator->count(); - $data = array(); - - foreach($paginator as $entity) - array_push($data, $entity); - - return new PagingResponse - ( - $total, - $paging_info->getPerPage(), - $paging_info->getCurrentPage(), - $paging_info->getLastPage($total), - $data - ); - } - - /** - * Creates a new QueryBuilder instance that is prepopulated for this entity name. - * - * @param string $alias - * @param string $indexBy The index for the from. - * - * @return QueryBuilder - */ - public function createQueryBuilder($alias, $indexBy = null) - { - return $this->getEntityManager()->createQueryBuilder() - ->select($alias) - ->from($this->_entityName, $alias, $indexBy); - } - - /** - * Creates a new result set mapping builder for this entity. - * - * The column naming strategy is "INCREMENT". - * - * @param string $alias - * - * @return Query\ResultSetMappingBuilder - */ - public function createResultSetMappingBuilder($alias) - { - $rsm = new Query\ResultSetMappingBuilder($this->getEntityManager(), ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT); - $rsm->addRootEntityFromClassMetadata($this->_entityName, $alias); - - return $rsm; - } - - /** - * Creates a new Query instance based on a predefined metadata named query. - * - * @param string $queryName - * - * @return Query - */ - public function createNamedQuery($queryName) - { - return $this->getEntityManager()->createQuery($this->_class->getNamedQuery($queryName)); - } - - /** - * Creates a native SQL query. - * - * @param string $queryName - * - * @return NativeQuery - */ - public function createNativeNamedQuery($queryName) - { - $queryMapping = $this->_class->getNamedNativeQuery($queryName); - $rsm = new Query\ResultSetMappingBuilder($this->getEntityManager()); - $rsm->addNamedNativeQueryMapping($this->_class, $queryMapping); - - return $this->getEntityManager()->createNativeQuery($queryMapping['query'], $rsm); - } - - /** - * Clears the repository, causing all managed entities to become detached. - * - * @return void - */ - public function clear() - { - $this->getEntityManager()->clear($this->_class->rootEntityName); - } - - /** - * Finds an entity by its primary key / identifier. - * - * @param mixed $id The identifier. - * @param int|null $lockMode One of the \Doctrine\DBAL\LockMode::* constants - * or NULL if no specific lock mode should be used - * during the search. - * @param int|null $lockVersion The lock version. - * - * @return object|null The entity instance or NULL if the entity can not be found. - */ - public function find($id, $lockMode = null, $lockVersion = null) - { - return $this->getEntityManager()->find($this->_entityName, $id, $lockMode, $lockVersion); - } - - /** - * Finds entities by a set of criteria. - * - * @param array $criteria - * @param array|null $orderBy - * @param int|null $limit - * @param int|null $offset - * - * @return array The objects. - */ - public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) - { - $persister = $this->getEntityManager()->getUnitOfWork()->getEntityPersister($this->_entityName); - - return $persister->loadAll($criteria, $orderBy, $limit, $offset); - } - - /** - * Finds a single entity by a set of criteria. - * - * @param array $criteria - * @param array|null $orderBy - * - * @return object|null The entity instance or NULL if the entity can not be found. - */ - public function findOneBy(array $criteria, array $orderBy = null) - { - $persister = $this->getEntityManager()->getUnitOfWork()->getEntityPersister($this->_entityName); - - return $persister->load($criteria, null, null, [], null, 1, $orderBy); - } - - /** - * Counts entities by a set of criteria. - * - * @todo Add this method to `ObjectRepository` interface in the next major release - * - * @param array $criteria - * - * @return int The cardinality of the objects that match the given criteria. - */ - public function count(array $criteria) - { - return $this->getEntityManager()->getUnitOfWork()->getEntityPersister($this->_entityName)->count($criteria); - } - - /** - * Select all elements from a selectable that match the expression and - * return a new collection containing these elements. - * - * @param \Doctrine\Common\Collections\Criteria $criteria - * - * @return \Doctrine\Common\Collections\Collection - */ - public function matching(Criteria $criteria) - { - $persister = $this->getEntityManager()->getUnitOfWork()->getEntityPersister($this->_entityName); - - return new LazyCriteriaCollection($persister, $criteria); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineResourceServerRepository.php b/app/Repositories/DoctrineResourceServerRepository.php deleted file mode 100644 index b9257556..00000000 --- a/app/Repositories/DoctrineResourceServerRepository.php +++ /dev/null @@ -1,106 +0,0 @@ -getEntityManager() - ->createQueryBuilder() - ->select("r") - ->from($this->getBaseEntity(), "r") - ->where("r.host in (:host)") - ->setParameter("host", $host) - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @param string $ip - * @return ResourceServer - */ - public function getByIp(string $ip):?ResourceServer - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("r") - ->from($this->getBaseEntity(), "r") - ->where("r.ips like :ip") - ->setParameter("ip", '%'.trim($ip).'%') - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @param string $name - * @return ResourceServer - */ - public function getByFriendlyName(string $name):?ResourceServer - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("r") - ->from($this->getBaseEntity(), "r") - ->where("r.friendly_name = :friendly_name") - ->setParameter("friendly_name", trim($name)) - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @param array $audience - * @param string $ip - * @return ResourceServer - */ - public function getByAudienceAndIpAndActive(array $audience, string $ip):?ResourceServer - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("r") - ->from($this->getBaseEntity(), "r") - ->where("r.ips like :ip ") - ->andWhere("r.host in (:host)") - ->andWhere("r.active = 1") - ->setParameter("ip", '%'.trim($ip).'%') - ->setParameter("host", $audience) - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineRocketChatSSOProfileRepository.php b/app/Repositories/DoctrineRocketChatSSOProfileRepository.php deleted file mode 100644 index 13fd3317..00000000 --- a/app/Repositories/DoctrineRocketChatSSOProfileRepository.php +++ /dev/null @@ -1,42 +0,0 @@ -findOneBy([ - 'forum_slug' => trim($forum_slug) - ]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineServerConfigurationRepository.php b/app/Repositories/DoctrineServerConfigurationRepository.php deleted file mode 100644 index 12fb2c60..00000000 --- a/app/Repositories/DoctrineServerConfigurationRepository.php +++ /dev/null @@ -1,40 +0,0 @@ -findOneBy([ - 'key' => trim($key) - ]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineServerExtensionRepository.php b/app/Repositories/DoctrineServerExtensionRepository.php deleted file mode 100644 index 4b3464a2..00000000 --- a/app/Repositories/DoctrineServerExtensionRepository.php +++ /dev/null @@ -1,43 +0,0 @@ -getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->where("e.active = 1") - ->getQuery()->execute(); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineServerPrivateKeyRepository.php b/app/Repositories/DoctrineServerPrivateKeyRepository.php deleted file mode 100644 index f8375e57..00000000 --- a/app/Repositories/DoctrineServerPrivateKeyRepository.php +++ /dev/null @@ -1,40 +0,0 @@ -findOneBy(['kid' => trim($kid)]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineSpamEstimatorFeedRepository.php b/app/Repositories/DoctrineSpamEstimatorFeedRepository.php deleted file mode 100644 index 27721f1d..00000000 --- a/app/Repositories/DoctrineSpamEstimatorFeedRepository.php +++ /dev/null @@ -1,46 +0,0 @@ -getEntityManager()->createQueryBuilder(); - $qb->delete(SpamEstimatorFeed::class, 'e'); - $qb->where('e.email = :email'); - $qb->setParameter('email', trim($email)); - $qb->getQuery()->execute(); - } - catch(\Exception $ex){ - Log::error($ex); - } - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineStreamChatSSOProfileRepository.php b/app/Repositories/DoctrineStreamChatSSOProfileRepository.php deleted file mode 100644 index d354c868..00000000 --- a/app/Repositories/DoctrineStreamChatSSOProfileRepository.php +++ /dev/null @@ -1,42 +0,0 @@ -findOneBy([ - 'forum_slug' => trim($forum_slug) - ]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineUserExceptionTrailRepository.php b/app/Repositories/DoctrineUserExceptionTrailRepository.php deleted file mode 100644 index 88bfc39b..00000000 --- a/app/Repositories/DoctrineUserExceptionTrailRepository.php +++ /dev/null @@ -1,57 +0,0 @@ -getEntityManager() - ->createQueryBuilder() - ->select("count(e.id)") - ->from($this->getBaseEntity(), "e") - ->where("e.from_ip = :ip") - ->andWhere("e.exception_type = :exception_type") - ->andWhere("DATESUB(UTC_TIMESTAMP(), :minutes, 'MINUTE') < e.created_at") - ->setParameters( - [ - 'ip' => trim($ip), - 'exception_type' => trim($type), - 'minutes' => $minutes_without_ex, - ] - ) - ->getQuery()->getSingleScalarResult(); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineUserPasswordResetRequestRepository.php b/app/Repositories/DoctrineUserPasswordResetRequestRepository.php deleted file mode 100644 index a29dcaf2..00000000 --- a/app/Repositories/DoctrineUserPasswordResetRequestRepository.php +++ /dev/null @@ -1,42 +0,0 @@ -findOneBy([ - 'hash' => UserPasswordResetRequest::hash($token) - ]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineUserRegistrationRequestRepository.php b/app/Repositories/DoctrineUserRegistrationRequestRepository.php deleted file mode 100644 index 42c354ac..00000000 --- a/app/Repositories/DoctrineUserRegistrationRequestRepository.php +++ /dev/null @@ -1,52 +0,0 @@ -findOneBy([ - 'hash' => $hash - ]); - } - - /** - * @inheritDoc - */ - public function getByEmail(string $email): ?UserRegistrationRequest - { - return $this->findOneBy([ - 'email' => strtolower(trim($email)) - ]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineUserRepository.php b/app/Repositories/DoctrineUserRepository.php deleted file mode 100644 index 0711f41b..00000000 --- a/app/Repositories/DoctrineUserRepository.php +++ /dev/null @@ -1,126 +0,0 @@ - 'e.first_name', - 'last_name' => 'e.last_name', - 'email' => 'e.email', - 'active' => 'e.active', - 'identifier' => 'e.identifier', - 'last_login_date' => 'e.last_login_date', - 'spam_type' => 'e.spam_type', - ]; - } - - /** - * @return array - */ - protected function getFilterMappings() - { - return [ - 'first_name' => 'e.first_name:json_string', - 'last_name' => 'e.last_name:json_string', - 'full_name' => new DoctrineFilterMapping("concat(e.first_name, ' ', e.last_name) :operator :value"), - 'github_user' => 'e.github_user:json_string', - 'email' => ['e.email:json_string', 'e.second_email:json_string', 'e.third_email:json_string'], - 'primary_email' => 'e.email:json_string', - 'active' => 'e.active:json_boolean', - 'group_id' => new DoctrineJoinFilterMapping('e.groups', "g", "g.id :operator :value") - ]; - } - - /** - * @return string - */ - protected function getBaseEntity() - { - return User::class; - } - - /** - * @param mixed $identifier - * @param string $token - * @return User|null - */ - public function getByToken(string $token): ?User - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->Where("e.remember_token = (:token)") - ->setParameter("token", trim($token)) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @param string $term - * @return User|null - */ - public function getByEmailOrName(string $term): ?User - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->Where("e.email = (:term)") - ->setParameter("term", trim($term)) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @param string $user_identifier - * @return User|null - */ - public function getByIdentifier($user_identifier): ?User - { - return $this->getEntityManager() - ->createQueryBuilder() - ->select("e") - ->from($this->getBaseEntity(), "e") - ->Where("e.identifier = (:identifier)") - ->setParameter("identifier", trim($user_identifier)) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @param string $token - * @return User|null - */ - public function getByVerificationEmailToken(string $token): ?User - { - return $this->findOneBy([ - 'email_verified_token_hash' => User::createConfirmationTokenHash($token) - ]); - } -} \ No newline at end of file diff --git a/app/Repositories/DoctrineWhiteListedIPRepository.php b/app/Repositories/DoctrineWhiteListedIPRepository.php deleted file mode 100644 index 343e2c9e..00000000 --- a/app/Repositories/DoctrineWhiteListedIPRepository.php +++ /dev/null @@ -1,42 +0,0 @@ -findOneBy([ - 'ip' => trim($ip) - ]); - } -} \ No newline at end of file diff --git a/app/Repositories/IServerConfigurationRepository.php b/app/Repositories/IServerConfigurationRepository.php deleted file mode 100644 index dcfd442d..00000000 --- a/app/Repositories/IServerConfigurationRepository.php +++ /dev/null @@ -1,27 +0,0 @@ -EntityRepository. - * - * @param EntityManager $em The EntityManager to use. - * @param ClassMetadata $class The class descriptor. - */ - public function __construct($em, ClassMetadata $class) - { - $this->manager_name = SilverstripeBaseModel::EntityManager; - parent::__construct(Registry::getManager($this->manager_name), $class); - } - - /** - * @param QueryBuilder $query - * @return QueryBuilder - */ - protected function applyExtraJoins(QueryBuilder $query) - { - return $query; - } - - /** - * @return array - */ - protected function getFilterMappings() - { - return []; - } - - /** - * @return array - */ - protected function getOrderMappings() - { - return []; - } - - /** - * @param QueryBuilder $query - * @return QueryBuilder - */ - protected function applyExtraFilters(QueryBuilder $query) - { - return $query; - } -} \ No newline at end of file diff --git a/app/Repositories/RepositoriesProvider.php b/app/Repositories/RepositoriesProvider.php deleted file mode 100644 index b340e475..00000000 --- a/app/Repositories/RepositoriesProvider.php +++ /dev/null @@ -1,290 +0,0 @@ -tx_service = $tx_service; - } -} \ No newline at end of file diff --git a/app/Services/Apis/IRocketChatAPI.php b/app/Services/Apis/IRocketChatAPI.php deleted file mode 100644 index ddf59ddd..00000000 --- a/app/Services/Apis/IRocketChatAPI.php +++ /dev/null @@ -1,33 +0,0 @@ -resource_server_context = $resource_server_context; - } - - /** - * @param string $service_name - * @return array - * @throws Exception - */ - public function login(string $service_name): array - { - try { - $client = new Client(); - $endpoint = sprintf("%s/api/v1/login", $this->base_url); - - $payload = [ - 'serviceName' => $service_name, - 'accessToken' => $this->resource_server_context->getCurrentAccessToken(), - "expiresIn" => 3600 - ]; - - $response = $client->post($endpoint, [ - 'json' => $payload - ]); - - $json = $response->getBody()->getContents(); - return json_decode($json, true); - } - catch (ClientException $ex){ - Log::error($ex->getMessage()); - throw new ValidationException($ex->getMessage()); - } - catch(Exception $ex){ - Log::error($ex->getMessage()); - throw $ex; - } - } - - /** - * @param string $base_url - * @return IRocketChatAPI - */ - public function setBaseUrl(string $base_url): IRocketChatAPI - { - $this->base_url = $base_url; - return $this; - } -} \ No newline at end of file diff --git a/app/Services/Auth/DisqusSSOService.php b/app/Services/Auth/DisqusSSOService.php deleted file mode 100644 index f9d15d30..00000000 --- a/app/Services/Auth/DisqusSSOService.php +++ /dev/null @@ -1,122 +0,0 @@ -repository = $repository; - $this->user_repository = $user_repository; - $this->resource_server_context = $resource_server_context; - } - - /** - * @inheritDoc - */ - public function create(array $payload): IEntity - { - // TODO: Implement create() method. - } - - /** - * @inheritDoc - */ - public function update(int $id, array $payload): IEntity - { - // TODO: Implement update() method. - } - - /** - * @inheritDoc - */ - public function delete(int $id): void - { - // TODO: Implement delete() method. - } - - /** - * @param string $forum_slug - * @return DisqusUserProfile|null - * @throws \Exception - */ - public function getUserProfile(string $forum_slug): ?DisqusUserProfile - { - return $this->tx_service->transaction(function() use($forum_slug){ - - Log::debug("DisqusSSOService::getUserProfile"); - $current_user_id = $this->resource_server_context->getCurrentUserId(); - - Log::debug(sprintf("DisqusSSOService::getUserProfile current_user_id %s", $current_user_id)); - if (is_null($current_user_id)) { - throw new ValidationException('me is no set!.'); - } - - $current_user = $this->user_repository->getById($current_user_id); - if(is_null($current_user)) throw new EntityNotFoundException(); - - if(!$current_user instanceof User) throw new EntityNotFoundException(); - $sso_profile = $this->repository->getByForumSlug($forum_slug); - if(is_null($sso_profile)){ - throw new EntityNotFoundException("Forum not found"); - } - - return new DisqusUserProfile($sso_profile, $current_user); - }); - } -} \ No newline at end of file diff --git a/app/Services/Auth/GroupService.php b/app/Services/Auth/GroupService.php deleted file mode 100644 index 979fe5b4..00000000 --- a/app/Services/Auth/GroupService.php +++ /dev/null @@ -1,193 +0,0 @@ -user_repository = $user_repository; - $this->group_repository = $group_repository; - } - - /** - * @param array $payload - * @return IEntity - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function create(array $payload): IEntity - { - return $this->tx_service->transaction(function() use($payload){ - $name = trim($payload['name']); - $slug = trim($payload['slug']); - - $formerGroup = $this->group_repository->getOneByName($name); - if(!is_null($formerGroup)){ - throw new ValidationException(sprintf("there is already a group with name %s", $name)); - } - - $formerGroup = $this->group_repository->getOneBySlug($slug); - if(!is_null($formerGroup)){ - throw new ValidationException(sprintf("there is already a group with slug %s", $slug)); - } - - $group = GroupFactory::build($payload); - - $this->group_repository->add($group); - - return $group; - }); - } - - /** - * @param int $id - * @param array $payload - * @return IEntity - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function update(int $id, array $payload): IEntity - { - return $this->tx_service->transaction(function() use($id, $payload){ - $group = $this->group_repository->getById($id); - - if(is_null($group) || !$group instanceof Group) - throw new EntityNotFoundException("group not found!"); - - $name = trim($payload['name']); - $slug = trim($payload['slug']); - - $formerGroup = $this->group_repository->getOneByName($name); - if(!is_null($formerGroup) && $formerGroup->getId() != $group->getId()){ - throw new ValidationException(sprintf("there is already a group with name %s", $name)); - } - - $formerGroup = $this->group_repository->getOneBySlug($slug); - if(!is_null($formerGroup) && $formerGroup->getId() != $group->getId()){ - throw new ValidationException(sprintf("there is already a group with slug %s", $slug)); - } - - return GroupFactory::populate($group, $payload); - - }); - } - - - /** - * @param int $id - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function delete(int $id): void - { - $this->tx_service->transaction(function() use($id) { - $group = $this->group_repository->getById($id); - if(is_null($group) || !$group instanceof Group) - throw new EntityNotFoundException("group not found"); - - $this->group_repository->delete($group); - }); - } - - /** - * @param Group $group - * @param int $user_id - * @throw EntityNotFoundException - * @throw ValidationException - */ - public function addUser2Group(Group $group, int $user_id): void - { - $user = $this->tx_service->transaction(function() use($group, $user_id){ - $user = $this->user_repository->getById($user_id); - if(is_null($user)) - throw new EntityNotFoundException(); - - $user->addToGroup($group); - return $user; - }); - - try { - if(Config::get("queue.enable_message_broker", false) == true) - PublishUserUpdated::dispatch($user)->onConnection('message_broker'); - } - catch (\Exception $ex){ - Log::warning($ex); - } - } - - /** - * @param Group $group - * @param int $user_id - * @throw EntityNotFoundException - * @throw ValidationException - */ - public function removeUserFromGroup(Group $group, int $user_id): void - { - $user = $this->tx_service->transaction(function() use($group, $user_id){ - $user = $this->user_repository->getById($user_id); - if(is_null($user)) - throw new EntityNotFoundException(); - - $user->removeFromGroup($group); - - return $user; - }); - - try { - if(Config::get("queue.enable_message_broker", false) == true) - PublishUserUpdated::dispatch($user)->onConnection('message_broker'); - } - catch (\Exception $ex){ - Log::warning($ex); - } - } -} \ No newline at end of file diff --git a/app/Services/Auth/IDisqusSSOService.php b/app/Services/Auth/IDisqusSSOService.php deleted file mode 100644 index 8a33e1e4..00000000 --- a/app/Services/Auth/IDisqusSSOService.php +++ /dev/null @@ -1,31 +0,0 @@ -repository = $repository; - $this->user_repository = $user_repository; - $this->resource_server_context = $resource_server_context; - $this->rocket_chat_api = $rocket_chat_api; - } - - /** - * @inheritDoc - */ - public function create(array $payload): IEntity - { - // TODO: Implement create() method. - } - - /** - * @inheritDoc - */ - public function update(int $id, array $payload): IEntity - { - // TODO: Implement update() method. - } - - /** - * @inheritDoc - */ - public function delete(int $id): void - { - // TODO: Implement delete() method. - } - - /** - * @param string $forum_slug - * @return RocketChatUserProfile|null - * @throws \Exception - */ - public function getUserProfile(string $forum_slug): ?RocketChatUserProfile - { - return $this->tx_service->transaction(function() use($forum_slug){ - - Log::debug("RocketChatSSOService::getUserProfile"); - $current_user_id = $this->resource_server_context->getCurrentUserId(); - $access_token = $this->resource_server_context->getCurrentAccessToken(); - if(empty($access_token)){ - throw new ValidationException("Access Token is empty."); - } - Log::debug(sprintf("RocketChatSSOService::getUserProfile current_user_id %s", $current_user_id)); - if (is_null($current_user_id)) { - throw new ValidationException('me is no set!.'); - } - - $current_user = $this->user_repository->getById($current_user_id); - if(is_null($current_user)) throw new EntityNotFoundException(); - - if(!$current_user instanceof User) throw new EntityNotFoundException(); - $sso_profile = $this->repository->getByForumSlug($forum_slug); - if(is_null($sso_profile)){ - throw new EntityNotFoundException("Forum not found"); - } - - return new RocketChatUserProfile - ( - $this->rocket_chat_api->setBaseUrl($sso_profile->getBaseUrl())->login($sso_profile->getServiceName()) - ); - }); - } -} \ No newline at end of file diff --git a/app/Services/Auth/StreamChatSSOService.php b/app/Services/Auth/StreamChatSSOService.php deleted file mode 100644 index ab59b7a0..00000000 --- a/app/Services/Auth/StreamChatSSOService.php +++ /dev/null @@ -1,143 +0,0 @@ -repository = $repository; - $this->user_repository = $user_repository; - $this->resource_server_context = $resource_server_context; - parent::__construct($tx_service); - } - - /** - * @inheritDoc - */ - public function getUserProfile(string $forum_slug): ?StreamChatUserProfile - { - return $this->tx_service->transaction(function() use($forum_slug){ - - Log::debug("StreamChatService::getUserProfile"); - $current_user_id = $this->resource_server_context->getCurrentUserId(); - $access_token = $this->resource_server_context->getCurrentAccessToken(); - if(empty($access_token)){ - throw new ValidationException("Access Token is empty."); - } - Log::debug(sprintf("RocketChatSSOService::getUserProfile current_user_id %s", $current_user_id)); - if (is_null($current_user_id)) { - throw new ValidationException('me is no set!.'); - } - - $current_user = $this->user_repository->getById($current_user_id); - if(is_null($current_user)) throw new EntityNotFoundException(); - - if(!$current_user instanceof User) throw new EntityNotFoundException(); - $sso_profile = $this->repository->getByForumSlug($forum_slug); - if(is_null($sso_profile)){ - throw new EntityNotFoundException("Forum not found"); - } - - // @see https://github.com/nparsons08/stream-chat-boilerplate-api/blob/master/src/controllers/v1/token/token.action.js - // @see https://getstream.io/chat/docs/tokens_and_authentication/?language=php - $client = new StreamChatClient($sso_profile->getApiKey(), $sso_profile->getApiSecret()); - $token = $client->createToken(strval($current_user->getId())); - - /** - * Available roles - * https://getstream.io/chat/docs/channel_user_role/?language=js - * user - * guest - * admin - */ - $role = 'user'; - $localRole = 'user'; - $isAdmin = $current_user->isSuperAdmin() || $current_user->isAdmin(); - $isChatQA = $current_user->belongToGroup(IGroupSlugs::ChatQAGroup); - $isChatHelp = $current_user->belongToGroup(IGroupSlugs::ChatHelpGroup); - - if($isChatQA && $isChatHelp){ - $localRole = 'help-qa-user'; - } - else if($isChatQA){ - $localRole = 'qa-user'; - } - else if($isChatHelp){ - $localRole = 'help-user'; - } - else if($isAdmin){ - $role = 'admin'; - $localRole = 'admin'; - } - // register user on stream api - $client->updateUser([ - 'id' => strval($current_user->getId()), - 'role' => $role, - 'name' => $current_user->getFullName(), - 'image' => $current_user->getPic(), - 'local_role' => $localRole - ]); - - return new StreamChatUserProfile - ( - strval($current_user->getId()), - $current_user->getFullName(), - $current_user->getPic(), - $token, - $sso_profile->getApiKey(), - $localRole - ); - }); - } -} \ No newline at end of file diff --git a/app/Services/Auth/UserService.php b/app/Services/Auth/UserService.php deleted file mode 100644 index 2dc872a3..00000000 --- a/app/Services/Auth/UserService.php +++ /dev/null @@ -1,444 +0,0 @@ -user_repository = $user_repository; - $this->group_repository = $group_repository; - $this->name_generator_service = $name_generator_service; - $this->request_reset_password_repository = $request_reset_password_repository; - $this->user_registration_request_repository = $user_registration_request_repository; - $this->spam_estimator_feed_repository = $spam_estimator_feed_repository; - $this->client_repository = $client_repository; - } - - /** - * @param array $payload - * @throws ValidationException - * @return User - */ - public function registerUser(array $payload): User - { - return $this->tx_service->transaction(function() use($payload){ - $email = trim($payload['email']); - $former_user = $this->user_repository->getByEmailOrName($email); - if(!is_null($former_user)) - throw new ValidationException(sprintf("email %s belongs to another user !!!", $email)); - - $default_groups = $this->group_repository->getDefaultOnes(); - if(count($default_groups) > 0){ - $payload['groups'] = $default_groups; - } - $user = UserFactory::build($payload); - - $this->user_repository->add($user); - - $formerRequest = $this->user_registration_request_repository->getByEmail($email); - if(!is_null($formerRequest)){ - if(!$formerRequest->isRedeem()){ - $formerRequest->redeem(); - } - } - - return $user; - }); - } - - /** - * @param string $token - * @throws ValidationException - * @throws EntityNotFoundException - * @return User - */ - public function verifyEmail(string $token): User - { - return $this->tx_service->transaction(function() use($token){ - $user = $this->user_repository->getByVerificationEmailToken($token); - if(is_null($user)) - throw new EntityNotFoundException(); - $user->verifyEmail(); - return $user; - }); - } - - /** - * @param array $payload - * @throws ValidationException - * @throws EntityNotFoundException - * @return User - */ - public function resendVerificationEmail(array $payload): User - { - return $this->tx_service->transaction(function() use($payload){ - $email = trim($payload['email']); - $user = $this->user_repository->getByEmailOrName($email); - if(is_null($user)) - throw new EntityNotFoundException(); - return $this->sendVerificationEmail($user); - }); - } - - /** - * @param User $user - * @return string - */ - private function generateVerificationLink(User $user):string{ - - return $this->tx_service->transaction(function() use($user) { - - //generate unique token - do { - $token = $user->generateEmailVerificationToken(); - $former_user = $this->user_repository->getByVerificationEmailToken($token); - if (is_null($former_user)) break; - } while (true); - - return URL::route("verification_verify", ["token" => $token]); - }); - } - - /** - * @param User $user - * @return string|null - * @throws \Exception - */ - public function sendWelcomeEmail(User $user):?string { - - return $this->tx_service->transaction(function() use($user){ - - $verification_link = null; - - if(!$user->isEmailVerified()) - $verification_link = $this->generateVerificationLink($user); - - Mail::queue(new WelcomeNewUserEmail($user, $verification_link)); - - return $verification_link; - }); - } - - /** - * @param User $user - * @param string|null $verification_link - * @return User - * @throws \Exception - */ - public function sendVerificationEmail(User $user, string $verification_link = null): User - { - return $this->tx_service->transaction(function() use($user, $verification_link){ - - if(empty($verification_link)) - $verification_link = $this->generateVerificationLink($user); - - Mail::queue(new UserEmailVerificationRequest($user, $verification_link)); - - return $user; - }); - } - - /** - * @param User $user - * @return User - * @throws \Exception - */ - public function generateIdentifier(User $user): User - { - return $this->tx_service->transaction(function() use($user) { - $fragment_nbr = 1; - $this->name_generator_service->generate($user); - $identifier = $original_identifier = $user->getIdentifier(); - do - { - $old_user = $this->user_repository->getByIdentifier($identifier); - if(!is_null($old_user)) - { - $identifier = $original_identifier . IUserNameGeneratorService::USER_NAME_CHAR_CONNECTOR . $fragment_nbr; - $fragment_nbr++; - continue; - } - $user->setIdentifier($identifier); - break; - } while (1); - - return $user; - }); - } - - /** - * @param array $payload - * @throws ValidationException - * @throws EntityNotFoundException - * @return UserPasswordResetRequest - */ - public function requestPasswordReset(array $payload): UserPasswordResetRequest - { - return $this->tx_service->transaction(function() use($payload) { - $user = $this->user_repository->getByEmailOrName(trim($payload['email'])); - if(is_null($user) || !$user->isEmailVerified()) - throw new EntityNotFoundException("User not found."); - - $request = new UserPasswordResetRequest(); - $request->setOwner($user); - - do{ - $token = $request->generateToken(); - $former_request = $this->request_reset_password_repository->getByToken($token); - if(is_null($former_request)) break; - }while(1); - - $user->addPasswordResetRequest($request); - - $reset_link = URL::route("password.reset", ["token" => $token]); - - Mail::queue(new UserPasswordResetRequestMail($user, $reset_link)); - - return $request; - }); - } - - /** - * @param string $token - * @param string $new_password - * @throws ValidationException - * @throws EntityNotFoundException - * @return User - */ - public function resetPassword(string $token, string $new_password): User - { - return $this->tx_service->transaction(function() use($token, $new_password) { - $request = $this->request_reset_password_repository->getByToken($token); - - if(is_null($request)) - throw new EntityNotFoundException("request not found"); - - if(!$request->isValid()) - throw new ValidationException("request is void"); - - if($request->isRedeem()){ - throw new ValidationException("request is already redeem"); - } - - $user = $request->getOwner(); - $user->setPassword($new_password); - $request->redeem(); - Event::fire(new UserPasswordResetSuccessful($user->getId())); - return $user; - }); - } - - /** - * @param string $client_id - * @param array $payload - * @return UserRegistrationRequest - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function createRegistrationRequest(string $client_id, array $payload): UserRegistrationRequest - { - return $this->tx_service->transaction(function() use($client_id, $payload) { - - $client = $this->client_repository->getClientById($client_id); - if(is_null($client)) - throw new EntityNotFoundException("client not found!"); - - $email = $payload['email']; - $former_user = $this->user_repository->getByEmailOrName($email); - - if(!is_null($former_user)) - throw new ValidationException(sprintf("There is another user already with email %s.", $email)); - - $formerRequest = $this->user_registration_request_repository->getByEmail($email); - if(!is_null($formerRequest)){ - if($formerRequest->isRedeem()){ - throw new ValidationException(sprintf("There is already a former registration request for email %s.", $email)); - } - return $formerRequest; - } - $request = UserRegistrationRequestFactory::build($payload); - $generator = new RandomGenerator(); - - do{ - - $hash = md5( - $request->getEmail(). - $request->getFirstName(). - $request->getLastName(). - $generator->randomToken()); - - $former_registration_request = $this->user_registration_request_repository->getByHash($hash); - $request->setHash($hash); - if(is_null($former_registration_request)) break; - - } while(1); - - $request->setClient($client); - $this->user_registration_request_repository->add($request); - return $request; - }); - } - - /** - * @param string $token - * @param string $new_password - * @return UserRegistrationRequest - * @throws \Exception - */ - public function setPassword(string $token, string $new_password): UserRegistrationRequest - { - - return $this->tx_service->transaction(function() use($token, $new_password) { - - $request = $this->user_registration_request_repository->getByHash($token); - - if(is_null($request)) { - Log::warning(sprintf("UserService::setPassword registration request %s not found.", $token)); - throw new EntityNotFoundException("Request not found."); - } - - if($request->isRedeem()){ - Log::warning(sprintf("UserService::setPassword registration request %s already redeem.", $token)); - throw new ValidationException("Request is already redeem."); - } - - $email = $request->getEmail(); - - $former_user = $this->user_repository->getByEmailOrName($email); - if(!is_null($former_user)) - throw new ValidationException(sprintf("User %s already exists!.", $email)); - - $user = UserFactory::build([ - 'first_name' => $request->getFirstName(), - 'last_name' => $request->getLastName(), - 'email' => $email, - 'password' => $new_password, - 'active' => true, - 'email_verified' => true, - ]); - - $request->setOwner($user); - $request->redeem(); - $this->user_repository->add($user); - Event::fire(new UserPasswordResetSuccessful($user->getId())); - return $request; - }); - } - - /** - * @inheritDoc - */ - public function recalculateUserSpamType(User $user): void - { - $this->tx_service->transaction(function() use($user) { - $this->spam_estimator_feed_repository->deleteByEmail($user->getEmail()); - switch($user->getSpamType()){ - case User::SpamTypeSpam: - $feed = SpamEstimatorFeed::buildFromUser($user, User::SpamTypeSpam); - $this->spam_estimator_feed_repository->add($feed); - break; - case User::SpamTypeHam: - $feed = SpamEstimatorFeed::buildFromUser($user, User::SpamTypeHam); - $this->spam_estimator_feed_repository->add($feed); - break; - } - }); - } -} \ No newline at end of file diff --git a/app/Services/Facades/ExternalUrlService.php b/app/Services/Facades/ExternalUrlService.php deleted file mode 100644 index e29d5cd9..00000000 --- a/app/Services/Facades/ExternalUrlService.php +++ /dev/null @@ -1,27 +0,0 @@ -repository = $repository; - $this->scope_repository = $scope_repository; - $this->api_repository = $api_repository; - } - - - /** - * @param array $payload - * @return IEntity - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function create(array $payload): IEntity - { - return $this->tx_service->transaction(function () use ($payload) { - - //check that does not exists an endpoint with same http method and same route - $route = trim($payload['route']); - $http_method = trim($payload['http_method']); - $api_id = intval($payload['api_id']); - $api = $this->api_repository->getById($api_id); - if(is_null($api) || !$api instanceof Api) - throw new EntityNotFoundException(); - - $former_endpoint = $this->repository->getApiEndpointByUrlAndMethodAndApi($route, $http_method, $api); - - if(!is_null($former_endpoint)) - throw new ValidationException - ( - sprintf - ( - 'there is already an endpoint api with route %s and http method %s', - $route, - $http_method - ) - ); - - $endpoint = ApiEndpointFactory::build($payload); - $api->addEndpoint($endpoint); - - return $endpoint; - }); - - } - - /** - * @param int $id - * @param array $payload - * @return IEntity - * @throws EntityNotFoundException - * @throws ValidationException - */ - public function update(int $id, array $payload):IEntity { - - return $this->tx_service->transaction(function () use ($id, $payload){ - $endpoint = $this->repository->getById($id); - - if(is_null($endpoint) || !$endpoint instanceof ApiEndpoint) - throw new EntityNotFoundException(sprintf('api endpoint id %s does not exists!', $id)); - - - //check that does not exists an endpoint with same http method and same route - $former_endpoint = $this->repository->getApiEndpointByUrlAndMethodAndApi - ( - $endpoint->getRoute(), - $endpoint->getHttpMethod(), - $endpoint->getApi() - ); - - if(!is_null($former_endpoint) && $former_endpoint->getId() != $endpoint->getId()) - throw new ValidationException - ( - sprintf - ( - 'there is already an endpoint api with route %s and http method %s', - $endpoint->getRoute(), - $endpoint->getHttpMethod() - ) - ); - - return ApiEndpointFactory::populate($endpoint, $payload); - }); - } - - /** - * Adds a new required scope to a given api endpoint, - * given scope must belongs to owner api of the given endpoint - * @param int $api_endpoint_id - * @param int $scope_id - * @return ApiEndpoint - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function addRequiredScope(int $api_endpoint_id, int $scope_id):ApiEndpoint - { - - return $this->tx_service->transaction(function () use($api_endpoint_id, $scope_id){ - - $api_endpoint = $this->repository->getById($api_endpoint_id); - - if(is_null($api_endpoint) || !$api_endpoint instanceof ApiEndpoint) - throw new EntityNotFoundException(sprintf("api endpoint id %s does not exists!.",$api_endpoint_id)); - - $scope = $this->scope_repository->getById($scope_id); - - if(is_null($scope) || !$scope instanceof ApiScope) - throw new EntityNotFoundException(sprintf("api scope id %s does not exists!.", $scope_id)); - - if($scope->getApi()->getId() != $api_endpoint->getApi()->getId()) - throw new ValidationException(sprintf("api scope id %s does not belong to api id %s !.",$scope_id, $api_endpoint->getApi()->getId())); - - if($api_endpoint->hasScope($scope)) - throw new ValidationException(sprintf("api scope id %s already belongs to endpoint id %s!.",$scope_id,$api_endpoint->getId())); - - $api_endpoint->addScope($scope); - - return $api_endpoint; - }); - } - - - /** - * Remove a required scope to a given api endpoint, - * given scope must belongs to owner api of the given endpoint - * @param int $api_endpoint_id - * @param int $scope_id - * @return ApiEndpoint - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function removeRequiredScope(int $api_endpoint_id, int $scope_id):ApiEndpoint{ - - - return $this->tx_service->transaction(function () use($api_endpoint_id, $scope_id){ - - $api_endpoint = $this->repository->getById($api_endpoint_id); - - if(is_null($api_endpoint) || !$api_endpoint instanceof ApiEndpoint) - throw new EntityNotFoundException(sprintf("api endpoint id %s does not exists!.",$api_endpoint_id)); - - $scope = $this->scope_repository->getById($scope_id); - - if(is_null($scope) || !$scope instanceof ApiScope) - throw new EntityNotFoundException(sprintf("api scope id %s does not exists!.",$scope_id)); - - if($scope->getApi()->getId() !== $api_endpoint->getApi()->getId()) - throw new ValidationException(sprintf("api scope id %s does not belongs to api id %s!.",$scope_id,$api_endpoint->getApi()->getId())); - - - if(!$api_endpoint->hasScope($scope)) - throw new ValidationException(sprintf("api scope id %s does not belongs to endpoint id %s !.",$scope_id,$api_endpoint->getId())); - - $api_endpoint->removeScope($scope); - - return $api_endpoint; - }); - - } - - /** - * deletes a given api endpoint - * @param int $id - * @throws EntityNotFoundException - */ - public function delete(int $id):void - { - $this->tx_service->transaction(function () use ($id) { - $endpoint = $this->repository->getById($id); - if(is_null($endpoint)) throw new EntityNotFoundException(); - $this->repository->delete($endpoint); - }); - } - -} \ No newline at end of file diff --git a/app/Services/OAuth2/ApiScopeGroupService.php b/app/Services/OAuth2/ApiScopeGroupService.php deleted file mode 100644 index 66b8ac65..00000000 --- a/app/Services/OAuth2/ApiScopeGroupService.php +++ /dev/null @@ -1,192 +0,0 @@ -log_service = $log_service; - $this->repository = $repository; - $this->user_repository = $user_repository; - $this->scope_service = $scope_service; - $this->scope_repository = $scope_repository; - $this->tx_service = $tx_service; - } - - /** - * @param int $id - * @param array $payload - * @return IEntity - * @throws \Exception - */ - public function update(int $id, array $payload):IEntity - { - return $this->tx_service->transaction(function () use ($id, $payload) { - - $group = $this->repository->getById($id); - - if (is_null($group) ||!$group instanceof ApiScopeGroup) - { - throw new InvalidApiScopeGroup(sprintf('api scope group id %s does not exists!', $id)); - } - - if(isset($payload['name'])){ - $former_group = $this->repository->getByName($payload['name']); - if(!is_null($former_group) && $former_group->getId() != $id) - { - throw new InvalidApiScopeGroup(sprintf('there is already another api scope group name (%s).', $payload['name'])); - } - } - - ApiScopeGroupFactory::populate($group, $payload); - - if(isset($payload['users'])){ - $group->clearUsers(); - $users = explode(',', $payload['users']); - foreach($users as $user_id) - { - $user = $this->user_repository->getById(intval($user_id)); - if(is_null($user)) throw new EntityNotFoundException(sprintf('user %s not found.',$user_id)); - $group->addUser($user); - } - } - - if(isset($payload['scopes'])){ - $scopes = explode(',', $payload['scopes']); - foreach($scopes as $scope_id) - { - $scope = $this->scope_repository->getById(intval($scope_id)); - if(is_null($scope)) throw new EntityNotFoundException(sprintf('scope %s not found.',$scope_id)); - $group->addScope($scope); - } - } - - return $group; - }); - } - - /** - * @param array $payload - * @return IEntity - */ - public function create(array $payload):IEntity - { - return $this->tx_service->transaction(function () use ($payload) { - - $name = trim($payload['name']); - $former_group = $this->repository->getByName($name); - - if(!is_null($former_group)) - { - throw new InvalidApiScopeGroup(sprintf('there is already another api scope group name (%s).', $name)); - } - $group = ApiScopeGroupFactory::build($payload); - $scopes = $payload['scopes']; - $users = $payload['users']; - $scopes = explode(',', $scopes); - $users = explode(',', $users); - - foreach($scopes as $scope_id) - { - $scope = $this->scope_repository->getById(intval($scope_id)); - if(is_null($scope)) throw new EntityNotFoundException(sprintf('scope %s not found.',$scope_id)); - $group->addScope($scope); - } - - foreach($users as $user_id) - { - $user = $this->user_repository->getById(intval($user_id)); - if(is_null($user)) throw new EntityNotFoundException(sprintf('user %s not found.',$user_id)); - $group->addUser($user); - } - - $this->repository->add($group); - - return $group; - }); - } - - /** - * @param int $id - * @throws \Exception - */ - public function delete(int $id): void - { - $this->tx_service->transaction(function () use ($id) { - - $group = $this->repository->getById($id); - - if(is_null($group)) - throw new EntityNotFoundException(); - - $this->repository->delete($group); - - }); - } -} \ No newline at end of file diff --git a/app/Services/OAuth2/ApiScopeService.php b/app/Services/OAuth2/ApiScopeService.php deleted file mode 100644 index 5130c565..00000000 --- a/app/Services/OAuth2/ApiScopeService.php +++ /dev/null @@ -1,164 +0,0 @@ -repository = $repository; - $this->api_repository = $api_repository; - } - - /** - * @param array $scopes_names - * @return array - */ - public function getAudienceByScopeNames(array $scopes_names):array - { - $scopes = $this->repository->getByNames($scopes_names); - $audience = []; - foreach ($scopes as $scope) { - $api = $scope->getApi(); - $resource_server = !is_null($api) ? $api->getResourceServer() : null; - if (!is_null($resource_server) && !array_key_exists($resource_server->getHost(), $audience)) { - $audience[$resource_server->getHost()] = $resource_server->getId(); - } - } - return $audience; - } - - /** - * @param array $scopes_names - * @return string - */ - public function getStrAudienceByScopeNames(array $scopes_names):string - { - $audiences = $this->getAudienceByScopeNames($scopes_names); - $audience = ''; - foreach ($audiences as $resource_server_host => $ip) { - $audience = $audience . $resource_server_host . ' '; - } - $audience = trim($audience); - - return $audience; - } - - /** - * @param $id - * @param array $payload - * @return IEntity - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function update(int $id, array $payload):IEntity - { - - return $this->tx_service->transaction(function () use ($id, $payload) { - //check that scope exists... - $scope = $this->repository->getById($id); - if (is_null($scope)) { - throw new EntityNotFoundException(sprintf('scope id %s does not exists!', $id)); - } - - return ApiScopeFactory::populate($scope, $payload); - }); - - } - - /** - * @param int $id - * @throws EntityNotFoundException - */ - public function delete(int $id):void - { - $this->tx_service->transaction(function () use ($id) { - $scope = $this->repository->getById($id); - if (is_null($scope)) { - throw new EntityNotFoundException(sprintf('scope id %s does not exists!', $id)); - } - $this->repository->delete($scope); - }); - } - - /** - * @param array $payload - * @return ApiScope - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function create(array $payload):IEntity - { - - return $this->tx_service->transaction(function () use ($payload) { - - $api_id = intval($payload['api_id']); - $name = trim($payload['name']); - - $api = $this->api_repository->getById($api_id); - // check if api exists... - if (is_null($api) || !$api instanceof Api) { - throw new EntityNotFoundException(sprintf('api id %s does not exists!.', $api_id)); - } - - $former_scope = $this->repository->getFirstByName($name); - //check if we have a former scope with selected name - if (!is_null($former_scope)) { - throw new ValidationException(sprintf('scope name %s already exists.', $name)); - } - - $scope = ApiScopeFactory::build($payload); - $api->addScope($scope); - $this->repository->add($scope); - return $scope; - }); - } - -} \ No newline at end of file diff --git a/app/Services/OAuth2/ApiService.php b/app/Services/OAuth2/ApiService.php deleted file mode 100644 index 9ac00c63..00000000 --- a/app/Services/OAuth2/ApiService.php +++ /dev/null @@ -1,115 +0,0 @@ -resource_server_repository = $resource_server_repository; - $this->api_repository = $api_repository; - } - - /** - * @param int $id - * @throws EntityNotFoundException - */ - public function delete(int $id):void - { - - $this->tx_service->transaction(function () use ($id) { - $api = $this->api_repository->getById($id); - if(is_null($api)) throw new EntityNotFoundException(); - $this->api_repository->delete($api); - }); - } - - - public function create(array $payload):IEntity - { - return $this->tx_service->transaction(function () use ($payload) { - - $name = trim($payload['name']); - $resource_server_id = intval($payload['resource_server_id']); - $resource_server = $this->resource_server_repository->getById($resource_server_id); - if(is_null($resource_server) || !$resource_server instanceof ResourceServer) - throw new EntityNotFoundException(); - $former_api = $this->api_repository->getByNameAndResourceServer($name, $resource_server_id); - if(!is_null($former_api)) - throw new ValidationException(sprintf('api name %s already exists!', $name)); - - $api = ApiFactory::build($payload); - - $resource_server->addApi($api); - - return $api; - }); - - } - - /** - * @param int $id - * @param array $payload - * @return IEntity - * @throws \Exception - */ - public function update(int $id, array $payload): IEntity { - - - return $this->tx_service->transaction(function () use ($id, $payload) { - - $api = $this->api_repository->getById($id); - if(is_null($api) || !$api instanceof Api) - throw new EntityNotFoundException(sprintf('api id %s does not exists!', $id)); - - return ApiFactory::populate($api, $payload); - }); - - } - -} \ No newline at end of file diff --git a/app/Services/OAuth2/AsymmetricKeyService.php b/app/Services/OAuth2/AsymmetricKeyService.php deleted file mode 100644 index 7c6e7076..00000000 --- a/app/Services/OAuth2/AsymmetricKeyService.php +++ /dev/null @@ -1,85 +0,0 @@ -repository = $repository; - } - - /** - * @param array $params - * @return IEntity - */ - abstract public function create(array $params):IEntity; - - /** - * @param $key_id - * @param array $params - * @throws EntityNotFoundException - * @return IEntity - */ - public function update(int $key_id, array $params): IEntity { - - return $this->tx_service->transaction(function() use($key_id, $params) - { - - $key = $this->repository->getById($key_id); - if(is_null($key)) - throw new EntityNotFoundException(); - - if(isset($params['active'])){ - $key->setActive($params['active']); - } - - return $key; - }); - } - - /** - * @param int $id - * @throws EntityNotFoundException - */ - public function delete(int $id):void - { - - $this->tx_service->transaction(function() use($id) - { - - $key = $this->repository->getById($id); - if(is_null($key)) - throw new EntityNotFoundException(); - - $this->repository->delete($key); - }); - } -} \ No newline at end of file diff --git a/app/Services/OAuth2/ClientCredentialGenerator.php b/app/Services/OAuth2/ClientCredentialGenerator.php deleted file mode 100644 index 876bdda0..00000000 --- a/app/Services/OAuth2/ClientCredentialGenerator.php +++ /dev/null @@ -1,49 +0,0 @@ -setClientId(Rand::getString(32, OAuth2Protocol::VsChar, true) . IClientCredentialGenerator::ClientSuffix); - - if ($client->getClientType() === IClient::ClientType_Confidential) - { - $now = new DateTime('now', new \DateTimeZone('UTC')); - $client->setClientSecret(Rand::getString(64, OAuth2Protocol::VsChar, true)); - // default 6 months - $client->setClientSecretExpiresAt($now->add( new DateInterval('P6M'))); - } - return $client; - } -} \ No newline at end of file diff --git a/app/Services/OAuth2/ClientPublicKeyService.php b/app/Services/OAuth2/ClientPublicKeyService.php deleted file mode 100644 index 3d46adaf..00000000 --- a/app/Services/OAuth2/ClientPublicKeyService.php +++ /dev/null @@ -1,119 +0,0 @@ -client_repository = $client_repository; - $this->auth_service = $auth_service; - - } - - /** - * @param array $params - * @return IAsymmetricKey - */ - public function create(array $params):IEntity - { - - return $this->tx_service->transaction(function() use($params) - { - - if ($this->repository->getByPEM($params['pem_content'])) - { - throw new ValidationException('public key already exists on another client, choose another one!.'); - } - - $client = $this->client_repository->getById(intval($params['client_id'])); - - if(is_null($client) || !$client instanceof Client) - throw new EntityNotFoundException('client does not exits!'); - - $existent_kid = $client->getPublicKeyByIdentifier(trim($params['kid'])); - - if ($existent_kid) - { - throw new ValidationException('public key identifier (kid) already exists!.'); - } - - $old_key_active = $client->getCurrentPublicKeyByTypeUseAlgAndRange( - trim($params['type']), - trim($params['usage']), - trim($params['usage']), - new DateTime($params['valid_to']), - new DateTime($params['valid_from']) - ); - - $public_key = ClientPublicKey::buildFromPEM - ( - $params['kid'], - $params['type'], - $params['usage'], - $params['pem_content'], - $params['alg'], - $old_key_active ? false : $params['active'], - new DateTime($params['valid_from']), - new DateTime($params['valid_to']) - ); - - $client->addPublicKey($public_key); - $client->setEditedBy($this->auth_service->getCurrentUser()); - - return $public_key; - }); - } - -} \ No newline at end of file diff --git a/app/Services/OAuth2/ClientService.php b/app/Services/OAuth2/ClientService.php deleted file mode 100644 index e1aab15e..00000000 --- a/app/Services/OAuth2/ClientService.php +++ /dev/null @@ -1,596 +0,0 @@ -auth_service = $auth_service; - $this->user_repository = $user_repository; - $this->scope_service = $scope_service; - $this->client_credential_generator = $client_credential_generator; - $this->client_repository = $client_repository; - $this->scope_repository = $scope_repository; - } - - - /** - * Clients in possession of a client password MAY use the HTTP Basic - * authentication scheme as defined in [RFC2617] to authenticate with - * the authorization server - * Alternatively, the authorization server MAY support including the - * client credentials in the request-body using the following - * parameters: - * implementation of @see http://tools.ietf.org/html/rfc6749#section-2.3.1 - * implementation of @see http://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication - * @throws InvalidClientAuthMethodException - * @throws MissingClientAuthorizationInfo - * @return ClientAuthenticationContext - */ - public function getCurrentClientAuthInfo() - { - - if - ( - Input::has(OAuth2Protocol::OAuth2Protocol_ClientAssertionType) && - Input::has(OAuth2Protocol::OAuth2Protocol_ClientAssertion) - ) - { - Log::debug - ( - sprintf - ( - "ClientService::getCurrentClientAuthInfo params %s - %s present", - OAuth2Protocol::OAuth2Protocol_ClientAssertionType, - OAuth2Protocol::OAuth2Protocol_ClientAssertion - ) - ); - - return new ClientAssertionAuthenticationContext - ( - Input::get(OAuth2Protocol::OAuth2Protocol_ClientAssertionType, ''), - Input::get(OAuth2Protocol::OAuth2Protocol_ClientAssertion, '') - ); - } - - - if(Request::hasHeader('Authorization')) - { - - Log::debug - ( - "ClientService::getCurrentClientAuthInfo Authorization Header present" - ); - - $auth_header = Request::header('Authorization'); - $auth_header = trim($auth_header); - $auth_header = explode(' ', $auth_header); - - if (!is_array($auth_header) || count($auth_header) < 2) - { - throw new MissingClientAuthorizationInfo('Wrong Authorization header format.'); - } - - $auth_header_content = $auth_header[1]; - $auth_header_content = base64_decode($auth_header_content); - $auth_header_content = explode(':', $auth_header_content); - - if (!is_array($auth_header_content) || count($auth_header_content) !== 2) - { - throw new MissingClientAuthorizationInfo('Wrong Authorization header format.'); - } - - Log::debug - ( - sprintf - ( - "ClientService::getCurrentClientAuthInfo client id %s - client secret %s", - $auth_header_content[0], - $auth_header_content[1] - ) - ); - - return new ClientCredentialsAuthenticationContext - ( - urldecode($auth_header_content[0]), - urldecode($auth_header_content[1]), - OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretBasic - ); - } - - if(Input::has(OAuth2Protocol::OAuth2Protocol_ClientId)) - { - Log::debug - ( - sprintf - ( - "ClientService::getCurrentClientAuthInfo params %s - %s present", - OAuth2Protocol::OAuth2Protocol_ClientId, - OAuth2Protocol::OAuth2Protocol_ClientSecret - ) - ); - - $client_secret = null; - $auth_type = OAuth2Protocol::TokenEndpoint_AuthMethod_None; - - if(Input::has(OAuth2Protocol::OAuth2Protocol_ClientSecret)){ - $client_secret = urldecode(Input::get(OAuth2Protocol::OAuth2Protocol_ClientSecret, '')); - $auth_type = OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretPost; - } - - return new ClientCredentialsAuthenticationContext - ( - urldecode(Input::get(OAuth2Protocol::OAuth2Protocol_ClientId, '')), - $client_secret, - $auth_type - ); - } - - throw new InvalidClientAuthMethodException; - } - - /** - * @param array $payload - * @return IEntity - * @throws \Exception - */ - public function create(array $payload):IEntity - { - - return $this->tx_service->transaction(function () use ($payload) { - - $current_user = $this->auth_service->getCurrentUser(); - - $app_name = trim($payload['app_name']); - - if($this->client_repository->getByApplicationName($app_name) != null){ - throw new ValidationException('there is already another application with that name, please choose another one.'); - } - - $client = ClientFactory::build($payload); - $client = $this->client_credential_generator->generate($client); - - if(isset($payload['admin_users']) && is_array($payload['admin_users'])) { - $admin_users = $payload['admin_users']; - //add admin users - foreach ($admin_users as $user_id) { - $user = $this->user_repository->getById(intval($user_id)); - if (is_null($user)) throw new EntityNotFoundException(sprintf('user %s not found.', $user_id)); - if(!$user instanceof User) continue; - $client->addAdminUser($user); - } - } - - $client->setOwner($current_user); - - $this->client_repository->add($client); - - return $client; - }); - } - - - /** - * @param int $id - * @param array $payload - * @return IEntity - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function update(int $id, array $payload):IEntity - { - - return $this->tx_service->transaction(function () use ($id, $payload) { - - $editing_user = $this->auth_service->getCurrentUser(); - - $client = $this->client_repository->getById($id); - - if (is_null($client) || !$client instanceof Client) { - throw new EntityNotFoundException(sprintf('client id %s does not exists.', $id)); - } - $app_name = isset($payload['app_name']) ? trim($payload['app_name']) : null; - if(!empty($app_name)) { - $old_client = $this->client_repository->getByApplicationName($app_name); - if(!is_null($old_client) && $old_client->getId() !== $client->getId()) - throw new ValidationException('there is already another application with that name, please choose another one.'); - } - $current_app_type = $client->getApplicationType(); - if($current_app_type !== $payload['application_type']) - { - throw new ValidationException('application type does not match.'); - } - - ClientFactory::populate($client, $payload); - - // validate uris - switch($client->getApplicationType()) { - case IClient::ApplicationType_Native: { - - if (isset($payload['redirect_uris'])) { - $redirect_uris = explode(',', $payload['redirect_uris']); - //check that custom schema does not already exists for another registerd app - if (!empty($payload['redirect_uris'])) { - foreach ($redirect_uris as $uri) { - $uri = @parse_url($uri); - if (!isset($uri['scheme'])) { - throw new ValidationException('invalid scheme on redirect uri.'); - } - if (HttpUtils::isCustomSchema($uri['scheme'])) { - if ($this->client_repository->hasCustomSchemeRegisteredForRedirectUrisOnAnotherClientThan($id, $uri['scheme'])) { - throw new ValidationException(sprintf('schema %s:// already registered for another client.', - $uri['scheme'])); - } - } else { - if (!HttpUtils::isHttpSchema($uri['scheme'])) { - throw new ValidationException(sprintf('scheme %s:// is invalid.', - $uri['scheme'])); - } - } - } - } - } - } - break; - case IClient::ApplicationType_Web_App: - case IClient::ApplicationType_JS_Client: { - if (isset($payload['redirect_uris'])){ - if (!empty($payload['redirect_uris'])) { - $redirect_uris = explode(',', $payload['redirect_uris']); - foreach ($redirect_uris as $uri) { - $uri = @parse_url($uri); - if (!isset($uri['scheme'])) { - throw new ValidationException('invalid scheme on redirect uri.'); - } - if (!HttpUtils::isHttpsSchema($uri['scheme'])) { - throw new ValidationException(sprintf('scheme %s:// is invalid.', $uri['scheme'])); - } - } - } - } - if($client->getApplicationType() === IClient::ApplicationType_JS_Client && isset($payload['allowed_origins']) &&!empty($payload['allowed_origins'])){ - $allowed_origins = explode(',', $payload['allowed_origins']); - foreach ($allowed_origins as $uri) { - $uri = @parse_url($uri); - if (!isset($uri['scheme'])) { - throw new ValidationException('invalid scheme on allowed origin uri.'); - } - if (!HttpUtils::isHttpsSchema($uri['scheme'])) { - throw new ValidationException(sprintf('scheme %s:// is invalid.', $uri['scheme'])); - } - } - } - } - break; - } - - if(isset($payload['admin_users']) && is_array($payload['admin_users'])) { - $admin_users = $payload['admin_users']; - //add admin users - $client->removeAllAdminUsers(); - foreach ($admin_users as $user_id) { - $user = $this->user_repository->getById(intval($user_id)); - if (is_null($user)) throw new EntityNotFoundException(sprintf('user %s not found.', $user_id)); - if(!$user instanceof User) continue; - $client->addAdminUser($user); - } - } - - $client->setEditedBy($editing_user); - return $client; - }); - } - - /** - * @param int $id - * @param int $scope_id - * @return Client|null - * @throws \Exception - */ - public function addClientScope(int $id, int $scope_id):?Client - { - return $this->tx_service->transaction(function() use ($id, $scope_id){ - $client = $this->client_repository->getById($id); - if (is_null($client) || !$client instanceof Client) { - throw new EntityNotFoundException(sprintf("client id %s does not exists!", $id)); - } - $owner = $client->getOwner(); - $scope = $this->scope_repository->getById($scope_id); - if (is_null($scope) || !$scope instanceof ApiScope) { - throw new EntityNotFoundException(sprintf("scope id %s does not exists!", $scope_id)); - } - - if($scope->isAssignedByGroups()) { - if(!$owner->isGroupScopeAllowed($scope)) - throw new ValidationException(sprintf('you cant assign to this client api scope %s', $scope_id)); - } - - if($scope->isSystem() && !$owner->canUseSystemScopes()) - throw new ValidationException(sprintf('you cant assign to this client api scope %s', $scope_id)); - - $client->addScope($scope); - $client->setEditedBy($this->auth_service->getCurrentUser()); - return $client; - }); - } - - /** - * @param $id - * @param $scope_id - * @return IClient - * @throws EntityNotFoundException - */ - public function deleteClientScope(int $id, int $scope_id):?Client - { - return $this->tx_service->transaction(function() use ($id, $scope_id){ - $client = $this->client_repository->getById($id); - if (is_null($client) || !$client instanceof Client) { - throw new EntityNotFoundException(sprintf("Client id %s does not exists.", $id)); - } - $scope = $this->scope_repository->getById($scope_id); - if (is_null($scope) || !$scope instanceof ApiScope) { - throw new EntityNotFoundException(sprintf("Scope id %s does not exists.", $scope_id)); - } - if($scope->getName() == OAuth2Protocol::OpenIdConnect_Scope){ - throw new ValidationException(sprintf("Scope %s can not be removed.", OAuth2Protocol::OpenIdConnect_Scope)); - } - if($scope->getName() == OAuth2Protocol::OfflineAccess_Scope && $client->canRequestRefreshTokens()){ - throw new ValidationException(sprintf("Scope %s can not be removed.", OAuth2Protocol::OfflineAccess_Scope)); - } - $client->removeScope($scope); - $client->setEditedBy($this->auth_service->getCurrentUser()); - return $client; - }); - - } - - /** - * @param int $id - * @throws \Exception - */ - public function delete(int $id):void - { - $this->tx_service->transaction(function () use ($id) { - $client = $this->client_repository->getById($id); - if (is_null($client) || !$client instanceof Client) { - throw new EntityNotFoundException(sprintf("client id %s does not exists!", $id)); - } - Event::fire('oauth2.client.delete', [$client->getClientId()]); - $this->client_repository->delete($client); - }); - } - - /** - * @param int $id - * @return Client|null - * @throws \Exception - */ - public function regenerateClientSecret(int $id):?Client - { - - return $this->tx_service->transaction(function () use ($id) - { - $current_user = $this->auth_service->getCurrentUser(); - - $client = $this->client_repository->getById($id); - - if (is_null($client) || !$client instanceof Client) - { - throw new EntityNotFoundException(sprintf("client id %d does not exists!.", $id)); - } - - if ($client->getClientType() != IClient::ClientType_Confidential) - { - throw new ValidationException - ( - sprintf - ( - "client id %d is not confidential type!.", - $id - ) - ); - } - - $client = $this->client_credential_generator->generate($client, true); - $client->setEditedBy($current_user); - - Event::fire('oauth2.client.regenerate.secret', array($client->getClientId())); - - return $client; - }); - } - - /** - * @param int $id - * @return Client|null - * @throws \Exception - */ - public function lockClient(int $id):?Client - { - return $this->tx_service->transaction(function () use ($id) { - - $client = $this->client_repository->getById($id); - if (is_null($client) || !$client instanceof Client) { - throw new EntityNotFoundException($id, sprintf("client id %s does not exists!", $id)); - } - $client->setLocked(true); - $client->setEditedBy($this->auth_service->getCurrentUser()); - Event::fire(new OAuth2ClientLocked($client->getClientId())); - return $client; - }); - - } - - /** - * @param int $id - * @return bool - * @throws EntityNotFoundException - */ - public function unlockClient(int $id):?Client - { - return $this->tx_service->transaction(function () use ($id) { - - $client = $this->client_repository->getClientByIdentifier($id); - if (is_null($client) || !$client instanceof Client) { - throw new EntityNotFoundException($id, sprintf("client id %s does not exists!", $id)); - } - $client->setLocked(false); - $client->setEditedBy($this->auth_service->getCurrentUser()); - return $client; - }); - - } - - /** - * @param int $id - * @param bool $active - * @return Client|null - * @throws \Exception - */ - public function activateClient(int $id, bool $active):?Client - { - - return $this->tx_service->transaction(function () use ($id, $active) { - - $client = $this->client_repository->getClientByIdentifier($id); - if (is_null($client) || !$client instanceof Client) { - throw new EntityNotFoundException($id, sprintf("client id %s does not exists!", $id)); - } - $client->setActive($active); - $client->setEditedBy($this->auth_service->getCurrentUser()); - return $client; - }); - } - - /** - * @param int $id - * @param bool $use_refresh_token - * @return Client|null - * @throws \Exception - */ - public function setRefreshTokenUsage(int $id, bool $use_refresh_token):?Client - { - return $this->tx_service->transaction(function () use ($id, $use_refresh_token) { - - $client = $this->client_repository->getClientByIdentifier($id); - if (is_null($client) || !$client instanceof Client) { - throw new EntityNotFoundException($id, sprintf("client id %s does not exists!", $id)); - } - $client->setUseRefreshToken($use_refresh_token); - $client->setEditedBy($this->auth_service->getCurrentUser()); - return $client; - }); - } - - /** - * @param int $id - * @param bool $rotate_refresh_token - * @return Client|null - * @throws \Exception - */ - public function setRotateRefreshTokenPolicy(int $id, bool $rotate_refresh_token):?Client - { - return $this->tx_service->transaction(function () use ($id, $rotate_refresh_token) { - - $client = $this->client_repository->getClientByIdentifier($id); - if (is_null($client) || !$client instanceof Client) { - throw new EntityNotFoundException($id, sprintf("client id %s does not exists!", $id)); - } - - $client->setRotateRefreshToken($rotate_refresh_token); - $client->setEditedBy($this->auth_service->getCurrentUser()); - return $client; - }); - } -} \ No newline at end of file diff --git a/app/Services/OAuth2/HttpIClientJWKSetReader.php b/app/Services/OAuth2/HttpIClientJWKSetReader.php deleted file mode 100644 index c00eb085..00000000 --- a/app/Services/OAuth2/HttpIClientJWKSetReader.php +++ /dev/null @@ -1,63 +0,0 @@ -getJWKSUri(); - if (empty($jwk_set_uri)) return null; - - $client = new HttpClient([ - 'defaults' => [ - 'timeout' => Config::get('curl.timeout', 60), - 'allow_redirects' => Config::get('curl.allow_redirects', false), - 'verify' => Config::get('curl.verify_ssl_cert', true) - ] - ]); - - $response = $client->get($jwk_set_uri); - if ($response->getStatusCode() !== 200) return null; - $content_type = $response->getHeader('content-type'); - if (is_null($content_type)) return null; - if (!$content_type->hasValue(HttpContentType::Json)) return null; - return JWKSet::fromJson($response->getBody()); - } - catch (HttpRequestException $ex) - { - Log::warning($ex->getMessage()); - return null; - } - } -} \ No newline at end of file diff --git a/app/Services/OAuth2/IdTokenBuilderImpl.php b/app/Services/OAuth2/IdTokenBuilderImpl.php deleted file mode 100644 index 8464ee19..00000000 --- a/app/Services/OAuth2/IdTokenBuilderImpl.php +++ /dev/null @@ -1,195 +0,0 @@ -server_private_key_repository = $server_private_key_repository; - $this->jwk_set_reader_service = $jwk_set_reader_service; - $this->tx_service = $tx_service; - } - - /** - * @param JWTClaimSet $claim_set - * @param JWTResponseInfo $info - * @param IClient $client - * @return IJWT - * @throws RecipientKeyNotFoundException - * @throws InvalidClientType - * @throws ServerKeyNotFoundException - */ - public function buildJWT(JWTClaimSet $claim_set, JWTResponseInfo $info, IClient $client) - { - $sig_alg = $info->getSigningAlgorithm(); - $enc_alg = $info->getEncryptionKeyAlgorithm(); - $enc = $info->getEncryptionContentAlgorithm(); - - $jwt = UnsecuredJWT::fromClaimSet($claim_set); - - if(!is_null($sig_alg)) - { - // must sign - // get server private key to sign - - $heuristic = new ServerSigningKeyFinder($this->server_private_key_repository); - - $jwt = self::buildJWS - ( - $heuristic->find - ( - $client, - $sig_alg - ), - $sig_alg->getName(), - $claim_set - ); - - } - - if(!is_null($enc_alg) && !is_null($enc)) - { - //encrypt , get client public key - - $alg = new StringOrURI($enc_alg->getName()); - $enc = new StringOrURI($enc->getName()); - - //encrypt jwt as payload - - $heuristic = new ClientEncryptionKeyFinder($this->jwk_set_reader_service, $this->tx_service); - - $jwt = self::buildJWE - ( - $heuristic->find - ( - $client, - $enc_alg - ), - $alg, - $enc, - $jwt - ); - } - - return $jwt; - } - - /** - * @param IJWK $recipient_key - * @param StringOrURI $alg - * @param StringOrURI $enc - * @param IBasicJWT $jwt - * @return IJWE - * @throws RecipientKeyNotFoundException - * @throws InvalidJWKAlgorithm - * @throws InvalidJWKType - */ - static private function buildJWE(IJWK $recipient_key, StringOrURI $alg, StringOrURI $enc, IBasicJWT $jwt) - { - - if(is_null($recipient_key)) - throw new RecipientKeyNotFoundException; - - $jwe = JWEFactory::build - ( - new JWE_ParamsSpecification - ( - $recipient_key, - $alg, - $enc, - $payload = $jwt->toCompactSerialization() - ) - ); - return $jwe; - } - - /** - * @param IJWK $jwk - * @param $alg - * @param JWTClaimSet $claim_set - * @return IJWS - * @throws InvalidJWKAlgorithm - * @throws InvalidJWKType - */ - static private function buildJWS(IJWK $jwk, $alg, JWTClaimSet $claim_set) - { - return JWSFactory::build - ( - new JWS_ParamsSpecification - ( - $jwk, - new StringOrURI - ( - $alg - ), - $claim_set - ) - ); - } -} \ No newline at end of file diff --git a/app/Services/OAuth2/OAuth2MementoSessionSerializerService.php b/app/Services/OAuth2/OAuth2MementoSessionSerializerService.php deleted file mode 100644 index 665fd006..00000000 --- a/app/Services/OAuth2/OAuth2MementoSessionSerializerService.php +++ /dev/null @@ -1,64 +0,0 @@ -getState())); - Session::put('oauth2.request.state', $state); - Session::save(); - } - - /** - * @return OAuth2RequestMemento - */ - public function load() - { - $state = Session::get('oauth2.request.state', null); - if(is_null($state)) return null; - - $state = json_decode( base64_decode($state), true); - - return OAuth2RequestMemento::buildFromState($state); - } - - /** - * @return void - */ - public function forget() - { - Session::remove('oauth2.request.state'); - Session::save(); - } - - /** - * @return bool - */ - public function exists() - { - return Session::has('oauth2.request.state'); - } -} \ No newline at end of file diff --git a/app/Services/OAuth2/OAuth2ServiceProvider.php b/app/Services/OAuth2/OAuth2ServiceProvider.php deleted file mode 100644 index a0af026b..00000000 --- a/app/Services/OAuth2/OAuth2ServiceProvider.php +++ /dev/null @@ -1,120 +0,0 @@ -setState - ( - [ - $user_id, - $auth_time, - $op_browser_state - ] - ); - - return $principal; - } - - /** - * @param IPrincipal $principal - * @return void - */ - public function save(IPrincipal $principal) - { - Log::debug("PrincipalService::save"); - - $this->register - ( - $principal->getUserId(), - $principal->getAuthTime() - ); - } - - /** - * @return string - */ - private function calculateBrowserState(): string - { - return hash('sha256', Session::getId()); - } - - /** - * @param int $user_id - * @param int $auth_time - * @return mixed - */ - public function register($user_id, $auth_time) - { - Log::debug(sprintf("PrincipalService::register user_id %s auth_time %s", $user_id, $auth_time)); - Session::put(self::UserIdParam, $user_id); - Session::put(self::AuthTimeParam, $auth_time); - // Maintain a `op_browser_state` cookie along with the `sessionid` cookie that - // represents the End-User's login state at the OP. If the user is not logged - $op_browser_state = $this->calculateBrowserState(); - Cookie::queue - ( - IPrincipalService::OP_BROWSER_STATE_COOKIE_NAME, - $op_browser_state, - Config::get("session.lifetime", 120), - $path = Config::get("session.path"), - $domain = Config::get("session.domain"), - $secure = true, - $httpOnly = false, - $raw = false, - $sameSite = 'none' - ); - Log::debug(sprintf("PrincipalService::register op_browser_state %s", $op_browser_state)); - Session::put(self::OPBrowserState, $op_browser_state); - Session::save(); - } - - /** - * @return $this - */ - public function clear() - { - Log::debug("PrincipalService::clear"); - Session::remove(self::UserIdParam); - Session::remove(self::AuthTimeParam); - Session::remove(self::OPBrowserState); - Session::save(); - Cookie::queue - ( - IPrincipalService::OP_BROWSER_STATE_COOKIE_NAME, - null, - $minutes = -2628000, - $path = Config::get("session.path"), - $domain = Config::get("session.domain"), - $secure = true, - $httpOnly = false, - $raw = false, - $sameSite = 'none' - ); - } - -} \ No newline at end of file diff --git a/app/Services/OAuth2/ResourceServer/UserService.php b/app/Services/OAuth2/ResourceServer/UserService.php deleted file mode 100644 index 242c7150..00000000 --- a/app/Services/OAuth2/ResourceServer/UserService.php +++ /dev/null @@ -1,317 +0,0 @@ -user_service = $user_service; - $this->configuration_service = $configuration_service; - $this->client_repository = $client_repository; - $this->auth_service = $auth_service; - $this->user_repository = $user_repository; - } - - /** - * Get Current user info - * @return array - * @throws Exception - */ - public function getCurrentUserInfo() - { - $data = []; - try { - Log::debug("UserService::getCurrentUserInfo"); - $current_user_id = $this->resource_server_context->getCurrentUserId(); - - Log::debug(sprintf("UserService::getCurrentUserInfo current_user_id %s", $current_user_id)); - if (is_null($current_user_id)) { - throw new Exception('me is no set!.'); - } - - $current_user = $this->user_repository->getById($current_user_id); - if (is_null($current_user)) throw new EntityNotFoundException(); - - if (!$current_user instanceof User) throw new EntityNotFoundException(); - - $scopes = $this->resource_server_context->getCurrentScope(); - - if (in_array(self::UserProfileScope_Address, $scopes)) { - // Address Claims - Log::debug(sprintf("UserService::getCurrentUserInfo current_user_id %s address", $current_user_id)); - $data[AddressClaim::Country] = $current_user->getCountry(); - $data[AddressClaim::StreetAddress] = $current_user->getStreetAddress(); - $data[AddressClaim::Address1] = $current_user->getAddress1(); - $data[AddressClaim::Address2] = $current_user->getAddress2(); - $data[AddressClaim::PostalCode] = $current_user->getPostalCode(); - $data[AddressClaim::Region] = $current_user->getRegion(); - $data[AddressClaim::Locality] = $current_user->getLocality(); - } - if (in_array(self::UserProfileScope_Profile, $scopes)) { - Log::debug(sprintf("UserService::getCurrentUserInfo current_user_id %s profile", $current_user_id)); - // Profile Claims - $data[StandardClaims::Name] = $current_user->getFullName(); - $data[StandardClaims::GivenName] = $current_user->getFirstName(); - $data[StandardClaims::FamilyName] = $current_user->getLastName(); - $data[StandardClaims::PhoneNumber] = $current_user->getPhoneNumber(); - $data[StandardClaims::PhoneNumberVerified] = false; - $data[StandardClaims::NickName] = $current_user->getIdentifier(); - $data[StandardClaims::SubjectIdentifier] = $current_user->getAuthIdentifier(); - $data[StandardClaims::Picture] = $current_user->getPic(); - $data[StandardClaims::Birthdate] = $current_user->getDateOfBirth(); - $data[StandardClaims::Gender] = $current_user->getGender(); - $data[StandardClaims::GenderSpecify] = $current_user->getGenderSpecify(); - $data[StandardClaims::Locale] = $current_user->getLanguage(); - $data[StandardClaims::Bio] = $current_user->getBio(); - $data[StandardClaims::StatementOfInterest] = $current_user->getStatementOfInterest(); - $data[StandardClaims::Irc] = $current_user->getIrc(); - $data[StandardClaims::LinkedInProfile] = $current_user->getLinkedInProfile(); - $data[StandardClaims::GitHubUser] = $current_user->getGithubUser(); - $data[StandardClaims::WeChatUser] = $current_user->getWechatUser(); - $data[StandardClaims::TwitterName] = $current_user->getTwitterName(); - $data[StandardClaims::Company] = $current_user->getCompany(); - $data[StandardClaims::JobTitle] = $current_user->getJobTitle(); - $data[StandardClaims::ShowPicture] = $current_user->isPublicProfileShowPhoto(); - $data[StandardClaims::ShowFullName] = $current_user->isPublicProfileShowFullname(); - $user_groups = []; - - foreach ($current_user->getGroups() as $group) { - $user_groups[] = SerializerRegistry::getInstance()->getSerializer($group)->serialize(); - } - - $data[StandardClaims::Groups] = $user_groups; - } - if (in_array(self::UserProfileScope_Email, $scopes)) { - Log::debug(sprintf("UserService::getCurrentUserInfo current_user_id %s email", $current_user_id)); - // Email Claim - $data[StandardClaims::Email] = $current_user->getEmail(); - $data[StandardClaims::ShowEmail] = $current_user->isPublicProfileShowEmail(); - $data[StandardClaims::SecondEmail] = $current_user->getSecondEmail(); - $data[StandardClaims::ThirdEmail] = $current_user->getThirdEmail(); - $data[StandardClaims::EmailVerified] = $current_user->isEmailVerified(); - } - } catch (Exception $ex) { - $this->log_service->error($ex); - throw $ex; - } - - return $data; - } - - /** - * @param JWTClaimSet $claim_set - * @param User $user - * @return JWTClaimSet - * @throws \jwt\exceptions\ClaimAlreadyExistsException - */ - public static function populateProfileClaims(JWTClaimSet $claim_set, User $user): JWTClaimSet - { - // Profile Claims - $claim_set->addClaim(new JWTClaim(StandardClaims::Name, new StringOrURI($user->getFullName()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::GivenName, new StringOrURI($user->getFirstName()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::PreferredUserName, new StringOrURI($user->getNickName()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::FamilyName, new StringOrURI($user->getLastName()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::NickName, new StringOrURI($user->getNickName()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::Picture, new StringOrURI($user->getPic()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::Birthdate, new StringOrURI($user->getDateOfBirthNice()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::Gender, new StringOrURI($user->getGender()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::GenderSpecify, new StringOrURI($user->getGenderSpecify()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::Locale, new StringOrURI($user->getLanguage()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::Bio, new StringOrURI($user->getBio()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::StatementOfInterest, new StringOrURI($user->getStatementOfInterest()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::Irc, new StringOrURI($user->getIrc()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::GitHubUser, new StringOrURI($user->getGithubUser()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::WeChatUser, new StringOrURI($user->getWechatUser()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::TwitterName, new StringOrURI($user->getTwitterName()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::LinkedInProfile, new StringOrURI($user->getLinkedInProfile()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::ShowPicture, new JsonValue($user->isPublicProfileShowPhoto()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::ShowFullName, new JsonValue($user->isPublicProfileShowFullname()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::Company, new StringOrURI($user->getCompany()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::JobTitle, new StringOrURI($user->getJobTitle()))); - - $user_groups = []; - - foreach ($user->getGroups() as $group) { - $user_groups[] = SerializerRegistry::getInstance()->getSerializer($group)->serialize(); - } - - $claim_set->addClaim(new JWTClaim(StandardClaims::Groups, new JsonValue($user_groups))); - - return $claim_set; - } - - /** - * @param JWTClaimSet $claim_set - * @param User $user - * @return JWTClaimSet - * @throws \jwt\exceptions\ClaimAlreadyExistsException - */ - public static function populateEmailClaims(JWTClaimSet $claim_set, User $user): JWTClaimSet - { - $claim_set->addClaim(new JWTClaim(StandardClaims::Email, new StringOrURI($user->getEmail()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::SecondEmail, new StringOrURI($user->getSecondEmail()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::ThirdEmail, new StringOrURI($user->getThirdEmail()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::EmailVerified, new JsonValue($user->isEmailVerified()))); - $claim_set->addClaim(new JWTClaim(StandardClaims::ShowEmail, new JsonValue($user->isPublicProfileShowEmail()))); - return $claim_set; - } - - /** - * @param JWTClaimSet $claim_set - * @param User $user - * @return JWTClaimSet - * @throws \jwt\exceptions\ClaimAlreadyExistsException - */ - public static function populateAddressClaims(JWTClaimSet $claim_set, User $user): JWTClaimSet - { - // Address Claims - $address = []; - $address[AddressClaim::Country] = $user->getCountry(); - $address[AddressClaim::StreetAddress] = $user->getStreetAddress(); - $address[AddressClaim::Address1] = $user->getAddress1(); - $address[AddressClaim::Address2] = $user->getAddress2(); - $address[AddressClaim::PostalCode] = $user->getPostalCode(); - $address[AddressClaim::Region] = $user->getRegion(); - $address[AddressClaim::Locality] = $user->getLocality(); - $address[AddressClaim::Formatted] = $user->getFormattedAddress(); - - $claim_set->addClaim(new JWTClaim(StandardClaims::Address, new JsonValue($address))); - - return $claim_set; - } - - /** - * @return JWTClaimSet - * @throws Exception - */ - public function getCurrentUserInfoClaims() - { - try { - - $current_user_id = $this->resource_server_context->getCurrentUserId(); - $client_id = $this->resource_server_context->getCurrentClientId(); - $client = $this->client_repository->getClientById($client_id); - - if (is_null($current_user_id)) { - throw new Exception('me is no set!.'); - } - - $current_user = $this->user_repository->getById($current_user_id); - if (is_null($current_user)) throw new EntityNotFoundException(); - if (!$current_user instanceof User) throw new EntityNotFoundException(); - $scopes = $this->resource_server_context->getCurrentScope(); - - $claim_set = new JWTClaimSet - ( - null, - $sub = new StringOrURI - ( - $this->auth_service->wrapUserId - ( - $current_user->getId(), - $client - ) - ), - $aud = new StringOrURI($client_id) - - ); - - if (in_array(self::UserProfileScope_Address, $scopes)) { - self::populateAddressClaims($claim_set, $current_user); - } - if (in_array(self::UserProfileScope_Profile, $scopes)) { - self::populateProfileClaims($claim_set, $current_user); - } - if (in_array(self::UserProfileScope_Email, $scopes)) { - // Email Address Claim - self::populateEmailClaims($claim_set, $current_user); - } - } catch (Exception $ex) { - $this->log_service->error($ex); - throw $ex; - } - return $claim_set; - } -} \ No newline at end of file diff --git a/app/Services/OAuth2/ResourceServerContext.php b/app/Services/OAuth2/ResourceServerContext.php deleted file mode 100644 index 9b4e4bce..00000000 --- a/app/Services/OAuth2/ResourceServerContext.php +++ /dev/null @@ -1,76 +0,0 @@ -auth_context['scope'])? explode(' ',$this->auth_context['scope']):[]; - } - - /** - * @return null|string - */ - public function getCurrentAccessToken() - { - return isset($this->auth_context['access_token'])?$this->auth_context['access_token']:null; - } - - - /** - * @return null|string - */ - public function getCurrentAccessTokenLifetime() - { - return isset($this->auth_context['expires_in'])?$this->auth_context['expires_in']:null; - } - - /** - * @return null - */ - public function getCurrentClientId() - { - return isset($this->auth_context['client_id'])?$this->auth_context['client_id']:null; - } - - /** - * @return null|int - */ - public function getCurrentUserId() - { - return isset($this->auth_context['user_id'])?intval($this->auth_context['user_id']):null; - } - - /** - * @param array$auth_context - * @return $this - */ - public function setAuthorizationContext(array $auth_context) - { - $this->auth_context = $auth_context; - return $this; - } -} \ No newline at end of file diff --git a/app/Services/OAuth2/ResourceServerService.php b/app/Services/OAuth2/ResourceServerService.php deleted file mode 100644 index 9ec5deb3..00000000 --- a/app/Services/OAuth2/ResourceServerService.php +++ /dev/null @@ -1,211 +0,0 @@ -client_service = $client_service; - $this->repository = $repository; - $this->client_repository = $client_repository; - $this->tx_service = $tx_service; - } - - /** - * @param array $payload - * @return IEntity - * @throws \Exception - */ - public function create(array $payload): IEntity - { - - return $this->tx_service->transaction(function () use ($payload) { - - $host = trim($payload['host']); - $friendly_name = trim($payload['friendly_name']); - if ($this->repository->getByHost($host) != null) { - throw new ValidationException - ( - sprintf('there is already another resource server with that hostname (%s).', $host) - ); - } - - if ($this->repository->getByFriendlyName($friendly_name) != null) { - throw new ValidationException - ( - sprintf('there is already another resource server with that friendly name (%s).', $friendly_name) - ); - } - - $resource_server = ResourceServerFactory::build($payload); - - // creates a new client for this brand new resource server - $resource_server_client = $this->client_service->create - ( - [ - 'application_type' => IClient::ApplicationType_Service, - 'app_name' => $host . '.confidential.application', - 'app_description' => $friendly_name . ' confidential oauth2 application' - ] - ); - - - $resource_server->setClient($resource_server_client); - // does not expires ... - $resource_server_client->setClientSecretNoExpiration(); - - $this->repository->add($resource_server); - - return $resource_server; - }); - - } - - /** - * @param int $id - * @param array $payload - * @return IEntity - * @throws \Exception - */ - public function update(int $id, array $payload): IEntity - { - - return $this->tx_service->transaction(function () use ($id, $payload) { - - $resource_server = $this->repository->getById($id); - if (is_null($resource_server) || !$resource_server instanceof ResourceServer) { - throw new EntityNotFoundException(sprintf('resource server id %s does not exists!', $id)); - } - - if (isset($payload['host'])) { - $host = trim($payload['host']); - $former_resource_server = $this->repository->getByHost($host); - if (!is_null($former_resource_server) && $former_resource_server->getId() != $resource_server->getId()) { - throw new ValidationException - ( - sprintf('there is already another resource server with that hostname (%s).', $host) - ); - } - } - - if (isset($payload['friendly_name'])) { - $friendly_name = trim($payload['friendly_name']); - $former_resource_server = $this->repository->getByFriendlyName($friendly_name); - if (!is_null($former_resource_server) && $former_resource_server->getId() != $resource_server->getId()) { - throw new ValidationException - ( - sprintf('there is already another resource server with that friendly name (%s).', $friendly_name) - ); - } - } - - return ResourceServerFactory::populate($resource_server, $payload); - - }); - } - - /** - * @param int $id - * @throws \Exception - */ - public function delete(int $id): void - { - - $this->tx_service->transaction(function () use ($id) { - - $resource_server = $this->repository->getById($id); - - if (is_null($resource_server)) { - throw new EntityNotFoundException(sprintf('resource server id %s does not exists!', $id)); - } - $this->repository->delete($resource_server); - }); - } - - /** - * @param int $id - * @return ResourceServer - * @throws EntityNotFoundException - */ - public function regenerateClientSecret(int $id): ResourceServer - { - - return $this->tx_service->transaction(function () use ($id) { - - $resource_server = $this->repository->getById($id); - - if (is_null($resource_server) || !$resource_server instanceof ResourceServer) { - throw new EntityNotFoundException(sprintf('resource server id %s does not exists!', $id)); - } - - if (!$resource_server->hasClient()) - throw new EntityNotFoundException(sprintf('client not found for resource server id %s!', $id)); - - $client = $resource_server->getClient(); - $this->client_service->regenerateClientSecret($client->getId()); - - return $resource_server; - - }); - } - -} diff --git a/app/Services/OAuth2/SecurityContextService.php b/app/Services/OAuth2/SecurityContextService.php deleted file mode 100644 index 2171edfb..00000000 --- a/app/Services/OAuth2/SecurityContextService.php +++ /dev/null @@ -1,67 +0,0 @@ -setState - ( - array - ( - Session::get(self::RequestedUserIdParam), - Session::get(self::RequestedAuthTime), - ) - ); - - return $context; - } - - /** - * @param SecurityContext $security_context - * @return $this - */ - public function save(SecurityContext $security_context) - { - Session::put(self::RequestedUserIdParam, $security_context->getRequestedUserId()); - Session::put(self::RequestedAuthTime, $security_context->isAuthTimeRequired()); - Session::save(); - return $this; - } - - /** - * @return $this - */ - public function clear() - { - Session::remove(self::RequestedUserIdParam); - Session::remove(self::RequestedAuthTime); - Session::save(); - return $this; - } -} \ No newline at end of file diff --git a/app/Services/OAuth2/ServerPrivateKeyService.php b/app/Services/OAuth2/ServerPrivateKeyService.php deleted file mode 100644 index 2a84254e..00000000 --- a/app/Services/OAuth2/ServerPrivateKeyService.php +++ /dev/null @@ -1,107 +0,0 @@ -rsa = new RSA(); - } - - /** - * @param array $params - * @return IEntity - * @throws ValidationException - */ - public function create(array $params):IEntity - { - return $this->tx_service->transaction(function() use($params) - { - $pem = isset($params['pem_content']) ? trim($params['pem_content']) : ''; - $password = isset($params['password'])? trim($params['password']) : ''; - - $old_active_key = $this->repository->getByValidityRange - ( - $params['type'], - $params['usage'], - $params['alg'], - new DateTime($params['valid_from']), - new DateTime($params['valid_to']) - ); - - if(count($old_active_key) > 0 ) - $old_active_key = $old_active_key[0]; - - if(empty($pem)) - { - if(!empty($password)) - $this->rsa->setPassword($password); - /** - * array( - * 'privatekey' => $privatekey, - * 'publickey' => $publickey, - * 'partialkey' => false - * ); - */ - $res = $this->rsa->createKey(2048); - $pem = $res['privatekey']; - } - - $key = ServerPrivateKey::build - ( - $params['kid'], - new DateTime($params['valid_from']), - new DateTime($params['valid_to']), - $params['type'], - $params['usage'], - $params['alg'], - $old_active_key ? false : $params['active'], - $pem, - $password - ); - - $this->repository->add($key); - - return $key; - }); - } - -} \ No newline at end of file diff --git a/app/Services/OAuth2/TokenService.php b/app/Services/OAuth2/TokenService.php deleted file mode 100644 index 945c09a3..00000000 --- a/app/Services/OAuth2/TokenService.php +++ /dev/null @@ -1,1488 +0,0 @@ -client_service = $client_service; - $this->lock_manager_service = $lock_manager_service; - $this->configuration_service = $configuration_service; - $this->cache_service = $cache_service; - $this->auth_service = $auth_service; - $this->user_consent_service = $user_consent_service; - $this->auth_code_generator = $auth_code_generator; - $this->access_token_generator = $access_token_generator; - $this->refresh_token_generator = $refresh_token_generator; - $this->server_private_key_repository = $server_private_key_repository; - $this->jwk_set_reader_service = $jwk_set_reader_service; - $this->security_context_service = $security_context_service; - $this->principal_service = $principal_service; - $this->id_token_builder = $id_token_builder; - $this->client_repository = $client_repository; - $this->access_token_repository = $access_token_repository; - $this->refresh_token_repository = $refresh_token_repository; - $this->resource_server_repository = $resource_server_repository; - $this->ip_helper = $ip_helper; - $this->scope_service = $scope_service; - - Event::listen('oauth2.client.delete', function ($client_id) { - $this->revokeClientRelatedTokens($client_id); - }); - - Event::listen('oauth2.client.regenerate.secret', function ($client_id) { - $this->revokeClientRelatedTokens($client_id); - }); - } - - /** - * Creates a brand new authorization code - * @param OAuth2AuthorizationRequest $request - * @param bool $has_previous_user_consent - * @return Identifier - */ - public function createAuthorizationCode - ( - OAuth2AuthorizationRequest $request, - bool $has_previous_user_consent = false - ): Identifier - { - - $user = $this->auth_service->getCurrentUser(); - // build current audience ... - $audience = $this->scope_service->getStrAudienceByScopeNames - ( - explode - ( - OAuth2Protocol::OAuth2Protocol_Scope_Delimiter, - $request->getScope() - ) - ); - - $nonce = null; - $prompt = null; - - if ($request instanceof OAuth2AuthenticationRequest) { - $nonce = $request->getNonce(); - $prompt = $request->getPrompt(true); - } - - $code = $this->auth_code_generator->generate - ( - AuthorizationCode::create - ( - $user->getId(), - $request->getClientId(), - $request->getScope(), - $audience, - $request->getRedirectUri(), - $request->getAccessType(), - $request->getApprovalPrompt(), - $has_previous_user_consent, - $this->configuration_service->getConfigValue('OAuth2.AuthorizationCode.Lifetime'), - $request->getState(), - $nonce, - $request->getResponseType(), - $this->security_context_service->get()->isAuthTimeRequired(), - $this->principal_service->get()->getAuthTime(), - $prompt, - $request->getCodeChallenge(), - $request->getCodeChallengeMethod() - ) - ); - - $hashed_value = Hash::compute('sha256', $code->getValue()); - //stores on cache - $this->cache_service->storeHash($hashed_value, $code->toArray(), intval($code->getLifetime())); - - //stores brand new auth code hash value on a set by client id... - $this->cache_service->addMemberSet($request->getClientId() . self::ClientAuthCodePrefixList, $hashed_value); - - $this->cache_service->incCounter($request->getClientId() . self::ClientAuthCodeQty, self::ClientAuthCodeQtyLifetime); - - return $code; - } - - /** - * @param $value - * @return AuthorizationCode - * @throws ReplayAttackException - * @throws InvalidAuthorizationCodeException - */ - public function getAuthorizationCode($value) - { - - $hashed_value = Hash::compute('sha256', $value); - - if (!$this->cache_service->exists($hashed_value)) { - throw new InvalidAuthorizationCodeException(sprintf("auth_code %s ", $value)); - } - try { - - $this->lock_manager_service->acquireLock('lock.get.authcode.' . $hashed_value); - $payload = $this->cache_service->getHash($hashed_value, AuthorizationCode::getKeys()); - $payload['value'] = $value; - return AuthorizationCode::load($payload); - } catch (UnacquiredLockException $ex1) { - throw new ReplayAttackAuthCodeException - ( - $value, - sprintf - ( - "Code was already redeemed %s.", - $value - ) - ); - } - } - - /** - * Creates a brand new access token from a give auth code - * @param AuthorizationCode $auth_code - * @param null $redirect_uri - * @return AccessToken - */ - public function createAccessToken(AuthorizationCode $auth_code, $redirect_uri = null) - { - - $access_token = $this->access_token_generator->generate - ( - AccessToken::create - ( - $auth_code, - $this->configuration_service->getConfigValue('OAuth2.AccessToken.Lifetime') - ) - ); - - return $this->tx_service->transaction(function () use ( - $auth_code, - $redirect_uri, - $access_token - ) { - - $value = $access_token->getValue(); - $hashed_value = Hash::compute('sha256', $value); - //oauth2 client id - $client_id = $access_token->getClientId(); - $user_id = $access_token->getUserId(); - $client = $this->client_repository->getClientById($client_id); - $user = $this->auth_service->getUserById($user_id); - - // TODO; move to a factory - - $access_token_db = new AccessTokenDB(); - $access_token_db->setValue($hashed_value); - $access_token_db->setFromIp($this->ip_helper->getCurrentUserIpAddress()); - $access_token_db->setAssociatedAuthorizationCode(Hash::compute('sha256', $auth_code->getValue())); - $access_token_db->setLifetime($access_token->getLifetime()); - $access_token_db->setScope($access_token->getScope()); - $access_token_db->setAudience($access_token->getAudience()); - $access_token_db->setClient($client); - $access_token_db->setOwner($user); - - $this->access_token_repository->add($access_token_db); - - //check if use refresh tokens... - Log::debug - ( - sprintf - ( - 'TokenService::createAccessToken use_refresh_token: %s - app_type: %s - scopes: %s - auth_code_access_type: %s - prompt: %s - approval_prompt: %s pkce %s.', - $client->useRefreshToken(), - $client->getApplicationType(), - $auth_code->getScope(), - $auth_code->getAccessType(), - $auth_code->getPrompt(), - $auth_code->getApprovalPrompt(), - $client->isPKCEEnabled() - ) - ); - - if - ( - $client->useRefreshToken() && - ( - $client->getApplicationType() == IClient::ApplicationType_Web_App || - $client->getApplicationType() == IClient::ApplicationType_Native || - $client->isPKCEEnabled() - ) && - ( - $auth_code->getAccessType() == OAuth2Protocol::OAuth2Protocol_AccessType_Offline || - //OIDC: http://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess - str_contains($auth_code->getScope(), OAuth2Protocol::OfflineAccess_Scope) - ) - ) { - //but only the first time (approval_prompt == force || not exists previous consent) - if - ( - !$auth_code->getHasPreviousUserConsent() || - // google oauth2 protocol - strpos($auth_code->getApprovalPrompt(), OAuth2Protocol::OAuth2Protocol_Approval_Prompt_Force) !== false || - // http://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess - strpos($auth_code->getPrompt(), OAuth2Protocol::OAuth2Protocol_Prompt_Consent) !== false - ) { - Log::debug('TokenService::createAccessToken creating refresh token ....'); - $this->createRefreshToken($access_token); - } - } - - $this->storesAccessTokenOnCache($access_token); - //stores brand new access token hash value on a set by client id... - $this->cache_service->addMemberSet($client_id . TokenService::ClientAccessTokenPrefixList, $hashed_value); - - $this->cache_service->incCounter - ( - $client_id . TokenService::ClientAccessTokensQty, - TokenService::ClientAccessTokensQtyLifetime - ); - - return $access_token; - }); - - - } - - /** - * Create a brand new Access Token by params - * @param $client_id - * @param $scope - * @param $audience - * @param null $user_id - * @return AccessToken - */ - public function createAccessTokenFromParams($client_id, $scope, $audience, $user_id = null) - { - - $access_token = $this->access_token_generator->generate(AccessToken::createFromParams - ( - $scope, - $client_id, - $audience, - $user_id, - $this->configuration_service->getConfigValue('OAuth2.AccessToken.Lifetime') - ) - ); - - - return $this->tx_service->transaction(function () use ( - $client_id, - $scope, - $audience, - $user_id, - $access_token - ) { - - - $value = $access_token->getValue(); - $hashed_value = Hash::compute('sha256', $value); - - $this->storesAccessTokenOnCache($access_token); - - $client_id = $access_token->getClientId(); - $client = $this->client_repository->getClientById($client_id); - - // todo: move to a factory - - $access_token_db = new AccessTokenDB(); - $access_token_db->setValue($hashed_value); - $access_token_db->setFromIp($this->ip_helper->getCurrentUserIpAddress()); - $access_token_db->setLifetime($access_token->getLifetime()); - $access_token_db->setScope($access_token->getScope()); - $access_token_db->setAudience($access_token->getAudience()); - - $access_token_db->setClient($client); - - if (!is_null($user_id)) { - $user = $this->auth_service->getUserById($user_id); - $access_token_db->setOwner($user); - } - - $this->access_token_repository->add($access_token_db); - - //stores brand new access token hash value on a set by client id... - $this->cache_service->addMemberSet($client_id . TokenService::ClientAccessTokenPrefixList, $hashed_value); - $this->cache_service->incCounter($client_id . TokenService::ClientAccessTokensQty, TokenService::ClientAccessTokensQtyLifetime); - return $access_token; - }); - - } - - /** - * @param RefreshToken $refresh_token - * @param null $scope - * @return AccessToken|void - */ - public function createAccessTokenFromRefreshToken(RefreshToken $refresh_token, $scope = null) - { - - //preserve entire operation on db transaction... - return $this->tx_service->transaction(function () use ( - $refresh_token, - $scope - ) { - - $refresh_token_value = $refresh_token->getValue(); - $refresh_token_hashed_value = Hash::compute('sha256', $refresh_token_value); - //clear current access tokens as invalid - $this->clearAccessTokensForRefreshToken($refresh_token->getValue()); - - //validate scope if present... - if (!is_null($scope) && empty($scope)) { - $original_scope = $refresh_token->getScope(); - $aux_original_scope = explode(OAuth2Protocol::OAuth2Protocol_Scope_Delimiter, $original_scope); - $aux_scope = explode(OAuth2Protocol::OAuth2Protocol_Scope_Delimiter, $scope); - //compare original scope with given one, and validate if its included on original one - //or not - if (count(array_diff($aux_scope, $aux_original_scope)) !== 0) { - throw new InvalidGrantTypeException - ( - sprintf - ( - "requested scope %s is not contained on original one %s", - $scope, - $original_scope - ) - ); - } - } else { - //get original scope - $scope = $refresh_token->getScope(); - } - - //create new access token - $access_token = $this->access_token_generator->generate - ( - AccessToken::createFromRefreshToken - ( - $refresh_token, - $scope, - $this->configuration_service->getConfigValue('OAuth2.AccessToken.Lifetime') - ) - ); - - $value = $access_token->getValue(); - $hashed_value = Hash::compute('sha256', $value); - - $this->storesAccessTokenOnCache($access_token); - - //get user id - $user_id = $access_token->getUserId(); - //get current client - $client_id = $access_token->getClientId(); - $client = $this->client_repository->getClientById($client_id); - - //todo : move to a factory - - $access_token_db = new AccessTokenDB(); - $access_token_db->setValue($hashed_value); - $access_token_db->setFromIp($this->ip_helper->getCurrentUserIpAddress()); - $access_token_db->setLifetime($access_token->getLifetime()); - $access_token_db->setScope($access_token->getScope()); - $access_token_db->setAudience($access_token->getAudience()); - - //save relationships - $refresh_token_db = $this->refresh_token_repository->getByValue($refresh_token_hashed_value); - $access_token_db->setRefreshToken($refresh_token_db); - $access_token_db->setClient($client); - - if (!is_null($user_id)) { - $user = $this->auth_service->getUserById($user_id); - $access_token_db->setOwner($user); - } - - $this->access_token_repository->add($access_token_db); - - //stores brand new access token hash value on a set by client id... - $this->cache_service->addMemberSet($client_id . TokenService::ClientAccessTokenPrefixList, $hashed_value); - $this->cache_service->incCounter - ( - $client_id . TokenService::ClientAccessTokensQty, - TokenService::ClientAccessTokensQtyLifetime - ); - return $access_token; - }); - } - - /** - * @param AccessToken $access_token - * @return bool - */ - private function clearAccessTokenOnCache(AccessToken $access_token) - { - $value = $access_token->getValue(); - $hashed_value = Hash::compute('sha256', $value); - - if ($this->cache_service->exists($hashed_value)) { - $this->cache_service->delete($hashed_value); - return true; - } - return false; - } - - /** - * @param AccessToken $access_token - * @throws InvalidAccessTokenException - */ - private function storesAccessTokenOnCache(AccessToken $access_token) - { - //stores in REDIS - - $value = $access_token->getValue(); - $hashed_value = Hash::compute('sha256', $value); - - if ($this->cache_service->exists($hashed_value)) { - throw new InvalidAccessTokenException; - } - - $auth_code = !is_null($access_token->getAuthCode()) ? Hash::compute('sha256', - $access_token->getAuthCode()) : ''; - - $refresh_token_value = !is_null($access_token->getRefreshToken()) ? Hash::compute('sha256', - $access_token->getRefreshToken()->getValue()) : ''; - - $user_id = !is_null($access_token->getUserId()) ? $access_token->getUserId() : 0; - - $this->cache_service->storeHash($hashed_value, [ - 'user_id' => $user_id, - 'client_id' => $access_token->getClientId(), - 'scope' => $access_token->getScope(), - 'auth_code' => $auth_code, - 'issued' => $access_token->getIssued(), - 'lifetime' => $access_token->getLifetime(), - 'audience' => $access_token->getAudience(), - 'from_ip' => $this->ip_helper->getCurrentUserIpAddress(), - 'refresh_token' => $refresh_token_value - ], intval($access_token->getLifetime())); - } - - /** - * @param AccessTokenDB $access_token - * @return bool - */ - private function clearAccessTokenDBOnCache(AccessTokenDB $access_token) - { - - if ($this->cache_service->exists($access_token->getValue())) { - $this->cache_service->delete($access_token->getValue()); - return true; - } - return false; - } - - /** - * @param AccessTokenDB $access_token - * @throws InvalidAccessTokenException - */ - private function storeAccessTokenDBOnCache(AccessTokenDB $access_token) - { - //stores in Cache - - if ($this->cache_service->exists($access_token->getValue())) { - throw new InvalidAccessTokenException; - } - - $refresh_token_value = ''; - $refresh_token_db = $access_token->getRefreshToken(); - - if (!is_null($refresh_token_db)) { - $refresh_token_value = $refresh_token_db->getValue(); - } - - $user_id = $access_token->getOwnerId(); - $client = $access_token->getClient(); - - $this->cache_service->storeHash($access_token->getValue(), [ - 'user_id' => $user_id, - 'client_id' => $client->getClientId(), - 'scope' => $access_token->getScope(), - 'auth_code' => $access_token->getAssociatedAuthorizationCode(), - 'issued' => $access_token->getCreatedAt()->format("Y-m-d H:i:s"), - 'lifetime' => $access_token->getLifetime(), - 'from_ip' => $access_token->getFromIp(), - 'audience' => $access_token->getAudience(), - 'refresh_token' => $refresh_token_value - ], intval($access_token->getLifetime())); - } - - /** - * @param $value - * @param bool $is_hashed - * @return AccessToken - * @throws InvalidAccessTokenException - * @throws Exception - */ - public function getAccessToken($value, $is_hashed = false) - { - - return $this->tx_service->transaction(function () use ( - $value, - $is_hashed - ) { - //hash the given value, bc tokens values are stored hashed on DB - $hashed_value = !$is_hashed ? Hash::compute('sha256', $value) : $value; - $access_token = null; - - try { - // check cache ... - if (!$this->cache_service->exists($hashed_value)) { - $this->lock_manager_service->lock('lock.get.accesstoken.' . $hashed_value, function () use ($value, $hashed_value) { - // check on DB... - $access_token_db = $this->access_token_repository->getByValue($hashed_value); - if (is_null($access_token_db)) { - if ($this->isAccessTokenRevoked($hashed_value)) { - throw new RevokedAccessTokenException(sprintf('Access token %s is revoked!', $value)); - } else if ($this->isAccessTokenVoid($hashed_value)) // check if its marked on cache as expired ... - { - throw new ExpiredAccessTokenException(sprintf('Access token %s is expired!', $value)); - } else { - throw new InvalidGrantTypeException(sprintf("Access token %s is invalid!", $value)); - } - } - - if ($access_token_db->isVoid()) { - // invalid one ... - throw new ExpiredAccessTokenException(sprintf('Access token %s is expired!', $value)); - } - //reload on cache - $this->storeAccessTokenDBOnCache($access_token_db); - }); - } - - $payload = $this->cache_service->getHash($hashed_value, [ - 'user_id', - 'client_id', - 'scope', - 'auth_code', - 'issued', - 'lifetime', - 'from_ip', - 'audience', - 'refresh_token' - ]); - - // reload auth code ... - $payload['value'] = $payload['auth_code']; - - $payload['user_id'] = intval($payload['user_id']) == 0 ? null : intval($payload['user_id']); - $payload['lifetime'] = $this->configuration_service->getConfigValue('OAuth2.AuthorizationCode.Lifetime'); - $payload['access_type'] = OAuth2Protocol::OAuth2Protocol_AccessType_Online; - $payload['approval_prompt'] = OAuth2Protocol::OAuth2Protocol_Approval_Prompt_Auto; - $payload['has_previous_user_consent'] = false; - $payload['is_hashed'] = true; - $auth_code = AuthorizationCode::load($payload); - - // reload access token ... - $access_token = AccessToken::load - ( - $value, - $auth_code, - $payload['issued'], - $payload['lifetime'] - ); - - $refresh_token_value = $payload['refresh_token']; - - if (!empty($refresh_token_value)) { - $refresh_token = $this->getRefreshToken($refresh_token_value, true); - $access_token->setRefreshToken($refresh_token); - } - } catch (UnacquiredLockException $ex1) { - throw new InvalidAccessTokenException(sprintf("access token %s ", $value)); - } - return $access_token; - }); - } - - /** - * Checks if current_ip has access rights on the given $access_token - * @param AccessToken $access_token - * @param $current_ip - * @return bool - */ - public function checkAccessTokenAudience(AccessToken $access_token, $current_ip) - { - - $current_audience = $access_token->getAudience(); - $current_audience = explode(' ', $current_audience); - if (!is_array($current_audience)) { - $current_audience = array($current_audience); - } - - $resource_server = $this->resource_server_repository->getByAudienceAndIpAndActive($current_audience, $current_ip); - return !is_null($resource_server); - } - - - /** - * Creates a new refresh token and associate it with given access token - * @param AccessToken $access_token - * @param boolean $refresh_cache - * @return RefreshToken - */ - public function createRefreshToken(AccessToken &$access_token, $refresh_cache = false) - { - $refresh_token = $this->refresh_token_generator->generate( - RefreshToken::create( - $access_token, - $this->configuration_service->getConfigValue('OAuth2.RefreshToken.Lifetime') - ) - ); - - return $this->tx_service->transaction(function () use ( - $refresh_token, - $access_token, - $refresh_cache - ) { - $value = $refresh_token->getValue(); - //hash the given value, bc tokens values are stored hashed on DB - $hashed_value = Hash::compute('sha256', $value); - $client_id = $refresh_token->getClientId(); - $user_id = $refresh_token->getUserId(); - $client = $this->client_repository->getClientById($client_id); - $user = $this->auth_service->getUserById($user_id); - - // todo: move to a factory - $refresh_token_db = new RefreshTokenDB; - $refresh_token_db->setValue($hashed_value); - $refresh_token_db->setLifetime($refresh_token->getLifetime()); - $refresh_token_db->setScope($refresh_token->getScope()); - $refresh_token_db->setAudience($access_token->getAudience()); - $refresh_token_db->setFromIp($this->ip_helper->getCurrentUserIpAddress()); - - $access_token_db = $this->access_token_repository->getByValue(Hash::compute('sha256', $access_token->getValue())); - $refresh_token_db->setClient($client); - $refresh_token_db->setOwner($user); - $refresh_token_db->addAccessToken($access_token_db); - - $this->refresh_token_repository->add($refresh_token_db); - - $access_token->setRefreshToken($refresh_token); - // bc refresh token could change - if ($refresh_cache) { - if ($this->clearAccessTokenOnCache($access_token)) - $this->storesAccessTokenOnCache($access_token); - if ($this->clearAccessTokenDBOnCache($access_token_db)) - $this->storeAccessTokenDBOnCache($access_token_db); - } - - $this->cache_service->incCounter - ( - $client_id . TokenService::ClientRefreshTokensQty, - TokenService::ClientRefreshTokensQtyLifetime - ); - - return $refresh_token; - }); - - } - - /** - * @param \oauth2\services\refresh $value - * @param bool $is_hashed - * @return RefreshToken - * @throws InvalidGrantTypeException - * @throws ReplayAttackException - * @throws RevokedRefreshTokenException - */ - public function getRefreshToken($value, $is_hashed = false) - { - //hash the given value, bc tokens values are stored hashed on DB - $hashed_value = !$is_hashed ? Hash::compute('sha256', $value) : $value; - - $refresh_token_db = $this->refresh_token_repository->getByValue($hashed_value); - - if (is_null($refresh_token_db)) { - if ($this->isRefreshTokenRevoked($hashed_value)) - throw new RevokedRefreshTokenException(sprintf("revoked refresh token %s !", $value)); - - throw new InvalidGrantTypeException(sprintf("refresh token %s does not exists!", $value)); - } - - if ($refresh_token_db->isVoid()) { - throw new ReplayAttackRefreshTokenException - ( - $value, - sprintf - ( - "refresh token %s is void", - $value - ) - ); - } - - //check is refresh token is stills alive... (ZERO is infinite lifetime) - if ($refresh_token_db->isVoid()) { - throw new InvalidGrantTypeException(sprintf("refresh token %s is expired!", $value)); - } - - $client = $refresh_token_db->getClient(); - - $refresh_token = RefreshToken::load - ( - [ - 'value' => $value, - 'scope' => $refresh_token_db->getScope(), - 'client_id' => $client->getClientId(), - 'user_id' => $refresh_token_db->getOwnerId(), - 'audience' => $refresh_token_db->getAudience(), - 'from_ip' => $refresh_token_db->getFromIp(), - 'issued' => $refresh_token_db->getCreatedAt()->format("Y-m-d H:i:s"), - 'is_hashed' => $is_hashed - ], - intval($refresh_token_db->getLifetime()) - ); - - return $refresh_token; - } - - /** - * Revokes all related tokens to a specific auth code - * @param $auth_code Authorization Code - * @return mixed - */ - public function revokeAuthCodeRelatedTokens($auth_code) - { - $auth_code_hashed_value = Hash::compute('sha256', $auth_code); - - $this->tx_service->transaction(function () use ( - $auth_code_hashed_value - ) { - //get related access tokens - $db_access_token = $this->access_token_repository->getByAuthCode($auth_code_hashed_value); - if (is_null($db_access_token)) return; - - $client = $db_access_token->getClient(); - $access_token_value = $db_access_token->getValue(); - $refresh_token_db = $db_access_token->getRefreshToken(); - //remove auth code from client list on cache - $this->cache_service->deleteMemberSet - ( - $client->getClientId() . TokenService::ClientAuthCodePrefixList, - $auth_code_hashed_value - ); - //remove access token from client list on cache - $this->cache_service->deleteMemberSet - ( - $client->getClientId() . TokenService::ClientAccessTokenPrefixList, - $access_token_value - ); - - $this->cache_service->delete($access_token_value); - - $this->access_token_repository->delete($db_access_token); - - if (!is_null($refresh_token_db)) { - $this->revokeRefreshToken($refresh_token_db->getValue(), true); - } - - }); - } - - /** - * Revokes a given access token - * @param $value - * @param bool $is_hashed - * @param User $current_user - * @return bool - */ - public function revokeAccessToken($value, $is_hashed = false, ?User $current_user = null) - { - - return $this->tx_service->transaction(function () use ( - $value, - $is_hashed, - $current_user - ) { - - //hash the given value, bc tokens values are stored hashed on DB - $hashed_value = !$is_hashed ? Hash::compute('sha256', $value) : $value; - - $access_token_db = $this->access_token_repository->getByValue($hashed_value); - - if (is_null($access_token_db)) return false; - - if (!is_null($current_user) && !$current_user->belongToGroup(IGroupSlugs::SuperAdminGroup) && $access_token_db->hasOwner() && $access_token_db->getOwnerId() != $current_user->getId()) { - throw new ValidationException(sprintf("access token %s does not belongs to user id %s!.", $value, $current_user->getId())); - } - - $client = $access_token_db->getClient(); - //delete from cache - $this->cache_service->delete($hashed_value); - $this->cache_service->deleteMemberSet - ( - $client->getClientId() . TokenService::ClientAccessTokenPrefixList, - $access_token_db->getValue() - ); - - //check on DB... and delete it - $this->access_token_repository->delete($access_token_db); - - $this->markAccessTokenAsRevoked($hashed_value); - - return true; - }); - - } - - /** - * @param $value - * @param bool|false $is_hashed - * @return bool - */ - public function expireAccessToken($value, $is_hashed = false) - { - return $this->tx_service->transaction(function () use ( - $value, - $is_hashed - ) { - //hash the given value, bc tokens values are stored hashed on DB - $hashed_value = !$is_hashed ? Hash::compute('sha256', $value) : $value; - - $access_token_db = $this->access_token_repository->getByValue($hashed_value); - - if (is_null($access_token_db)) return false; - - $client = $access_token_db->getClient(); - //delete from cache - $this->cache_service->delete($hashed_value); - $this->cache_service->deleteMemberSet - ( - $client->getClientId() . TokenService::ClientAccessTokenPrefixList, - $access_token_db->getValue() - ); - - $this->access_token_repository->delete($access_token_db); - - $this->markAccessTokenAsVoid($hashed_value); - - return true; - }); - } - - /** - * Revokes all related tokens to a specific client id - * @param $client_id - */ - public function revokeClientRelatedTokens($client_id) - { - - - $this->tx_service->transaction(function () use ( - $client_id - ) { - //get client auth codes - $auth_codes = $this->cache_service->getSet($client_id . self::ClientAuthCodePrefixList); - //get client access tokens - $access_tokens = $this->cache_service->getSet($client_id . self::ClientAccessTokenPrefixList); - - $client = $this->client_repository->getClientById($client_id); - - if (is_null($client)) { - return; - } - //revoke on cache - $this->cache_service->deleteArray($auth_codes); - $this->cache_service->deleteArray($access_tokens); - //revoke on db - foreach ($client->getValidAccessTokens() as $at) { - $this->markAccessTokenAsRevoked($at->getValue()); - } - - foreach ($client->getRefreshTokens() as $rt) { - $this->markRefreshTokenAsRevoked($rt->getValue()); - } - - $client->removeAllAccessTokens(); - $client->removeAllRefreshTokens(); - //delete client list (auth codes and access tokens) - $this->cache_service->delete($client_id . TokenService::ClientAuthCodePrefixList); - $this->cache_service->delete($client_id . TokenService::ClientAccessTokenPrefixList); - }); - } - - /** - * @param string $at_hash - */ - public function markAccessTokenAsRevoked($at_hash) - { - $this->cache_service->addSingleValue - ( - 'access.token:revoked:' . $at_hash, - 'access.token:revoked:' . $at_hash, - $this->configuration_service->getConfigValue('OAuth2.AccessToken.Revoked.Lifetime') - ); - } - - /** - * @param string $at_hash - */ - public function markAccessTokenAsVoid($at_hash) - { - $this->cache_service->addSingleValue - ( - 'access.token:void:' . $at_hash, - 'access.token:void:' . $at_hash, - $this->configuration_service->getConfigValue('OAuth2.AccessToken.Void.Lifetime') - ); - } - - /** - * @param string $rt_hash - */ - public function markRefreshTokenAsRevoked($rt_hash) - { - $this->cache_service->addSingleValue - ( - 'refresh.token:revoked:' . $rt_hash, - 'refresh.token:revoked:' . $rt_hash, - $this->configuration_service->getConfigValue('OAuth2.RefreshToken.Revoked.Lifetime') - ); - } - - /** - * @param string $at_hash - * @return bool - */ - public function isAccessTokenRevoked($at_hash) - { - return $this->cache_service->exists('access.token:revoked:' . $at_hash); - } - - /** - * @param string $at_hash - * @return bool - */ - public function isAccessTokenVoid($at_hash) - { - return $this->cache_service->exists('access.token:void:' . $at_hash); - } - - /** - * @param string $rt_hash - * @return bool - */ - public function isRefreshTokenRevoked($rt_hash) - { - return $this->cache_service->exists('refresh.token:revoked:' . $rt_hash); - } - - /** - * Mark a given refresh token as void - * @param string $value - * @param bool $is_hashed - * @parama User $current_user - * @return bool - */ - public function invalidateRefreshToken(string $value, bool $is_hashed = false, ?User $current_user = null) - { - return $this->tx_service->transaction(function () use ($value, $is_hashed, $current_user) { - $hashed_value = !$is_hashed ? Hash::compute('sha256', $value) : $value; - $refresh_token = $this->refresh_token_repository->getByValue($hashed_value); - if (is_null($refresh_token)) return false; - if (!is_null($current_user) && !$current_user->belongToGroup(IGroupSlugs::SuperAdminGroup) && $refresh_token->hasOwner() && $refresh_token->getOwnerId() != $current_user->getId()) { - throw new ValidationException(sprintf("refresh token %s does not belongs to user id %s!.", $value, $current_user->getId())); - } - - $refresh_token->setVoid(); - $this->refresh_token_repository->add($refresh_token); - return true; - }); - - - } - - /** - * Revokes a give refresh token and all related access tokens - * @param $value - * @param bool $is_hashed - * @param User $current_user - * @return mixed - */ - public function revokeRefreshToken(string $value, bool $is_hashed = false, ?User $current_user = null) - { - return $this->tx_service->transaction(function () use ($value, $is_hashed, $current_user) { - $res = $this->invalidateRefreshToken($value, $is_hashed, $current_user); - return $res && $this->clearAccessTokensForRefreshToken($value, $is_hashed); - }); - - } - - /** - * Revokes all access tokens for a give refresh token - * @param string $value refresh token value - * @param bool $is_hashed - * @return bool|void - */ - public function clearAccessTokensForRefreshToken($value, $is_hashed = false) - { - - $hashed_value = !$is_hashed ? Hash::compute('sha256', $value) : $value; - - return $this->tx_service->transaction(function () use ( - $hashed_value - ) { - - $refresh_token_db = $this->refresh_token_repository->getByValue($hashed_value); - - if (!is_null($refresh_token_db)) { - $access_tokens_db = $this->access_token_repository->getByRefreshToken($refresh_token_db->getId()); - - if (count($access_tokens_db) == 0) return false; - - foreach ($access_tokens_db as $access_token_db) { - - $this->cache_service->delete($access_token_db->getValue()); - $client = $access_token_db->getClient(); - $this->cache_service->deleteMemberSet - ( - $client->getClientId() . TokenService::ClientAccessTokenPrefixList, - $access_token_db->getValue() - ); - - $this->markAccessTokenAsRevoked($access_token_db->getValue()); - - - $this->access_token_repository->delete($access_token_db); - } - } - - return true; - }); - } - - /** - * @param string $nonce - * @param string $client_id - * @param AccessToken|null $access_token - * @param AuthorizationCode|null $auth_code - * @return IBasicJWT - * @throws AbsentClientException - * @throws AbsentCurrentUserException - * @throws ConfigurationException - * @throws InvalidClientCredentials - * @throws \jwt\exceptions\ClaimAlreadyExistsException - */ - public function createIdToken - ( - $nonce, - $client_id, - AccessToken $access_token = null, - AuthorizationCode $auth_code = null - ) - { - $issuer = $this->configuration_service->getSiteUrl(); - if (empty($issuer)) throw new ConfigurationException('missing idp url'); - - $client = $this->client_repository->getClientById($client_id); - $id_token_lifetime = $this->configuration_service->getConfigValue('OAuth2.IdToken.Lifetime'); - - if (is_null($client)) { - throw new AbsentClientException - ( - sprintf - ( - "client id %d does not exists!", - $client_id - ) - ); - } - - $user = $this->auth_service->getCurrentUser(); - - if (is_null($user)) { - $user_id = $this->principal_service->get()->getUserId(); - Log::debug(sprintf("user id is %s", $user_id)); - $user = $this->auth_service->getUserById($user_id); - } - - if (is_null($user)) - throw new AbsentCurrentUserException; - - if (!$user instanceof User) - throw new AbsentCurrentUserException; - - // build claim set - $epoch_now = time(); - - $jti = $this->auth_service->generateJTI($client_id, $id_token_lifetime); - - $claim_set = new JWTClaimSet - ( - $iss = new StringOrURI($issuer), - $sub = new StringOrURI - ( - $this->auth_service->wrapUserId - ( - $user->getId(), - $client - ) - ), - $aud = new StringOrURI($client_id), - $iat = new NumericDate($epoch_now), - $exp = new NumericDate($epoch_now + $id_token_lifetime), - $jti = new JsonValue($jti) - ); - - // custom user info custom claims - - UserService::populateProfileClaims($claim_set, $user); - UserService::populateAddressClaims($claim_set, $user); - UserService::populateEmailClaims($claim_set, $user); - - if (!empty($nonce)) - $claim_set->addClaim(new JWTClaim(OAuth2Protocol::OAuth2Protocol_Nonce, new StringOrURI($nonce))); - - $id_token_response_info = $client->getIdTokenResponseInfo(); - $sig_alg = $id_token_response_info->getSigningAlgorithm(); - - if (!is_null($sig_alg) && !is_null($access_token)) - $this->buildAccessTokenHashClaim($access_token, $sig_alg, $claim_set); - - if (!is_null($sig_alg) && !is_null($auth_code)) - $this->buildAuthCodeHashClaim($auth_code, $sig_alg, $claim_set); - - $this->buildAuthTimeClaim($claim_set); - - return $this->id_token_builder->buildJWT($claim_set, $id_token_response_info, $client); - } - - /** - * @param AccessToken $access_token - * @param HashFunctionAlgorithm $hashing_alg - * @param JWTClaimSet $claim_set - * @return JWTClaimSet - * @throws InvalidClientCredentials - * @throws \jwt\exceptions\ClaimAlreadyExistsException - */ - private function buildAccessTokenHashClaim - ( - AccessToken $access_token, - HashFunctionAlgorithm $hashing_alg, - JWTClaimSet $claim_set - ) - { - $at = $access_token->getValue(); - $at_len = $hashing_alg->getHashKeyLen() / 2; - $encoder = new Base64UrlRepresentation(); - - if ($at_len > ByteUtil::bitLength(strlen($at))) - throw new InvalidClientCredentials('invalid access token length!.'); - - $claim_set->addClaim - ( - new JWTClaim - ( - OAuth2Protocol::OAuth2Protocol_AccessToken_Hash, - new JsonValue - ( - $encoder->encode - ( - substr - ( - hash - ( - $hashing_alg->getHashingAlgorithm(), - $at, - true - ), - 0, - $at_len / 8 - ) - ) - ) - ) - ); - - return $claim_set; - } - - /** - * @param AuthorizationCode $auth_code - * @param HashFunctionAlgorithm $hashing_alg - * @param JWTClaimSet $claim_set - * @return JWTClaimSet - * @throws InvalidClientCredentials - * @throws \jwt\exceptions\ClaimAlreadyExistsException - */ - private function buildAuthCodeHashClaim - ( - AuthorizationCode $auth_code, - HashFunctionAlgorithm $hashing_alg, - JWTClaimSet $claim_set - ) - { - - $ac = $auth_code->getValue(); - $ac_len = $hashing_alg->getHashKeyLen() / 2; - $encoder = new Base64UrlRepresentation(); - - if ($ac_len > ByteUtil::bitLength(strlen($ac))) - throw new InvalidClientCredentials('invalid auth code length!.'); - - $claim_set->addClaim - ( - new JWTClaim - ( - OAuth2Protocol::OAuth2Protocol_AuthCode_Hash, - new JsonValue - ( - $encoder->encode - ( - substr - ( - hash - ( - $hashing_alg->getHashingAlgorithm(), - $ac, - true - ), - 0, - $ac_len / 8 - ) - ) - ) - ) - ); - - return $claim_set; - } - - private function buildAuthTimeClaim(JWTClaimSet $claim_set) - { - if ($this->security_context_service->get()->isAuthTimeRequired()) { - $claim_set->addClaim - ( - new JWTClaim - ( - OAuth2Protocol::OAuth2Protocol_AuthTime, - new JsonValue - ( - $this->principal_service->get()->getAuthTime() - ) - ) - ); - } - } - - /** - * @param AuthorizationCode $auth_code - * @return AccessToken|null - */ - public function getAccessTokenByAuthCode(AuthorizationCode $auth_code) - { - $auth_code_value = Hash::compute('sha256', $auth_code->getValue()); - $db_access_token = $this->access_token_repository->getByAuthCode($auth_code_value); - if (is_null($db_access_token)) return null; - return $this->getAccessToken($db_access_token->getValue(), true); - } - -} \ No newline at end of file diff --git a/app/Services/OAuth2/UserConsentService.php b/app/Services/OAuth2/UserConsentService.php deleted file mode 100644 index 225683c1..00000000 --- a/app/Services/OAuth2/UserConsentService.php +++ /dev/null @@ -1,80 +0,0 @@ -user_repository = $user_repository; - $this->client_repository = $client_repository; - } - - /** - * @param User $user - * @param Client $client - * @param string $scopes - * @return UserConsent - * @throws EntityNotFoundException - */ - public function addUserConsent(User $user, Client $client, string $scopes):UserConsent - { - return $this->tx_service->transaction(function() use($user, $client, $scopes){ - - $scope_set = explode(' ', $scopes); - sort($scope_set); - $consent = new UserConsent(); - $consent->setClient($client); - $consent->setOwner($user); - $consent->setScope(join(' ', $scope_set)); - $user->addConsent($consent); - - return $consent; - }); - } -} \ No newline at end of file diff --git a/app/Services/OpenId/AssociationService.php b/app/Services/OpenId/AssociationService.php deleted file mode 100644 index 18691a0d..00000000 --- a/app/Services/OpenId/AssociationService.php +++ /dev/null @@ -1,240 +0,0 @@ -lock_manager_service = $lock_manager_service; - $this->cache_service = $cache_service; - $this->repository = $repository; - $this->tx_service = $tx_service; - } - - /** - * gets a given association by handle, and if association exists and its type is private, then lock it - * to prevent subsequent usage ( private association could be used once) - * @param $handle - * @param null $realm - * @return null|IAssociation - * @throws ReplayAttackException - * @throws InvalidAssociation - * @throws OpenIdInvalidRealmException - */ - public function getAssociation($handle, $realm = null) - { - - return $this->tx_service->transaction(function() use($handle, $realm) { - - $lock_name = 'lock.get.assoc.' . $handle; - - try { - // check if association is on cache - if (!$this->cache_service->exists($handle)) { - // if not , check on db - $assoc = $this->repository->getByHandle($handle); - if (is_null($assoc)) { - throw new InvalidAssociation(sprintf('openid association %s does not exists!', $handle)); - } - //check association lifetime ... - $remaining_lifetime = $assoc->getRemainingLifetime(); - if ($remaining_lifetime < 0) { - $this->deleteAssociation($handle); - - return null; - } - //convert secret to hexa representation - // bin2hex - $secret_unpack = \unpack('H*', $assoc->getSecret()); - $secret_unpack = array_shift($secret_unpack); - //repopulate cache - $this->cache_service->storeHash($handle, [ - "type" => $assoc->getType(), - "mac_function" => $assoc->getMacFunction(), - "issued" => $assoc->getIssued()->format("Y-m-d H:i:s"), - "lifetime" => $assoc->getLifetime(), - "secret" => $secret_unpack, - "realm" => $assoc->getRealm() - ], $remaining_lifetime); - } - - //get hash from cache - $cache_values = $this->cache_service->getHash($handle, [ - "type", - "mac_function", - "issued", - "lifetime", - "secret", - "realm" - ]); - - if ($cache_values['type'] == IAssociation::TypePrivate) { - if (is_null($realm) || empty($realm) || $cache_values['realm'] != $realm) { - throw new OpenIdInvalidRealmException(sprintf(OpenIdErrorMessages::InvalidPrivateAssociationMessage, - $handle, $realm)); - } - // only one time we could use this handle - $this->lock_manager_service->acquireLock($lock_name); - } - - //convert hex 2 bin - $secret = \pack('H*', $cache_values['secret']); - $assoc = new SnapShotAssociation(); - - $assoc->setType($cache_values['type']); - $assoc->setMacFunction($cache_values['mac_function']); - $issued = $cache_values['issued']; - $assoc->setIssued(new \DateTime($issued)); - $assoc->setLifetime(intval($cache_values['lifetime'])); - $assoc->setSecret($secret); - $realm = $cache_values['realm']; - - if (!empty($realm)) { - $assoc->setRealm($realm); - } - return $assoc; - - } catch (UnacquiredLockException $ex1) { - throw new ReplayAttackException - ( - sprintf(OpenIdErrorMessages::ReplayAttackPrivateAssociationAlreadyUsed, $handle) - ); - } - }); - } - - /** - * @param string $handle - */ - public function deleteAssociation(string $handle) - { - $this->tx_service->transaction(function() use($handle){ - - $this->cache_service->delete($handle); - $assoc = $this->repository->getByHandle($handle); - if (!is_null($assoc)) { - $this->repository->delete($assoc); - } - }); - } - - /** - * @param IAssociation $association - * @return OpenIdAssociation - * @throws ReplayAttackException - */ - public function addAssociation(IAssociation $association) - { - return $this->tx_service->transaction(function() use($association){ - - $assoc = new OpenIdAssociation(); - try { - $lock_name = 'lock.add.assoc.' . $association->getHandle(); - - $this->lock_manager_service->acquireLock($lock_name); - // todo: move to a factory - $assoc->setIdentifier($association->getHandle()); - $assoc->setSecret($association->getSecret()); - $assoc->setType($association->getType()); - $assoc->setMacFunction($association->getMacFunction()); - $assoc->setLifetime(intval($association->getLifetime())); - $assoc->setIssued($association->getIssued()); - - if (!is_null($association->getRealm())) { - $assoc->setRealm($association->getRealm()); - } - - if ($association->getType() == IAssociation::TypeSession) { - $this->repository->add($assoc); - } - //convert secret to hexa representation - // bin2hex - $secret_unpack = \unpack('H*', $association->getSecret()); - $secret_unpack = array_shift($secret_unpack); - - $this->cache_service->storeHash($association->getHandle(), - [ - "type" => $association->getType(), - "mac_function" => $association->getMacFunction(), - "issued" => $association->getIssued()->format("Y-m-d H:i:s"), - "lifetime" => intval($association->getLifetime()), - "secret" => $secret_unpack, - "realm" => !is_null($association->getRealm()) ? $association->getRealm() : '' - ], - intval($association->getLifetime()) - ); - - } catch (UnacquiredLockException $ex1) { - throw new ReplayAttackException - ( - sprintf - ( - OpenIdErrorMessages::ReplayAttackPrivateAssociationAlreadyUsed, - $association->getHandle() - ) - ); - } - - return $assoc; - - }); - } - -} \ No newline at end of file diff --git a/app/Services/OpenId/NonceService.php b/app/Services/OpenId/NonceService.php deleted file mode 100644 index da815f69..00000000 --- a/app/Services/OpenId/NonceService.php +++ /dev/null @@ -1,156 +0,0 @@ -lock_manager_service = $lock_manager_service; - $this->cache_service = $cache_service; - $this->configuration_service = $configuration_service; - $this->nonce_generator = $nonce_generator; - } - - /** - * @param OpenIdNonce $nonce - * @throws ReplayAttackException - * @return $this - */ - public function lockNonce(OpenIdNonce $nonce) - { - $raw_nonce = $nonce->getRawFormat(); - $lock_lifetime = $this->configuration_service->getConfigValue("Nonce.Lifetime"); - try { - $this->lock_manager_service->acquireLock('lock.nonce.' . $raw_nonce, $lock_lifetime); - } catch (UnacquiredLockException $ex) { - throw new ReplayAttackException(sprintf(OpenIdErrorMessages::ReplayAttackNonceAlreadyUsed, $nonce->getRawFormat())); - } - return $this; - } - - /** - * @param OpenIdNonce $nonce - * @return $this - */ - public function unlockNonce(OpenIdNonce $nonce) - { - $raw_nonce = $nonce->getRawFormat(); - $this->lock_manager_service->releaseLock('lock.nonce.' . $raw_nonce); - return $this; - } - - - /** - * Value: A string 255 characters or less in length, that MUST be unique to this particular successful - * authentication response. The nonce MUST start with the current time on the server, and MAY contain additional - * ASCII characters in the range 33-126 inclusive (printable non-whitespace characters), as necessary to make each - * response unique. The date and time MUST be formatted as specified in section 5.6 of [RFC3339], with the following - * restrictions: - * All times must be in the UTC timezone, indicated with a "Z". - * No fractional seconds are allowed - * For example: 2005-05-15T17:11:51ZUNIQUE - * @return OpenIdNonce - */ - public function generateNonce() - { - return $this->nonce_generator->generate(new OpenIdNonce(255)); - } - - /** - * @param OpenIdNonce $nonce - * @param string $signature - * @param string $realm - * @return $this - * @throws ReplayAttackException - */ - public function markNonceAsInvalid(OpenIdNonce $nonce, $signature, $realm) - { - $raw_nonce = $nonce->getRawFormat(); - $key = $raw_nonce . $signature; - - try { - if (!$this->cache_service->exists($key)) - throw new ReplayAttackException(sprintf(OpenIdErrorMessages::ReplayAttackNonceAlreadyUsed, $nonce->getRawFormat())); - $old_realm = $this->cache_service->getSingleValue($key); - if ($realm != $old_realm) { - throw new ReplayAttackException(sprintf(OpenIdErrorMessages::ReplayAttackNonceAlreadyEmittedForAnotherRealm, $realm)); - } - $this->cache_service->delete($key); - } catch (ReplayAttackException $ex) { - $this->cache_service->delete($key); - throw $ex; - } - return $this; - } - - /** - * @param OpenIdNonce $nonce - * @param string $signature - * @param string $realm - * @return $this; - */ - public function associateNonce(OpenIdNonce $nonce, $signature, $realm) - { - try { - $raw_nonce = $nonce->getRawFormat(); - $lifetime = $this->configuration_service->getConfigValue("Nonce.Lifetime"); - $this->cache_service->setSingleValue($raw_nonce . $signature, $realm, $lifetime ); - } catch (Exception $ex) { - Log::error($ex); - } - return $this; - } -} \ No newline at end of file diff --git a/app/Services/OpenId/OpenIdMementoSessionSerializerService.php b/app/Services/OpenId/OpenIdMementoSessionSerializerService.php deleted file mode 100644 index 8ff8d7b9..00000000 --- a/app/Services/OpenId/OpenIdMementoSessionSerializerService.php +++ /dev/null @@ -1,65 +0,0 @@ -getState())); - Session::put('openid.request.state', $state); - Session::save(); - } - - /** - * @return OpenIdMessageMemento - */ - public function load() - { - $state = Session::get('openid.request.state', null); - - if(is_null($state)) return null; - - $state = json_decode( base64_decode($state), true); - - return OpenIdMessageMemento::buildFromState($state); - } - - /** - * @return void - */ - public function forget() - { - Session::remove('openid.request.state'); - Session::save(); - } - - /** - * @return bool - */ - public function exists() - { - return Session::has('openid.request.state'); - } -} \ No newline at end of file diff --git a/app/Services/OpenId/OpenIdProvider.php b/app/Services/OpenId/OpenIdProvider.php deleted file mode 100644 index 33d3baf8..00000000 --- a/app/Services/OpenId/OpenIdProvider.php +++ /dev/null @@ -1,64 +0,0 @@ -server_extensions_repository = $server_extensions_repository; - } - - /** - * @return array - */ - public function getAllActiveExtensions() - { - return $this->tx_service->transaction(function(){ - $extensions = $this->server_extensions_repository->getAllActives(); - $res = []; - foreach ($extensions as $extension) { - $class_name = $extension->getExtensionClass(); - if (empty($class_name)) continue; - - $class = new ReflectionClass($class_name); - $constructor = $class->getConstructor(); - $constructor_params = $constructor->getParameters(); - - $deps = []; - - foreach($constructor_params as $constructor_param){ - $param_class = $constructor_param->getClass(); - if(is_null($param_class)){ - $property = $constructor_param->getName(); - $deps[] = $extension->{$property}; - continue; - } - $deps [] = ServiceLocator::getInstance()->getService($param_class->getName()); - } - - $res[] = $class->newInstanceArgs($deps); - } - return $res; - }); - - } -} \ No newline at end of file diff --git a/app/Services/OpenId/TrustedSitesService.php b/app/Services/OpenId/TrustedSitesService.php deleted file mode 100644 index a01a1c56..00000000 --- a/app/Services/OpenId/TrustedSitesService.php +++ /dev/null @@ -1,151 +0,0 @@ -repository = $repository; - $this->log_service = $log_service; - } - - /** - * @param User $user - * @param string $realm - * @param string $policy - * @param array $data - * @return OpenIdTrustedSite - */ - public function addTrustedSite(User $user, string $realm, string $policy, $data = []):OpenIdTrustedSite - { - - return $this->tx_service->transaction(function() use($user, $realm, $policy, $data){ - $site = null; - try { - - if (!OpenIdUriHelper::isValidRealm($realm)) - throw new OpenIdInvalidRealmException(sprintf('realm %s is invalid', $realm)); - - $site = new OpenIdTrustedSite; - $site->setRealm($realm); - $site->setPolicy($policy); - $site->setOwner($user); - $site->setData(json_encode($data)); - $user->addTrustedSite($site); - } - catch (Exception $ex) { - Log::error($ex); - throw $ex; - } - return $site; - }); - - } - - /** - * @param $id - * @return bool - */ - public function delete(int $id):void - { - $this->tx_service->transaction(function() use($id){ - $site = $this->repository->getById($id); - if(is_null($site)) - throw new EntityNotFoundException(); - - $this->repository->delete($site); - }); - - } - - /** - * @param User $user - * @param string $realm - * @param array $data - * @return array - * @throws Exception - */ - public function getTrustedSites(User $user, string $realm, $data = []):array - { - $res = []; - try { - if (!OpenIdUriHelper::isValidRealm($realm)) - throw new OpenIdInvalidRealmException(sprintf('realm %s is invalid', $realm)); - //get all possible sub-domains - $sub_domains = URLUtils::getSubDomains($realm); - $sites = $this->repository->getMatchingOnesByUserId($user->getId(), $sub_domains, $data); - //iterate over all retrieved sites and check the set policies by user - foreach ($sites as $site) { - if(!$site instanceof OpenIdTrustedSite) continue; - $policy = $site->getAuthorizationPolicy(); - //if denied then break - if ($policy == IAuthService::AuthorizationResponse_DenyForever) { - $res[] = $site; - break; - } - $trusted_data = $site->getData(); - $diff = array_diff($data, $trusted_data); - //if pre approved data is contained or equal than a former one - if (count($diff) == 0) { - $res[] = $site; - break; - } - } - } catch (Exception $ex) { - Log::error($ex); - throw $ex; - } - return $res; - } - -} \ No newline at end of file diff --git a/app/Services/OpenId/UserService.php b/app/Services/OpenId/UserService.php deleted file mode 100644 index 9c60679f..00000000 --- a/app/Services/OpenId/UserService.php +++ /dev/null @@ -1,387 +0,0 @@ -repository = $repository; - $this->group_repository = $group_repository; - $this->user_name_generator = $user_name_generator; - $this->configuration_service = $configuration_service; - $this->log_service = $log_service; - $this->server_ctx = $server_ctx; - } - - /** - * @param int $user_id - * @return User - * @throws EntityNotFoundException - */ - public function updateLastLoginDate(int $user_id):User - { - return $this->tx_service->transaction(function() use($user_id){ - $user = $this->repository->getById($user_id); - if(is_null($user) || !$user instanceof User) throw new EntityNotFoundException(); - $user->updateLastLoginDate(); - return $user; - }); - } - - /** - * @param int $user_id - * @return User - * @throws EntityNotFoundException - */ - public function updateFailedLoginAttempts(int $user_id):User - { - return $this->tx_service->transaction(function() use($user_id){ - $user = $this->repository->getById($user_id); - if(is_null($user) || !$user instanceof User) throw new EntityNotFoundException(); - $user->updateLoginFailedAttempt(); - return $user; - }); - } - - /** - * @param int $user_id - * @return User - * @throws EntityNotFoundException - */ - public function lockUser(int $user_id):User - { - return $this->tx_service->transaction(function() use($user_id){ - $user = $this->repository->getById($user_id); - if(is_null($user) || !$user instanceof User) throw new EntityNotFoundException(); - return $user->lock(); - }); - } - - /** - * @param int $user_id - * @return void - * @throws EntityNotFoundException - */ - public function unlockUser(int $user_id):User - { - return $this->tx_service->transaction(function() use($user_id){ - $user = $this->repository->getById($user_id); - if(is_null($user) || !$user instanceof User) throw new EntityNotFoundException(); - return $user->unlock(); - }); - } - - /** - * @param int $user_id - * @param bool $show_pic - * @param bool $show_full_name - * @param bool $show_email - * @param string $identifier - * @return User - * @throws EntityNotFoundException - * @throws ValidationException - */ - public function saveProfileInfo($user_id, $show_pic, $show_full_name, $show_email, $identifier):User - { - - return $this->tx_service->transaction(function() use($user_id, $show_pic, $show_full_name, $show_email, $identifier){ - $user = $this->repository->getById($user_id); - if(is_null($user) || !$user instanceof User) throw new EntityNotFoundException(); - - $former_user = $this->repository->getByIdentifier($identifier); - - if(!is_null($former_user) && $former_user->getId() != $user_id){ - throw new ValidationException("there is already another user with that openid identifier"); - } - - $user->setPublicProfileShowPhoto($show_pic); - $user->setPublicProfileShowFullname($show_full_name); - $user->setPublicProfileShowEmail($show_email); - $user->setIdentifier($identifier); - - return $user; - }); - } - - /** - * @param array $payload - * @return IEntity - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function create(array $payload): IEntity - { - return $this->tx_service->transaction(function() use($payload){ - if(isset($payload["email"])){ - $former_user = $this->repository->getByEmailOrName(trim($payload["email"])); - if(!is_null($former_user)) - throw new ValidationException(sprintf("email %s already belongs to another user", $payload["email"])); - } - - if(isset($payload["identifier"]) && !empty($payload["identifier"])){ - $former_user = $this->repository->getByIdentifier(trim($payload["identifier"])); - if(!is_null($former_user)) - throw new ValidationException(sprintf("identifier %s already belongs to another user", $payload["identifier"])); - } - - $user = UserFactory::build($payload); - - if(isset($payload['groups'])){ - foreach($payload['groups'] as $group_id) { - $group = $this->group_repository->getById($group_id); - if(is_null($group)) - throw new EntityNotFoundException("group not found"); - $user->addToGroup($group); - } - } - - $this->repository->add($user); - - return $user; - }); - } - - /** - * @param int $id - * @param array $payload - * @return IEntity - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function update(int $id, array $payload): IEntity - { - $user = $this->tx_service->transaction(function() use($id, $payload){ - - $user = $this->repository->getById($id); - if(is_null($user) || !$user instanceof User) - throw new EntityNotFoundException("user not found"); - - $former_email = $user->getEmail(); - $former_password = $user->getPassword(); - $current_user = !empty($this->server_ctx->getCurrentUserId()) ? $this->repository->getById($this->server_ctx->getCurrentUserId()):Auth::user(); - $should_ask_4_cur_password_validation = !(!is_null($current_user) && - $user->getId() != $current_user->getId() && // is not the same user as current user - ($current_user->isAdmin() || $current_user->isSuperAdmin()) && // current user should be admin - (!$user->isAdmin() && !$user->isSuperAdmin()));// user to update is not admin - - if($should_ask_4_cur_password_validation) { - if (isset($payload["password"]) && !empty($payload["password"])) { - // changing password - if (!isset($payload['current_password'])) - throw new ValidationException(sprintf("current_password is needed to update user password.")); - - if (!$user->checkPassword(trim($payload['current_password']))) { - throw new ValidationException(sprintf("current_password is not correct.")); - } - } - } - - if(isset($payload["email"]) && !empty($payload["email"])){ - $former_user = $this->repository->getByEmailOrName(trim($payload["email"])); - if(!is_null($former_user) && $former_user->getId() != $id) - throw new ValidationException(sprintf("email %s already belongs to another user", $payload["email"])); - } - - if(isset($payload["identifier"]) && !empty($payload["identifier"])){ - $former_user = $this->repository->getByIdentifier(trim($payload["identifier"])); - if(!is_null($former_user) && $former_user->getId() != $id) - throw new ValidationException(sprintf("identifier %s already belongs to another user", $payload["identifier"])); - } - - $user = UserFactory::populate($user, $payload); - - if(isset($payload['groups'])){ - $user->clearGroups(); - foreach($payload['groups'] as $group_id) { - $group = $this->group_repository->getById($group_id); - if(is_null($group)) - throw new EntityNotFoundException("group not found"); - $user->addToGroup($group); - } - } - - if($former_email != $user->getEmail()){ - Log::warning(sprintf("UserService::update use id %s - email changed old %s - email new %s", $id, $former_email , $user->getEmail())); - $user->clearEmailVerification(); - Event::fire(new UserEmailUpdated($user->getId())); - } - - if($former_password != $user->getPassword()){ - Log::warning(sprintf("UserService::update use id %s - password changed", $id)); - Event::fire(new UserPasswordResetSuccessful($user->getId())); - } - return $user; - }); - - try { - if(Config::get("queue.enable_message_broker", false) == true) - PublishUserUpdated::dispatch($user)->onConnection('message_broker'); - } - catch (\Exception $ex){ - Log::warning($ex); - } - - return $user; - } - - /** - * @param int $id - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function delete(int $id): void - { - $this->tx_service->transaction(function() use($id) { - $user = $this->repository->getById($id); - if(is_null($user) || !$user instanceof User) - throw new EntityNotFoundException("user not found"); - - try { - if(Config::get("queue.enable_message_broker", false) == true) - PublishUserDeleted::dispatch($user)->onConnection('message_broker'); - } - catch (\Exception $ex){ - Log::warning($ex); - } - - $this->repository->delete($user); - - }); - } - - /** - * @inheritDoc - */ - public function updateProfilePhoto($user_id, UploadedFile $file, $max_file_size = 10485760): User - { - $user = $this->tx_service->transaction(function() use($user_id, $file, $max_file_size) { - - $allowed_extensions = ['png', 'jpg', 'jpeg']; - - $user = $this->repository->getById($user_id); - if(is_null($user) || !$user instanceof User) - throw new EntityNotFoundException("user not found"); - $fileName = $file->getClientOriginalName(); - $fileExt = $file->extension() ?? pathinfo($fileName, PATHINFO_EXTENSION); - - Log::debug(sprintf("UserService::updateProfilePhoto user %s fileName %s fileExt %s", $user_id, $fileName, $fileExt)); - - if (!in_array($fileExt, $allowed_extensions)) { - throw new ValidationException(sprintf( "file does not has a valid extension (%s).", join(",", $allowed_extensions))); - } - if ($file->getSize() > $max_file_size) { - throw new ValidationException(sprintf("file exceeds max_file_size (%s MB).", ($max_file_size / 1024) / 1024)); - } - - // normalize fileName - $fileName = FileNameSanitizer::sanitize($fileName); - $path = User::getProfilePicFolder(); - - Log::debug(sprintf("UserService::updateProfilePhoto user %s saving file to swift path %s fileName %s", $user_id, $path, $fileName)); - Storage::disk('swift')->putFileAs($path, $file, $fileName); - - $user->setPic($fileName); - - return $user; - }); - - try { - if(Config::get("queue.enable_message_broker", false) == true) - PublishUserUpdated::dispatch($user)->onConnection('message_broker'); - } - catch (\Exception $ex){ - Log::warning($ex); - } - - return $user; - } -} \ No newline at end of file diff --git a/app/Services/SecurityPolicies/AbstractBlacklistSecurityPolicy.php b/app/Services/SecurityPolicies/AbstractBlacklistSecurityPolicy.php deleted file mode 100644 index a33870de..00000000 --- a/app/Services/SecurityPolicies/AbstractBlacklistSecurityPolicy.php +++ /dev/null @@ -1,139 +0,0 @@ -banned_ip_repository = $banned_ip_repository; - $this->server_configuration_service = $server_configuration_service; - $this->lock_manager_service = $lock_manager_service; - $this->cache_service = $cache_service; - $this->tx_service = $tx_service; - $this->ip_helper = $ip_helper; - } - - /** - * @param ISecurityPolicyCounterMeasure $counter_measure - * @return $this - */ - public function setCounterMeasure(ISecurityPolicyCounterMeasure $counter_measure) - { - $this->counter_measure = $counter_measure; - return $this; - } - - /** - * @param int $initial_hits - * @param string $exception_type - * @throws Exception - */ - protected function createBannedIP(int $initial_hits, string $exception_type): void - { - $this->tx_service->transaction(function () use ($initial_hits, $exception_type) { - try { - $remote_address = $this->ip_helper->getCurrentUserIpAddress(); - //try to create on cache - $this->cache_service->addSingleValue($remote_address, $initial_hits, - intval($this->server_configuration_service->getConfigValue("BlacklistSecurityPolicy.BannedIpLifeTimeSeconds"))); - - Log::warning(sprintf("AbstractBlacklistSecurityPolicy: Banning ip %s by Exception %s", $remote_address, - $exception_type)); - $banned_ip = $this->banned_ip_repository->getByIp($remote_address); - - if (is_null($banned_ip)) { - $banned_ip = new BannedIP(); - $banned_ip->setIp($remote_address); - } - $banned_ip->setExceptionType($exception_type); - $banned_ip->setHits($initial_hits); - - if (Auth::check()) { - $banned_ip->setUser(Auth::user()); - } - - if($banned_ip->isNew()) - $this->banned_ip_repository->add($banned_ip); - - } catch (Exception $ex) { - Log::error($ex); - } - }); - - } - -} \ No newline at end of file diff --git a/app/Services/SecurityPolicies/AuthorizationCodeRedeemPolicy.php b/app/Services/SecurityPolicies/AuthorizationCodeRedeemPolicy.php deleted file mode 100644 index df0efdfc..00000000 --- a/app/Services/SecurityPolicies/AuthorizationCodeRedeemPolicy.php +++ /dev/null @@ -1,93 +0,0 @@ -getToken(); - Log::error(sprintf("AuthorizationCodeRedeemPolicy : auth code %s - message %s", $auth_code, $ex->getMessage())); - $this->counter_measure->trigger - ( - [ - 'auth_code' => $auth_code - ] - ); - } - } catch (Exception $ex) { - Log::error($ex); - } - return $this; - } - -} \ No newline at end of file diff --git a/app/Services/SecurityPolicies/BlacklistSecurityPolicy.php b/app/Services/SecurityPolicies/BlacklistSecurityPolicy.php deleted file mode 100644 index 87543616..00000000 --- a/app/Services/SecurityPolicies/BlacklistSecurityPolicy.php +++ /dev/null @@ -1,308 +0,0 @@ -resource_server_repository = $resource_server_repository; - - $this->user_exception_trail_repository = $user_exception_trail_repository; - // here we configure on which exceptions are we interested and the max occurrence attempts and initial delay on tar pit for - // offending IP address - $this->exception_dictionary = [ - ReplayAttackException::class => array( - 'BlacklistSecurityPolicy.MaxReplayAttackExceptionAttempts', - 'BlacklistSecurityPolicy.ReplayAttackExceptionInitialDelay' - ), - InvalidNonce::class => array( - 'BlacklistSecurityPolicy.MaxInvalidNonceAttempts', - 'BlacklistSecurityPolicy.InvalidNonceInitialDelay' - ), - InvalidOpenIdMessageException::class => array( - 'BlacklistSecurityPolicy.MaxInvalidOpenIdMessageExceptionAttempts', - 'BlacklistSecurityPolicy.InvalidOpenIdMessageExceptionInitialDelay' - ), - OpenIdInvalidRealmException::class => array( - 'BlacklistSecurityPolicy.MaxOpenIdInvalidRealmExceptionAttempts', - 'BlacklistSecurityPolicy.OpenIdInvalidRealmExceptionInitialDelay' - ), - InvalidOpenIdMessageMode::class => array( - 'BlacklistSecurityPolicy.MaxInvalidOpenIdMessageModeAttempts', - 'BlacklistSecurityPolicy.InvalidOpenIdMessageModeInitialDelay' - ), - InvalidOpenIdAuthenticationRequestMode::class => array( - 'BlacklistSecurityPolicy.MaxInvalidOpenIdAuthenticationRequestModeAttempts', - 'BlacklistSecurityPolicy.InvalidOpenIdAuthenticationRequestModeInitialDelay' - ), - InvalidAssociation::class => array( - 'BlacklistSecurityPolicy.MaxInvalidAssociationAttempts', - 'BlacklistSecurityPolicy.InvalidAssociationInitialDelay' - ), - AuthenticationException::class => array( - 'BlacklistSecurityPolicy.MaxAuthenticationExceptionAttempts', - 'BlacklistSecurityPolicy.AuthenticationExceptionInitialDelay' - ), - \OAuth2\Exceptions\ReplayAttackException::class => [ - 'BlacklistSecurityPolicy.OAuth2.MaxAuthCodeReplayAttackAttempts', - 'BlacklistSecurityPolicy.OAuth2.AuthCodeReplayAttackInitialDelay' - ], - InvalidAuthorizationCodeException::class => [ - 'BlacklistSecurityPolicy.OAuth2.MaxInvalidAuthorizationCodeAttempts', - 'BlacklistSecurityPolicy.OAuth2.InvalidAuthorizationCodeInitialDelay' - ], - BearerTokenDisclosureAttemptException::class => [ - 'BlacklistSecurityPolicy.OAuth2.MaxInvalidBearerTokenDisclosureAttempt', - 'BlacklistSecurityPolicy.OAuth2.BearerTokenDisclosureAttemptInitialDelay' - ], - ]; - $this->white_listed_ip_repository = $white_listed_ip_repository; - } - - /** - * Check policy - * @return bool - */ - public function check() - { - - return $this->tx_service->transaction(function(){ - $res = true; - $remote_address = $this->ip_helper->getCurrentUserIpAddress(); - try { - - if($this->isIPAddressWhitelisted($remote_address)) return true; - - //check if banned ip is on cache ... - if ($this->cache_service->incCounterIfExists($remote_address)) { - $this->counter_measure->trigger(); - return false; - } - //check on db - if (!is_null($banned_ip = $this->banned_ip_repository->getByIp($remote_address))) { - // banned ip exists on DB, set lock - $this->lock_manager_service->acquireLock("lock.ip." . $remote_address); - try { - //check lifetime - $issued = $banned_ip->getCreatedAt(); - $utc_now = gmdate("Y-m-d H:i:s", time()); - $utc_now = DateTime::createFromFormat("Y-m-d H:i:s", $utc_now); - //get time lived on seconds - $time_lived_seconds = abs($utc_now->getTimestamp() - $issued->getTimestamp()); - if ($time_lived_seconds >= intval($this->server_configuration_service->getConfigValue("BlacklistSecurityPolicy.BannedIpLifeTimeSeconds"))) { - //void banned ip - $this->banned_ip_repository->delete($banned_ip); - return true; - } - - $banned_ip->updateHits(); - //save ip on cache - $this->cache_service->addSingleValue($banned_ip->getIp(), $banned_ip->getHits(), - intval($this->server_configuration_service->getConfigValue("BlacklistSecurityPolicy.BannedIpLifeTimeSeconds") - $time_lived_seconds)); - } catch (Exception $ex) { - Log::error($ex); - } - //release lock - $this->lock_manager_service->releaseLock("lock.ip." . $remote_address); - $this->counter_measure->trigger(); - - return false; - } - } catch (UnacquiredLockException $ex1) { - Log::error($ex1); - $res = false; - } catch (Exception $ex) { - Log::error($ex); - $res = false; - } - return $res; - }); - - } - - /** - * @param Exception $ex - * @throws Exception - * @return $this - */ - public function apply(Exception $ex) - { - return $this->tx_service->transaction(function() use($ex){ - try - { - $remote_ip = $this->ip_helper->getCurrentUserIpAddress(); - $exception_class = get_class($ex); - - //check exception count by type on last "MinutesWithoutExceptions" minutes... - $exception_count = $this->user_exception_trail_repository->getCountByIPTypeOfLatestUserExceptions - ( - $remote_ip, - $exception_class, - $this->server_configuration_service->getConfigValue("BlacklistSecurityPolicy.MinutesWithoutExceptions") - ); - - if (array_key_exists($exception_class, $this->exception_dictionary)) - { - $params = $this->exception_dictionary[$exception_class]; - $max_attempts = !is_null($params[0]) && !empty($params[0]) ? intval($this->server_configuration_service->getConfigValue($params[0])) : 0; - - Log::info - ( - sprintf - ( - 'IP %s, - exception_class %s - exception_count %s - max allowed attempts %s', - $remote_ip, - $exception_class, - $exception_count, - $max_attempts - ) - ); - - $initial_delay_on_tar_pit = intval($this->server_configuration_service->getConfigValue($params[1])); - if (!$this->isIPAddressWhiteListed($remote_ip) && $exception_count >= $max_attempts) - { - Log::warning - ( - sprintf - ( - 'banning IP %s, - exception_class %s - exception_count %s - max allowed attempts %s', - $remote_ip, - $exception_class, - $exception_count, - $max_attempts - ) - ); - - $this->createBannedIP($initial_delay_on_tar_pit, $exception_class); - } - } - } - catch (Exception $ex) - { - Log::error($ex); - throw $ex; - } - return $this; - }); - } - - /** - * @param string $ip - * @return bool - */ - private function isIPAddressWhiteListed(string $ip): bool - { - $banning_enable = boolval(Config::get("server.banning_enable", true)); - if(!$banning_enable) return true; - $cache_value = $this->cache_service->getSingleValue($ip.".whitelisted"); - if(!empty($cache_value)) return true; - - $resource_server = $this->resource_server_repository->getByIp($ip); - $white_listed_ip = $this->white_listed_ip_repository->getByIp($ip); - - $white_listed = !is_null($resource_server) || !is_null($white_listed_ip); - if($white_listed) - $this->cache_service->setSingleValue($ip.".whitelisted", $ip.".whitelisted"); - - return $white_listed; - } - -} - - - - diff --git a/app/Services/SecurityPolicies/DelayCounterMeasure.php b/app/Services/SecurityPolicies/DelayCounterMeasure.php deleted file mode 100644 index ffdaa0dd..00000000 --- a/app/Services/SecurityPolicies/DelayCounterMeasure.php +++ /dev/null @@ -1,56 +0,0 @@ -cache_service = $cache_service; - } - - /** - * @param array $params - * @return $this - */ - public function trigger(array $params = []) - { - try { - $remote_address = IPHelper::getUserIp(); - if ($this->cache_service->exists($remote_address)) { - Log::warning(sprintf("DelayCounterMeasure: attempt from banned ip %s",$remote_address)); - $hits = intval($this->cache_service->getSingleValue($remote_address)); - sleep(2 ^ $hits); - } - } catch (Exception $ex) { - Log::error($ex); - } - return $this; - } -} \ No newline at end of file diff --git a/app/Services/SecurityPolicies/LockUserCounterMeasure.php b/app/Services/SecurityPolicies/LockUserCounterMeasure.php deleted file mode 100644 index 8ceab2fd..00000000 --- a/app/Services/SecurityPolicies/LockUserCounterMeasure.php +++ /dev/null @@ -1,91 +0,0 @@ -user_service = $user_service; - $this->server_configuration = $server_configuration; - $this->repository = $repository; - $this->tx_service = $tx_service; - } - - /** - * @param array $params - * @return $this - */ - public function trigger(array $params = []) - { - return $this->tx_service->transaction(function() use($params){ - try { - if (isset($params["user_id"])) { - $user_id = $params["user_id"]; - $user = $this->repository->getById($user_id); - if (!is_null($user) && $user instanceof User) { - //apply lock policy - if (intval($user->getLoginFailedAttempt()) < intval($this->server_configuration->getConfigValue("MaxFailed.Login.Attempts"))) { - $this->user_service->updateFailedLoginAttempts($user->getId()); - return $this; - } - $this->user_service->lockUser($user->getId()); - } - } - } catch (Exception $ex) { - Log::error($ex); - } - return $this; - }); - } -} \ No newline at end of file diff --git a/app/Services/SecurityPolicies/LockUserSecurityPolicy.php b/app/Services/SecurityPolicies/LockUserSecurityPolicy.php deleted file mode 100644 index 15afc324..00000000 --- a/app/Services/SecurityPolicies/LockUserSecurityPolicy.php +++ /dev/null @@ -1,66 +0,0 @@ -counter_measure = $counter_measure; - return $this; - } - - /** - * Apply security policy on a exception - * @param Exception $ex - * @return $this - */ - public function apply(Exception $ex) - { - try { - if($ex instanceof AuthenticationInvalidPasswordAttemptException) { - $user_id = $ex->getUserId(); - if (!is_null($user_id) && !empty($user_id)) - $this->counter_measure->trigger(['user_id' => $user_id]); - } - } catch (Exception $ex) { - Log::error($ex); - } - return $this; - } -} \ No newline at end of file diff --git a/app/Services/SecurityPolicies/OAuth2LockClientCounterMeasure.php b/app/Services/SecurityPolicies/OAuth2LockClientCounterMeasure.php deleted file mode 100644 index c30676ed..00000000 --- a/app/Services/SecurityPolicies/OAuth2LockClientCounterMeasure.php +++ /dev/null @@ -1,54 +0,0 @@ -client_service = $client_service; - } - - /** - * @param array $params - * @return $this - */ - public function trigger(array $params = []) - { - try{ - - if (isset($params["client_id"])) { - $this->client_service->lockClient(intval($params['client_id'])); - } - } - catch(Exception $ex){ - Log::error($ex); - } - return $this; - } -} \ No newline at end of file diff --git a/app/Services/SecurityPolicies/OAuth2SecurityPolicy.php b/app/Services/SecurityPolicies/OAuth2SecurityPolicy.php deleted file mode 100644 index 48f52ffc..00000000 --- a/app/Services/SecurityPolicies/OAuth2SecurityPolicy.php +++ /dev/null @@ -1,162 +0,0 @@ -server_configuration_service = $server_configuration_service; - $this->client_repository = $client_repository; - $this->ip_helper = $ip_helper; - $this->user_exception_trail_repository = $user_exception_trail_repository; - $this->tx_service = $tx_service; - - $this->exception_dictionary = [ - BearerTokenDisclosureAttemptException::class => ['OAuth2SecurityPolicy.MaxBearerTokenDisclosureAttempts'], - InvalidClientException::class => ['OAuth2SecurityPolicy.MaxInvalidClientExceptionAttempts'], - InvalidRedeemAuthCodeException::class => ['OAuth2SecurityPolicy.MaxInvalidRedeemAuthCodeAttempts'], - InvalidClientCredentials::class => ['OAuth2SecurityPolicy.MaxInvalidClientCredentialsAttempts'], - ]; - } - /** - * Check if current security policy is meet or not - * @return boolean - */ - public function check() - { - return true; - } - - /** - * Apply security policy on a exception - * @param Exception $ex - * @return $this - */ - public function apply(Exception $ex) - { - return $this->tx_service->transaction(function () use ($ex) { - try { - if($ex instanceof OAuth2ClientBaseException){ - $client_id = $ex->getClientId(); - //save oauth2 exception by client id - if (!is_null($client_id) && !empty($client_id)){ - $client = $this->client_repository->getClientById($client_id); - if(!is_null($client)) { - $exception_class = get_class($ex); - $trail = new OAuth2TrailException(); - $trail->setFromIp($this->ip_helper->getCurrentUserIpAddress()); - $trail->setExceptionType($exception_class); - $trail->setClient($client); - - $this->user_exception_trail_repository->add($trail, true); - //check exception count by type on last "MinutesWithoutExceptions" minutes... - $exception_count = $this->user_exception_trail_repository->getCountByIPTypeOfLatestUserExceptions - ( - $client, - $exception_class, - $this->server_configuration_service->getConfigValue("OAuth2SecurityPolicy.MinutesWithoutExceptions") - ); - - if(array_key_exists($exception_class,$this->exception_dictionary)){ - $params = $this->exception_dictionary[$exception_class]; - $max_attempts = !is_null($params[0]) && !empty($params[0])? intval($this->server_configuration_service->getConfigValue($params[0])):0; - if ($exception_count >= $max_attempts) - $this->counter_measure->trigger(['client_id' => $client->getId()]); - } - } - } - } - - } catch (Exception $ex) { - Log::error($ex); - } - return $this; - }); - } - - /** - * @param ISecurityPolicyCounterMeasure $counter_measure - * @return $this - */ - public function setCounterMeasure(ISecurityPolicyCounterMeasure $counter_measure) - { - $this->counter_measure = $counter_measure; - return $this; - } -} \ No newline at end of file diff --git a/app/Services/SecurityPolicies/RevokeAuthorizationCodeRelatedTokens.php b/app/Services/SecurityPolicies/RevokeAuthorizationCodeRelatedTokens.php deleted file mode 100644 index 05588e26..00000000 --- a/app/Services/SecurityPolicies/RevokeAuthorizationCodeRelatedTokens.php +++ /dev/null @@ -1,59 +0,0 @@ -token_service = $token_service; - } - - /** - * @param array $params - * @return $this - */ - public function trigger(array $params = []) - { - try { - if (isset($params["auth_code"])) { - $auth_code = $params["auth_code"]; - $this->token_service->revokeAuthCodeRelatedTokens($auth_code); - } - } catch (Exception $ex) { - Log::error($ex); - } - return $this; - } -} \ No newline at end of file diff --git a/app/Services/ServicesProvider.php b/app/Services/ServicesProvider.php deleted file mode 100644 index 5c46baa8..00000000 --- a/app/Services/ServicesProvider.php +++ /dev/null @@ -1,122 +0,0 @@ -setCounterMeasure($delay_counter_measure); - - $revoke_tokens_counter_measure = App::make(\Services\SecurityPolicies\RevokeAuthorizationCodeRelatedTokens::class); - - $authorization_code_redeem_Policy = App::make(\Services\SecurityPolicies\AuthorizationCodeRedeemPolicy::class); - $authorization_code_redeem_Policy->setCounterMeasure($revoke_tokens_counter_measure); - - $lock_user_counter_measure = App::make(\Services\SecurityPolicies\LockUserCounterMeasure::class); - - $lock_user_security_policy = App::make(\Services\SecurityPolicies\LockUserSecurityPolicy::class); - $lock_user_security_policy->setCounterMeasure($lock_user_counter_measure); - - $oauth2_lock_client_counter_measure = App::make(\Services\SecurityPolicies\OAuth2LockClientCounterMeasure::class); - $oauth2_security_policy = App::make(\Services\SecurityPolicies\OAuth2SecurityPolicy::class); - $oauth2_security_policy->setCounterMeasure($oauth2_lock_client_counter_measure); - - $checkpoint_service = new CheckPointService - ( - App::make(IUserExceptionTrailRepository::class), - App::make(ITransactionService::class) - ); - - $checkpoint_service->addPolicy($blacklist_security_policy); - $checkpoint_service->addPolicy($lock_user_security_policy); - $checkpoint_service->addPolicy($authorization_code_redeem_Policy); - $checkpoint_service->addPolicy($oauth2_security_policy); - return $checkpoint_service; - }); - - App::singleton(IUserService::class, UserService::class); - App::singleton(IGroupService::class, GroupService::class); - App::singleton(IDisqusSSOService::class, DisqusSSOService::class); - App::singleton(IRocketChatSSOService::class, RocketChatSSOService::class); - App::singleton(IRocketChatAPI::class, RocketChatAPI::class); - App::singleton(IStreamChatSSOService::class, StreamChatSSOService::class); - } - - public function provides() - { - return [ - IUserActionService::class, - \Services\SecurityPolicies\DelayCounterMeasure::class, - \Services\SecurityPolicies\LockUserCounterMeasure::class, - \Services\SecurityPolicies\RevokeAuthorizationCodeRelatedTokens::class, - \Services\SecurityPolicies\BlacklistSecurityPolicy::class, - \Services\SecurityPolicies\LockUserSecurityPolicy::class, - \Services\SecurityPolicies\OAuth2LockClientCounterMeasure::class, - IUserService::class, - IGroupService::class, - OAuth2SecurityPolicy::class, - AuthorizationCodeRedeemPolicy::class, - UtilsServiceCatalog::CheckPointService, - IUserService::class, - IDisqusSSOService::class, - IRocketChatSSOService::class, - IRocketChatAPI::class, - IStreamChatSSOService::class, - ]; - } -} \ No newline at end of file diff --git a/app/Services/UserActionService.php b/app/Services/UserActionService.php deleted file mode 100644 index 042f9aaf..00000000 --- a/app/Services/UserActionService.php +++ /dev/null @@ -1,72 +0,0 @@ -user_repository = $user_repository; - $this->tx_service = $tx_service; - } - - /** - * @param int $user_id - * @param string $ip - * @param string $user_action - * @param null|string $realm - * @return UserAction - */ - public function addUserAction($user_id, $ip, $user_action, $realm = null): UserAction - { - return $this->tx_service->transaction(function () use ($user_id, $ip, $user_action, $realm) { - - $action = new UserAction(); - $action->setFromIp($ip); - $action->setUserAction($user_action); - if(!empty($realm)) - $action->setRealm($realm); - $user = $this->user_repository->getById($user_id); - if (is_null($user)) - throw new EntityNotFoundException(); - - $user->addUserAction($action); - - return $action; - }); - - } -} \ No newline at end of file diff --git a/app/Services/Utils/BannedIPService.php b/app/Services/Utils/BannedIPService.php deleted file mode 100644 index 4666f3f8..00000000 --- a/app/Services/Utils/BannedIPService.php +++ /dev/null @@ -1,172 +0,0 @@ -cache_service = $cache_service; - $this->server_configuration_service = $server_configuration_service; - $this->ip_helper = $ip_helper; - $this->banned_ip_repository = $banned_ip_repository; - $this->auth_service = $auth_service; - } - - /** - * @param int $initial_hits - * @param string $exception_type - * @return BannedIP - * @throws Exception - */ - public function add(int $initial_hits, string $exception_type):BannedIP - { - return $this->tx_service->transaction(function() use ($initial_hits, $exception_type) { - $banned_ip = null; - try { - $remote_address = $this->ip_helper->getCurrentUserIpAddress(); - //try to create on cache - $this->cache_service->addSingleValue($remote_address, $initial_hits, - intval($this->server_configuration_service->getConfigValue("BlacklistSecurityPolicy.BannedIpLifeTimeSeconds"))); - - $banned_ip = $this->banned_ip_repository->getByIp($remote_address); - if (is_null($banned_ip)) { - $banned_ip = new BannedIP(); - $banned_ip->setHits($remote_address); - } - $banned_ip->setExceptionType($exception_type); - $banned_ip->setHits($initial_hits); - - if (Auth::check()) { - $banned_ip->setUser(Auth::user()); - } - - if($banned_ip->isNew()) - $this->banned_ip_repository->add($banned_ip); - - - } - catch (Exception $ex) { - Log::error($ex); - } - return $banned_ip; - }); - } - - /** - * @param string $ip - * @throws Exception - */ - public function deleteByIP(string $ip):void - { - $this->tx_service->transaction(function () use ($ip) { - $banned_ip = $this->banned_ip_repository->getByIp($ip); - if(is_null($banned_ip)) - throw new EntityNotFoundException(); - - $this->banned_ip_repository->delete($banned_ip); - $this->cache_service->delete($ip); - }); - } - - /** - * @param array $payload - * @return IEntity - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function create(array $payload): IEntity - { - // TODO: Implement create() method. - } - - /** - * @param int $id - * @param array $payload - * @return IEntity - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function update(int $id, array $payload): IEntity - { - // TODO: Implement update() method. - } - - /** - * @param int $id - * @throws ValidationException - * @throws EntityNotFoundException - */ - public function delete(int $id): void - { - // TODO: Implement delete() method. - } -} \ No newline at end of file diff --git a/app/Services/Utils/CheckPointService.php b/app/Services/Utils/CheckPointService.php deleted file mode 100644 index 9367afae..00000000 --- a/app/Services/Utils/CheckPointService.php +++ /dev/null @@ -1,116 +0,0 @@ -policies = []; - $this->tx_service = $tx_service; - $this->user_exception_trail_repository = $user_exception_trail_repository; - } - - public function check() - { - $res = false; - try { - foreach ($this->policies as $policy) { - $res = $policy->check(); - if (!$res) break; - } - } catch (Exception $ex) { - Log::error($ex); - } - return $res; - } - - /** - * @param Exception $ex - * @throws Exception - */ - public function trackException(Exception $ex):void - { - $this->tx_service->transaction(function() use($ex){ - try { - $remote_ip = IPHelper::getUserIp(); - $class_name = get_class($ex); - $user_trail = new UserExceptionTrail(); - $user_trail->setFromIp($remote_ip); - $user_trail->setExceptionType($class_name); - $user_trail->setStackTrace($ex->getTraceAsString()); - if(Auth::check()){ - $currentUser = Auth::user(); - if($currentUser instanceof User && !$currentUser->isNew()) - $user_trail->setUser($currentUser); - } - $this->user_exception_trail_repository->add($user_trail, true); - - Log::warning(sprintf("* CheckPointService - exception : << %s >> - IP Address: %s",$ex->getMessage(),$remote_ip)); - //applying policies - foreach ($this->policies as $policy) { - $policy->apply($ex); - } - } catch (Exception $ex) { - Log::error($ex); - } - }); - } - - /** - * @param ISecurityPolicy $policy - * @return $this - */ - public function addPolicy(ISecurityPolicy $policy) - { - $this->policies[] = $policy; - return $this; - } -} diff --git a/app/Services/Utils/DoctrineTransactionService.php b/app/Services/Utils/DoctrineTransactionService.php deleted file mode 100644 index 6ad01f37..00000000 --- a/app/Services/Utils/DoctrineTransactionService.php +++ /dev/null @@ -1,104 +0,0 @@ -manager_name = $manager_name; - } - - /** - * Execute a Closure within a transaction. - * - * @param Closure $callback - * @return mixed - * - * @throws \Exception - */ - public function transaction(Closure $callback) - { - $retry = 0; - $done = false; - $result = null; - - while (!$done and $retry < self::MaxRetries) { - try { - $em = Registry::getManager($this->manager_name); - $con = $em->getConnection(); - - /** - * Some database systems close the connection after a period of time, in MySQL this is system variable - * `wait_timeout`. Given the daemon is meant to run indefinitely we need to make sure we have an open - * connection before working any job. Otherwise we would see `MySQL has gone away` type errors. - */ - - if ($con->ping() === false) { - $con->close(); - $con->connect(); - } - - if (!$em->isOpen()) { - Log::warning("DoctrineTransactionService::transaction: entity manager is closed!, trying to re open..."); - $em = Registry::resetManager($this->manager_name); - // new entity manager - $con = $em->getConnection(); - } - - $con->beginTransaction(); // suspend auto-commit - $result = $callback($this); - $em->flush(); - $con->commit(); - $done = true; - } catch (RetryableException $ex) { - Log::warning("retrying ..."); - Registry::resetManager($this->manager_name); - $con->rollBack(); - Log::warning($ex); - $retry++; - if ($retry === self::MaxRetries) { - throw $ex; - } - } catch (Exception $ex) { - Log::warning("rolling back transaction"); - $em->close(); - $con->rollBack(); - Log::warning($ex); - throw $ex; - } - } - - return $result; - } -} \ No newline at end of file diff --git a/app/Services/Utils/ExternalUrlService.php b/app/Services/Utils/ExternalUrlService.php deleted file mode 100644 index ac55ba1d..00000000 --- a/app/Services/Utils/ExternalUrlService.php +++ /dev/null @@ -1,44 +0,0 @@ -isMobile() ? Config::get("app.registration_mobile_url", "#") : Config::get("app.registration_url", "#") ; - - } - - /** - * @return string - */ - public function getVerifyAccountUrl(){ - return Config::get("app.resend_verification_url","#"); - } - - /** - * @return string - */ - public function getForgotPasswordUrl(){ - return Config::get("app.lost_password_url","#"); - } -} \ No newline at end of file diff --git a/app/Services/Utils/LockManagerService.php b/app/Services/Utils/LockManagerService.php deleted file mode 100644 index 7b85f6cd..00000000 --- a/app/Services/Utils/LockManagerService.php +++ /dev/null @@ -1,95 +0,0 @@ -cache_service = $cache_service; - } - - /** - * @param string $name - * @param int $lifetime - * @return $this - * @throws UnacquiredLockException - */ - public function acquireLock($name,$lifetime = 3600) - { - $time = time()+$lifetime+1; - $success = $this->cache_service->addSingleValue($name, $time, $time); - if (!$success) - { - // only one time we could use this handle - throw new UnacquiredLockException(sprintf("lock name %s",$name)); - } - return $this; - } - - /** - * @param string $name - * @return $this - */ - public function releaseLock($name) - { - $this->cache_service->delete($name); - return $this; - } - - /** - * @param string $name - * @param Closure $callback - * @param int $lifetime - * @return null - * @throws UnacquiredLockException - * @throws Exception - */ - public function lock($name, Closure $callback, $lifetime = 3600) - { - $result = null; - - try - { - $this->acquireLock($name, $lifetime); - $result = $callback($this); - $this->releaseLock($name); - } - catch(UnacquiredLockException $ex1) - { - throw $ex1; - } - catch(Exception $ex) - { - $this->releaseLock($name); - throw $ex; - } - return $result; - } -} \ No newline at end of file diff --git a/app/Services/Utils/LogService.php b/app/Services/Utils/LogService.php deleted file mode 100644 index 6e501807..00000000 --- a/app/Services/Utils/LogService.php +++ /dev/null @@ -1,53 +0,0 @@ -redis = Redis::connection(); - } - - public function boot() - { - if (is_null($this->redis)) - { - $this->redis = Redis::connection(); - } - } - - /** - * @param $key - * @return mixed - */ - public function delete($key) - { - $res = 0; - if ($this->redis->exists($key)) { - $res = $this->redis->del($key); - } - return $res; - } - - public function deleteArray(array $keys){ - if(count($keys)>0) - $this->redis->del($keys); - } - - /** - * @param $key - * @return bool - */ - public function exists($key){ - $res = $this->redis->exists($key); - return $res>0; - } - - /** - * @param $name - * @param array $values - * @return mixed - */ - public function getHash($name, array $values) - { - $res = []; - if($this->redis->exists($name)){ - $cache_values = $this->redis->hmget($name,$values); - for($i=0;$iredis->exists($name)){ - $this->redis->hmset($name, $values); - $res = true; - //sets expiration time - if($ttl>0) $this->redis->expire($name, $ttl); - } - return $res; - } - - public function incCounter($counter_name, $ttl = 0) - { - if($this->redis->setnx($counter_name,1)) { - $this->redis->expire($counter_name, $ttl); - return 1; - } - else - return (int)$this->redis->incr($counter_name); - } - - public function incCounterIfExists($counter_name){ - $res = false; - if ($this->redis->exists($counter_name)) { - $this->redis->incr($counter_name); - $res = true; - } - return $res; - } - - public function addMemberSet($set_name, $member){ - return $this->redis->sadd($set_name, $member); - } - - public function deleteMemberSet($set_name,$member){ - return $this->redis->srem($set_name,$member); - } - - public function getSet($set_name){ - return $this->redis->smembers($set_name); - } - - public function getSingleValue($key){ - return $this->redis->get($key); - } - - public function setSingleValue($key,$value,$ttl = 0){ - if($ttl>0) - return $this->redis->setex($key , $ttl, $value); - else - return $this->redis->set($key ,$value); - } - - public function addSingleValue($key, $value, $ttl = 0){ - //http://redis.io/commands/setnx - $res = $this->redis->setnx($key , $value); - if($res && $ttl>0) - $this->redis->expire($key,$ttl); - return $res; - } - - public function setKeyExpiration($key, $ttl){ - $this->redis->expire($key, intval($ttl)); - } - - /**Returns the remaining time to live of a key that has a timeout. - * @param string $key - * @return int - */ - public function ttl($key) - { - return (int)$this->redis->ttl($key); - } -} \ No newline at end of file diff --git a/app/Services/Utils/ServerConfigurationService.php b/app/Services/Utils/ServerConfigurationService.php deleted file mode 100644 index e256eeb1..00000000 --- a/app/Services/Utils/ServerConfigurationService.php +++ /dev/null @@ -1,252 +0,0 @@ -cache_service = $cache_service; - $this->server_config_repository = $server_config_repository; - $this->default_config_params = []; - //default config values - - //general - $this->default_config_params["MaxFailed.Login.Attempts"] = Config::get('server.MaxFailed_Login_Attempts', 10); - $this->default_config_params["SupportEmail"] = Config::get('server.support_email', 'info@openstack.org'); - - $this->default_config_params["MaxFailed.LoginAttempts.2ShowCaptcha"] = Config::get('server.MaxFailed_LoginAttempts_2ShowCaptcha', - 3); - $this->default_config_params["Assets.Url"] = Config::get('server.assets_base_url', self::DefaultAssetsUrl ); - // remember me cookie lifetime (minutes) - $this->default_config_params["Remember.ExpirationTime"] = Config::get('Remember.ExpirationTime', 120); - - //openid - $this->default_config_params["OpenId.Private.Association.Lifetime"] = Config::get('server.OpenId_Private_Association_Lifetime', - 240); - $this->default_config_params["OpenId.Session.Association.Lifetime"] = Config::get('server.OpenId_Session_Association_Lifetime', - 21600); - $this->default_config_params["OpenId.Nonce.Lifetime"] = Config::get('server.OpenId_Nonce_Lifetime', 360); - - //policies - $this->default_config_params["BlacklistSecurityPolicy.BannedIpLifeTimeSeconds"] = Config::get('server.BlacklistSecurityPolicy_BannedIpLifeTimeSeconds', - 21600); - $this->default_config_params["BlacklistSecurityPolicy.MinutesWithoutExceptions"] = Config::get('server.BlacklistSecurityPolicy_MinutesWithoutExceptions', - 5);; - $this->default_config_params["BlacklistSecurityPolicy.ReplayAttackExceptionInitialDelay"] = Config::get('server.BlacklistSecurityPolicy_ReplayAttackExceptionInitialDelay', - 10); - $this->default_config_params["BlacklistSecurityPolicy.MaxInvalidNonceAttempts"] = Config::get('server.BlacklistSecurityPolicy_MaxInvalidNonceAttempts', - 10); - $this->default_config_params["BlacklistSecurityPolicy.InvalidNonceInitialDelay"] = Config::get('server.BlacklistSecurityPolicy_InvalidNonceInitialDelay', - 10); - $this->default_config_params["BlacklistSecurityPolicy.MaxInvalidOpenIdMessageExceptionAttempts"] = Config::get('server.BlacklistSecurityPolicy_MaxInvalidOpenIdMessageExceptionAttempts', - 10); - $this->default_config_params["BlacklistSecurityPolicy.InvalidOpenIdMessageExceptionInitialDelay"] = Config::get('server.BlacklistSecurityPolicy_InvalidOpenIdMessageExceptionInitialDelay', - 10); - $this->default_config_params["BlacklistSecurityPolicy.MaxOpenIdInvalidRealmExceptionAttempts"] = Config::get('server.BlacklistSecurityPolicy_MaxOpenIdInvalidRealmExceptionAttempts', - 10); - $this->default_config_params["BlacklistSecurityPolicy.OpenIdInvalidRealmExceptionInitialDelay"] = Config::get('server.BlacklistSecurityPolicy_OpenIdInvalidRealmExceptionInitialDelay', - 10); - $this->default_config_params["BlacklistSecurityPolicy.MaxInvalidOpenIdMessageModeAttempts"] = Config::get('server.BlacklistSecurityPolicy_MaxInvalidOpenIdMessageModeAttempts', - 10); - $this->default_config_params["BlacklistSecurityPolicy.InvalidOpenIdMessageModeInitialDelay"] = Config::get('server.BlacklistSecurityPolicy_InvalidOpenIdMessageModeInitialDelay', - 10); - $this->default_config_params["BlacklistSecurityPolicy.MaxInvalidOpenIdAuthenticationRequestModeAttempts"] = Config::get('server.BlacklistSecurityPolicy_MaxInvalidOpenIdAuthenticationRequestModeAttempts', - 10); - $this->default_config_params["BlacklistSecurityPolicy.InvalidOpenIdAuthenticationRequestModeInitialDelay"] = Config::get('server.BlacklistSecurityPolicy_InvalidOpenIdAuthenticationRequestModeInitialDelay', - 10); - $this->default_config_params["BlacklistSecurityPolicy.MaxAuthenticationExceptionAttempts"] = Config::get('server.BlacklistSecurityPolicy_MaxAuthenticationExceptionAttempts', - 10); - $this->default_config_params["BlacklistSecurityPolicy.AuthenticationExceptionInitialDelay"] = Config::get('server.BlacklistSecurityPolicy_AuthenticationExceptionInitialDelay', - 20); - $this->default_config_params["BlacklistSecurityPolicy.MaxInvalidAssociationAttempts"] = Config::get('server.BlacklistSecurityPolicy_MaxInvalidAssociationAttempts', - 10); - $this->default_config_params["BlacklistSecurityPolicy.InvalidAssociationInitialDelay"] = Config::get('server.BlacklistSecurityPolicy_InvalidAssociationInitialDelay', - 20); - - //oauth2 - $this->default_config_params["OAuth2.Enable"] = Config::get('server.OAuth2_Enable', false); - $this->default_config_params["BlacklistSecurityPolicy.OAuth2.MaxAuthCodeReplayAttackAttempts"] = Config::get('server.BlacklistSecurityPolicy_OAuth2_MaxAuthCodeReplayAttackAttempts', - 3); - $this->default_config_params["BlacklistSecurityPolicy.OAuth2.AuthCodeReplayAttackInitialDelay"] = Config::get('server.BlacklistSecurityPolicy_OAuth2_AuthCodeReplayAttackInitialDelay', - 10); - - $this->default_config_params["BlacklistSecurityPolicy.OAuth2.MaxInvalidAuthorizationCodeAttempts"] = Config::get('server.BlacklistSecurityPolicy_OAuth2_MaxInvalidAuthorizationCodeAttempts', - 3); - $this->default_config_params["BlacklistSecurityPolicy.OAuth2.InvalidAuthorizationCodeInitialDelay"] = Config::get('server.BlacklistSecurityPolicy_OAuth2_InvalidAuthorizationCodeInitialDelay', - 10); - - $this->default_config_params["BlacklistSecurityPolicy.OAuth2.MaxInvalidBearerTokenDisclosureAttempt"] = Config::get('server.BlacklistSecurityPolicy_OAuth2_MaxInvalidBearerTokenDisclosureAttempt', - 3); - $this->default_config_params["BlacklistSecurityPolicy.OAuth2.BearerTokenDisclosureAttemptInitialDelay"] = Config::get('server.BlacklistSecurityPolicy_OAuth2_BearerTokenDisclosureAttemptInitialDelay', - 10); - - - $this->default_config_params["OAuth2.AuthorizationCode.Lifetime"] = Config::get('server.OAuth2_AuthorizationCode_Lifetime', 240); - $this->default_config_params["OAuth2.AccessToken.Lifetime"] = Config::get('server.OAuth2_AccessToken_Lifetime', 3600); - $this->default_config_params["OAuth2.IdToken.Lifetime"] = Config::get('server.OAuth2_IdToken_Lifetime', 3600); - //infinite by default - $this->default_config_params["OAuth2.RefreshToken.Lifetime"] = Config::get('server.OAuth2_RefreshToken_Lifetime', 0); - //revoked lifetimes - $this->default_config_params["OAuth2.AccessToken.Revoked.Lifetime"] = Config::get('server.OAuth2_AccessToken_Revoked_Lifetime', 3600); - $this->default_config_params["OAuth2.AccessToken.Void.Lifetime"] = Config::get('server.OAuth2_AccessToken_Void_Lifetime', 3600); - $this->default_config_params["OAuth2.RefreshToken.Revoked.Lifetime"] = Config::get('server.OAuth2_RefreshToken_Revoked_Lifetime', 3600); - - //oauth2 policy defaults - $this->default_config_params["OAuth2SecurityPolicy.MinutesWithoutExceptions"] = Config::get('server.OAuth2SecurityPolicy_MinutesWithoutExceptions', 2); - $this->default_config_params["OAuth2SecurityPolicy.MaxBearerTokenDisclosureAttempts"] = Config::get('server.OAuth2SecurityPolicy_MaxBearerTokenDisclosureAttempts', 5); - $this->default_config_params["OAuth2SecurityPolicy.MaxInvalidClientExceptionAttempts"] = Config::get('server.OAuth2SecurityPolicy_MaxInvalidClientExceptionAttempts', 10); - $this->default_config_params["OAuth2SecurityPolicy.MaxInvalidRedeemAuthCodeAttempts"] = Config::get('server.OAuth2SecurityPolicy_MaxInvalidRedeemAuthCodeAttempts', 10); - $this->default_config_params["OAuth2SecurityPolicy.MaxInvalidClientCredentialsAttempts"] = Config::get('server.OAuth2SecurityPolicy_MaxInvalidClientCredentialsAttempts', 5); - //ssl - $this->default_config_params["SSL.Enable"] = Config::get('server.SSL_Enable', true); - } - - public function getUserIdentityEndpointURL($identifier) - { - return action("UserController@getIdentity", array("identifier" => $identifier)); - } - - public function getOPEndpointURL() - { - return action("OpenId\OpenIdProviderController@endpoint"); - } - - /** - * get config value from cache and if not in cache check for it on table server_configuration - * @param $key - * @return mixed - */ - public function getConfigValue($key) - { - - return $this->tx_service->transaction(function () use ($key) { - $res = null; - try { - if (!$this->cache_service->exists($key)) { - if (!is_null($conf = $this->server_config_repository->getByKey($key))) { - $this->cache_service->addSingleValue($key, $conf->getValue()); - return $conf->getValue(); - } - - if (isset($this->default_config_params[$key])) { - $this->cache_service->addSingleValue($key, $this->default_config_params[$key]); - return $this->default_config_params[$key]; - } - - return null; - } - - $res = $this->cache_service->getSingleValue($key); - - } - catch (Exception $ex) { - Log::error($ex); - if (isset($this->default_config_params[$key])) { - $res = $this->default_config_params[$key]; - } - } - - return $res; - }); - - } - - public function getAllConfigValues() - { - // TODO: Implement getAllConfigValues() method. - } - - /** - * @param string $key - * @param $value - * @return mixed|void - * @throws Exception - */ - public function saveConfigValue(string $key, $value) - { - $this->tx_service->transaction(function () use ($key, $value) { - - $conf = $this->server_config_repository->getByKey($key); - - if (is_null($conf)) { - $conf = new ServerConfiguration(); - $conf->setKey($key); - $conf->setValue($value); - $this->server_config_repository->add($conf); - } else { - $conf->setValue($value); - } - - $this->cache_service->delete($key); - }); - } - - /** - * @return string - */ - public function getSiteUrl() - { - return Config::get('app.url'); - } -} diff --git a/app/Services/Utils/UtilsProvider.php b/app/Services/Utils/UtilsProvider.php deleted file mode 100644 index 8f348a71..00000000 --- a/app/Services/Utils/UtilsProvider.php +++ /dev/null @@ -1,83 +0,0 @@ -user_action_service = $user_action_service; - $this->auth_service = $auth_service; - } - - public function getLogin() - { - if (Auth::guest()) - return View::make("auth.login"); - return Redirect::action("UserController@getProfile"); - } - - public function postLogin() - { - $user = $this->auth_service->getCurrentUser(); - $identifier = $user->getIdentifier(); - $this->user_action_service->addUserAction($this->auth_service->getCurrentUser()->getId(), IPHelper::getUserIp(), IUserActionService::LoginAction); - $default_url = URL::action("UserController@getIdentity", array("identifier" => $identifier)); - return Redirect::intended($default_url); - } - - public function cancelLogin() - { - return Redirect::action("HomeController@index"); - } - - /** - * @param array $params - * @return mixed - */ - public function errorLogin(array $params) - { - $response = Redirect::action('UserController@getLogin') - ->with('max_login_attempts_2_show_captcha', $params['max_login_attempts_2_show_captcha']) - ->with('login_attempts', $params['login_attempts']); - if(isset($params['username'])) - $response= $response->with('username', $params['username']); - if(isset($params['error_message'])) - $response = $response->with('flash_notice', $params['error_message']); - if(isset($params['validator'])) - $response = $response->withErrors($params['validator']); - return $response; - } -} \ No newline at end of file diff --git a/app/Strategies/DirectResponseStrategy.php b/app/Strategies/DirectResponseStrategy.php deleted file mode 100644 index 3aa772bf..00000000 --- a/app/Strategies/DirectResponseStrategy.php +++ /dev/null @@ -1,31 +0,0 @@ -getContent(), $response->getHttpCode()); - $http_response->header('Content-Type', $response->getContentType()); - $http_response->header('Cache-Control','no-cache, no-store, max-age=0, must-revalidate'); - $http_response->header('Pragma','no-cache'); - return $http_response; - } -} \ No newline at end of file diff --git a/app/Strategies/DisplayResponseJsonStrategy.php b/app/Strategies/DisplayResponseJsonStrategy.php deleted file mode 100644 index dc4902c5..00000000 --- a/app/Strategies/DisplayResponseJsonStrategy.php +++ /dev/null @@ -1,97 +0,0 @@ -getSerializer($scope)->serialize(); - } - - $data['required_params'] = array('_token', 'trust'); - $data['required_params_valid_values'] = array - ( - 'trust' => array - ( - IAuthService::AuthorizationResponse_AllowOnce, - IAuthService::AuthorizationResponse_DenyOnce, - ), - '_token' => csrf_token() - ); - $data['optional_params'] = []; - $data['url'] = URL::action('UserController@postConsent'); - $data['method'] = 'POST'; - return Response::json($data, 412); - } - - /** - * @param array $data - * @return SymfonyResponse - */ - public function getLoginResponse(array $data = []) - { - $data['required_params'] = array('username','password', '_token'); - $data['optional_params'] = array('remember'); - $data['url'] = URL::action('UserController@postLogin'); - $data['method'] = 'POST'; - - if(!isset($data['required_params_valid_values'])) - { - $data['required_params_valid_values'] = []; - } - - $data['required_params_valid_values']['_token'] = csrf_token(); - return Response::json($data, 412); - } - - /** - * @param array $data - * @return SymfonyResponse - */ - public function getLoginErrorResponse(array $data = []) - { - if(isset($data['validator']) && $data['validator'] instanceof MessageProvider ) - { - $validator = $data['validator']; - unset($data['validator']); - $data['error_message'] = []; - $errors = $validator->getMessageBag()->getMessages(); - foreach($errors as $e) - { - array_push($data['error_message'],$e[0]); - } - } - return Response::json($data, 412); - } -} \ No newline at end of file diff --git a/app/Strategies/DisplayResponseStrategyFactory.php b/app/Strategies/DisplayResponseStrategyFactory.php deleted file mode 100644 index ff79734e..00000000 --- a/app/Strategies/DisplayResponseStrategyFactory.php +++ /dev/null @@ -1,38 +0,0 @@ -with('max_login_attempts_2_show_captcha', $data['max_login_attempts_2_show_captcha']) - ->with('login_attempts', $data['login_attempts']); - - if(isset($data['username'])) - $response= $response->with('username', $data['username']); - if(isset($data['error_message'])) - $response = $response->with('flash_notice', $data['error_message']); - if(isset($data['validator'])) - $response = $response->withErrors($data['validator']); - - return $response; - } -} \ No newline at end of file diff --git a/app/Strategies/IConsentStrategy.php b/app/Strategies/IConsentStrategy.php deleted file mode 100644 index 67c38a96..00000000 --- a/app/Strategies/IConsentStrategy.php +++ /dev/null @@ -1,17 +0,0 @@ -getContent(); - $return_to = $response->getReturnTo(); - - if (is_null($return_to) || empty($return_to)) { - return Response::view('errors.404', [], 404); - } - $return_to = (strpos($return_to, "?") == false) ? $return_to . "?" . $query_string : $return_to . "&" . $query_string; - - return Redirect::to($return_to) - ->header('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate') - ->header('Pragma','no-cache'); - } -} \ No newline at end of file diff --git a/app/Strategies/IndirectResponseUrlFragmentStrategy.php b/app/Strategies/IndirectResponseUrlFragmentStrategy.php deleted file mode 100644 index e0dea760..00000000 --- a/app/Strategies/IndirectResponseUrlFragmentStrategy.php +++ /dev/null @@ -1,44 +0,0 @@ -getContent(); - $return_to = $response->getReturnTo(); - - if (is_null($return_to) || empty($return_to)) { - return Response::view('errors.404', [], 404);; - } - - $return_to = (strpos($return_to, "#") == false) ? $return_to . "#" . $fragment : $return_to . "&" . $fragment; - - return Redirect::to($return_to) - ->header('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate') - ->header('Pragma','no-cache'); - } -} \ No newline at end of file diff --git a/app/Strategies/OAuth2AuthenticationStrategy.php b/app/Strategies/OAuth2AuthenticationStrategy.php deleted file mode 100644 index 5eccd17e..00000000 --- a/app/Strategies/OAuth2AuthenticationStrategy.php +++ /dev/null @@ -1,32 +0,0 @@ -auth_service = $auth_service; - $this->memento_service = $memento_service; - $this->scope_repository = $scope_repository; - $this->client_repository = $client_repository; - } - - public function getConsent() - { - $auth_request = OAuth2AuthorizationRequestFactory::getInstance()->build - ( - OAuth2Message::buildFromMemento - ( - $this->memento_service->load() - ) - ); - - $client_id = $auth_request->getClientId(); - $client = $this->client_repository->getClientById($client_id); - $scopes = explode(' ',$auth_request->getScope()); - $requested_scopes = $this->scope_repository->getByNames($scopes); - - $data = []; - $data['requested_scopes'] = $requested_scopes; - $data['app_name'] = $client->getApplicationName(); - $data['redirect_to'] = $auth_request->getRedirectUri(); - $data['website'] = $client->getWebsite(); - $data['tos_uri'] = $client->getTermOfServiceUri(); - $data['policy_uri'] = $client->getPolicyUri(); - - $app_logo = $client->getApplicationLogo(); - - $data['app_logo'] = $app_logo; - $data['app_description'] = $client->getApplicationDescription(); - $data['dev_info_email'] = $client->getDeveloperEmail(); - - $response_strategy = DisplayResponseStrategyFactory::build($auth_request->getDisplay()); - - return $response_strategy->getConsentResponse($data); - - } - - public function postConsent($trust_action) - { - $this->auth_service->setUserAuthorizationResponse($trust_action); - return Redirect::action('OAuth2\OAuth2ProviderController@auth'); - } -} \ No newline at end of file diff --git a/app/Strategies/OAuth2LoginStrategy.php b/app/Strategies/OAuth2LoginStrategy.php deleted file mode 100644 index 2f005df7..00000000 --- a/app/Strategies/OAuth2LoginStrategy.php +++ /dev/null @@ -1,119 +0,0 @@ -memento_service = $memento_service; - $this->security_context_service = $security_context_service; - } - - public function getLogin() - { - if (!Auth::guest()) - return Redirect::action("UserController@getProfile"); - - $requested_user_id = $this->security_context_service->get()->getRequestedUserId(); - if (!is_null($requested_user_id)) { - Session::put('username', $this->auth_service->getUserById($requested_user_id)->getEmail()); - Session::save(); - } - - $auth_request = OAuth2AuthorizationRequestFactory::getInstance()->build( - OAuth2Message::buildFromMemento( - $this->memento_service->load() - ) - ); - - $response_strategy = DisplayResponseStrategyFactory::build($auth_request->getDisplay()); - - return $response_strategy->getLoginResponse(); - } - - public function postLogin() - { - $auth_request = OAuth2AuthorizationRequestFactory::getInstance()->build( - OAuth2Message::buildFromMemento( - $this->memento_service->load() - ) - ); - - $this->user_action_service->addUserAction($this->auth_service->getCurrentUser()->getId(), IPHelper::getUserIp(), - IUserActionService::LoginAction, $auth_request->getRedirectUri()); - - return Redirect::action("OAuth2\OAuth2ProviderController@auth"); - } - - public function cancelLogin() - { - $this->auth_service->setUserAuthenticationResponse(IAuthService::AuthenticationResponse_Cancel); - - return Redirect::action("OAuth2\OAuth2ProviderController@auth"); - } - - /** - * @param array $params - * @return mixed - */ - public function errorLogin(array $params) - { - $auth_request = OAuth2AuthorizationRequestFactory::getInstance()->build( - OAuth2Message::buildFromMemento( - $this->memento_service->load() - ) - ); - - $response_strategy = DisplayResponseStrategyFactory::build($auth_request->getDisplay()); - - return $response_strategy->getLoginErrorResponse($params); - } -} \ No newline at end of file diff --git a/app/Strategies/OpenIdAuthenticationStrategy.php b/app/Strategies/OpenIdAuthenticationStrategy.php deleted file mode 100644 index 5e09cb48..00000000 --- a/app/Strategies/OpenIdAuthenticationStrategy.php +++ /dev/null @@ -1,50 +0,0 @@ -memento_service = $memento_service; - $this->auth_service = $auth_service; - $this->server_configuration_service = $server_configuration_service; - $this->user_action_service = $user_action_service; - } - - public function getConsent() - { - $data = $this->getViewData(); - return View::make("openid.consent", $data); - } - - /** - * @return array - * @throws InvalidRequestContextException - */ - private function getViewData() - { - $context = Session::get('openid.auth.context'); - - if (is_null($context)) - throw new InvalidRequestContextException(); - - $partial_views = $context->getPartials(); - $data = []; - $request = OpenIdMessage::buildFromMemento( $this->memento_service->load()); - $user = $this->auth_service->getCurrentUser(); - $data['realm'] = $request->getParam(OpenIdProtocol::OpenIDProtocol_Realm); - $data['openid_url'] = $this->server_configuration_service->getUserIdentityEndpointURL($user->getIdentifier()); - $data['views'] = $partial_views; - return $data; - } - - /** - * @param $trust_action - * @return mixed - * @throws InvalidOpenIdMessageException - */ - public function postConsent($trust_action) - { - if (is_array($trust_action)) { - $msg = OpenIdMessage::buildFromMemento( $this->memento_service->load()); - if (is_null($msg) || !$msg->isValid()) - throw new InvalidOpenIdMessageException(); - $this->user_action_service->addUserAction($this->auth_service->getCurrentUser()->getId(), IPHelper::getUserIp(), IUserActionService::ConsentAction, $msg->getParam(OpenIdProtocol::OpenIDProtocol_Realm)); - $this->auth_service->setUserAuthorizationResponse($trust_action[0]); - Session::remove('openid.auth.context'); - Session::save(); - return Redirect::action('OpenId\OpenIdProviderController@endpoint'); - } - return Redirect::action('UserController@getConsent'); - } -} \ No newline at end of file diff --git a/app/Strategies/OpenIdLoginStrategy.php b/app/Strategies/OpenIdLoginStrategy.php deleted file mode 100644 index 41dc439d..00000000 --- a/app/Strategies/OpenIdLoginStrategy.php +++ /dev/null @@ -1,93 +0,0 @@ -memento_service = $memento_service; - - parent::__construct($user_action_service, $auth_service); - } - - public function getLogin() - { - if (Auth::guest()) { - $msg = OpenIdMessage::buildFromMemento($this->memento_service->load()); - $auth_request = new OpenIdAuthenticationRequest($msg); - $params = array('realm' => $auth_request->getRealm()); - - if (!$auth_request->isIdentitySelectByOP()) { - $params['claimed_id'] = $auth_request->getClaimedId(); - $params['identity'] = $auth_request->getIdentity(); - $params['identity_select'] = false; - } else { - $params['identity_select'] = true; - } - - return View::make("auth.login", $params); - } - return Redirect::action("UserController@getProfile"); - } - - public function postLogin() - { - //go to authentication flow again - $msg = OpenIdMessage::buildFromMemento($this->memento_service->load()); - - $this->user_action_service->addUserAction - ( - $this->auth_service->getCurrentUser()->getId(), - IPHelper::getUserIp(), - IUserActionService::LoginAction, - $msg->getParam(OpenIdProtocol::OpenIDProtocol_Realm) - ); - - return Redirect::action("OpenId\OpenIdProviderController@endpoint"); - } - - public function cancelLogin() - { - $this->auth_service->setUserAuthenticationResponse(IAuthService::AuthenticationResponse_Cancel); - - return Redirect::action("OpenId\OpenIdProviderController@endpoint"); - } -} \ No newline at end of file diff --git a/app/Strategies/PostResponseStrategy.php b/app/Strategies/PostResponseStrategy.php deleted file mode 100644 index 453d383e..00000000 --- a/app/Strategies/PostResponseStrategy.php +++ /dev/null @@ -1,35 +0,0 @@ -getContent(), $response->getHttpCode()); - $http_response->header('Content-Type', $response->getContentType()); - $http_response->header('Cache-Control','no-cache, no-store, max-age=0, must-revalidate'); - $http_response->header('Pragma','no-cache'); - return $http_response; - } -} \ No newline at end of file diff --git a/app/Strategies/StrategyProvider.php b/app/Strategies/StrategyProvider.php deleted file mode 100644 index 9fc7eda6..00000000 --- a/app/Strategies/StrategyProvider.php +++ /dev/null @@ -1,66 +0,0 @@ -isImplicit('fail'); - } - - public function validateBoolean($attribute, $value) - { - if (is_bool($value)) { - return true; - } - if (is_int($value)) { - return true; - } - - return strtoupper(trim($value)) == 'TRUE' || strtoupper(trim($value)) == 'FALSE' || strtoupper(trim($value)) == '1' || strtoupper(trim($value)) == '0'; - } - - public function validateText($attribute, $value) - { - $value = trim($value); - - return preg_match("%^[a-zA-Z0-9\s\-\.\,\/\_]+$%i", $value) == 1; - } - - public function validateHttpmethod($attribute, $value) - { - $value = strtoupper(trim($value)); - //'GET', 'HEAD','POST','PUT','DELETE','TRACE','CONNECT','OPTIONS' - $allowed_http_verbs = array( - 'GET' => 'GET', - 'HEAD' => 'HEAD', - 'POST' => 'POST', - 'PUT' => 'PUT', - 'DELETE' => 'DELETE', - 'TRACE' => 'TRACE', - 'CONNECT' => 'CONNECT', - 'OPTIONS' => 'OPTIONS', - ); - - return array_key_exists($value, $allowed_http_verbs); - } - - public function validateRoute($attribute, $value) - { - return true; - } - - public function validateScopename($attribute, $value) - { - $value = trim($value); - - return preg_match("/^[a-zA-Z0-9\-\.\,\:\_\/]+$/", $value) == 1; - } - - public function validateHost($attribute, $value) - { - return filter_var(gethostbyname($value), FILTER_VALIDATE_IP) ? true : false; - } - - public function validateApplicationtype($attribute, $value) - { - - if (!is_string($value)) { - return false; - } - - $value = trim($value); - - return in_array($value, Client::$valid_app_types); - } - - public function validateSslurl($attribute, $value) - { - return preg_match(";^https:\/\/([\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*$;i", $value) == 1; - } - - public function validateFreeText($attribute, $value) - { - return preg_match('|^[a-z0-9A-Z\-@_.,()\'"\s\:\/]+$|i', $value) == 1; - } - - public function validateSslorigin($attribute, $value) - { - if (filter_var($value, FILTER_VALIDATE_URL)) { - $parts = @parse_url($value); - - if ($parts == false) { - return false; - } - - if ($parts['scheme'] != 'https') { - return false; - } - - if (isset($parts['query'])) { - return false; - } - - if (isset($parts['fragment'])) { - return false; - } - - if (isset($parts['path'])) { - return false; - } - - if (isset($parts['user'])) { - return false; - } - - if (isset($parts['pass'])) { - return false; - } - - return true; - } - - return false; - } - - public function validateEmailSet($attribute, $value) - { - $emails = explode(',', $value); - $res = true; - foreach ($emails as $email) { - $res = $this->validateEmail($attribute, $email); - if (!$res) { - break; - } - } - - return $res; - } - - public function validateUrlSet($attribute, $value) - { - $urls = explode(',', $value); - $res = true; - foreach ($urls as $url) { - $res = $this->validateUrl($attribute, $url); - if (!$res) { - break; - } - } - - return $res; - } - - public function validateTokenEndpointAuthMethod($attribute, $value) - { - return in_array($value,OAuth2Protocol::$token_endpoint_auth_methods); - } - - public function validateSigningAlg($attribute, $value) - { - return in_array($value,OAuth2Protocol::$supported_signing_algorithms); - } - - public function validateSubjectType($attribute, $value) - { - return in_array($value, Client::$valid_subject_types); - } - - public function validateEncryptedAlg($attribute, $value) - { - return in_array($value,OAuth2Protocol::$supported_key_management_algorithms); - } - - public function validateEncryptedEnc($attribute, $value) - { - return in_array($value,OAuth2Protocol::$supported_content_encryption_algorithms); - } - - public function validatePublicKeyPem($attribute, $value) - { - $res1 = strpos($value,'-----BEGIN PUBLIC KEY-----'); - $res2 = strpos($value,'-----BEGIN RSA PUBLIC KEY-----'); - $res3 = strpos($value,'-----END PUBLIC KEY-----'); - $res4 = strpos($value,'-----END RSA PUBLIC KEY-----'); - - $PKCS8 = $res1 !== false && $res3 !== false; - $PKCS1 = $res2 !== false && $res4 !== false; - - $rsa = new RSA; - $parsed = $rsa->loadKey($value); - - return ($PKCS8 || $PKCS1) && $parsed; - } - - public function validatePublicKeyPemLength($attribute, $value) - { - $rsa = new RSA(); - $parsed = $rsa->loadKey($value); - - return $parsed && $rsa->getSize() > 1024; - } - - public function validatePrivateKeyPem($attribute, $value, $parameters) - { - $res1 = strpos($value,'-----BEGIN PRIVATE KEY-----'); - $res2 = strpos($value,'-----BEGIN RSA PRIVATE KEY-----'); - $res3 = strpos($value,'-----END PRIVATE KEY-----'); - $res4 = strpos($value,'-----END RSA PRIVATE KEY-----'); - - $PKCS8 = $res1 !== false && $res3 !== false; - $PKCS1 = $res2 !== false && $res4 !== false; - - $encrypted = strpos($value,'ENCRYPTED') !== false ; - $password_param = $parameters[0]; - $rsa = new RSA; - if(isset($this->data[$password_param]) && $encrypted){ - $rsa->setPassword($this->data[$password_param]); - } - - $parsed = $rsa->loadKey($value); - - return ($PKCS8 || $PKCS1) && $parsed; - } - - public function validatePrivateKeyPemLength($attribute, $value, $parameters) - { - - $encrypted = strpos($value,'ENCRYPTED') !== false ; - $password_param = $parameters[0]; - $rsa = new RSA; - if(isset($this->data[$password_param]) && $encrypted){ - $rsa->setPassword($this->data[$password_param]); - } - - $parsed = $rsa->loadKey($value); - - return $parsed && $rsa->getSize() >= 2048; - } - - public function validatePublicKeyUsage($attribute, $value, $parameters) - { - return in_array($value, JSONWebKeyPublicKeyUseValues::$valid_uses); - } - - public function validatePublicKeyType($attribute, $value, $parameters) - { - return in_array($value, JSONWebKeyTypes::$valid_keys_set); - } - - public function validatePrivateKeyPassword($attribute, $value, $parameters){ - $pem_param = $parameters[0]; - if(!isset($this->data[$pem_param])) return true; - $pem_content = $this->data[$pem_param]; - $rsa = new RSA; - $rsa->setPassword($value); - $parsed = $rsa->loadKey($pem_content); - return $parsed; - } - - public function validateCustomUrlSet($attribute, $value, $parameters) - { - $app_type_param = $parameters[0]; - if(!isset($this->data[$app_type_param])) return true; - $app_type = $this->data[$app_type_param]; - - $urls = explode(',', $value); - $res = true; - foreach ($urls as $url) { - $res = $app_type === IClient::ApplicationType_Native ? $this->validateCustomUrl($attribute, $url, $parameters): $this->validateSslurl($attribute, $url); - if (!$res) { - break; - } - } - - return $res; - } - - public function validateCustomUrl($attribute, $value, $paramenters){ - $uri = @parse_url($value); - if (!isset($uri['scheme'])) { - return false; - } - return true; - } - - public function validateSslUrlSet($attribute, $value, $parameters) - { - - $urls = explode(',', $value); - $res = true; - foreach ($urls as $url) { - $res = $this->validateSslurl($attribute, $url); - if (!$res) { - break; - } - } - - return $res; - } - - public function validateKeyAlg($attribute, $value, $parameters) - { - $key_type_param = $parameters[0]; - $key_type = $this->data[$key_type_param]; - - if($key_type === JSONWebKeyPublicKeyUseValues::Signature) - { - return in_array($value, OAuth2Protocol::$supported_signing_algorithms); - } - else - { - return in_array($value, OAuth2Protocol::$supported_key_management_algorithms); - } - } - - public function validateOauth2TrustResponse($attribute, $value, $parameters){ - $valid_values = array - ( - IAuthService::AuthorizationResponse_AllowOnce, - IAuthService::AuthorizationResponse_DenyOnce, - IAuthService::AuthorizationResponse_AllowForever, - IAuthService::AuthorizationResponse_DenyForever, - ); - if(is_array($value)) $value = $value[0]; - return in_array($value, $valid_values); - } - - public function validateUserIds($attribute, $value, $parameters) - { - $user_ids = explode(',',$value); - foreach($user_ids as $id) - { - if(!intval($id)) return false; - } - return true; - } -} \ No newline at end of file diff --git a/app/libs/Auth/AuthHelper.php b/app/libs/Auth/AuthHelper.php deleted file mode 100644 index 9715e79c..00000000 --- a/app/libs/Auth/AuthHelper.php +++ /dev/null @@ -1,381 +0,0 @@ - "none", - "md5" => "md5", - "sha1" => "sha1", - "md5_v2.4" => "md5", - "sha1_v2.4" => "sha1", - ]; - - public function __construct($algorithm){ - $this->algorithm = $algorithm; - } - - public function encrypt($password, $salt = null) - { - if ($this->algorithm != 'none') - return Hash::compute(self::$algorithms[$this->algorithm], $password . $salt); - return $password; - } - - /** - * @param $hash1 - * @param $hash2 - * @return bool - */ - public function compare($hash1, $hash2) - { - // Due to flawed base_convert() floating poing precision, - // only the first 10 characters are consistently useful for comparisons. - return hash_equals(substr($hash1, 0, 10) ,substr($hash2, 0, 10)); - } - - /** - * @param string $raw - * @param string $hash - * @param string $salt - * @return bool - */ - public function check(string $raw, string $hash, string $salt = null): bool - { - $output = $this->encrypt($raw, $salt); - return $this->compare($output, $hash); - } -} - -/** - * Class PasswordEncryptor_Blowfish - * @package Auth - */ -final class PasswordEncryptor_Blowfish extends PasswordEncryptorStrategy { - /** - * Cost of encryption. - * Higher costs will increase security, but also increase server load. - * If you are using basic auth, you may need to decrease this as encryption - * will be run on every request. - * The two digit cost parameter is the base-2 logarithm of the iteration - * count for the underlying Blowfish-based hashing algorithmeter and must - * be in range 04-31, values outside this range will cause crypt() to fail. - */ - protected static $cost = 10; - - /** - * Sets the cost of the blowfish algorithm. - * See {@link PasswordEncryptor_Blowfish::$cost} - * Cost is set as an integer but - * Ensure that set values are from 4-31 - * - * @param int $cost range 4-31 - * @return null - */ - public static function set_cost($cost) { - self::$cost = max(min(31, $cost), 4); - } - - /** - * @return int - */ - public static function get_cost() { - return self::$cost; - } - - public function encrypt($password, $salt = null) { - // See: http://nz.php.net/security/crypt_blowfish.php - // There are three version of the algorithm - y, a and x, in order - // of decreasing security. Attempt to use the strongest version. - $encryptedPassword = $this->encryptY($password, $salt); - if(!$encryptedPassword) { - $encryptedPassword = $this->encryptA($password, $salt); - } - if(!$encryptedPassword) { - $encryptedPassword = $this->encryptX($password, $salt); - } - - // We *never* want to generate blank passwords. If something - // goes wrong, throw an exception. - if(strpos($encryptedPassword, '$2') === false) { - throw new \Exception('Blowfish password encryption failed.'); - } - - return $encryptedPassword; - } - - public function encryptX($password, $salt) { - $methodAndSalt = '$2x$' . $salt; - $encryptedPassword = crypt($password, $methodAndSalt); - - if(strpos($encryptedPassword, '$2x$') === 0) { - return $encryptedPassword; - } - - // Check if system a is actually x, and if available, use that. - if($this->checkAEncryptionLevel() == 'x') { - $methodAndSalt = '$2a$' . $salt; - $encryptedPassword = crypt($password, $methodAndSalt); - - if(strpos($encryptedPassword, '$2a$') === 0) { - $encryptedPassword = '$2x$' . substr($encryptedPassword, strlen('$2a$')); - return $encryptedPassword; - } - } - - return false; - } - - public function encryptY($password, $salt) { - $methodAndSalt = '$2y$' . $salt; - $encryptedPassword = crypt($password, $methodAndSalt); - - if(strpos($encryptedPassword, '$2y$') === 0) { - return $encryptedPassword; - } - - // Check if system a is actually y, and if available, use that. - if($this->checkAEncryptionLevel() == 'y') { - $methodAndSalt = '$2a$' . $salt; - $encryptedPassword = crypt($password, $methodAndSalt); - - if(strpos($encryptedPassword, '$2a$') === 0) { - $encryptedPassword = '$2y$' . substr($encryptedPassword, strlen('$2a$')); - return $encryptedPassword; - } - } - - return false; - } - - public function encryptA($password, $salt) { - if($this->checkAEncryptionLevel() == 'a') { - $methodAndSalt = '$2a$' . $salt; - $encryptedPassword = crypt($password, $methodAndSalt); - - if(strpos($encryptedPassword, '$2a$') === 0) { - return $encryptedPassword; - } - } - - return false; - } - - /** - * The algorithm returned by using '$2a$' is not consistent - - * it might be either the correct (y), incorrect (x) or mostly-correct (a) - * version, depending on the version of PHP and the operating system, - * so we need to test it. - */ - public function checkAEncryptionLevel() { - // Test hashes taken from - // http://cvsweb.openwall.com/cgi/cvsweb.cgi/~checkout~/Owl/packages/glibc - // /crypt_blowfish/wrapper.c?rev=1.9.2.1;content-type=text%2Fplain - $xOrY = crypt("\xff\xa334\xff\xff\xff\xa3345", '$2a$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi') - == '$2a$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi'; - $yOrA = crypt("\xa3", '$2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq') - == '$2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq'; - - if($xOrY && $yOrA) { - return 'y'; - } elseif($xOrY) { - return 'x'; - } elseif($yOrA) { - return 'a'; - } - - return 'unknown'; - } - - /** - * self::$cost param is forced to be two digits with leading zeroes for ints 4-9 - */ - public static function salt() { - $generator = Hash::compute('sha1',Rand::getString(128, null, true)); - return sprintf('%02d', self::$cost) . '$' . substr($generator, 0, 22); - } - - /** - * @param string $raw - * @param string $hash - * @param string|null $salt - * @return bool - */ - public function check(string $raw, string $hash, string $salt = null):bool { - if(strpos($hash, '$2y$') === 0) { - return $this->compare($hash , $this->encryptY($raw, $salt)); - } - if(strpos($hash, '$2a$') === 0) { - return $this->compare($hash , $this->encryptA($raw, $salt)); - } - if(strpos($hash, '$2x$') === 0) { - return $this->compare($hash , $this->encryptX($raw, $salt)); - } - return false; - } - - -} - -/** - * Class PasswordEncryptor_Native - * @package Auth - */ -final class PasswordEncryptor_Native extends PasswordEncryptorStrategy { - - /** - * @param $password - * @param null $salt - * @return string - */ - public function encrypt($password, $salt = null) - { - return HashFacade::make($password.$salt); - } - - /** - * @param $hash1 - * @param $hash2 - * @return bool - */ - public function compare($hash1, $hash2) - { - return HashFacade::check($hash1, $hash2); - } - - /** - * @param string $raw - * @param string $hash - * @param string $salt - * @return bool - */ - public function check(string $raw, string $hash, string $salt = null): bool - { - return $this->compare($raw.$salt, $hash); - } -} - -/** - * Class AuthHelper - * @package Auth - */ -final class AuthHelper -{ - - const AlgNone = 'none'; - const AlgMD5 = 'md5'; - const AlgSHA1 = 'sha1'; - const AlgBlowFish = 'blowfish'; - const AlgSHA1_V2_4 = "sha1_v2.4"; - const AlgNative = 'native'; - const AlgMD5_v_2_4 = 'md5_v2.4'; - - private static $algorithms = [ - self::AlgNone => "auth\\PasswordEncryptor_Legacy", - self::AlgMD5 => "auth\\PasswordEncryptor_Legacy", - self::AlgSHA1 => "auth\\PasswordEncryptor_Legacy", - self::AlgMD5_v_2_4 => "auth\\PasswordEncryptor_Legacy", - self::AlgSHA1_V2_4 => "auth\\PasswordEncryptor_Legacy", - self::AlgBlowFish => "auth\\PasswordEncryptor_Blowfish", - self::AlgNative => "auth\\PasswordEncryptor_Native", - ]; - - /** - * @param $password - * @param $salt - * @param string $algorithm - * @return string - * @throws Exception - */ - public static function encrypt_password($password, $salt, $algorithm = self::AlgSHA1) - { - if (!isset(self::$algorithms[$algorithm])) - throw new Exception(sprintf("non supported algorithm %s", $algorithm)); - - $class = self::$algorithms[$algorithm]; - $strategy = new $class($algorithm); - - return $strategy->encrypt($password, $salt); - } - - /** - * @param string $raw - * @param string $hash - * @param string $algorithm - * @param string $salt - * @return mixed - * @throws Exception - */ - public static function check(string $raw, string $hash, $algorithm = self::AlgSHA1, $salt = "") - { - if (!isset(self::$algorithms[$algorithm])) - throw new Exception(sprintf("non supported algorithm %s", $algorithm)); - $class = self::$algorithms[$algorithm]; - $strategy = new $class($algorithm); - return $strategy->check($raw, $hash, $salt); - } - - /** - * @param int $n - * @param string $alg - * @return string - */ - public static function generateSalt(int $n = 255, string $alg = self::AlgNative):string { - if(!empty($alg) && $alg == self::AlgBlowFish){ - return PasswordEncryptor_Blowfish::salt(); - } - return str_random($n); - } -} \ No newline at end of file diff --git a/app/libs/Auth/AuthService.php b/app/libs/Auth/AuthService.php deleted file mode 100644 index 4803942c..00000000 --- a/app/libs/Auth/AuthService.php +++ /dev/null @@ -1,400 +0,0 @@ -user_repository = $user_repository; - $this->principal_service = $principal_service; - $this->user_service = $user_service; - $this->cache_service = $cache_service; - } - - /** - * @return bool - */ - public function isUserLogged() - { - return Auth::check(); - } - - /** - * @return User|null - */ - public function getCurrentUser():?User - { - return Auth::user(); - } - - /** - * @param string $username - * @param string $password - * @param bool $remember_me - * @return mixed - */ - public function login($username, $password, $remember_me) - { - Log::debug("AuthService::login"); - $res = Auth::attempt(['username' => $username, 'password' => $password], $remember_me); - - if ($res) - { - Log::debug("AuthService::login: clearing principal"); - $this->principal_service->clear(); - $this->principal_service->register - ( - $this->getCurrentUser()->getId(), - time() - ); - } - - return $res; - } - - public function logout() - { - $this->invalidateSession(); - Auth::logout(); - $this->principal_service->clear(); - // put in past - Cookie::queue - ( - IAuthService::LOGGED_RELAYING_PARTIES_COOKIE_NAME, - null, - $minutes = -2628000, - $path = Config::get("session.path"), - $domain = Config::get("session.domain"), - $secure = true, - $httpOnly = true, - $raw = false, - $sameSite = 'none' - ); - } - - /** - * @return string - */ - public function getUserAuthorizationResponse() - { - if (Session::has("openid.authorization.response")) - { - $value = Session::get("openid.authorization.response"); - - return $value; - } - - return IAuthService::AuthorizationResponse_None; - } - - - public function clearUserAuthorizationResponse() - { - if (Session::has("openid.authorization.response")) - { - Session::remove("openid.authorization.response"); - Session::save(); - } - } - - public function setUserAuthorizationResponse($auth_response) - { - Session::put("openid.authorization.response", $auth_response); - Session::save(); - } - - /** - * @param string $openid - * @return User|null - */ - public function getUserByOpenId(string $openid):?User - { - return $this->user_repository->getByIdentifier($openid); - } - - /** - * @param string $username - * @return null|User - */ - public function getUserByUsername(string $username):?User - { - return $this->user_repository->getByEmailOrName($username); - } - - /** - * @param int $id - * @return null|User - */ - public function getUserById(int $id):?User - { - return $this->user_repository->getById($id); - } - - // Authentication - - public function getUserAuthenticationResponse() - { - if (Session::has("openstackid.authentication.response")) { - $value = Session::get("openstackid.authentication.response"); - return $value; - } - return IAuthService::AuthenticationResponse_None; - } - - public function setUserAuthenticationResponse($auth_response) - { - Session::put("openstackid.authentication.response", $auth_response); - Session::save(); - } - - public function clearUserAuthenticationResponse() - { - if (Session::has("openstackid.authentication.response")) - { - Session::remove("openstackid.authentication.response"); - Session::save(); - } - } - - /** - * @param string $user_id - * @return string - */ - public function unwrapUserId(string $user_id):string - { - // first try to get user by raw id - $user = $this->getUserById(intval($user_id)); - - if(!is_null($user)) - return $user_id; - // check if we have a wrapped user id - try { - $unwrapped_name = $this->decrypt($user_id); - $parts = explode(':', $unwrapped_name); - return intval($parts[1]); - } - catch (Exception $ex){ - Log::warning($ex); - } - return $user_id; - } - - /** - * @param int $user_id - * @param IClient $client - * @return string - */ - public function wrapUserId(int $user_id, IClient $client):string - { - if($client->getSubjectType() === IClient::SubjectType_Public) - return $user_id; - - $wrapped_name = sprintf('%s:%s', $client->getClientId(), $user_id); - return $this->encrypt($wrapped_name); - } - - /** - * @param string $value - * @return String - */ - private function encrypt(string $value):string - { - return base64_encode(Crypt::encrypt($value)); - } - - /** - * @param string $value - * @return String - */ - private function decrypt(string $value):string - { - $value = base64_decode($value); - return Crypt::decrypt($value); - } - - /** - * @return string - */ - public function getSessionId():string - { - return Session::getId(); - } - - /** - * @param $client_id - * @return void - */ - public function registerRPLogin(string $client_id):void - { - - try { - $rps = Cookie::get(IAuthService::LOGGED_RELAYING_PARTIES_COOKIE_NAME, ""); - $zlib = CompressionAlgorithms_Registry::getInstance()->get(CompressionAlgorithmsNames::ZLib); - - if (!empty($rps)) { - $rps = $this->decrypt($rps); - $rps = $zlib->uncompress($rps); - $rps .= '|'; - } - if(is_null($rps)) $rps = ""; - if (!str_contains($rps, $client_id)) - $rps .= $client_id; - - $rps = $zlib->compress($rps); - $rps = $this->encrypt($rps); - } - catch(Exception $ex){ - Log::warning($ex); - $rps = ""; - } - - Cookie::queue - ( - IAuthService::LOGGED_RELAYING_PARTIES_COOKIE_NAME, - $rps, - Config::get("session.lifetime", 120), - $path = Config::get("session.path"), - $domain = Config::get("session.domain"), - $secure = true, - $httpOnly = true, - $raw = false, - $sameSite = 'none' - ); - } - - /** - * @return string[] - */ - public function getLoggedRPs():array - { - try { - $rps = Cookie::get(IAuthService::LOGGED_RELAYING_PARTIES_COOKIE_NAME); - $zlib = CompressionAlgorithms_Registry::getInstance()->get(CompressionAlgorithmsNames::ZLib); - if (!empty($rps)) { - $rps = $this->decrypt($rps); - $rps = $zlib->uncompress($rps); - return explode('|', $rps); - } - } - catch (Exception $ex){ - Log::warning($ex); - } - return []; - } - - /** - * @param string $jti - * @throws Exception - */ - public function reloadSession(string $jti):void - { - Log::debug(sprintf("AuthService::reloadSession jti %s", $jti )); - $session_id = $this->cache_service->getSingleValue($jti); - - Log::debug(sprintf("AuthService::reloadSession session_id %s", $session_id )); - if(empty($session_id)) - throw new ReloadSessionException('session not found!'); - - if($this->cache_service->exists($session_id."invalid")){ - // session was marked as void, check if we are authenticated - if(!Auth::check()) - throw new ReloadSessionException('user not found!'); - } - - Session::setId(Crypt::decrypt($session_id)); - Session::start(); - if(!Auth::check()) - { - $user_id = $this->principal_service->get()->getUserId(); - Log::debug(sprintf("AuthService::reloadSession user_id %s", $user_id )); - $user = $this->getUserById($user_id); - if(is_null($user)) - throw new ReloadSessionException('user not found!'); - Auth::login($user); - } - } - - /** - * @param string $client_id - * @param int $id_token_lifetime - * @return string - */ - public function generateJTI(string $client_id, int $id_token_lifetime):string { - $session_id = Crypt::encrypt(Session::getId()); - $encoder = new Base64UrlRepresentation(); - $jti = $encoder->encode(hash('sha512', $session_id.$client_id, true)); - - $this->cache_service->addSingleValue($jti, $session_id, $id_token_lifetime); - - return $jti; - } - - - public function invalidateSession():void { - $session_id = Crypt::encrypt(Session::getId()); - $this->cache_service->addSingleValue($session_id."invalid", $session_id); - } -} \ No newline at end of file diff --git a/app/libs/Auth/AuthenticationExtensionService.php b/app/libs/Auth/AuthenticationExtensionService.php deleted file mode 100644 index 3905ad1c..00000000 --- a/app/libs/Auth/AuthenticationExtensionService.php +++ /dev/null @@ -1,48 +0,0 @@ -extensions = []; - } - /** - * @return array - */ - public function getExtensions() - { - return $this->extensions; - } - - /** - * @param IAuthenticationExtension $extension - * @return $this - */ - public function addExtension(IAuthenticationExtension $extension) - { - $this->extensions[] = $extension; - return $this; - } -} \ No newline at end of file diff --git a/app/libs/Auth/AuthenticationServiceProvider.php b/app/libs/Auth/AuthenticationServiceProvider.php deleted file mode 100644 index 26f943ae..00000000 --- a/app/libs/Auth/AuthenticationServiceProvider.php +++ /dev/null @@ -1,45 +0,0 @@ -auth_extension_service = $auth_extension_service; - $this->user_service = $user_service; - $this->checkpoint_service = $checkpoint_service; - $this->user_repository = $user_repository; - $this->tx_service = $tx_service; - } - - /** - * Retrieve a user by their unique identifier. - * @param mixed $identifier - * @return \Illuminate\Contracts\Auth\Authenticatable|null - */ - public function retrieveById($identifier) - { - try { - $user = $this->user_repository->getById($identifier); - if (!is_null($user)) { - return $user; - } - - } catch (Exception $ex) { - Log::warning($ex); - return null; - } - - return null; - } - - /** - * Retrieve a user by the given credentials. - * @param array $credentials - * @return \Illuminate\Contracts\Auth\Authenticatable|null - */ - public function retrieveByCredentials(array $credentials) - { - return $this->tx_service->transaction(function () use ($credentials) { - - $user = null; - - try - { - - if (!isset($credentials['username']) || !isset($credentials['password'])) - { - throw new AuthenticationException("invalid crendentials"); - } - - $email = $credentials['username']; - $password = $credentials['password']; - $user = $this->user_repository->getByEmailOrName(trim($email)); - - if (is_null($user)) //user must exists - { - throw new AuthenticationException(sprintf("User %s does not exists.", $email)); - } - - if(!$user->canLogin()) - { - if(!$user->isEmailVerified()) - throw new UnverifiedEmailMemberException(sprintf("User %s is not yet verified; check your email and click on the confirmation link before trying to log in again.", $email)); - throw new AuthenticationException(sprintf("User %s does not exists.", $email)); - } - - $valid_password = $user->checkPassword($password); - - if (!$valid_password) - { - throw new AuthenticationInvalidPasswordAttemptException($user->getId(), - sprintf("invalid login attempt for user %s ", $email)); - } - - //check user status... - if (!$user->isActive()) { - Log::warning(sprintf("user %s is on lock state", $email)); - throw new AuthenticationLockedUserLoginAttempt($email, - sprintf("User %s is locked.", $email)); - } - - //update user fields - $user->setLastLoginDate(new \DateTime('now', new \DateTimeZone('UTC'))); - $user->setLoginFailedAttempt(0); - $user->activate(); - $user->clearResetPasswordRequests(); - - $auth_extensions = $this->auth_extension_service->getExtensions(); - - foreach ($auth_extensions as $auth_extension) - { - if(!$auth_extension instanceof IAuthenticationExtension) continue; - $auth_extension->process($user); - } - } - catch(UnverifiedEmailMemberException $ex){ - $this->checkpoint_service->trackException($ex); - Log::warning($ex); - throw $ex; - } - catch (Exception $ex) - { - $this->checkpoint_service->trackException($ex); - Log::warning($ex); - $user = null; - } - - return $user; - }); - - } - - /** - * @param Authenticatable $user - * @param array $credentials - * @return bool - * @throws AuthenticationException - */ - public function validateCredentials(Authenticatable $user, array $credentials) - { - if (!isset($credentials['username']) || !isset($credentials['password'])) { - throw new AuthenticationException("invalid crendentials"); - } - try { - $email = $credentials['username']; - $password = $credentials['password']; - - $user = $this->user_repository->getByEmailOrName(trim($email)); - - if (!$user || !$user->canLogin() || !$user->checkPassword($password)) { - return false; - } - - if (is_null($user) || !$user->isActive()) { - return false; - } - } catch (Exception $ex) { - Log::warning($ex); - return false; - } - return true; - } - - /** - * Retrieve a user by by their unique identifier and "remember me" token. - * @param mixed $identifier - * @param string $token - * @return \Illuminate\Contracts\Auth\Authenticatable|null - */ - public function retrieveByToken($identifier, $token) - { - return $this->user_repository->getByToken($token); - } - - /** - * @param Authenticatable $user - * @param string $token - * @throws Exception - */ - public function updateRememberToken(Authenticatable $user, $token) - { - $this->tx_service->transaction(function () use ($user, $token) { - $dbUser = $this->user_repository->getById($user->getAuthIdentifier()); - if(is_null($dbUser)) return; - $dbUser->setRememberToken($user->getRememberToken()); - }); - } -} \ No newline at end of file diff --git a/app/libs/Auth/Exceptions/AuthenticationException.php b/app/libs/Auth/Exceptions/AuthenticationException.php deleted file mode 100644 index 163b9fa2..00000000 --- a/app/libs/Auth/Exceptions/AuthenticationException.php +++ /dev/null @@ -1,27 +0,0 @@ -user_id = $user_id; - parent::__construct($message, 0, null); - } - - /** - * @return int - */ - public function getUserId(): int{ - return $this->user_id; - } -} \ No newline at end of file diff --git a/app/libs/Auth/Exceptions/AuthenticationLockedUserLoginAttempt.php b/app/libs/Auth/Exceptions/AuthenticationLockedUserLoginAttempt.php deleted file mode 100644 index 68dc6296..00000000 --- a/app/libs/Auth/Exceptions/AuthenticationLockedUserLoginAttempt.php +++ /dev/null @@ -1,35 +0,0 @@ -identifier = $identifier; - parent::__construct($message, 0, null); - } - - public function getIdentifier(){ - return $this->identifier; - } - -} \ No newline at end of file diff --git a/app/libs/Auth/Exceptions/UnverifiedEmailMemberException.php b/app/libs/Auth/Exceptions/UnverifiedEmailMemberException.php deleted file mode 100644 index f14e315e..00000000 --- a/app/libs/Auth/Exceptions/UnverifiedEmailMemberException.php +++ /dev/null @@ -1,25 +0,0 @@ -setName(trim($payload['name'])); - if(isset($payload['slug'])) - $group->setSlug(trim($payload['slug'])); - if(isset($payload['active'])) - $group->setActive(boolval($payload['active'])); - if(isset($payload['default'])) - $group->setDefault(boolval($payload['default'])); - return $group; - } -} \ No newline at end of file diff --git a/app/libs/Auth/Factories/UserFactory.php b/app/libs/Auth/Factories/UserFactory.php deleted file mode 100644 index 78c96bcf..00000000 --- a/app/libs/Auth/Factories/UserFactory.php +++ /dev/null @@ -1,171 +0,0 @@ -isSuperAdmin()){ - $user->setCreatedBy($current_user); - } - return $user; - } - - /** - * @param User $user - * @param array $payload - * @return User - */ - public static function populate(User $user, array $payload):User{ - - if(isset($payload['first_name'])) - $user->setFirstName(trim($payload['first_name'])); - if(isset($payload['last_name'])) - $user->setLastName(trim($payload['last_name'])); - - if(isset($payload['email']) && !empty($payload['email'])) - $user->setEmail(strtolower(trim($payload['email']))); - - if(isset($payload['second_email'])) - $user->setSecondEmail(strtolower(trim($payload['second_email']))); - - if(isset($payload['third_email'])) - $user->setThirdEmail(strtolower(trim($payload['third_email']))); - - if(isset($payload['bio'])) - $user->setBio(trim($payload['bio'])); - - if(isset($payload['identifier']) && !empty($payload['identifier'])) - $user->setIdentifier(trim($payload['identifier'])); - - if(isset($payload['statement_of_interest'])) - $user->setStatementOfInterest(trim($payload['statement_of_interest'])); - - if(isset($payload['irc'])) - $user->setIrc(trim($payload['irc'])); - - if(isset($payload['github_user'])) - $user->setGithubUser(trim($payload['github_user'])); - - if(isset($payload['twitter_name'])) - $user->setTwitterName(trim($payload['twitter_name'])); - - if(isset($payload['wechat_user'])) - $user->setWechatUser(trim($payload['wechat_user'])); - - if(isset($payload['linked_in_profile'])) - $user->setLinkedInProfile(trim($payload['linked_in_profile'])); - - if(isset($payload['birthday'])){ - if(!empty($payload['birthday'])) { - $birthday = $payload['birthday']; - if (is_int($birthday)) { - $birthday = new \DateTime("@$birthday"); - } - $birthday->setTime(0, 0, 0); - $user->setBirthday($birthday); - } - else{ - $user->setBirthday(null); - } - } - - if(isset($payload['password_enc']) && !empty($payload['password_enc'])) { - $user->setPasswordEnc(trim($payload['password_enc'])); - } - - if(isset($payload['password']) && !empty($payload['password'])) { - $user->setPassword(trim($payload['password'])); - } - - if(isset($payload['gender'])) - $user->setGender(trim($payload['gender'])); - - if(isset($payload['gender_specify'])) - $user->setGenderSpecify(trim($payload['gender_specify'])); - - if(isset($payload['address1'])) - $user->setAddress1(trim($payload['address1'])); - - if(isset($payload['address2'])) - $user->setAddress2(trim($payload['address2'])); - - if(isset($payload['city'])) - $user->setCity(trim($payload['city'])); - - if(isset($payload['state'])) - $user->setState(trim($payload['state'])); - - if(isset($payload['phone_number'])) - $user->setPhoneNumber(trim($payload['phone_number'])); - - if(isset($payload['company'])) - $user->setCompany(trim($payload['company'])); - - if(isset($payload['job_title'])) - $user->setJobTitle(trim($payload['job_title'])); - - if(isset($payload['post_code'])) - $user->setPostCode(trim($payload['post_code'])); - - if(isset($payload['country_iso_code'])) - $user->setCountryIsoCode(trim($payload['country_iso_code'])); - - if(isset($payload['language'])) - $user->setLanguage(trim($payload['language'])); - - if(isset($payload['groups'])){ - foreach($payload['groups'] as $group){ - if(!$group instanceof Group) continue; - $user->addToGroup($group); - } - } - - if(isset($payload['active'])) { - $active = boolval($payload['active']); - if($active) - $user->activate(); - else - $user->deActivate(); - } - - if(isset($payload['public_profile_show_photo'])) - $user->setPublicProfileShowPhoto(boolval($payload['public_profile_show_photo'])); - - if(isset($payload['public_profile_show_fullname'])) - $user->setPublicProfileShowFullname(boolval($payload['public_profile_show_fullname'])); - - if(isset($payload['public_profile_show_email'])) - $user->setPublicProfileShowEmail(boolval($payload['public_profile_show_email'])); - - if(isset($payload['email_verified']) && boolval($payload['email_verified']) === true && !$user->isEmailVerified()) - $user->verifyEmail(); - - return $user; - } -} \ No newline at end of file diff --git a/app/libs/Auth/Factories/UserRegistrationRequestFactory.php b/app/libs/Auth/Factories/UserRegistrationRequestFactory.php deleted file mode 100644 index 712bc639..00000000 --- a/app/libs/Auth/Factories/UserRegistrationRequestFactory.php +++ /dev/null @@ -1,50 +0,0 @@ -setEmail(trim($payload['email'])); - - if(isset($payload['first_name'])) - $request->setFirstName(trim($payload['first_name'])); - - if(isset($payload['last_name'])) - $request->setLastName(trim($payload['last_name'])); - - if(isset($payload['country'])) - $request->setCountryIsoCode(trim($payload['country'])); - - return $request; - } -} \ No newline at end of file diff --git a/app/libs/Auth/IAuthenticationExtension.php b/app/libs/Auth/IAuthenticationExtension.php deleted file mode 100644 index 7cc37ce7..00000000 --- a/app/libs/Auth/IAuthenticationExtension.php +++ /dev/null @@ -1,25 +0,0 @@ -owner; - } - - /** - * @param User $owner - */ - public function setOwner(User $owner): void - { - $this->owner = $owner; - } - - /** - * @return Organization - */ - public function getOrganization(): Organization - { - return $this->organization; - } - - /** - * @param Organization $organization - */ - public function setOrganization(Organization $organization): void - { - $this->organization = $organization; - } - - /** - * @return string - */ - public function getJobTitle(): string - { - return $this->job_title; - } - - /** - * @param string $job_title - */ - public function setJobTitle(string $job_title): void - { - $this->job_title = $job_title; - } - - /** - * @return string - */ - public function getRole(): string - { - return $this->role; - } - - /** - * @param string $role - */ - public function setRole(string $role): void - { - $this->role = $role; - } - - /** - * @return \DateTime - */ - public function getStartDate(): \DateTime - { - return $this->start_date; - } - - /** - * @param \DateTime $start_date - */ - public function setStartDate(\DateTime $start_date): void - { - $this->start_date = $start_date; - } - - /** - * @return ?\DateTime - */ - public function getEndDate(): ?\DateTime - { - return $this->end_date; - } - - /** - * @param \DateTime $end_date - */ - public function setEndDate(\DateTime $end_date): void - { - $this->end_date = $end_date; - } - - /** - * @return bool - */ - public function isCurrent(): bool - { - return $this->is_current; - } - - /** - * @param bool $is_current - */ - public function setIsCurrent(bool $is_current): void - { - $this->is_current = $is_current; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - -} \ No newline at end of file diff --git a/app/libs/Auth/Models/Group.php b/app/libs/Auth/Models/Group.php deleted file mode 100644 index 3f47ec78..00000000 --- a/app/libs/Auth/Models/Group.php +++ /dev/null @@ -1,191 +0,0 @@ -active = false; - $this->default = false; - $this->users = new ArrayCollection(); - } - - /** - * @return string - */ - public function getName(): string - { - return $this->name; - } - - /** - * @return string - */ - public function getSlug(): string - { - return $this->slug; - } - - /** - * @return ArrayCollection - */ - public function getUsers(): ArrayCollection - { - return $this->users; - } - - /** - * @param string $name - */ - public function setName(string $name): void - { - $this->name = $name; - } - - /** - * @param string $slug - */ - public function setSlug(string $slug): void - { - $this->slug = $slug; - } - - /** - * @param User $user - */ - public function addUser(User $user){ - if($this->users->contains($user)) return; - $this->users->add($user); - } - - /** - * @param User $user - */ - public function removeUser(User $user){ - if(!$this->users->contains($user)) return; - $this->users->removeElement($user); - } - - /** - * @return bool - */ - public function isActive(): bool - { - return $this->active; - } - - /** - * @param bool $active - */ - public function setActive(bool $active): void - { - $this->active = $active; - } - - /** - * @return bool - */ - public function isDefault(): bool - { - return $this->default; - } - - /** - * @param bool $default - */ - public function setDefault(bool $default): void - { - $this->default = $default; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - - /** - * @ORM\PreRemove: - */ - public function preRemoveHandler(LifecycleEventArgs $args){ - if(!self::canDelete($this->slug)) - throw new ValidationException(sprintf("can not delete group %s", $this->getSlug())); - } - - - /** - * @param string $slug - * @return bool - */ - public static function canDelete(string $slug):bool{ - return !in_array($slug, [ - IGroupSlugs::RawUsersGroup, - IGroupSlugs::SuperAdminGroup, - IGroupSlugs::OAuth2ServerAdminGroup, - IGroupSlugs::OpenIdServerAdminsGroup, - IGroupSlugs::OAuth2SystemScopeAdminsGroup, - ]); - } - - -} \ No newline at end of file diff --git a/app/libs/Auth/Models/IGroupSlugs.php b/app/libs/Auth/Models/IGroupSlugs.php deleted file mode 100644 index 2ca6a1f0..00000000 --- a/app/libs/Auth/Models/IGroupSlugs.php +++ /dev/null @@ -1,29 +0,0 @@ -name; - } - - /** - * @param string $name - */ - public function setName(string $name): void - { - $this->name = $name; - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - -} \ No newline at end of file diff --git a/app/libs/Auth/Models/SpamEstimatorFeed.php b/app/libs/Auth/Models/SpamEstimatorFeed.php deleted file mode 100644 index eb828d49..00000000 --- a/app/libs/Auth/Models/SpamEstimatorFeed.php +++ /dev/null @@ -1,149 +0,0 @@ -first_name; - } - - /** - * @param string $first_name - */ - public function setFirstName(string $first_name): void - { - $this->first_name = $first_name; - } - - /** - * @return string - */ - public function getLastName(): ?string - { - return $this->last_name; - } - - /** - * @param string $last_name - */ - public function setLastName(string $last_name): void - { - $this->last_name = $last_name; - } - - /** - * @return string - */ - public function getEmail(): ?string - { - return $this->email; - } - - /** - * @param string $email - */ - public function setEmail(string $email): void - { - $this->email = $email; - } - - /** - * @return string - */ - public function getBio(): ?string - { - return $this->bio; - } - - /** - * @param string $bio - */ - public function setBio(string $bio): void - { - $this->bio = $bio; - } - - /** - * @return string - */ - public function getSpamType(): ?string - { - return $this->spam_type; - } - - /** - * @param string $spam_type - */ - public function setSpamType(string $spam_type): void - { - $this->spam_type = $spam_type; - } - - /** - * @param User $user - * @param string $spam_type - * @return SpamEstimatorFeed - */ - public static function buildFromUser(User $user, string $spam_type){ - $feed = new SpamEstimatorFeed; - $feed->spam_type = $spam_type; - $feed->email = $user->getEmail(); - $feed->first_name = $user->getFirstName(); - $feed->last_name = $user->getLastName(); - $feed->bio = $user->getBio(); - return $feed; - } -} \ No newline at end of file diff --git a/app/libs/Auth/Models/User.php b/app/libs/Auth/Models/User.php deleted file mode 100644 index c5bc9097..00000000 --- a/app/libs/Auth/Models/User.php +++ /dev/null @@ -1,1783 +0,0 @@ -active = false; - $this->email_verified = false; - $this->public_profile_show_photo = false; - $this->public_profile_show_email = false; - $this->public_profile_show_fullname = false; - $this->password = ""; - $this->identifier = null; - $this->gender_specify = ""; - $this->password_enc = AuthHelper::AlgNative; - $this->password_salt = AuthHelper::generateSalt(self::SaltLen, $this->password_enc); - $this->login_failed_attempt = 0; - $this->access_tokens = new ArrayCollection(); - $this->refresh_tokens = new ArrayCollection(); - $this->clients = new ArrayCollection(); - $this->trusted_sites = new ArrayCollection(); - $this->consents = new ArrayCollection(); - $this->actions = new ArrayCollection(); - $this->groups = new ArrayCollection(); - $this->affiliations = new ArrayCollection(); - $this->scope_groups = new ArrayCollection(); - $this->reset_password_requests = new ArrayCollection(); - $this->spam_type = self::SpamTypeNone; - $this->company = null; - $this->phone_number = null; - } - - /** - * @param int $n - * @return mixed - */ - public function getLatestNActions(int $n = 10) - { - $criteria = Criteria::create(); - $criteria->orderBy(['created_at' => 'desc'])->setMaxResults($n); - return $this->actions->matching($criteria); - } - - - /** - * Get the unique identifier for the user. - * the one that is saved as session id on vendor/laravel/framework/src/Illuminate/Auth/Guard.php - * @return mixed - */ - public function getAuthIdentifier() - { - return $this->id; - } - - /** - * Get the password for the user. - * @return string - */ - public function getAuthPassword() - { - return $this->password; - } - - /** - * @return string - */ - public function getIdentifier(): ?string - { - return $this->identifier; - } - - public function getEmail() - { - return $this->email; - } - - public function getFullName(): ?string - { - return $this->getFirstName() . " " . $this->getLastName(); - } - - public function getFirstName() - { - return $this->first_name; - } - - public function getLastName() - { - return $this->last_name; - } - - public function getNickName(): ?string - { - return $this->getIdentifier(); - } - - public function getGender(): ?string - { - return $this->gender; - } - - public function getCountry() - { - return $this->country_iso_code; - } - - public function getLanguage(): ?string - { - return $this->language; - } - - public function getDateOfBirth(): ?\DateTime - { - return $this->birthday; - } - - /** - * @return null|string - */ - public function getDateOfBirthNice(): ?string - { - if (is_null($this->birthday)) return null; - return $this->birthday->format("Y-m-d H:i:s"); - } - - - public function getId() - { - return (int)$this->id; - } - - /** - * @return bool - */ - public function getShowProfileFullName() - { - return $this->public_profile_show_fullname > 0; - } - - /** - * @return bool - */ - public function getShowProfilePic() - { - return $this->public_profile_show_photo > 0; - } - - /** - * @return bool - */ - public function getShowProfileBio() - { - return false; - } - - /** - * @return bool - */ - public function getShowProfileEmail() - { - return $this->public_profile_show_email > 0; - } - - public function getBio(): ?string - { - return $this->bio; - } - - /** - * @return Client[] - */ - public function getAvailableClients(): array - { - $own_clients = $this->clients->filter(function (Client $client) { - return !$client->hasResourceServer(); - })->toArray(); - - $managed_clients = $this->managed_clients->filter(function (Client $client) { - return !$client->hasResourceServer() && !$client->isOwner($this); - })->toArray(); - - return array_merge($own_clients, $managed_clients); - } - - public function getManagedClients() - { - return $this->managed_clients->filter(function (Client $client) { - return !$client->hasResourceServer() && !$client->isOwner($this); - }); - } - - /** - * Could use system scopes on registered clients - * @return bool - */ - public function canUseSystemScopes(): bool - { - if ($this->isSuperAdmin()) return true; - return $this->belongToGroup(IOAuth2User::OAuth2SystemScopeAdminGroup); - } - - /** - * Is Server Administrator - * @return bool - */ - public function isOAuth2ServerAdmin(): bool - { - if ($this->isSuperAdmin()) return true; - return $this->belongToGroup(IOAuth2User::OAuth2ServerAdminGroup); - } - - /** - * @return bool - */ - public function isOpenIdServerAdmin(): bool - { - if ($this->isSuperAdmin()) return true; - return $this->belongToGroup(IOpenIdUser::OpenIdServerAdminGroup); - } - - /** - * @return bool - */ - public function isSuperAdmin(): bool - { - return $this->belongToGroup(IGroupSlugs::SuperAdminGroup); - } - - /** - * @return bool - */ - public function isAdmin(): bool - { - return $this->belongToGroup(IGroupSlugs::AdminGroup); - } - - /** - * @param string $slug - * @return bool - */ - public function belongToGroup(string $slug): bool - { - $criteria = new Criteria(); - $criteria->where(Criteria::expr()->eq('slug', $slug)); - return $this->groups->matching($criteria)->count() > 0; - } - - /** - * @param Group $group - */ - public function addToGroup(Group $group) - { - if ($this->groups->contains($group)) return; - $this->groups->add($group); - } - - /** - * @param Group $group - */ - public function removeFromGroup(Group $group) - { - if (!$this->groups->contains($group)) return; - $this->groups->removeElement($group); - } - - public function clearGroups(): void - { - $this->groups->clear(); - } - - public function getStreetAddress() - { - - return $this->address1 . ' ' . $this->address2; - } - - public function getRegion() - { - return $this->state; - } - - public function getLocality() - { - return $this->city; - } - - public function getPostalCode() - { - return $this->post_code; - } - - public function getTrustedSites() - { - return $this->trusted_sites; - } - - /** - * @param OpenIdTrustedSite $site - */ - public function addTrustedSite(OpenIdTrustedSite $site) - { - if ($this->trusted_sites->contains($site)) return; - $this->trusted_sites->add($site); - $site->setOwner($this); - } - - public function getRememberToken() - { - return $this->remember_token; - } - - public function setRememberToken($value) - { - $this->remember_token = $value; - } - - public function getRememberTokenName() - { - return 'remember_token'; - } - - /** - * @return int - */ - public function getExternalIdentifier() - { - return $this->getAuthIdentifier(); - } - - /** - * @return string - */ - public function getFormattedAddress() - { - $street = $this->getStreetAddress(); - $region = $this->getRegion(); - $city = $this->getLocality(); - $zip_code = $this->getPostalCode(); - $country = $this->getCountry(); - - $complete = $street; - - if (!empty($city)) - $complete .= ', ' . $city; - - if (!empty($region)) - $complete .= ', ' . $region; - - if (!empty($zip_code)) - $complete .= ', ' . $zip_code; - - if (!empty($country)) - $complete .= ', ' . $country; - - return $complete; - } - - /** - * @return mixed - */ - public function getGroups() - { - return $this->groups; - } - - /** - * @return ApiScope[] - */ - public function getGroupScopes() - { - $scopes = []; - $map = []; - - $criteria = new Criteria(); - $criteria->where(Criteria::expr()->eq('active', true)); - $active_scope_groups = $this->scope_groups->matching($criteria); - - foreach ($active_scope_groups as $group) { - foreach ($group->getScopes() as $scope) { - if (!isset($map[$scope->getId()])) - $scopes[] = $scope; - } - } - - return $scopes; - } - - /** - * @param ApiScope $scope - * @return bool - * @throws ValidationException - */ - public function isGroupScopeAllowed(ApiScope $scope): bool - { - if (!$scope->isAssignedByGroups()) throw new ValidationException("scope is not assigned by groups!"); - $criteria = Criteria::create(); - $criteria->where(Criteria::expr()->eq('active', true)); - $active_scope_groups = $this->scope_groups->matching($criteria); - foreach ($active_scope_groups as $group) { - if ($group->hasScope($scope)) return true; - } - return false; - } - - public function clearEmailVerification(){ - $this->email_verified = false; - $this->email_verified_date = null; - } - - /** - * @return bool - */ - public function isEmailVerified() - { - return $this->email_verified; - } - - public function clearTrustedSites(): void - { - $this->trusted_sites->clear(); - } - - /** - * Get the name of the unique identifier for the user. - * - * @return string - */ - public function getAuthIdentifierName() - { - return "id"; - } - - /** - * @return string - */ - public function getPic(): string - { - try { - if (!empty($this->pic)) { - return Storage::disk('swift')->url(sprintf("%s/%s", self::getProfilePicFolder(), $this->pic)); - } - return $this->getGravatarUrl(); - } - catch (\Exception $ex) { - Log::warning($ex); - } - return $this->getGravatarUrl(); - } - - /** - * @param string $pic - */ - public function setPic(string $pic){ - $this->pic = $pic; - } - - /** - * Get either a Gravatar URL or complete image tag for a specified email address. - */ - private function getGravatarUrl(): string - { - $url = 'https://www.gravatar.com/avatar/'; - $url .= md5(strtolower(trim($this->email))); - return $url; - } - - /** - * @param string $password - * @return bool - * @throws \Exception - */ - public function checkPassword(string $password): bool - { - if(empty($this->password)) - { - Log::warning(sprintf("User %s (%s) has not password set.", $this->id, $this->email)); - return false; - } - - if(empty($this->password_enc)) - { - Log::warning(sprintf("User %s (%s) has not password encoding set.", $this->id, $this->email)); - return false; - } - - return AuthHelper::check($password, $this->password, $this->password_enc, $this->password_salt); - } - - public function canLogin(): bool - { - return $this->isEmailVerified() && $this->isActive(); - } - - /** - * @return bool - */ - public function isActive(): bool - { - return $this->active; - } - - /** - * @return $this - */ - public function lock() - { - $this->deActivate(); - Event::fire(new UserLocked($this->getId())); - return $this; - } - - /** - * @return $this - */ - public function unlock() - { - $this->activate(); - return $this; - } - - /** - * @return bool - */ - public function isPublicProfileShowPhoto(): bool - { - return $this->public_profile_show_photo; - } - - /** - * @param bool $public_profile_show_photo - */ - public function setPublicProfileShowPhoto(bool $public_profile_show_photo): void - { - $this->public_profile_show_photo = $public_profile_show_photo; - } - - /** - * @return bool - */ - public function isPublicProfileShowFullname(): bool - { - return $this->public_profile_show_fullname; - } - - /** - * @param bool $public_profile_show_fullname - */ - public function setPublicProfileShowFullname(bool $public_profile_show_fullname): void - { - $this->public_profile_show_fullname = $public_profile_show_fullname; - } - - /** - * @return bool - */ - public function isPublicProfileShowEmail(): bool - { - return $this->public_profile_show_email; - } - - /** - * @param bool $public_profile_show_email - */ - public function setPublicProfileShowEmail(bool $public_profile_show_email): void - { - $this->public_profile_show_email = $public_profile_show_email; - } - - /** - * @return \DateTime|null - */ - public function getLastLoginDate(): ?\DateTime - { - return $this->last_login_date; - } - - /** - * @param \DateTime $last_login_date - */ - public function setLastLoginDate(\DateTime $last_login_date): void - { - $this->last_login_date = $last_login_date; - } - - /** - * @return int - */ - public function getLoginFailedAttempt(): int - { - return $this->login_failed_attempt; - } - - /** - * @param int $login_failed_attempt - */ - public function setLoginFailedAttempt(int $login_failed_attempt): void - { - $this->login_failed_attempt = $login_failed_attempt; - } - - /** - * @return string - */ - public function getAddress1(): ?string - { - return $this->address1; - } - - /** - * @param string $address1 - */ - public function setAddress1(string $address1): void - { - $this->address1 = $address1; - } - - /** - * @return string - */ - public function getAddress2(): ?string - { - return $this->address2; - } - - /** - * @param string $address2 - */ - public function setAddress2(string $address2): void - { - $this->address2 = $address2; - } - - /** - * @return string - */ - public function getState(): ?string - { - return $this->state; - } - - /** - * @param string $state - */ - public function setState(string $state): void - { - $this->state = $state; - } - - /** - * @return string - */ - public function getCity(): ?string - { - return $this->city; - } - - /** - * @param string $city - */ - public function setCity(string $city): void - { - $this->city = $city; - } - - /** - * @return string - */ - public function getPostCode(): ?string - { - return $this->post_code; - } - - /** - * @param string $post_code - */ - public function setPostCode(string $post_code): void - { - $this->post_code = $post_code; - } - - /** - * @return string - */ - public function getCountryIsoCode(): ?string - { - return $this->country_iso_code; - } - - /** - * @param string $country_iso_code - */ - public function setCountryIsoCode(string $country_iso_code): void - { - $this->country_iso_code = $country_iso_code; - } - - /** - * @return string|null - */ - public function getSecondEmail(): ?string - { - return $this->second_email; - } - - /** - * @param string $second_email - */ - public function setSecondEmail(string $second_email): void - { - $this->second_email = $second_email; - } - - /** - * @return string|null - */ - public function getThirdEmail(): ?string - { - return $this->third_email; - } - - /** - * @param string $third_email - */ - public function setThirdEmail(string $third_email): void - { - $this->third_email = $third_email; - } - - /** - * @return string|null - */ - public function getStatementOfInterest(): ?string - { - return $this->statement_of_interest; - } - - /** - * @param string $statement_of_interest - */ - public function setStatementOfInterest(string $statement_of_interest): void - { - $this->statement_of_interest = $statement_of_interest; - } - - /** - * @return string - */ - public function getIrc(): ?string - { - return $this->irc; - } - - /** - * @param string $irc - */ - public function setIrc(string $irc): void - { - $this->irc = $irc; - } - - /** - * @return string - */ - public function getLinkedInProfile(): ?string - { - return $this->linked_in_profile; - } - - /** - * @param string $linked_in_profile - */ - public function setLinkedInProfile(string $linked_in_profile): void - { - $this->linked_in_profile = $linked_in_profile; - } - - /** - * @return string - */ - public function getGithubUser(): ?string - { - return $this->github_user; - } - - /** - * @param string $github_user - */ - public function setGithubUser(string $github_user): void - { - $this->github_user = $github_user; - } - - /** - * @return string - */ - public function getWechatUser(): ?string - { - return $this->wechat_user; - } - - /** - * @param string $wechat_user - */ - public function setWechatUser(string $wechat_user): void - { - $this->wechat_user = $wechat_user; - } - - /** - * @return string - */ - public function getPassword(): string - { - return $this->password; - } - - /** - * @param string $password - */ - public function setPassword(string $password): void - { - if(empty($this->password_enc)){ - $this->password_enc = AuthHelper::AlgNative; - } - $this->password_salt = AuthHelper::generateSalt(self::SaltLen, $this->password_enc); - $this->password = AuthHelper::encrypt_password($password, $this->password_salt, $this->password_enc); - } - - /** - * @return string - */ - public function getPasswordEnc(): string - { - return $this->password_enc; - } - - /** - * @param string $password_enc - */ - public function setPasswordEnc(string $password_enc): void - { - $this->password_enc = $password_enc; - } - - /** - * @return string - */ - public function getEmailVerifiedTokenHash(): string - { - return $this->email_verified_token_hash; - } - - /** - * @param string $email_verified_token_hash - */ - public function setEmailVerifiedTokenHash(string $email_verified_token_hash): void - { - $this->email_verified_token_hash = $email_verified_token_hash; - } - - /** - * @return \Datetime - */ - public function getEmailVerifiedDate(): \Datetime - { - return $this->email_verified_date; - } - - /** - * @param \Datetime $email_verified_date - */ - public function setEmailVerifiedDate(\Datetime $email_verified_date): void - { - $this->email_verified_date = $email_verified_date; - } - - /** - * @return \Datetime - */ - public function getBirthday(): \Datetime - { - return $this->birthday; - } - - /** - * @param \Datetime $birthday - */ - public function setBirthday(?\Datetime $birthday): void - { - $this->birthday = $birthday; - } - - /** - * @return ArrayCollection - */ - public function getAccessTokens(): ArrayCollection - { - return $this->access_tokens; - } - - /** - * @param ArrayCollection $access_tokens - */ - public function setAccessTokens(ArrayCollection $access_tokens): void - { - $this->access_tokens = $access_tokens; - } - - /** - * @return ArrayCollection - */ - public function getRefreshTokens(): ArrayCollection - { - return $this->refresh_tokens; - } - - /** - * @param ArrayCollection $refresh_tokens - */ - public function setRefreshTokens(ArrayCollection $refresh_tokens): void - { - $this->refresh_tokens = $refresh_tokens; - } - - /** - * @return ArrayCollection - */ - public function getConsents(): ArrayCollection - { - return $this->consents; - } - - /** - * @return ArrayCollection - */ - public function getActions(): ArrayCollection - { - return $this->actions; - } - - /** - * @param UserAction $action - */ - public function addUserAction(UserAction $action) - { - if ($this->actions->contains($action)) return; - $this->actions->add($action); - $action->setOwner($this); - } - - /** - * @return ArrayCollection - */ - public function getAffiliations(): ArrayCollection - { - return $this->affiliations; - } - - /** - * @param ArrayCollection $affiliations - */ - public function setAffiliations(ArrayCollection $affiliations): void - { - $this->affiliations = $affiliations; - } - - /** - * @param Client $client - * @param string $scopes - * @return UserConsent|null - */ - public function findFirstConsentByClientAndScopes(Client $client, string $scopes): ?UserConsent - { - $criteria = new Criteria(); - $criteria->where(Criteria::expr()->eq("client", $client)); - $consents = $this->consents->matching($criteria); - if ($consents->count() == 0) return null; - - $scope_set = explode(' ', $scopes); - sort($scope_set); - - $query = <<getEM()->createQuery($query); - - $query->setParameter("user", $this); - $query->setParameter("client", $client); - $query->setParameter("scopes", join(' ', $scope_set)); - - $consent = $query->getOneOrNullResult(); - if (!is_null($consent)) return $consent; - - foreach ($consents as $consent) { - $former_scope_set = explode(' ', $consent->getScope()); - // check if the requested scopes are included on the former consent present - if (count(array_diff($scope_set, $former_scope_set)) == 0) { - return $consent; - } - } - return null; - } - - /** - * @param UserConsent $consent - */ - public function addConsent(UserConsent $consent) - { - if ($this->consents->contains($consent)) return; - $this->consents->add($consent); - $consent->setOwner($this); - } - - public function updateLastLoginDate(): void - { - $this->last_login_date = new \DateTime('now', new \DateTimeZone('UTC')); - } - - /** - * @return int - */ - public function updateLoginFailedAttempt(): int - { - $this->login_failed_attempt = $this->login_failed_attempt + 1; - return $this->login_failed_attempt; - } - - /** - * @param string $first_name - */ - public function setFirstName(string $first_name): void - { - $this->first_name = $first_name; - } - - /** - * @param string $last_name - */ - public function setLastName(string $last_name): void - { - $this->last_name = $last_name; - } - - /** - * @param string $email - */ - public function setEmail(string $email): void - { - if (!empty($this->email) && $email != $this->email) { - //we are setting a new email - $this->clearResetPasswordRequests(); - } - $this->email = $email; - } - - /** - * @param string $gender - */ - public function setGender(string $gender): void - { - $this->gender = $gender; - } - - /** - * @param string $bio - */ - public function setBio(string $bio): void - { - $this->bio = $bio; - } - - public function activate():void { - if(!$this->active) { - $this->active = true; - $this->spam_type = self::SpamTypeHam; - Event::fire(new UserSpamStateUpdated( - $this->getId() - ) - ); - } - } - - public function deActivate():void { - if( $this->active) { - $this->active = false; - $this->spam_type = self::SpamTypeSpam; - Event::fire(new UserSpamStateUpdated( - $this->getId() - ) - ); - } - } - - /** - * @return $this - * @throws \Exception - */ - public function verifyEmail() - { - if (!$this->email_verified) { - Log::debug(sprintf("User::verifyEmail verifying email %s", $this->email)); - $this->email_verified = true; - $this->spam_type = self::SpamTypeHam; - $this->active = true; - $this->lock = false; - $this->email_verified_date = new \DateTime('now', new \DateTimeZone('UTC')); - Event::fire(new UserEmailVerified( - $this->getId() - ) - ); - Event::fire(new UserSpamStateUpdated( - $this->getId() - ) - ); - } - return $this; - } - - /** - * @return string - * @throws ValidationException - */ - public function generateEmailVerificationToken(): string - { - if($this->isEmailVerified()){ - throw new ValidationException(sprintf("User %s (%s) is already verified.", $this->id, $this->email)); - } - - $generator = new RandomGenerator(); - $token = strval($this->id) . $generator->randomToken(); - $this->email_verified_token_hash = self::createConfirmationTokenHash($token); - return $token; - } - - /** - * @param string $token - * @return string - */ - public static function createConfirmationTokenHash(string $token): string - { - return md5($token); - } - - /** - * @param string $token - * @return bool - */ - public function checkConfirmationTokenHash(string $token): bool - { - return md5($token) == $this->email_verified_token_hash; - } - - /** - * @param string $language - */ - public function setLanguage(string $language): void - { - $this->language = $language; - } - - /** - * @param string $identifier - */ - public function setIdentifier(string $identifier) - { - $this->identifier = $identifier; - } - - /** - * @ORM\postPersist - */ - public function postPersist($args) - { - Event::fire(new UserCreated($this->getId())); - } - - /** - * @ORM\preRemove - */ - public function preRemove($args) - { - } - - /** - * @ORM\preUpdate - * @param PreUpdateEventArgs $args - */ - public function preUpdate(PreUpdateEventArgs $args) - { - if($this->spam_type != self::SpamTypeNone ){ - if($args->hasChangedField("active")) return; - $bio_changed = $args->hasChangedField("bio") && !empty($args->getNewValue('bio')); - $email_changed = $args->hasChangedField("email"); - if( $bio_changed|| $email_changed) { - // enqueue user for spam re checker - Log::warning(sprintf("User::preUpdate user %s was marked for spam type reclasification.", $this->email)); - $this->resetSpamTypeClassification(); - Event::fire(new UserSpamStateUpdated($this->getId())); - } - } - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) - { - if ($name == "fullname") - return $this->getFullName(); - - if ($name == "pic") - return $this->getPic(); - - $res = $this->{$name}; - return $res; - } - - /** - * @return string - */ - public function getGenderSpecify(): ?string - { - return $this->gender_specify; - } - - /** - * @param string $gender_specify - */ - public function setGenderSpecify(string $gender_specify): void - { - $this->gender_specify = $gender_specify; - } - - /** - * @param UserPasswordResetRequest $request - */ - public function addPasswordResetRequest(UserPasswordResetRequest $request) - { - if ($this->reset_password_requests->contains($request)) return; - $this->reset_password_requests->add($request); - } - - /** - * @return User|null - */ - public function getCreatedBy(): ?User - { - return $this->created_by; - } - - /** - * @param User $created_by - */ - public function setCreatedBy(User $created_by): void - { - $this->created_by = $created_by; - } - - /** - * @return bool - */ - public function hasCreator(): bool - { - return $this->getCreatedById() > 0; - } - - /** - * @return int - */ - public function getCreatedById(): int - { - try { - return !is_null($this->created_by) ? $this->created_by->getId() : 0; - } catch (\Exception $ex) { - return 0; - } - } - - /** - * @return string|null - */ - public function getTwitterName(): ?string - { - return $this->twitter_name; - } - - /** - * @param string $twitter_name - */ - public function setTwitterName(string $twitter_name): void - { - $this->twitter_name = $twitter_name; - } - - public function clearResetPasswordRequests(): void - { - $this->reset_password_requests->clear(); - } - - /** - * @return string|null - */ - public function getSpamType(): ?string - { - return $this->spam_type; - } - - /** - * @param string $spam_type - * @throws ValidationException - */ - public function setSpamType(string $spam_type): void - { - if(!in_array($spam_type, self::ValidSpamTypes)) - throw new ValidationException(sprintf("Not valid %s spam type value.", $spam_type)); - $this->spam_type = $spam_type; - } - - - public function resetSpamTypeClassification():void{ - $this->spam_type = self::SpamTypeNone; - } - - /** - * @return bool - */ - public function isHam():bool{ - return $this->spam_type == self::SpamTypeHam; - } - - /** - * @return bool - */ - public function isSpam():bool{ - return $this->spam_type == self::SpamTypeSpam; - } - - /** - * @return string - */ - public function getCompany(): ?string - { - return $this->company; - } - - /** - * @param string $company - */ - public function setCompany(string $company): void - { - $this->company = $company; - } - - /** - * @return string - */ - public function getPhoneNumber(): ?string - { - return $this->phone_number; - } - - /** - * @param string $phone_number - */ - public function setPhoneNumber(string $phone_number): void - { - $this->phone_number = $phone_number; - } - - const ProfilePicFolder = 'profile_pics'; - - public static function getProfilePicFolder():string{ - return self::ProfilePicFolder; - } - - /** - * @return string - */ - public function getJobTitle(): ?string - { - return $this->job_title; - } - - /** - * @param string $job_title - */ - public function setJobTitle(string $job_title): void - { - $this->job_title = $job_title; - } - -} \ No newline at end of file diff --git a/app/libs/Auth/Models/UserPasswordResetRequest.php b/app/libs/Auth/Models/UserPasswordResetRequest.php deleted file mode 100644 index a0543abc..00000000 --- a/app/libs/Auth/Models/UserPasswordResetRequest.php +++ /dev/null @@ -1,170 +0,0 @@ -lifetime = Config::get("auth.password_reset_lifetime", 10 * 60); - } - - /** - * @param $name - * @return mixed - */ - public function __get($name) { - return $this->{$name}; - } - - /** - * @return User - */ - public function getOwner(): User - { - return $this->owner; - } - - /** - * @param User $owner - */ - public function setOwner(User $owner): void - { - $this->owner = $owner; - } - - /** - * @return int - */ - public function getLifetime(): int - { - return $this->lifetime; - } - - /** - * @param int $lifetime - */ - public function setLifetime(int $lifetime): void - { - $this->lifetime = $lifetime; - } - - /** - * @return string - */ - public function getHash(): string - { - return $this->hash; - } - - public const TokenLen = 50; - - /** - * @return string - */ - public function generateToken(): string { - $token = strval($this->id).str_random(self::TokenLen); - $this->hash = self::hash($token); - return $token; - } - - /** - * @param string $token - * @return bool - */ - public function compare(string $token):bool{ - return $this->hash == self::hash($token); - } - - /** - * @param string $token - * @return string - */ - public static function hash(string $token):string{ - return md5($token); - } - - /** - * @return \DateTime - */ - public function getRedeemAt(): \DateTime - { - return $this->redeem_at; - } - - public function redeem():void{ - $this->redeem_at = new \DateTime('now', new \DateTimeZone('UTC')); - } - - /** - * @return bool - */ - public function isRedeem():bool { - return !is_null($this->redeem_at); - } - - /** - * @return bool - */ - public function isValid():bool{ - $void_date = $this->created_at->add(new \DateInterval('PT'.$this->lifetime.'S')); - $now = new \DateTime('now', new \DateTimeZone('UTC')); - return $void_date > $now; - } - - /** - * @ORM\PostPersist - */ - public function inserted($args){ - Event::fire(new UserPasswordResetRequestCreated($this->getId())); - } -} \ No newline at end of file diff --git a/app/libs/Auth/Models/UserRegistrationRequest.php b/app/libs/Auth/Models/UserRegistrationRequest.php deleted file mode 100644 index 925d70ad..00000000 --- a/app/libs/Auth/Models/UserRegistrationRequest.php +++ /dev/null @@ -1,215 +0,0 @@ -owner; - } - - /** - * @param User $owner - */ - public function setOwner(User $owner): void - { - $this->owner = $owner; - } - - /** - * @return string - */ - public function getHash(): string - { - return $this->hash; - } - - /** - * @param string $hash - */ - public function setHash(string $hash): void - { - $this->hash = $hash; - } - - /** - * @return string - */ - public function getEmail(): string - { - return $this->email; - } - - /** - * @param string $email - */ - public function setEmail(string $email): void - { - $this->email = $email; - } - - /** - * @return string - */ - public function getFirstName(): string - { - return $this->first_name; - } - - /** - * @param string $first_name - */ - public function setFirstName(string $first_name): void - { - $this->first_name = $first_name; - } - - /** - * @return string - */ - public function getLastName(): string - { - return $this->last_name; - } - - /** - * @param string $last_name - */ - public function setLastName(string $last_name): void - { - $this->last_name = $last_name; - } - - /** - * @return \DateTime|null - */ - public function getRedeemAt(): ?\DateTime - { - return $this->redeem_at; - } - - /** - * @param \DateTime $redeem_at - */ - public function setRedeemAt(\DateTime $redeem_at): void - { - $this->redeem_at = $redeem_at; - } - - /** - * @return string - */ - public function getCountryIsoCode(): string - { - return $this->country_iso_code; - } - - /** - * @param string $country_iso_code - */ - public function setCountryIsoCode(string $country_iso_code): void - { - $this->country_iso_code = $country_iso_code; - } - - /** - * @return Client - */ - public function getClient(): Client - { - return $this->client; - } - - /** - * @param Client $client - */ - public function setClient(Client $client): void - { - $this->client = $client; - } - - public function redeem():void{ - $this->redeem_at = new \DateTime('now', new \DateTimeZone('UTC')); - } - - /** - * @return bool - */ - public function isRedeem():bool { - return !is_null($this->redeem_at); - } - -} \ No newline at end of file diff --git a/app/libs/Auth/Repositories/IBannedIPRepository.php b/app/libs/Auth/Repositories/IBannedIPRepository.php deleted file mode 100644 index 18f54fac..00000000 --- a/app/libs/Auth/Repositories/IBannedIPRepository.php +++ /dev/null @@ -1,27 +0,0 @@ - 'and', '@' => 'at', '©' => 'c', '®' => 'r', 'À' => 'a', - 'Á' => 'a', 'Â' => 'a', 'Ä' => 'a', 'Å' => 'a', 'Æ' => 'ae','Ç' => 'c', - 'È' => 'e', 'É' => 'e', 'Ë' => 'e', 'Ì' => 'i', 'Í' => 'i', 'Î' => 'i', - 'Ï' => 'i', 'Ò' => 'o', 'Ó' => 'o', 'Ô' => 'o', 'Õ' => 'o', 'Ö' => 'o', - 'Ø' => 'o', 'Ù' => 'u', 'Ú' => 'u', 'Û' => 'u', 'Ü' => 'u', 'Ý' => 'y', - 'ß' => 'ss','à' => 'a', 'á' => 'a', 'â' => 'a', 'ä' => 'a', 'å' => 'a', - 'æ' => 'ae','ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', - 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ò' => 'o', 'ó' => 'o', - 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', - 'û' => 'u', 'ü' => 'u', 'ý' => 'y', 'þ' => 'p', 'ÿ' => 'y', 'Ā' => 'a', - 'ā' => 'a', 'Ă' => 'a', 'ă' => 'a', 'Ą' => 'a', 'ą' => 'a', 'Ć' => 'c', - 'ć' => 'c', 'Ĉ' => 'c', 'ĉ' => 'c', 'Ċ' => 'c', 'ċ' => 'c', 'Č' => 'c', - 'č' => 'c', 'Ď' => 'd', 'ď' => 'd', 'Đ' => 'd', 'đ' => 'd', 'Ē' => 'e', - 'ē' => 'e', 'Ĕ' => 'e', 'ĕ' => 'e', 'Ė' => 'e', 'ė' => 'e', 'Ę' => 'e', - 'ę' => 'e', 'Ě' => 'e', 'ě' => 'e', 'Ĝ' => 'g', 'ĝ' => 'g', 'Ğ' => 'g', - 'ğ' => 'g', 'Ġ' => 'g', 'ġ' => 'g', 'Ģ' => 'g', 'ģ' => 'g', 'Ĥ' => 'h', - 'ĥ' => 'h', 'Ħ' => 'h', 'ħ' => 'h', 'Ĩ' => 'i', 'ĩ' => 'i', 'Ī' => 'i', - 'ī' => 'i', 'Ĭ' => 'i', 'ĭ' => 'i', 'Į' => 'i', 'į' => 'i', 'İ' => 'i', - 'ı' => 'i', 'IJ' => 'ij','ij' => 'ij','Ĵ' => 'j', 'ĵ' => 'j', 'Ķ' => 'k', - 'ķ' => 'k', 'ĸ' => 'k', 'Ĺ' => 'l', 'ĺ' => 'l', 'Ļ' => 'l', 'ļ' => 'l', - 'Ľ' => 'l', 'ľ' => 'l', 'Ŀ' => 'l', 'ŀ' => 'l', 'Ł' => 'l', 'ł' => 'l', - 'Ń' => 'n', 'ń' => 'n', 'Ņ' => 'n', 'ņ' => 'n', 'Ň' => 'n', 'ň' => 'n', - 'ʼn' => 'n', 'Ŋ' => 'n', 'ŋ' => 'n', 'Ō' => 'o', 'ō' => 'o', 'Ŏ' => 'o', - 'ŏ' => 'o', 'Ő' => 'o', 'ő' => 'o', 'Œ' => 'oe','œ' => 'oe','Ŕ' => 'r', - 'ŕ' => 'r', 'Ŗ' => 'r', 'ŗ' => 'r', 'Ř' => 'r', 'ř' => 'r', 'Ś' => 's', - 'ś' => 's', 'Ŝ' => 's', 'ŝ' => 's', 'Ş' => 's', 'ş' => 's', 'Š' => 's', - 'š' => 's', 'Ţ' => 't', 'ţ' => 't', 'Ť' => 't', 'ť' => 't', 'Ŧ' => 't', - 'ŧ' => 't', 'Ũ' => 'u', 'ũ' => 'u', 'Ū' => 'u', 'ū' => 'u', 'Ŭ' => 'u', - 'ŭ' => 'u', 'Ů' => 'u', 'ů' => 'u', 'Ű' => 'u', 'ű' => 'u', 'Ų' => 'u', - 'ų' => 'u', 'Ŵ' => 'w', 'ŵ' => 'w', 'Ŷ' => 'y', 'ŷ' => 'y', 'Ÿ' => 'y', - 'Ź' => 'z', 'ź' => 'z', 'Ż' => 'z', 'ż' => 'z', 'Ž' => 'z', 'ž' => 'z', - 'ſ' => 'z', 'Ə' => 'e', 'ƒ' => 'f', 'Ơ' => 'o', 'ơ' => 'o', 'Ư' => 'u', - 'ư' => 'u', 'Ǎ' => 'a', 'ǎ' => 'a', 'Ǐ' => 'i', 'ǐ' => 'i', 'Ǒ' => 'o', - 'ǒ' => 'o', 'Ǔ' => 'u', 'ǔ' => 'u', 'Ǖ' => 'u', 'ǖ' => 'u', 'Ǘ' => 'u', - 'ǘ' => 'u', 'Ǚ' => 'u', 'ǚ' => 'u', 'Ǜ' => 'u', 'ǜ' => 'u', 'Ǻ' => 'a', - 'ǻ' => 'a', 'Ǽ' => 'ae','ǽ' => 'ae','Ǿ' => 'o', 'ǿ' => 'o', 'ə' => 'e', - 'Ё' => 'jo','Є' => 'e', 'І' => 'i', 'Ї' => 'i', 'А' => 'a', 'Б' => 'b', - 'В' => 'v', 'Г' => 'g', 'Д' => 'd', 'Е' => 'e', 'Ж' => 'zh','З' => 'z', - 'И' => 'i', 'Й' => 'j', 'К' => 'k', 'Л' => 'l', 'М' => 'm', 'Н' => 'n', - 'О' => 'o', 'П' => 'p', 'Р' => 'r', 'С' => 's', 'Т' => 't', 'У' => 'u', - 'Ф' => 'f', 'Х' => 'h', 'Ц' => 'c', 'Ч' => 'ch','Ш' => 'sh','Щ' => 'sch', - 'Ъ' => '-', 'Ы' => 'y', 'Ь' => '-', 'Э' => 'je','Ю' => 'ju','Я' => 'ja', - 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', - 'ж' => 'zh','з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', - 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', - 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', - 'ш' => 'sh','щ' => 'sch','ъ' => '-','ы' => 'y', 'ь' => '-', 'э' => 'je', - 'ю' => 'ju','я' => 'ja','ё' => 'jo','є' => 'e', 'і' => 'i', 'ї' => 'i', - 'Ґ' => 'g', 'ґ' => 'g', 'א' => 'a', 'ב' => 'b', 'ג' => 'g', 'ד' => 'd', - 'ה' => 'h', 'ו' => 'v', 'ז' => 'z', 'ח' => 'h', 'ט' => 't', 'י' => 'i', - 'ך' => 'k', 'כ' => 'k', 'ל' => 'l', 'ם' => 'm', 'מ' => 'm', 'ן' => 'n', - 'נ' => 'n', 'ס' => 's', 'ע' => 'e', 'ף' => 'p', 'פ' => 'p', 'ץ' => 'C', - 'צ' => 'c', 'ק' => 'q', 'ר' => 'r', 'ש' => 'w', 'ת' => 't', '™' => 'tm', - ]; - - /** - * @param string $input - * @return string - */ - private static function normalizeChars($input) { - return strtr($input, self::$convert_table); - } - /** - * @param User $user - * @return string - */ - public function generate(User $user):User - { - $fname = self::normalizeChars(trim($user->getFirstName())); - $lname = self::normalizeChars(trim($user->getLastName())); - $fname = preg_replace('/[^\d\w_-]+/i', IUserNameGeneratorService::USER_NAME_INVALID_CHAR_REPLACEMENT, $fname); - $lname = preg_replace('/[^\d\w_-]+/i', IUserNameGeneratorService::USER_NAME_INVALID_CHAR_REPLACEMENT, $lname); - $user_name = strtolower - ( - trim($fname, '.') - . IUserNameGeneratorService::USER_NAME_CHAR_CONNECTOR . - trim($lname,'.') - ); - //if all characters were replaced by a connector, then is not a latin character based user name - if(strlen($user_name) === substr_count($user_name, IUserNameGeneratorService::USER_NAME_CHAR_CONNECTOR)) - { - $email = $user->getEmail(); - $email = explode('@', $email); - $user_name = strtolower($email[0]); - } - $user->setIdentifier($user_name); - return $user; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/.gitkeep b/app/libs/OAuth2/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/libs/OAuth2/AddressClaim.php b/app/libs/OAuth2/AddressClaim.php deleted file mode 100644 index 4300911a..00000000 --- a/app/libs/OAuth2/AddressClaim.php +++ /dev/null @@ -1,68 +0,0 @@ -set[OpenIDProviderMetadata::Issuer] = $issuer; - return $this; - } - - /** - * @param string $auth_endpoint - * @return $this - */ - public function setAuthEndpoint($auth_endpoint) - { - $this->set[OpenIDProviderMetadata::AuthEndpoint] = $auth_endpoint; - return $this; - } - - /** - * @param string $token_endpoint - * @return $this - */ - public function setTokenEndpoint($token_endpoint) - { - $this->set[OpenIDProviderMetadata::TokenEndpoint] = $token_endpoint; - return $this; - } - - /** - * @param string $user_info_endpoint - * @return $this - */ - public function setUserInfoEndpoint($user_info_endpoint) - { - $this->set[OpenIDProviderMetadata::UserInfoEndpoint] = $user_info_endpoint; - return $this; - } - - /** - * @param string $end_session_endpoint - * @return $this - */ - public function setEndSessionEndpoint($end_session_endpoint) - { - $this->set[OpenIDProviderMetadata::EndSessionEndPoint] = $end_session_endpoint; - return $this; - } - - /** - * @param string $check_session_iframe - * @return $this - */ - public function setCheckSessionIframe($check_session_iframe) - { - $this->set[OpenIDProviderMetadata::CheckSessionIFrame] = $check_session_iframe; - return $this; - } - - /** - * @param string $jwks_url - * @return $this - */ - public function setJWKSUrl($jwks_url) - { - $this->set[OpenIDProviderMetadata::JWKSUrl] = $jwks_url; - return $this; - } - - /** - * @param string $revocation_endpoint - * @return $this - */ - public function setRevocationEndpoint($revocation_endpoint) - { - $this->set[OpenIDProviderMetadata::RevocationEndpoint] = $revocation_endpoint; - return $this; - } - - /** - * @param string $introspection_endpoint - * @return $this - */ - public function setIntrospectionEndpoint($introspection_endpoint) - { - $this->set[OpenIDProviderMetadata::IntrospectionEndpoint] = $introspection_endpoint; - return $this; - } - - /** - * @param string $key - * @param string $value - */ - private function addArrayValue($key, $value) - { - - if( !isset($this->set[$key])) - $this->set[$key] = []; - - array_push($this->set[$key], $value); - } - - /** - * @param string $response_type - * @return $this - */ - public function addResponseTypeSupported($response_type) - { - $this->addArrayValue(OpenIDProviderMetadata::ResponseTypesSupported, $response_type); - return $this; - } - - /** - * @param string $display_value - * @return $this - */ - public function addDisplayValueSupported($display_value){ - $this->addArrayValue(OpenIDProviderMetadata::DisplayValuesSupported, $display_value); - return $this; - } - - /** - * @param string $response_mode - * @return $this - */ - public function addResponseModeSupported($response_mode) - { - $this->addArrayValue(OpenIDProviderMetadata::ResponseModesSupported, $response_mode); - return $this; - } - - /** - * @param string $subject_type - * @return $this - */ - public function addSubjectTypeSupported($subject_type) - { - $this->addArrayValue(OpenIDProviderMetadata::SubjectTypesSupported, $subject_type); - return $this; - } - - /** - * @param string $scope - * @return $this - */ - public function addScopeSupported($scope){ - $this->addArrayValue(OpenIDProviderMetadata::ScopesSupported, $scope); - return $this; - } - - /** - * @param string $claim - * @return $this - */ - public function addClaimSupported($claim) - { - $this->addArrayValue(OpenIDProviderMetadata::ClaimsSupported, $claim); - return $this; - } - - /** - * @param string $auth_method - * @return $this - */ - public function addTokenEndpointAuthMethodSupported($auth_method) - { - $this->addArrayValue(OpenIDProviderMetadata::TokenEndpointAuthMethodsSupported, $auth_method); - return $this; - } - - /** - * @param string $alg - * @return $this - */ - public function addIdTokenSigningAlgSupported($alg) - { - $this->addArrayValue(OpenIDProviderMetadata::IdTokenSigningAlgValuesSupported, $alg); - return $this; - } - - /** - * @param string $alg - * @return $this - */ - public function addIdTokenEncryptionAlgSupported($alg) - { - $this->addArrayValue(OpenIDProviderMetadata::IdTokenEncryptionAlgValuesSupported, $alg); - return $this; - } - - /** - * @param string $enc - * @return $this - */ - public function addIdTokenEncryptionEncSupported($enc) - { - $this->addArrayValue(OpenIDProviderMetadata::IdTokenEncryptionEncValuesSupported, $enc); - return $this; - } - - /** - * @param string $alg - * @return $this - */ - public function addUserInfoSigningAlgSupported($alg) - { - $this->addArrayValue(OpenIDProviderMetadata::UserInfoSigningAlgValuesSupported, $alg); - return $this; - } - - /** - * @param string $alg - * @return $this - */ - public function addUserInfoEncryptionAlgSupported($alg) - { - $this->addArrayValue(OpenIDProviderMetadata::UserInfoEncryptionAlgValuesSupported, $alg); - return $this; - } - - /** - * @param string $enc - * @return $this - */ - public function addUserInfoEncryptionEncSupported($enc) - { - $this->addArrayValue(OpenIDProviderMetadata::UserInfoEncryptionEncValuesSupported, $enc); - return $this; - } - - /** - * @return string - */ - public function render() - { - $json = json_encode($this->set); - $json = str_replace('\/','/', $json); - return $json; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Discovery/IOpenIDProviderConfigurationService.php b/app/libs/OAuth2/Discovery/IOpenIDProviderConfigurationService.php deleted file mode 100644 index d33c1fad..00000000 --- a/app/libs/OAuth2/Discovery/IOpenIDProviderConfigurationService.php +++ /dev/null @@ -1,65 +0,0 @@ -protocol = $protocol; - } - - /** - * @param OAuth2Request $request - * @return mixed - * @throws InvalidOAuth2Request - * @throws InvalidClientException - * @throws UriNotAllowedException - * @throws ScopeNotAllowedException - * @throws UnsupportedResponseTypeException - * @throws UnAuthorizedClientException - * @throws AccessDeniedException - * @throws OAuth2GenericException - * @throws AbsentClientException - * @throws AbsentCurrentUserException - */ - public function handle(OAuth2Request $request) - { - foreach($this->protocol->getAvailableGrants() as $key => $grant){ - if($grant->canHandle($request)) - return $grant->handle($request); - } - throw new InvalidOAuth2Request; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Endpoints/IOAuth2Endpoint.php b/app/libs/OAuth2/Endpoints/IOAuth2Endpoint.php deleted file mode 100644 index 6c555dfb..00000000 --- a/app/libs/OAuth2/Endpoints/IOAuth2Endpoint.php +++ /dev/null @@ -1,27 +0,0 @@ -protocol = $protocol; - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws InvalidGrantTypeException - */ - public function handle(OAuth2Request $request) - { - foreach ($this->protocol->getAvailableGrants() as $key => $grant) { - if(!$grant instanceof IGrantType) continue; - if ($grant->canHandle($request)) { - $request = $grant->buildTokenRequest($request); - if (is_null($request)) - throw new InvalidGrantTypeException; - return $grant->completeFlow($request); - } - } - throw new InvalidGrantTypeException; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Endpoints/TokenIntrospectionEndpoint.php b/app/libs/OAuth2/Endpoints/TokenIntrospectionEndpoint.php deleted file mode 100644 index 942e54d4..00000000 --- a/app/libs/OAuth2/Endpoints/TokenIntrospectionEndpoint.php +++ /dev/null @@ -1,97 +0,0 @@ -protocol = $protocol; - $this->grant_type = new ValidateBearerTokenGrantType - ( - $client_service, - $client_repository, - $token_service, - $auth_service, - $log_service, - $ip_helper - ); - } - - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws InvalidOAuth2Request - * @throws BearerTokenDisclosureAttemptException - * @throws ExpiredAccessTokenException - * @throws InvalidApplicationType - * @throws InvalidOAuth2Request - * @throws LockedClientException - */ - public function handle(OAuth2Request $request) - { - if($this->grant_type->canHandle($request)) - { - return $this->grant_type->completeFlow($request); - } - throw new InvalidOAuth2Request; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Endpoints/TokenRevocationEndpoint.php b/app/libs/OAuth2/Endpoints/TokenRevocationEndpoint.php deleted file mode 100644 index bfd90ee1..00000000 --- a/app/libs/OAuth2/Endpoints/TokenRevocationEndpoint.php +++ /dev/null @@ -1,81 +0,0 @@ -protocol = $protocol; - $this->grant_type = new RevokeBearerTokenGrantType($client_service, $client_repository, $token_service, $log_service); - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws InvalidOAuth2Request - * @throws Exception - * @throws BearerTokenDisclosureAttemptException - * @throws ExpiredAccessTokenException - * @throws UnAuthorizedClientException - */ - public function handle(OAuth2Request $request) - { - if($this->grant_type->canHandle($request)) - { - return $this->grant_type->completeFlow($request); - } - throw new InvalidOAuth2Request; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Exceptions/AbsentClientException.php b/app/libs/OAuth2/Exceptions/AbsentClientException.php deleted file mode 100644 index e9f0988e..00000000 --- a/app/libs/OAuth2/Exceptions/AbsentClientException.php +++ /dev/null @@ -1,28 +0,0 @@ -client_id = $client_id; - $message = "OAuth2 Client Base Exception : " . $message; - parent::__construct($message, 0, null); - } - - /** - * @return string - */ - public function getClientId(){ - return $this->client_id; - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/Exceptions/OAuth2GenericException.php b/app/libs/OAuth2/Exceptions/OAuth2GenericException.php deleted file mode 100644 index 915a2cf7..00000000 --- a/app/libs/OAuth2/Exceptions/OAuth2GenericException.php +++ /dev/null @@ -1,28 +0,0 @@ -http_code = $http_code; - $this->error = $error; - $this->error_description = $error_description; - $this->scope = $scope; - - $message = "Resource Server Exception : " . sprintf - ( - 'http code : %s - error : %s - error description: %s', - $http_code, - $error, - $error_description - ); - - parent::__construct($message, 0, null); - } - - /** - * @return int - */ - public function getError() - { - return $this->error; - } - - /** - * @return string - */ - public function getErrorDescription() - { - return $this->error_description; - } - - /** - * @return null|string - */ - public function getScope() - { - return $this->scope; - } - - /** - * @return string - */ - public function getHttpCode() - { - return $this->http_code; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Exceptions/RecipientKeyNotFoundException.php b/app/libs/OAuth2/Exceptions/RecipientKeyNotFoundException.php deleted file mode 100644 index f8654462..00000000 --- a/app/libs/OAuth2/Exceptions/RecipientKeyNotFoundException.php +++ /dev/null @@ -1,28 +0,0 @@ -token = $token; - parent::__construct($description); - } - /** - * @var string - */ - private $token; - - /** - * @return string - */ - public function getToken() - { - return $this->token; - } - /** - * @return string - */ - public function getError() - { - return OAuth2Protocol::OAuth2Protocol_Error_InvalidGrant; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Exceptions/ReplayAttackRefreshTokenException.php b/app/libs/OAuth2/Exceptions/ReplayAttackRefreshTokenException.php deleted file mode 100644 index bb29cec8..00000000 --- a/app/libs/OAuth2/Exceptions/ReplayAttackRefreshTokenException.php +++ /dev/null @@ -1,29 +0,0 @@ -getResponseType(false))) - { - $access_token = $token_service->createAccessTokenFromParams - ( - $request->getClientId(), - $request->getScope(), - $audience, - $user->getId() - ); - } - - if(in_array(OAuth2Protocol::OAuth2Protocol_ResponseType_IdToken, $request->getResponseType(false))) { - - $id_token = $token_service->createIdToken - ( - $request->getNonce(), - $request->getClientId(), - $access_token - ); - } - - return new OAuth2IDTokenFragmentResponse - ( - $request->getRedirectUri(), - is_null($access_token) ? null : $access_token->getValue(), - is_null($access_token) ? null : $access_token->getLifetime(), - is_null($access_token) ? null : $request->getScope(), - $request->getState(), - $session_state, - is_null($id_token) ? null : $id_token->toCompactSerialization() - ); - } - - if($request instanceof OAuth2AuthorizationRequest) - { - $access_token = $token_service->createAccessTokenFromParams - ( - $request->getClientId(), - $request->getScope(), - $audience, - $user->getId() - ); - - return new OAuth2AccessTokenFragmentResponse - ( - $request->getRedirectUri(), - $access_token->getValue(), - $access_token->getLifetime(), - $request->getScope(), - $request->getState() - ); - } - - throw new InvalidOAuth2Request; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Factories/OAuth2AccessTokenResponseFactory.php b/app/libs/OAuth2/Factories/OAuth2AccessTokenResponseFactory.php deleted file mode 100644 index 528f5000..00000000 --- a/app/libs/OAuth2/Factories/OAuth2AccessTokenResponseFactory.php +++ /dev/null @@ -1,129 +0,0 @@ -getResponseType() - ); - - - $is_hybrid_flow = OAuth2Protocol::responseTypeBelongsToFlow - ( - $response_type, - OAuth2Protocol::OAuth2Protocol_GrantType_Hybrid - ); - - if ($is_hybrid_flow) { - - if (in_array(OAuth2Protocol::OAuth2Protocol_ResponseType_Token, $response_type)) { - - $access_token = $token_service->createAccessToken($auth_code, $request->getRedirectUri()); - } - - // check if should emmit id token - - if (in_array(OAuth2Protocol::OAuth2Protocol_ResponseType_IdToken, $response_type)) { - - $id_token = $token_service->createIdToken - ( - $auth_code->getNonce(), - $auth_code->getClientId(), - $access_token - ); - } - - if (is_null($id_token) && is_null($access_token)) throw new InvalidOAuth2Request; - } - else - { - $access_token = $token_service->createAccessToken($auth_code, $request->getRedirectUri()); - - $id_token = $token_service->createIdToken - ( - $auth_code->getNonce(), - $auth_code->getClientId(), - $access_token - ); - } - - if (!is_null($access_token)) - $refresh_token = $access_token->getRefreshToken(); - - return new OAuth2IdTokenResponse - ( - is_null($access_token) ? null : $access_token->getValue(), - is_null($access_token) ? null : $access_token->getLifetime(), - is_null($id_token) ? null : $id_token->toCompactSerialization(), - is_null($refresh_token) ? null : $refresh_token->getValue() - ); - } - // normal oauth2.0 code flow - - $access_token = $token_service->createAccessToken($auth_code, $request->getRedirectUri()); - $refresh_token = $access_token->getRefreshToken(); - - return new OAuth2AccessTokenResponse - ( - $access_token->getValue(), - $access_token->getLifetime(), - is_null($refresh_token) ? null : $refresh_token->getValue() - ); - - } - - /** - * @param AuthorizationCode $auth_code - * @return bool - */ - static public function authCodeWasIssuedForOIDC(AuthorizationCode $auth_code) - { - return str_contains($auth_code->getScope(), OAuth2Protocol::OpenIdConnect_Scope); - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/Factories/OAuth2AuthorizationRequestFactory.php b/app/libs/OAuth2/Factories/OAuth2AuthorizationRequestFactory.php deleted file mode 100644 index eaf645d1..00000000 --- a/app/libs/OAuth2/Factories/OAuth2AuthorizationRequestFactory.php +++ /dev/null @@ -1,64 +0,0 @@ -getScope(); - if(!is_null($scope) && str_contains($scope, OAuth2Protocol::OpenIdConnect_Scope) ) { - $auth_request = new OAuth2AuthenticationRequest($auth_request); - } - - return $auth_request; - } - - /** - * @var OAuth2AuthorizationRequestFactory - */ - private static $instance; - - private function __construct(){} - - private function __clone(){} - - /** - * @return OAuth2AuthorizationRequestFactory - */ - public static function getInstance() - { - if(!is_object(self::$instance)) - { - self::$instance = new OAuth2AuthorizationRequestFactory(); - } - return self::$instance; - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/Factories/OAuth2PKCEValidationMethodFactory.php b/app/libs/OAuth2/Factories/OAuth2PKCEValidationMethodFactory.php deleted file mode 100644 index 7aba5714..00000000 --- a/app/libs/OAuth2/Factories/OAuth2PKCEValidationMethodFactory.php +++ /dev/null @@ -1,69 +0,0 @@ -getCodeChallenge(); - $code_challenge_method = $auth_code->getCodeChallengeMethod(); - - if(empty($code_challenge) || empty($code_challenge_method)){ - throw new InvalidOAuth2PKCERequest(sprintf("%s or %s missing", OAuth2Protocol::PKCE_CodeChallenge, OAuth2Protocol::PKCE_CodeChallengeMethod)); - } - - /** - * code_verifier = high-entropy cryptographic random STRING using the - * unreserved characters [A-Z] / [a-z] / [0-9] / "-" / "." / "_" / "~" - * from Section 2.3 of [RFC3986], with a minimum length of 43 characters - * and a maximum length of 128 characters. - */ - - $code_verifier = $request->getCodeVerifier(); - if(empty($code_verifier)) - throw new InvalidOAuth2PKCERequest(sprintf("%s param required", OAuth2Protocol::PKCE_CodeVerifier)); - $code_verifier_len = strlen($code_verifier); - if( $code_verifier_len < 43 || $code_verifier_len > 128) - throw new InvalidOAuth2PKCERequest(sprintf("%s param should have at least 43 and at most 128 characters.", OAuth2Protocol::PKCE_CodeVerifier)); - - switch ($code_challenge_method){ - case OAuth2Protocol::PKCE_CodeChallengeMethodPlain: - return new PKCEPlainValidator($code_challenge, $code_verifier); - break; - case OAuth2Protocol::PKCE_CodeChallengeMethodSHA256: - return new PKCES256Validator($code_challenge, $code_verifier); - break; - default: - throw new InvalidOAuth2PKCERequest(sprintf("invalid %s param", OAuth2Protocol::PKCE_CodeChallengeMethod)); - break; - } - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/.gitkeep b/app/libs/OAuth2/GrantTypes/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/libs/OAuth2/GrantTypes/AbstractGrantType.php b/app/libs/OAuth2/GrantTypes/AbstractGrantType.php deleted file mode 100644 index 0e96b892..00000000 --- a/app/libs/OAuth2/GrantTypes/AbstractGrantType.php +++ /dev/null @@ -1,133 +0,0 @@ -client_service = $client_service; - $this->client_repository = $client_repository; - $this->token_service = $token_service; - $this->log_service = $log_service; - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws MissingClientIdParam - * @throws InvalidClientCredentials - * @throws InvalidClientException - * @throws LockedClientException - */ - public function completeFlow(OAuth2Request $request) - { - //get client credentials from request.. - $this->client_auth_context = $this->client_service->getCurrentClientAuthInfo(); - - //retrieve client from storage.. - $this->current_client = $this->client_repository->getClientById($this->client_auth_context->getId()); - - if (is_null($this->current_client)) - throw new InvalidClientException - ( - sprintf - ( - "Client id %s does not exists!", - $this->client_auth_context->getId() - ) - ); - - if (!$this->current_client->isActive() || $this->current_client->isLocked()) { - throw new LockedClientException - ( - sprintf - ( - 'Client id %s is locked.', - $this->client_auth_context->getId() - ) - ); - } - - $this->client_auth_context->setClient($this->current_client); - - if(!ClientAuthContextValidatorFactory::build($this->client_auth_context)->validate($this->client_auth_context)) - throw new InvalidClientCredentials - ( - sprintf - ( - 'Invalid credentials for client id %s.', - $this->client_auth_context->getId() - ) - ); - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/AuthorizationCodeGrantType.php b/app/libs/OAuth2/GrantTypes/AuthorizationCodeGrantType.php deleted file mode 100644 index beaba0de..00000000 --- a/app/libs/OAuth2/GrantTypes/AuthorizationCodeGrantType.php +++ /dev/null @@ -1,397 +0,0 @@ -isValid() && - OAuth2Protocol::responseTypeBelongsToFlow - ( - $request->getResponseType(false), - OAuth2Protocol::OAuth2Protocol_GrantType_AuthCode - ) - ) - { - return true; - } - if - ( - $request instanceof OAuth2TokenRequest && - $request->isValid() && - $request->getGrantType() == $this->getType() - ) - { - return true; - } - - return false; - } - - /** - * @return mixed|string - */ - public function getType() - { - return OAuth2Protocol::OAuth2Protocol_GrantType_AuthCode; - } - - /** - * @return array - */ - public function getResponseType() - { - return OAuth2Protocol::getValidResponseTypes(OAuth2Protocol::OAuth2Protocol_GrantType_AuthCode); - } - - /** - * Implements last request processing for Authorization code (Access Token Request processing) - * @see http://tools.ietf.org/html/rfc6749#section-4.1.3 and - * @see http://tools.ietf.org/html/rfc6749#section-4.1.4 - * @param OAuth2Request $request - * @return OAuth2AccessTokenResponse - * @throws InvalidAuthorizationCodeException - * @throws ExpiredAuthorizationCodeException - * @throws Exception - * @throws InvalidClientException - * @throws UnAuthorizedClientException - * @throws UriNotAllowedException - */ - public function completeFlow(OAuth2Request $request) - { - - if (!($request instanceof OAuth2AccessTokenRequestAuthCode)) - { - throw new InvalidOAuth2Request; - } - - try - { - parent::completeFlow($request); - $client = $this->client_auth_context->getClient(); - $this->checkClientTypeAccess($client); - - $current_redirect_uri = $request->getRedirectUri(); - //verify redirect uri - if (empty($current_redirect_uri) || !$this->current_client->isUriAllowed($current_redirect_uri)) - { - throw new UriNotAllowedException - ( - empty($current_redirect_uri)? "missing" : $current_redirect_uri - ); - } - - $code = $request->getCode(); - // verify that the authorization code is valid - // The client MUST NOT use the authorization code - // more than once. If an authorization code is used more than - // once, the authorization server MUST deny the request and SHOULD - // revoke (when possible) all tokens previously issued based on - // that authorization code. The authorization code is bound to - // the client identifier and redirection URI. - $auth_code = $this->token_service->getAuthorizationCode($code); - - // reload session state - $client_id = $auth_code->getClientId(); - - $this->security_context_service->save - ( - $this->security_context_service->get() - ->setAuthTimeRequired - ( - $auth_code->isAuthTimeRequested() - ) - ->setRequestedUserId - ( - $auth_code->getUserId() - ) - ); - - //ensure that the authorization code was issued to the authenticated - //confidential client, or if the client is public, ensure that the - //code was issued to "client_id" in the request - if ($client_id != $this->client_auth_context->getId()) - { - throw new InvalidRedeemAuthCodeException - ( - sprintf - ( - "auth code was issued for another client id!." - ) - ); - } - - // ensure that the "redirect_uri" parameter is present if the - // "redirect_uri" parameter was included in the initial authorization - // and if included ensure that their values are identical. - $redirect_uri = $auth_code->getRedirectUri(); - Log::debug(sprintf("AuthorizationCodeGrantType::completeFlow auth code redirect uri %s current_redirect_uri %s", $redirect_uri, $current_redirect_uri)); - if (!empty($redirect_uri) && URLUtils::normalizeUrl($redirect_uri) !== URLUtils::normalizeUrl($current_redirect_uri)) - { - throw new UriNotAllowedException($current_redirect_uri); - } - - if($client->isPKCEEnabled()){ - /** - * PKCE Validation - * @see https://tools.ietf.org/html/rfc7636#page-10 - * @see https://oauth.net/2/pkce - * server Verifies code_verifier before Returning the Tokens - * If the "code_challenge_method" from Section 4.3 was "S256", the - * received "code_verifier" is hashed by SHA-256, base64url-encoded, and - * then compared to the "code_challenge", i.e.: - * BASE64URL-ENCODE(SHA256(ASCII(code_verifier))) == code_challenge - * If the "code_challenge_method" from Section 4.3 was "plain", they are - * compared directly, i.e.: - * code_verifier == code_challenge. - * If the values are equal, the token endpoint MUST continue processing - * as normal (as defined by OAuth 2.0 - */ - - if(!$request instanceof OAuth2AccessTokenRequestAuthCode) - throw new InvalidOAuth2Request(); - - $strategy = OAuth2PKCEValidationMethodFactory::build($auth_code, $request); - - if(!$strategy->isValid()){ - throw new InvalidOAuth2Request("PKCE request can not be validated"); - } - } - - $this->principal_service->register - ( - $auth_code->getUserId(), - $auth_code->getAuthTime() - ); - - $response = OAuth2AccessTokenResponseFactory::build - ( - $this->token_service, - $auth_code, - $request - ); - - $this->security_context_service->clear(); - - return $response; - } - catch (InvalidAuthorizationCodeException $ex) - { - $this->log_service->error($ex); - $this->security_context_service->clear(); - throw new InvalidRedeemAuthCodeException - ( - $ex->getMessage() - ); - } - } - - /** - * @param OAuth2Request $request - * @return mixed|null|OAuth2AccessTokenRequestAuthCode - */ - public function buildTokenRequest(OAuth2Request $request) - { - if ($request instanceof OAuth2TokenRequest) - { - if ($request->getGrantType() !== $this->getType()) - { - return null; - } - return new OAuth2AccessTokenRequestAuthCode($request->getMessage()); - } - return null; - } - - /** - * @param IClient $client - * @throws InvalidApplicationType - * @throws InvalidClientType - * @return void - */ - protected function checkClientTypeAccess(IClient $client) - { - if - ( - !( - $client->getClientType() === IClient::ClientType_Confidential || - $client->getApplicationType() === IClient::ApplicationType_Native || - $client->isPKCEEnabled() - ) - ) - { - throw new InvalidApplicationType - ( - sprintf - ( - "client id %s - Application type must be %s or %s or have PKCE enabled", - $client->getClientId(), - IClient::ClientType_Confidential, - IClient::ApplicationType_Native - ) - ); - } - } - - /** - * @param OAuth2AuthorizationRequest $request - * @param bool $has_former_consent - * @return OAuth2AuthorizationResponse - * @throws OAuth2GenericException - */ - protected function buildResponse(OAuth2AuthorizationRequest $request, $has_former_consent) - { - $auth_code = $this->token_service->createAuthorizationCode - ( - $request, - $has_former_consent - ); - - if (is_null($auth_code)) - { - throw new OAuth2GenericException("Invalid Auth Code"); - } - - // http://openid.net/specs/openid-connect-session-1_0.html#CreatingUpdatingSessions - $session_state = $this->getSessionState - ( - self::getOrigin - ( - $request->getRedirectUri() - ), - $request->getClientId(), - - $this->principal_service->get()->getOPBrowserState() - ); - - return new OAuth2AuthorizationResponse - ( - $request->getRedirectUri(), - $auth_code->getValue(), - $request->getScope(), - $request->getState(), - $session_state - ); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/ClientCredentialsGrantType.php b/app/libs/OAuth2/GrantTypes/ClientCredentialsGrantType.php deleted file mode 100644 index 2c672e00..00000000 --- a/app/libs/OAuth2/GrantTypes/ClientCredentialsGrantType.php +++ /dev/null @@ -1,185 +0,0 @@ -scope_service = $scope_service; - } - - /** Given an OAuth2Request, returns true if it can handle it, false otherwise - * @param OAuth2Request $request - * @return boolean - */ - public function canHandle(OAuth2Request $request) - { - return $request instanceof OAuth2TokenRequest && $request->isValid() && $request->getGrantType() == $this->getType(); - } - - /** - * get grant type response type - * @return array - * @throws InvalidOAuth2Request - */ - public function getResponseType() - { - throw new InvalidOAuth2Request('not implemented!'); - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws InvalidOAuth2Request - */ - public function handle(OAuth2Request $request) - { - throw new InvalidOAuth2Request('not implemented!'); - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws ScopeNotAllowedException - * @throws InvalidOAuth2Request - * @throws InvalidApplicationType - * @throws InvalidGrantTypeException - */ - public function completeFlow(OAuth2Request $request) - { - if (!($request instanceof OAuth2AccessTokenRequestClientCredentials)) { - throw new InvalidOAuth2Request; - } - - if ($request->getGrantType() != $this->getType()) { - throw new InvalidGrantTypeException; - } - - parent::completeFlow($request); - - //only confidential clients could use this grant type - if ($this->current_client->getApplicationType() != IClient::ApplicationType_Service) { - throw new InvalidApplicationType - ( - sprintf - ( - 'client id %s client type must be %s', - $this->client_auth_context->getId(), - IClient::ApplicationType_Service - ) - ); - } - - //check requested scope - $scope = $request->getScope(); - if (is_null($scope) || empty($scope)) { - throw new ScopeNotAllowedException("scope param is empty"); - } - - if(!$this->current_client->isScopeAllowed($scope)) { - throw new ScopeNotAllowedException(sprintf("scope %s", $scope)); - } - - // build current audience ... - $audience = $this->scope_service->getStrAudienceByScopeNames(explode(' ', $scope)); - - //build access token - $access_token = $this->token_service->createAccessTokenFromParams($this->client_auth_context->getId(), $scope, $audience); - - $response = new OAuth2AccessTokenResponse($access_token->getValue(), $access_token->getLifetime(), null); - - return $response; - - } - - /** builds specific Token request - * @param OAuth2Request $request - * @return mixed - */ - public function buildTokenRequest(OAuth2Request $request) - { - - if ($request instanceof OAuth2TokenRequest) - { - if ($request->getGrantType() !== $this->getType()) - { - return null; - } - return new OAuth2AccessTokenRequestClientCredentials($request->getMessage()); - } - - return null; - } - - /** - * get grant type - * @return string - */ - public function getType() - { - return OAuth2Protocol::OAuth2Protocol_GrantType_ClientCredentials; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/HybridGrantType.php b/app/libs/OAuth2/GrantTypes/HybridGrantType.php deleted file mode 100644 index e0a378d0..00000000 --- a/app/libs/OAuth2/GrantTypes/HybridGrantType.php +++ /dev/null @@ -1,258 +0,0 @@ -isValid() && - OAuth2Protocol::responseTypeBelongsToFlow - ( - $request->getResponseType(false), - OAuth2Protocol::OAuth2Protocol_GrantType_Hybrid - ) - ); - } - - /** - * get grant type - * @return string - */ - public function getType() - { - return OAuth2Protocol::OAuth2Protocol_GrantType_Hybrid; - } - - /** - * get grant type response type - * @return array - */ - public function getResponseType() - { - return OAuth2Protocol::getValidResponseTypes(OAuth2Protocol::OAuth2Protocol_GrantType_Hybrid); - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws InvalidOAuth2Request - */ - public function buildTokenRequest(OAuth2Request $request) - { - throw new InvalidOAuth2Request('not implemented!'); - } - - /** - * @param OAuth2AuthorizationRequest $request - * @param bool $has_former_consent - * @return OAuth2Response - * @throws InvalidOAuth2Request - * @throws OAuth2GenericException - */ - protected function buildResponse(OAuth2AuthorizationRequest $request, $has_former_consent) - { - if (!($request instanceof OAuth2AuthenticationRequest)) { - throw new InvalidOAuth2Request; - } - - $user = $this->auth_service->getCurrentUser(); - - // build current audience ... - $audience = $this->scope_service->getStrAudienceByScopeNames - ( - explode - ( - OAuth2Protocol::OAuth2Protocol_Scope_Delimiter, - $request->getScope() - ) - ); - - // http://openid.net/specs/openid-connect-session-1_0.html#CreatingUpdatingSessions - $session_state = $this->getSessionState - ( - self::getOrigin - ( - $request->getRedirectUri() - ), - $request->getClientId(), - - $this->principal_service->get()->getOPBrowserState() - ); - - $auth_code = $this->token_service->createAuthorizationCode - ( - $request, - $has_former_consent - ); - - if (is_null($auth_code) || !$auth_code instanceof AuthorizationCode) { - throw new OAuth2GenericException("Invalid Auth Code."); - } - - $access_token = null; - $id_token = null; - - if (in_array(OAuth2Protocol::OAuth2Protocol_ResponseType_Token, $request->getResponseType(false))) - { - $access_token = $this->token_service->createAccessToken - ( - $auth_code, - $request->getRedirectUri() - ); - } - - if (in_array(OAuth2Protocol::OAuth2Protocol_ResponseType_IdToken, $request->getResponseType(false))) - { - - $id_token = $this->token_service->createIdToken - ( - $request->getNonce(), - $request->getClientId(), - $access_token, - $auth_code - ); - } - - return new OAuth2HybridTokenFragmentResponse - ( - $request->getRedirectUri(), - $auth_code->getValue(), - is_null($access_token) ? null : $access_token->getValue(), - is_null($access_token) ? null : $access_token->getLifetime(), - is_null($access_token) ? null : $request->getScope(), - $request->getState(), - $session_state, - is_null($id_token) ? null : $id_token->toCompactSerialization() - ); - } - - /** - * @param IClient $client - * @throws InvalidApplicationType - * @throws InvalidClientType - * @return void - */ - protected function checkClientTypeAccess(IClient $client) - { - if - ( - !( - $client->getClientType() === IClient::ClientType_Confidential || - $client->getApplicationType() === IClient::ApplicationType_Native - ) - ) - { - throw new InvalidApplicationType - ( - sprintf - ( - "client id %s - Application type must be %s or %s", - $client->getClientId(), - IClient::ClientType_Confidential, - IClient::ApplicationType_Native - ) - ); - } - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/IGrantType.php b/app/libs/OAuth2/GrantTypes/IGrantType.php deleted file mode 100644 index 5e990d0b..00000000 --- a/app/libs/OAuth2/GrantTypes/IGrantType.php +++ /dev/null @@ -1,62 +0,0 @@ -isValid() && - OAuth2Protocol::responseTypeBelongsToFlow - ( - $request->getResponseType(false), - OAuth2Protocol::OAuth2Protocol_GrantType_Implicit - ) - ); - } - - /** - * get grant type response type - * OAuth 2.0 Response Type value that determines the authorization processing flow to be used, including what - * parameters are returned from the endpoints used. When using the Implicit Flow, this value is id_token token or - * id_token. The meanings of both of these values are defined in OAuth 2.0 Multiple Response Type Encoding Practices - * [OAuth.Responses]. No Access Token is returned when the value is id_token. - * NOTE: While OAuth 2.0 also defines the token Response Type value for the Implicit Flow, OpenID Connect does not - * use this Response Type, since no ID Token would be returned. - * @return array - */ - public function getResponseType() - { - return OAuth2Protocol::getValidResponseTypes(OAuth2Protocol::OAuth2Protocol_GrantType_Implicit); - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws InvalidOAuth2Request - */ - public function completeFlow(OAuth2Request $request) - { - throw new InvalidOAuth2Request('not implemented!'); - } - - /** - * get grant type - * @return string - */ - public function getType() - { - return OAuth2Protocol::OAuth2Protocol_GrantType_Implicit; - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws InvalidOAuth2Request - */ - public function buildTokenRequest(OAuth2Request $request) - { - throw new InvalidOAuth2Request('not implemented!'); - } - - /** - * @param OAuth2AuthorizationRequest $request - * @param bool $has_former_consent - * @return OAuth2AccessTokenFragmentResponse - */ - protected function buildResponse(OAuth2AuthorizationRequest $request, $has_former_consent) - { - // build current audience ... - $audience = $this->scope_service->getStrAudienceByScopeNames - ( - explode - ( - OAuth2Protocol::OAuth2Protocol_Scope_Delimiter, - $request->getScope() - ) - ); - - // http://openid.net/specs/openid-connect-session-1_0.html#CreatingUpdatingSessions - $session_state = $this->getSessionState - ( - self::getOrigin - ( - $request->getRedirectUri() - ), - $request->getClientId(), - - $this->principal_service->get()->getOPBrowserState() - ); - - return OAuth2AccessTokenFragmentResponseFactory::build - ( - $request, - $audience, - $session_state, - $this->auth_service->getCurrentUser(), - $this->token_service - ); - } - - /** - * @param IClient $client - * @throws InvalidApplicationType - * @throws InvalidClientType - * @return void - */ - protected function checkClientTypeAccess(IClient $client) - { - //check client type - // only public clients could use this grant type - if( $client->getClientType() != IClient::ClientType_Public ) - { - throw new InvalidClientType - ( - sprintf - ( - 'client id %s client type must be %s', - $client->getClientId(), - IClient::ClientType_Public - ) - ); - } - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/InteractiveGrantType.php b/app/libs/OAuth2/GrantTypes/InteractiveGrantType.php deleted file mode 100644 index dd24de50..00000000 --- a/app/libs/OAuth2/GrantTypes/InteractiveGrantType.php +++ /dev/null @@ -1,669 +0,0 @@ -security_context_service = $security_context_service; - $this->principal_service = $principal_service; - $this->auth_service = $auth_service; - $this->user_consent_service = $user_consent_service; - $this->scope_service = $scope_service; - $this->auth_strategy = $auth_strategy; - $this->memento_service = $memento_service; - $this->server_private_key_repository = $server_private_key_repository; - $this->jwk_set_reader_service = $jwk_set_reader_service; - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws Exception - */ - public function handle(OAuth2Request $request) - { - try - { - - if (!($request instanceof OAuth2AuthorizationRequest)) - { - throw new InvalidOAuth2Request; - } - - $client_id = $request->getClientId(); - $client = $this->client_repository->getClientById($client_id); - - if (is_null($client)) { - throw new InvalidClientException - ( - sprintf - ( - "client_id %s does not exists!", - $client_id - ) - ); - } - - if (!$client->isActive() || $client->isLocked()) { - throw new LockedClientException - ( - sprintf - ( - 'client id %s is locked', - $client_id - ) - ); - } - - $this->checkClientTypeAccess($client); - - //check redirect uri - $redirect_uri = $request->getRedirectUri(); - - if (!$client->isUriAllowed($redirect_uri)) { - throw new UriNotAllowedException - ( - $redirect_uri - ); - } - - //check requested scope - $scope = $request->getScope(); - $this->log_service->debug_msg(sprintf("scope %s", $scope)); - if (empty($scope) || !$client->isScopeAllowed($scope)) { - throw new ScopeNotAllowedException($scope); - } - - $authentication_response = $this->auth_service->getUserAuthenticationResponse(); - - // user has cancelled login action - if ($authentication_response == IAuthService::AuthenticationResponse_Cancel) { - //clear saved data ... - $this->memento_service->forget(); - $this->auth_service->clearUserAuthenticationResponse(); - $this->auth_service->clearUserAuthorizationResponse(); - - if ($this->shouldPromptLogin($request)) { - throw new LoginRequiredException; - } - - throw new AccessDeniedException; - } - - //check user logged - if ($this->mustAuthenticateUser($request, $client)) { - if (!$this->canInteractWithEndUser($request)) { - throw new LoginRequiredException; - } - - $this->memento_service->serialize($request->getMessage()->createMemento()); - - return $this->auth_strategy->doLogin($request); - } - - $approval_prompt = $request->getApprovalPrompt(); - $user = $this->auth_service->getCurrentUser(); - - // check if logged user its the same as login hint - $requested_user_id = $this->security_context_service->get()->getRequestedUserId(); - - if (is_null($user)) { - throw new OAuth2GenericException("Invalid Current User"); - } - - if (!is_null($requested_user_id) && $requested_user_id !== $user->getId()) { - $this->auth_service->logout(); - throw new InvalidLoginHint('invalid login hint'); - } - - $authorization_response = $this->auth_service->getUserAuthorizationResponse(); - - $this->log_service->debug_msg(sprintf("authorization_response %s", $authorization_response)); - - if ($authorization_response == IAuthService::AuthorizationResponse_DenyOnce) { - if ($this->hadPromptConsent($request)) { - throw new ConsentRequiredException('the user denied access to your application'); - } - throw new AccessDeniedException; - } - - // check for former user consents - $former_user_consent = $user->findFirstConsentByClientAndScopes($client, $scope); - $auto_approval = $approval_prompt == OAuth2Protocol::OAuth2Protocol_Approval_Prompt_Auto; - $has_former_consent = !is_null($former_user_consent); - $should_prompt_consent = $this->shouldPromptConsent($request); - - if((!$should_prompt_consent && $has_former_consent && $auto_approval) || $authorization_response == IAuthService::AuthorizationResponse_AllowOnce) { - // emit response ... - $this->auth_service->registerRPLogin($client_id); - //save positive consent - if (is_null($former_user_consent)) { - $this->user_consent_service->addUserConsent($user, $client, $scope); - } - $response = $this->buildResponse($request, $has_former_consent); - // clear save data ... - $this->auth_service->clearUserAuthorizationResponse(); - $this->memento_service->forget(); - return $response; - } - - if (!$this->canInteractWithEndUser($request)) - throw new InteractionRequiredException; - - $this->memento_service->serialize($request->getMessage()->createMemento()); - $this->log_service->debug_msg(sprintf("Doing consent ... authorization_response %s should_prompt_consent %s",$authorization_response, $should_prompt_consent)); - return $this->auth_strategy->doConsent($request); - } - catch(Exception $ex) - { - $this->log_service->warning($ex); - // clear save data ... - $this->auth_service->clearUserAuthorizationResponse(); - $this->memento_service->forget(); - throw $ex; - } - } - - /** - * @param string $origin - * @param string $client_id - * @param string $session_id - * @return string - */ - public function getSessionState($origin, $client_id, $session_id) - { - - $this->log_service->debug_msg(sprintf( - "InteractiveGrantType::getSessionState origin %s client_id %s session_id %s", - $origin, - $client_id, - $session_id - )); - - $salt = bin2hex(Random::string(16)); - $message = "{$client_id}{$origin}{$session_id}{$salt}"; - $this->log_service->debug_msg(sprintf( - "InteractiveGrantType::getSessionState message %s", - $message - )); - $hash = hash('sha256', $message); - $this->log_service->debug_msg(sprintf( - "InteractiveGrantType::getSessionState hash %s", - $hash - )); - $session_state = $hash. '.' . $salt; - $this->log_service->debug_msg(sprintf( - "InteractiveGrantType::getSessionState session_state %s", - $session_state - )); - - return $session_state; - } - - /** - * @param string $url - * @return string - */ - static public function getOrigin($url) - { - $url_parts = @parse_url($url); - return sprintf("%s://%s%s", $url_parts['scheme'], $url_parts['host'], isset($url_parts['port']) ? ':' . $url_parts['port'] : ''); - } - - /** - * @param OAuth2AuthorizationRequest $request - * @param bool $has_former_consent - * @return OAuth2Response - */ - abstract protected function buildResponse(OAuth2AuthorizationRequest $request, $has_former_consent); - - /** - * @param IClient $client - * @throws InvalidApplicationType - * @throws InvalidClientType - * @return void - */ - abstract protected function checkClientTypeAccess(IClient $client); - - /** - * @param OAuth2AuthorizationRequest $request - * @return bool - */ - protected function canInteractWithEndUser(OAuth2AuthorizationRequest $request) - { - if($request instanceof OAuth2AuthenticationRequest && in_array(OAuth2Protocol::OAuth2Protocol_Prompt_None, $request->getPrompt())) - { - return false; - } - return true; - } - - /** - * @param OAuth2AuthenticationRequest $request - * @throws InteractionRequiredException - * @throws InvalidClientException - * @throws InvalidLoginHint - * @throws InvalidJWKAlgorithm - * @throws InvalidClientType - * @throws ServerKeyNotFoundException - * @throws InvalidCompactSerializationException - */ - protected function processUserHint(OAuth2AuthenticationRequest $request) - { - $login_hint = $request->getLoginHint(); - $token_hint = $request->getIdTokenHint(); - $this->log_service->debug_msg("InteractiveGrantType::processUserHint"); - // process login hint - $user = null; - - if(!empty ($login_hint)) - { - - if (filter_var($login_hint, FILTER_VALIDATE_EMAIL)) - { - $user = $this->auth_service->getUserByUsername($login_hint); - } - else - { - $user_id = $this->auth_service->unwrapUserId($login_hint); - $user = $this->auth_service->getUserById($user_id); - } - } - else if(!empty($token_hint)) - { - $this->log_service->debug_msg("InteractiveGrantType::processUserHint has token hint"); - $client_id = $request->getClientId(); - $client = $this->client_repository->getClientById($client_id); - - if (is_null($client)) - { - throw new InvalidClientException - ( - sprintf - ( - "client_id %s does not exists!", - $client_id - ) - ); - } - - $jwt = BasicJWTFactory::build($token_hint); - - if($jwt instanceof IJWE) - { - $this->log_service->debug_msg("InteractiveGrantType::processUserHint token hint is IJWE"); - // decrypt using server key - $heuristic = new ServerEncryptionKeyFinder($this->server_private_key_repository); - $server_enc_private_key = $heuristic->find - ( - $client, - $client->getIdTokenResponseInfo()->getEncryptionKeyAlgorithm() - ); - - $jwt->setRecipientKey($server_enc_private_key); - - $payload = $jwt->getPlainText(); - $jwt = BasicJWTFactory::build($payload); - } - if($jwt instanceof IJWS) - { - $this->log_service->debug_msg("InteractiveGrantType::processUserHint token hint is IJWS"); - // signed by client ? - try - { - $heuristic = new ClientSigningKeyFinder($this->jwk_set_reader_service); - $client_public_sig_key = $heuristic->find - ( - $client, - $client->getIdTokenResponseInfo()->getSigningAlgorithm() - ); - - $jwt->setKey($client_public_sig_key); - } - catch(RecipientKeyNotFoundException $ex) - { - // try to find the server signing key used ... - $this->log_service->debug_msg("InteractiveGrantType::processUserHint token hint is IJWS -> RecipientKeyNotFoundException"); - $heuristic = new ServerSigningKeyFinder($this->server_private_key_repository); - $server_private_sig_key = $heuristic->find - ( - $client, - $client->getIdTokenResponseInfo()->getSigningAlgorithm(), - $jwt->getJOSEHeader()->getKeyID()->getValue() - ); - $jwt->setKey($server_private_sig_key); - } - - $verified = $jwt->verify($jwt->getJOSEHeader()->getAlgorithm()->getString()); - - if(!$verified) - throw new InvalidLoginHint('invalid id_token_hint'); - } - - $sub = $jwt->getClaimSet()->getSubject(); - $user_id = $this->auth_service->unwrapUserId($sub->getString()); - $user = $this->auth_service->getUserById($user_id); - - $jti = $jwt->getClaimSet()->getJWTID(); - if(is_null($jti)) throw new InvalidLoginHint('invalid jti!'); - - $this->auth_service->reloadSession($jti->getValue()); - - } - - if(!is_null($user)) - { - $this->log_service->debug_msg("InteractiveGrantType::processUserHint: checking principal"); - $logged_user = $this->auth_service->getCurrentUser(); - if - ( - !is_null($logged_user) && - $logged_user->getId() !== $user->getId() - ) - { - $this->auth_service->logout(); - - if(!$this->canInteractWithEndUser($request)) { - $this->log_service->debug_msg("InteractiveGrantType::processUserHint: cant interact with user"); - throw new InteractionRequiredException; - } - } - - $this->security_context_service->save - ( - $this->security_context_service->get()->setRequestedUserId - ( - $user->getId() - ) - ); - } - } - - /** - * @param OAuth2AuthorizationRequest $request - * @return bool - */ - protected function shouldPromptLogin(OAuth2AuthorizationRequest $request) - { - if - ( - $request instanceof OAuth2AuthenticationRequest && - !$request->isProcessedParam(OAuth2Protocol::OAuth2Protocol_Prompt_Login) && - in_array(OAuth2Protocol::OAuth2Protocol_Prompt_Login, $request->getPrompt()) - ) - { - $request->markParamAsProcessed(OAuth2Protocol::OAuth2Protocol_Prompt_Login); - return true; - } - return false; - } - - /** - * @param OAuth2AuthorizationRequest $request - * @return bool - */ - protected function shouldPromptConsent(OAuth2AuthorizationRequest $request) - { - if - ( - $request instanceof OAuth2AuthenticationRequest && - !$request->isProcessedParam(OAuth2Protocol::OAuth2Protocol_Prompt_Consent) && - in_array(OAuth2Protocol::OAuth2Protocol_Prompt_Consent, $request->getPrompt()) - ) - { - $request->markParamAsProcessed(OAuth2Protocol::OAuth2Protocol_Prompt_Consent); - return true; - } - return false; - } - - /** - * @param OAuth2AuthorizationRequest $request - * @return bool - */ - protected function hadPromptConsent(OAuth2AuthorizationRequest $request) - { - if - ( - $request instanceof OAuth2AuthenticationRequest && - in_array(OAuth2Protocol::OAuth2Protocol_Prompt_Consent, $request->getPrompt()) - ) - { - return true; - } - return false; - } - - /** - * @param OAuth2AuthorizationRequest $request - * @param IClient $client - * @return bool - * @throws InteractionRequiredException - */ - protected function shouldForceReLogin(OAuth2AuthorizationRequest $request, IClient $client) - { - $now = time(); - $principal = $this->principal_service->get(); - - if($request instanceof OAuth2AuthenticationRequest) - { - - $max_age = $request->getMaxAge(); - $default_max_age = $client->getDefaultMaxAge(); - - if(is_null($max_age) && $default_max_age > 0) - $max_age = $default_max_age; - - if(!is_null($max_age) && $max_age > 0) - { - // must required teh auth_time claim - $this->security_context_service->save - ( - $this->security_context_service->get()->setAuthTimeRequired(true) - ); - - if - ( - !is_null($principal) && - !is_null($principal->getAuthTime()) && - ($now - $principal->getAuthTime()) > $max_age - ) - { - if (!$this->canInteractWithEndUser($request)) - { - throw new InteractionRequiredException; - } - - return true; - } - } - } - return false; - } - - /** - * @param OAuth2AuthorizationRequest $request - * @param IClient $client - * @return bool - * @throws LoginRequiredException - */ - protected function mustAuthenticateUser(OAuth2AuthorizationRequest $request, IClient $client) - { - - if($request instanceof OAuth2AuthenticationRequest) - { - try { - $this->processUserHint($request); - } - catch (JWSInvalidJWKException $ex){ - Log::warning($ex); - throw $ex; - } - catch (JWKInvalidSpecException $ex){ - Log::warning($ex); - throw $ex; - } - catch (Exception $ex){ - Log::warning($ex); - return true; - } - } - - if($this->shouldPromptLogin($request)) - { - $this->auth_service->logout(); - return true; - } - - if($this->shouldForceReLogin($request, $client)) - { - $this->auth_service->logout(); - return true; - } - - if (!$this->auth_service->isUserLogged()) - return true; - - return false; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/RefreshBearerTokenGrantType.php b/app/libs/OAuth2/GrantTypes/RefreshBearerTokenGrantType.php deleted file mode 100644 index 536070db..00000000 --- a/app/libs/OAuth2/GrantTypes/RefreshBearerTokenGrantType.php +++ /dev/null @@ -1,216 +0,0 @@ -isValid() && - $request->getGrantType() == $this->getType(); - } - - /** Not implemented , there is no first process phase on this grant type - * @param OAuth2Request $request - * @return mixed|void - * @throws Exception - */ - public function handle(OAuth2Request $request) - { - throw new InvalidOAuth2Request('not implemented!'); - } - - /** - * Access Token issuance using a refresh token - * The authorization server MUST: - * o require client authentication for confidential clients or for any - * client that was issued client credentials (or with other - * authentication requirements), - * o authenticate the client if client authentication is included and - * ensure that the refresh token was issued to the authenticated - * client, and - * o validate the refresh token. - * @param OAuth2Request $request - * @return OAuth2Response - * @throws UseRefreshTokenException - * @throws InvalidOAuth2Request - * @throws InvalidApplicationType - * @throws InvalidGrantTypeException - */ - public function completeFlow(OAuth2Request $request) - { - - if (!($request instanceof OAuth2RefreshAccessTokenRequest)) { - throw new InvalidOAuth2Request; - } - - parent::completeFlow($request); - - if (!$this->current_client->canRequestRefreshTokens()) { - throw new InvalidApplicationType - ( - sprintf - ( - 'client id %s client type must be %s or %s or support PKCE', - $this->client_auth_context->getId(), - IClient::ApplicationType_Web_App, - IClient::ApplicationType_Native - ) - ); - } - - if (!$this->current_client->useRefreshToken()) { - throw new UseRefreshTokenException - ( - sprintf - ( - "current client id %s could not use refresh tokens", - $this->client_auth_context->getId() - ) - ); - } - - $refresh_token_value = $request->getRefreshToken(); - $scope = $request->getScope(); - $refresh_token = $this->token_service->getRefreshToken($refresh_token_value); - - if (is_null($refresh_token)) { - throw new InvalidGrantTypeException - ( - sprintf - ( - "refresh token %s does not exists!", - $refresh_token_value - ) - ); - } - - if ($refresh_token->getClientId() !== $this->current_client->getClientId()) { - throw new InvalidGrantTypeException - ( - sprintf - ( - "refresh token %s does not belongs to client %s", - $refresh_token_value, $this->current_client->getClientId() - ) - ); - } - - $new_refresh_token = null; - $access_token = $this->token_service->createAccessTokenFromRefreshToken($refresh_token, $scope); - /* - * the authorization server could employ refresh token - * rotation in which a new refresh token is issued with every access - * token refresh response. The previous refresh token is invalidated - * but retained by the authorization server. If a refresh token is - * compromised and subsequently used by both the attacker and the - * legitimate client, one of them will present an invalidated refresh - * token, which will inform the authorization server of the breach. - */ - if ($this->current_client->useRotateRefreshTokenPolicy()) { - $this->token_service->invalidateRefreshToken($refresh_token_value); - $new_refresh_token = $this->token_service->createRefreshToken($access_token, true); - } - - $response = new OAuth2AccessTokenResponse - ( - $access_token->getValue(), - $access_token->getLifetime(), - !is_null($new_refresh_token) ? $new_refresh_token->getValue() : null, - $scope - ); - - return $response; - } - - /** - * @return string - */ - public function getType() - { - return OAuth2Protocol::OAuth2Protocol_GrantType_RefreshToken; - } - - /** - * @return array - * @throws InvalidOAuth2Request - */ - public function getResponseType() - { - throw new InvalidOAuth2Request('not implemented!'); - } - - /** - * @param OAuth2Request $request - * @return null|OAuth2Response - */ - public function buildTokenRequest(OAuth2Request $request) - { - if ($request instanceof OAuth2TokenRequest) { - if ($request->getGrantType() !== $this->getType()) { - return null; - } - - return new OAuth2RefreshAccessTokenRequest($request->getMessage()); - } - - return null; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/RevokeBearerTokenGrantType.php b/app/libs/OAuth2/GrantTypes/RevokeBearerTokenGrantType.php deleted file mode 100644 index f3020333..00000000 --- a/app/libs/OAuth2/GrantTypes/RevokeBearerTokenGrantType.php +++ /dev/null @@ -1,279 +0,0 @@ -isValid(); - } - - /** defines entry point for first request processing - * @param OAuth2Request $request - * @throws InvalidOAuth2Request - * @return OAuth2Response - */ - public function handle(OAuth2Request $request) - { - throw new InvalidOAuth2Request('not implemented!'); - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws BearerTokenDisclosureAttemptException - * @throws Exception - * @throws ExpiredAccessTokenException - * @throws InvalidOAuth2Request - * @throws UnAuthorizedClientException - * @throws InvalidClientCredentials - * @throws InvalidClientException - * @throws LockedClientException - * @throws MissingClientIdParam - */ - public function completeFlow(OAuth2Request $request) - { - - if (!($request instanceof OAuth2TokenRevocationRequest)) - { - throw new InvalidOAuth2Request; - } - - parent::completeFlow($request); - - $token_value = $request->getToken(); - $token_hint = $request->getTokenHint(); - - try - { - if (!is_null($token_hint) && !empty($token_hint)) - { - //we have been provided with a token hint... - switch ($token_hint) - { - case OAuth2Protocol::OAuth2Protocol_AccessToken: - { - //check ownership - $access_token = $this->token_service->getAccessToken($token_value); - - if (is_null($access_token)) - { - throw new ExpiredAccessTokenException(sprintf('Access token %s is expired!', $token_value)); - } - - if ($access_token->getClientId() !== $this->client_auth_context->getId()) - { - throw new BearerTokenDisclosureAttemptException - ( - sprintf - ( - 'access token %s does not belongs to client id %s', - $token_value, - $this->client_auth_context->getId() - ) - ); - } - - $this->token_service->revokeAccessToken($token_value, false); - } - break; - case OAuth2Protocol::OAuth2Protocol_RefreshToken: - { - //check ownership - $refresh_token = $this->token_service->getRefreshToken($token_value); - - if ($refresh_token->getClientId() !== $this->client_auth_context->getId()) - { - throw new BearerTokenDisclosureAttemptException - ( - sprintf - ( - 'refresh token %s does not belongs to client id %s', - $token_value, - $this->client_auth_context->getId() - ) - ); - } - - $this->token_service->revokeRefreshToken($token_value, false); - } - break; - } - } - else - { - /* - * no token hint given :( - * if the server is unable to locate the token using - * the given hint, it MUST extend its search across all of its - * supported token types. - */ - - //check and handle access token first .. - try { - //check ownership - $access_token = $this->token_service->getAccessToken($token_value); - - if (is_null($access_token)) - { - throw new ExpiredAccessTokenException - ( - sprintf - ( - 'Access token %s is expired!', - $token_value - ) - ); - } - - if ($access_token->getClientId() !== $this->client_auth_context->getId()) - { - throw new BearerTokenDisclosureAttemptException - ( - sprintf - ( - 'access token %s does not belongs to client id %s', - $token_value, - $this->client_auth_context->getId() - ) - ); - } - - $this->token_service->revokeAccessToken($token_value, false); - - } - catch (UnAuthorizedClientException $ex1) - { - $this->log_service->error($ex1); - throw $ex1; - } - catch (Exception $ex) - { - $this->log_service->warning($ex); - //access token was not found, check refresh token - //check ownership - $refresh_token = $this->token_service->getRefreshToken($token_value); - - if ($refresh_token->getClientId() !== $this->client_auth_context->getId()) - { - throw new BearerTokenDisclosureAttemptException - ( - sprintf - ( - 'refresh token %s does not belongs to client id %s', - $token_value, - $this->client_auth_context->getId() - ) - ); - } - $this->token_service->revokeRefreshToken($token_value, false); - } - } - - return new OAuth2TokenRevocationResponse; - } - catch (InvalidGrantTypeException $ex) - { - throw new BearerTokenDisclosureAttemptException - ( - $ex->getMessage() - ); - } - } - - /** - * get grant type - * @return string - */ - public function getType() - { - return self::OAuth2Protocol_GrantType_Extension_RevokeToken; - } - - /** get grant type response type - * @return array - * @throws InvalidOAuth2Request - */ - public function getResponseType() - { - throw new InvalidOAuth2Request('not implemented!'); - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws InvalidOAuth2Request - */ - public function buildTokenRequest(OAuth2Request $request) - { - throw new InvalidOAuth2Request('not implemented!'); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/Strategies/IValidateBearerTokenStrategy.php b/app/libs/OAuth2/GrantTypes/Strategies/IValidateBearerTokenStrategy.php deleted file mode 100644 index 42ff67bd..00000000 --- a/app/libs/OAuth2/GrantTypes/Strategies/IValidateBearerTokenStrategy.php +++ /dev/null @@ -1,26 +0,0 @@ -code_challenge = $code_challenge; - $this->code_verifier = $code_verifier; - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/Strategies/PKCEPlainValidator.php b/app/libs/OAuth2/GrantTypes/Strategies/PKCEPlainValidator.php deleted file mode 100644 index dfe901d4..00000000 --- a/app/libs/OAuth2/GrantTypes/Strategies/PKCEPlainValidator.php +++ /dev/null @@ -1,25 +0,0 @@ -code_challenge === $this->code_verifier; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/Strategies/PKCES256Validator.php b/app/libs/OAuth2/GrantTypes/Strategies/PKCES256Validator.php deleted file mode 100644 index c412c958..00000000 --- a/app/libs/OAuth2/GrantTypes/Strategies/PKCES256Validator.php +++ /dev/null @@ -1,32 +0,0 @@ -code_verifier, true)); - $calculate_code_challenge = strtr(rtrim($encoded, '='), '+/', '-_'); - return $this->code_challenge === $calculate_code_challenge; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenResourceServerStrategy.php b/app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenResourceServerStrategy.php deleted file mode 100644 index ca7f3b65..00000000 --- a/app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenResourceServerStrategy.php +++ /dev/null @@ -1,107 +0,0 @@ -token_service = $token_service; - $this->ip_helper = $ip_helper; - } - - /** - * @param AccessToken $access_token - * @param IClient $client - * @throws BearerTokenDisclosureAttemptException - * @throws InvalidApplicationType - * @throws LockedClientException - */ - public function validate(AccessToken $access_token, IClient $client) - { - // current client is a resource server, validate client type (must be confidential) - if ($client->getClientType() !== IClient::ClientType_Confidential) - { - throw new InvalidApplicationType - ( - 'resource server client is not of confidential type!' - ); - } - //validate resource server IP address - $current_ip = $this->ip_helper->getCurrentUserIpAddress(); - $resource_server = $client->getResourceServer(); - //check if resource server is active - if (!$resource_server->isActive()) - { - throw new LockedClientException - ( - 'resource server is disabled!' - ); - } - //check resource server ip address - if (!$resource_server->isOwn($current_ip)) - { - throw new BearerTokenDisclosureAttemptException - ( - sprintf - ( - 'resource server ip (%s) differs from current request ip %s', - $resource_server->getIPAddresses(), - $current_ip - ) - ); - } - // check if current ip belongs to a registered resource server audience - if (!$this->token_service->checkAccessTokenAudience($access_token, $current_ip)) - { - throw new BearerTokenDisclosureAttemptException - ( - sprintf - ( - 'access token current audience does not match with current request ip %s', - $current_ip - ) - ); - } - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenStrategy.php b/app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenStrategy.php deleted file mode 100644 index c72460de..00000000 --- a/app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenStrategy.php +++ /dev/null @@ -1,58 +0,0 @@ -client_auth_context = $client_auth_context; - } - - /** - * @param AccessToken $access_token - * @param IClient $client - * @throws BearerTokenDisclosureAttemptException - */ - public function validate(AccessToken $access_token, IClient $client) - { - // if current client is not a resource server, then we could only access to our own tokens - if ($access_token->getClientId() !== $this->client_auth_context->getId()) - { - throw new BearerTokenDisclosureAttemptException - ( - sprintf - ( - 'access token %s does not belongs to client id %s', - $access_token->getValue(), - $this->client_auth_context->getId() - ) - ); - } - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenStrategyFactory.php b/app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenStrategyFactory.php deleted file mode 100644 index 6c99f90f..00000000 --- a/app/libs/OAuth2/GrantTypes/Strategies/ValidateBearerTokenStrategyFactory.php +++ /dev/null @@ -1,44 +0,0 @@ -isResourceServerClient()) - return new ValidateBearerTokenResourceServerStrategy($token_service, $ip_helper); - return new ValidateBearerTokenStrategy($client_auth_context); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/GrantTypes/ValidateBearerTokenGrantType.php b/app/libs/OAuth2/GrantTypes/ValidateBearerTokenGrantType.php deleted file mode 100644 index f66c7371..00000000 --- a/app/libs/OAuth2/GrantTypes/ValidateBearerTokenGrantType.php +++ /dev/null @@ -1,254 +0,0 @@ -auth_service = $auth_service; - $this->ip_helper = $ip_helper; - } - - /** - * @param OAuth2Request $request - * @return bool - */ - public function canHandle(OAuth2Request $request) - { - return $request instanceof OAuth2AccessTokenValidationRequest && $request->isValid(); - } - - /** - * @return string - */ - public function getType() - { - return self::OAuth2Protocol_GrantType_Extension_ValidateBearerToken; - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws InvalidOAuth2Request - */ - public function handle(OAuth2Request $request) - { - throw new InvalidOAuth2Request('Not Implemented!'); - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws BearerTokenDisclosureAttemptException - * @throws ExpiredAccessTokenException - * @throws InvalidApplicationType - * @throws InvalidOAuth2Request - * @throws LockedClientException - * @throws InvalidClientCredentials - * @throws InvalidClientException - */ - public function completeFlow(OAuth2Request $request) - { - - if (!($request instanceof OAuth2AccessTokenValidationRequest)) { - throw new InvalidOAuth2Request; - } - - parent::completeFlow($request); - - $token_value = $request->getToken(); - - try { - - $access_token = $this->token_service->getAccessToken($token_value); - - if (is_null($access_token)) - { - throw new ExpiredAccessTokenException - ( - sprintf - ( - 'Access token %s is expired!', - $token_value - ) - ); - } - - $this->log_service->debug_msg - ( - sprintf - ( - "ValidateBearerTokenGrantType::completeFlow : access token %s - client id %s", - $access_token->getValue(), - $access_token->getClientId() - ) - ); - - $strategy = ValidateBearerTokenStrategyFactory::build - ( - $this->client_auth_context, - $this->token_service, - $this->current_client, - $this->ip_helper - ); - - $strategy->validate($access_token, $this->current_client); - - $issued_client = $this->client_repository->getClientById($access_token->getClientId()); - - if (is_null($issued_client)) - { - throw new BearerTokenDisclosureAttemptException - ( - sprintf - ( - 'access token %s does not belongs to client id %s', - $token_value, - $access_token->getClientId() - ) - ); - } - - $user_id = $access_token->getUserId(); - $user = !is_null($user_id) && $user_id > 0 ? $this->auth_service->getUserById($user_id) : null; - - return new OAuth2AccessTokenValidationResponse - ( - $token_value, - $access_token->getScope(), - $access_token->getAudience(), - $issued_client, - $access_token->getRemainingLifetime(), - $user, - $issued_client->getRedirectUris(), - $issued_client->getClientAllowedOrigins() - ); - } - catch (InvalidAccessTokenException $ex1) - { - $this->log_service->warning($ex1); - throw new BearerTokenDisclosureAttemptException($ex1->getMessage()); - } - catch (InvalidGrantTypeException $ex2) - { - $this->log_service->warning($ex2); - throw new BearerTokenDisclosureAttemptException($ex2->getMessage()); - } - catch(ExpiredAccessTokenException $ex3) - { - $this->log_service->warning($ex3); - $this->token_service->expireAccessToken($token_value); - throw $ex3; - } - } - - /** - * @return array - * @throws InvalidOAuth2Request - */ - public function getResponseType() - { - throw new InvalidOAuth2Request('Not Implemented!'); - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws InvalidOAuth2Request - */ - public function buildTokenRequest(OAuth2Request $request) - { - throw new InvalidOAuth2Request('Not Implemented!'); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Heuristics/ClientEncryptionKeyFinder.php b/app/libs/OAuth2/Heuristics/ClientEncryptionKeyFinder.php deleted file mode 100644 index fb6ec561..00000000 --- a/app/libs/OAuth2/Heuristics/ClientEncryptionKeyFinder.php +++ /dev/null @@ -1,139 +0,0 @@ -jwk_set_reader_service = $jwk_set_reader_service; - $this->tx_service = $tx_service; - } - - /** - * @param IClient $client - * @param ICryptoAlgorithm $alg - * @param string|null $kid_hint - * @return IJWK - * @throws InvalidClientType - * @throws RecipientKeyNotFoundException - */ - public function find(IClient $client, ICryptoAlgorithm $alg, ?string $kid_hint = null) - { - return $this->tx_service->transaction(function() use($client, $alg, $kid_hint){ - - if($alg instanceof DirectEncryption) - { - // use secret - if($client->getClientType() !== IClient::ClientType_Confidential) - throw new InvalidClientType; - - $jwk = OctetSequenceJWKFactory::build - ( - new OctetSequenceJWKSpecification - ( - $client->getClientSecret(), - $alg->getName() - ) - ); - - $jwk->setId('shared_secret'); - - return $jwk; - } - - - $recipient_key = null; - - if(!is_null($kid_hint)) - { - $recipient_key = $client->getPublicKeyByIdentifier($kid_hint); - if(!$recipient_key->isActive()) $recipient_key = null; - if($recipient_key->getAlg()->getName() !== $alg->getName()) $recipient_key = null; - } - - if(is_null($recipient_key)) - { - $recipient_key = $client->getCurrentPublicKeyByUse - ( - JSONWebKeyPublicKeyUseValues::Encryption, - $alg->getName() - ); - } - - if(!is_null($recipient_key)) - { - $recipient_key->markAsUsed(); - $recipient_key = $recipient_key->toJWK(); - } - else - { - // check on jwk uri - $jwk_set = $this->jwk_set_reader_service->read($client); - - if(is_null($jwk_set)) - throw new RecipientKeyNotFoundException; - - foreach($jwk_set->getKeys() as $jwk) - { - if - ( - $jwk->getKeyUse() === JSONWebKeyPublicKeyUseValues::Encryption && - $jwk->getAlgorithm()->getString() === $alg->getName() - ) - { - - $recipient_key = $jwk; - break; - } - } - } - - if(is_null($recipient_key)) - throw new RecipientKeyNotFoundException; - - return $recipient_key; - }); - - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Heuristics/ClientSigningKeyFinder.php b/app/libs/OAuth2/Heuristics/ClientSigningKeyFinder.php deleted file mode 100644 index bcf9af23..00000000 --- a/app/libs/OAuth2/Heuristics/ClientSigningKeyFinder.php +++ /dev/null @@ -1,129 +0,0 @@ -jwk_set_reader_service = $jwk_set_reader_service; - } - - /** - * @param IClient $client - * @param ICryptoAlgorithm $alg - * @param string|null $kid_hint - * @return IJWK - * @throws InvalidClientType - * @throws RecipientKeyNotFoundException - * @throws InvalidJWKAlgorithm - * @throws JWKInvalidSpecException - */ - public function find(IClient $client, ICryptoAlgorithm $alg, ?string $kid_hint = null) - { - if($alg instanceof MAC_Algorithm ) - { - // use secret - if($client->getClientType() !== IClient::ClientType_Confidential) - throw new InvalidClientType; - - $jwk = OctetSequenceJWKFactory::build - ( - new OctetSequenceJWKSpecification - ( - $client->getClientSecret(), - $alg->getName() - ) - ); - - $jwk->setId('shared_secret'); - - return $jwk; - } - - $recipient_key = null; - - if(!is_null($kid_hint)) - { - $recipient_key = $client->getPublicKeyByIdentifier($kid_hint); - if(!$recipient_key->isActive()) $recipient_key = null; - if($recipient_key->getAlg()->getName() !== $alg->getName()) $recipient_key = null; - } - - if(is_null($recipient_key)) - { - $recipient_key = $client->getCurrentPublicKeyByUse - ( - JSONWebKeyPublicKeyUseValues::Signature, - $alg->getName() - ); - } - - if(!is_null($recipient_key)) - { - $recipient_key->markAsUsed(); - $recipient_key->save(); - $recipient_key = $recipient_key->toJWK(); - } - else - { - // check on jwk uri - $jwk_set = $this->jwk_set_reader_service->read($client); - - if(is_null($jwk_set)) - throw new RecipientKeyNotFoundException; - - foreach($jwk_set->getKeys() as $jwk) - { - if - ( - $jwk->getKeyUse() === JSONWebKeyPublicKeyUseValues::Signature && - $jwk->getAlgorithm()->getString() === $alg->getName() - ) - { - - $recipient_key = $jwk; - break; - } - } - } - - if(is_null($recipient_key)) - throw new RecipientKeyNotFoundException; - - return $recipient_key; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Heuristics/IKeyFinder.php b/app/libs/OAuth2/Heuristics/IKeyFinder.php deleted file mode 100644 index bd168d64..00000000 --- a/app/libs/OAuth2/Heuristics/IKeyFinder.php +++ /dev/null @@ -1,38 +0,0 @@ -server_private_key_repository = $server_private_key_repository; - } - - /** - * @param IClient $client - * @param ICryptoAlgorithm $alg - * @param string|null $kid_hint - * @return IJWK - * @throws InvalidClientType - * @throws ServerKeyNotFoundException - * @throws InvalidJWKAlgorithm - * @throws JWKInvalidSpecException - */ - public function find(IClient $client, ICryptoAlgorithm $alg, ?string $kid_hint = null) - { - if($alg instanceof DirectEncryption) - { - // use secret - if($client->getClientType() !== IClient::ClientType_Confidential) - throw new InvalidClientType; - - $jwk = OctetSequenceJWKFactory::build - ( - new OctetSequenceJWKSpecification - ( - $client->getClientSecret(), - $alg->getName() - ) - ); - - $jwk->setId('shared_secret'); - - return $jwk; - } - - $key = null; - - if(!is_null($kid_hint)) - { - $key = $this->server_private_key_repository->getByKeyIdentifier($kid_hint); - if (!is_null($key) && !$key->isActive()) - { - $key = null; - } - if (!is_null($key) && $key->getAlg()->getName() !== $alg->getName()) - { - $key = null; - } - } - - if(is_null($key)) - { - $key = $this->server_private_key_repository->getActiveByCriteria - ( - JSONWebKeyTypes::RSA, - JSONWebKeyPublicKeyUseValues::Encryption, - $alg->getName() - ); - } - - if(is_null($key)) - throw new ServerKeyNotFoundException - ( - sprintf('enc key not found - client id %s - requested alg %s', $client->getClientId(), $alg->getName()) - ); - - $jwk = $key->toJWK(); - - $key->markAsUsed(); - $key->save(); - - return $jwk; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Heuristics/ServerSigningKeyFinder.php b/app/libs/OAuth2/Heuristics/ServerSigningKeyFinder.php deleted file mode 100644 index 9512cbb1..00000000 --- a/app/libs/OAuth2/Heuristics/ServerSigningKeyFinder.php +++ /dev/null @@ -1,131 +0,0 @@ -server_private_key_repository = $server_private_key_repository; - // @todo Refactor IOC - $this->tx_service = App::make(ITransactionService::class); - } - - /** - * @param IClient $client - * @param ICryptoAlgorithm $alg - * @param string|null $kid_hint - * @return IJWK|mixed - * @throws \Exception - */ - public function find(IClient $client, ICryptoAlgorithm $alg, ?string $kid_hint = null) - { - return $this->tx_service->transaction(function() use($client, $alg, $kid_hint ){ - $jwk = null; - - if ($alg instanceof MAC_Algorithm) { - // use secret - if ($client->getClientType() !== IClient::ClientType_Confidential) { - throw new InvalidClientType; - } - - $jwk = OctetSequenceJWKFactory::build - ( - new OctetSequenceJWKSpecification - ( - $client->getClientSecret(), - $alg->getName() - ) - ); - - $jwk->setId('shared_secret'); - - return $jwk; - } - - $key = null; - - if (!is_null($kid_hint)) - { - Log::debug(sprintf("ServerSigningKeyFinder::find: trying to get key kid_hint %s", $kid_hint)); - $key = $this->server_private_key_repository->getByKeyIdentifier($kid_hint); - if (!is_null($key) && !$key->isActive()) - { - $key = null; - } - if (!is_null($key) && $key->getAlg()->getName() !== $alg->getName()) - { - $key = null; - } - } - - if(is_null($key)) - { - $key = $this->server_private_key_repository->getActiveByCriteria - ( - JSONWebKeyTypes::RSA, - JSONWebKeyPublicKeyUseValues::Signature, - $alg->getName() - ); - } - - if (is_null($key)) - { - throw new ServerKeyNotFoundException - ( - sprintf('sig key not found - client id %s - requested alg %s', $client->getClientId(), $alg->getName()) - ); - } - - $jwk = $key->toJWK(); - - $key->markAsUsed(); - - return $jwk; - }); - - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/IOAuth2Protocol.php b/app/libs/OAuth2/IOAuth2Protocol.php deleted file mode 100644 index 6d3668d2..00000000 --- a/app/libs/OAuth2/IOAuth2Protocol.php +++ /dev/null @@ -1,80 +0,0 @@ -user_id = $auth_code->getUserId(); - $instance->scope = $auth_code->getScope(); - // client id (oauth2) not client identifier - $instance->client_id = $auth_code->getClientId(); - $instance->auth_code = $auth_code->getValue(); - $instance->audience = $auth_code->getAudience(); - $instance->lifetime = intval($lifetime); - $instance->is_hashed = false; - return $instance; - } - - public static function createFromParams($scope, $client_id, $audience,$user_id,$lifetime){ - $instance = new self(); - $instance->scope = $scope; - $instance->client_id = $client_id; - $instance->user_id = $user_id; - $instance->auth_code = null; - $instance->audience = $audience; - $instance->refresh_token = null; - $instance->lifetime = intval($lifetime); - $instance->is_hashed = false; - return $instance; - } - - public static function createFromRefreshToken(RefreshToken $refresh_token,$scope = null, $lifetime = 3600){ - $instance = new self(); - $instance->scope = $scope; - $instance->from_ip = $refresh_token->getFromIp(); - $instance->user_id = $refresh_token->getUserId(); - $instance->client_id = $refresh_token->getClientId(); - $instance->auth_code = null; - $instance->refresh_token = $refresh_token; - $instance->audience = $refresh_token->getAudience(); - $instance->lifetime = intval($lifetime); - $instance->is_hashed = false; - return $instance; - } - - public static function load($value, AuthorizationCode $auth_code, $issued = null, $lifetime = 3600, $is_hashed=false){ - $instance = new self(); - $instance->value = $value; - $instance->scope = $auth_code->getScope(); - $instance->client_id = $auth_code->getClientId(); - $instance->user_id = $auth_code->getUserId(); - $instance->auth_code = $auth_code->getValue(); - $instance->audience = $auth_code->getAudience(); - $instance->from_ip = $auth_code->getFromIp(); - $instance->issued = $issued; - $instance->lifetime = intval($lifetime); - $instance->is_hashed = $is_hashed; - return $instance; - } - - /** - * @return AuthorizationCode - */ - public function getAuthCode(){ - return $this->auth_code; - } - - /** - * @return RefreshToken - */ - public function getRefreshToken(){ - return $this->refresh_token; - } - - /** - * @param RefreshToken $refresh_token - * @return $this - */ - public function setRefreshToken(RefreshToken $refresh_token){ - $this->refresh_token = $refresh_token; - return $this; - } - - - public function toJSON(){ - return '{}'; - } - - public function fromJSON($json){ - - } - - /** - * @return string - */ - public function getType() - { - return 'access_token'; - } - - /** - * @inheritDoc - */ - public function toArray(): array - { - return []; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Models/AuthorizationCode.php b/app/libs/OAuth2/Models/AuthorizationCode.php deleted file mode 100644 index adc9a9a5..00000000 --- a/app/libs/OAuth2/Models/AuthorizationCode.php +++ /dev/null @@ -1,387 +0,0 @@ -scope = $scope; - $instance->user_id = $user_id; - $instance->redirect_uri = $redirect_uri; - $instance->client_id = $client_id; - $instance->lifetime = intval($lifetime); - $instance->audience = $audience; - $instance->is_hashed = false; - $instance->from_ip = IPHelper::getUserIp(); - $instance->access_type = $access_type; - $instance->approval_prompt = $approval_prompt; - $instance->has_previous_user_consent = $has_previous_user_consent; - $instance->state = $state; - $instance->nonce = $nonce; - $instance->response_type = $response_type; - $instance->requested_auth_time = $requested_auth_time; - $instance->auth_time = $auth_time; - $instance->prompt = $prompt; - $instance->code_challenge = $code_challenge; - $instance->code_challenge_method = $code_challenge_method; - - return $instance; - } - - /** - * @param array $payload - * @return AuthorizationCode - */ - public static function load - ( - array $payload - ): AuthorizationCode - { - $instance = new self(); - $instance->value = $payload['value']; - $instance->user_id = $payload['user_id'] ?? null; - $instance->scope = $payload['scope'] ?? null; - $instance->redirect_uri = $payload['redirect_uri'] ?? null; - $instance->client_id = $payload['client_id'] ?? null; - $instance->audience = $payload['audience'] ?? null; - $instance->issued = $payload['issued'] ?? null; - $instance->lifetime = intval($payload['lifetime']); - $instance->from_ip = $payload['from_ip'] ?? null; - $instance->is_hashed = isset($payload['is_hashed']) ? boolval($payload['is_hashed']) : false; - $instance->access_type = $payload['access_type'] ?? null; - $instance->approval_prompt = $payload['approval_prompt'] ?? null; - $instance->has_previous_user_consent = $payload['has_previous_user_consent'] ?? false; - $instance->state = $payload['state'] ?? null; - $instance->nonce = $payload['nonce'] ?? null; - $instance->response_type = $payload['response_type'] ?? null; - $instance->requested_auth_time = $payload['requested_auth_time'] ?? null;; - $instance->auth_time = $payload['auth_time'] ?? null; - $instance->prompt = $payload['prompt'] ?? null; - $instance->code_challenge = $payload['code_challenge'] ?? null; - $instance->code_challenge_method = $payload['code_challenge_method'] ?? null; - return $instance; - } - - /** - * @return string - */ - public function getRedirectUri() - { - return $this->redirect_uri; - } - - /** - * @return string - */ - public function getAccessType() - { - return $this->access_type; - } - - /** - * @return string - */ - public function getApprovalPrompt() - { - return $this->approval_prompt; - } - - /** - * @return bool - */ - public function getHasPreviousUserConsent() - { - return $this->has_previous_user_consent; - } - - /** - * @return string - */ - public function getState() - { - return $this->state; - } - - /** - * @return string - */ - public function getNonce() - { - return $this->nonce; - } - - /** - * @return string - */ - public function getResponseType() - { - return $this->response_type; - } - - /** - * @return bool - */ - public function isAuthTimeRequested() - { - $res = $this->requested_auth_time; - if (!is_string($res)) return (bool)$res; - switch (strtolower($res)) { - case '1': - case 'true': - case 'on': - case 'yes': - case 'y': - return true; - } - return false; - } - - /** - * @return string - */ - public function getPrompt() - { - return $this->prompt; - } - - /** - * @return int - */ - public function getAuthTime() - { - return $this->auth_time; - } - - public function toJSON() - { - return '{}'; - } - - public function fromJSON($json) - { - } - - /** - * @return string - */ - public function getType() - { - return 'auth_code'; - } - - public function toArray(): array - { - return [ - 'client_id' => $this->getClientId(), - 'scope' => $this->getScope(), - 'audience' => $this->getAudience(), - 'redirect_uri' => $this->getRedirectUri(), - 'issued' => $this->getIssued(), - 'lifetime' => $this->getLifetime(), - 'from_ip' => $this->getFromIp(), - 'user_id' => $this->getUserId(), - 'access_type' => $this->getAccessType(), - 'approval_prompt' => $this->getApprovalPrompt(), - 'has_previous_user_consent' => $this->getHasPreviousUserConsent(), - 'state' => $this->getState(), - 'nonce' => $this->getNonce(), - 'response_type' => $this->getResponseType(), - 'requested_auth_time' => $this->isAuthTimeRequested(), - 'auth_time' => $this->getAuthTime(), - 'prompt' => $this->getPrompt(), - 'code_challenge' => $this->getCodeChallenge(), - 'code_challenge_method' => $this->getCodeChallengeMethod(), - ]; - } - - public static function getKeys(): array - { - return [ - 'user_id', - 'client_id', - 'scope', - 'audience', - 'redirect_uri', - 'issued', - 'lifetime', - 'from_ip', - 'access_type', - 'approval_prompt', - 'has_previous_user_consent', - 'state', - 'nonce', - 'response_type', - 'requested_auth_time', - 'auth_time', - 'prompt', - 'code_challenge', - 'code_challenge_method', - ]; - } - - /** - * @return string - */ - public function getCodeChallenge(): ?string - { - return $this->code_challenge; - } - - /** - * @return string - */ - public function getCodeChallengeMethod(): ?string - { - return $this->code_challenge_method; - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/Models/ClientAssertionAuthenticationContext.php b/app/libs/OAuth2/Models/ClientAssertionAuthenticationContext.php deleted file mode 100644 index 0db2be39..00000000 --- a/app/libs/OAuth2/Models/ClientAssertionAuthenticationContext.php +++ /dev/null @@ -1,96 +0,0 @@ -type = $type; - $this->jwt_assertion = $jwt_assertion; - - $this->jws = BasicJWTFactory::build($jwt_assertion); - - if(!($this->jws instanceof IJWS)) - throw new InvalidClientAssertionException; - - $alg = $this->jws->getJOSEHeader()->getAlgorithm()->getValue(); - - if( !(DigitalSignatures_MACs_Registry::getInstance()->isSupported($alg) && - in_array($alg, OAuth2Protocol::$supported_signing_algorithms))) - throw new InvalidClientAssertionAlgorithmException($alg); - - $alg = DigitalSignatures_MACs_Registry::getInstance()->get($alg); - - $auth_type = $alg instanceof MAC_Algorithm ? - OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretJwt : - OAuth2Protocol::TokenEndpoint_AuthMethod_PrivateKeyJwt; - - parent::__construct($this->jws->getClaimSet()->getIssuer()->getString(), $auth_type); - } - - /** - * @return IJWS - */ - public function getAssertion() - { - return $this->jws; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Models/ClientAuthenticationContext.php b/app/libs/OAuth2/Models/ClientAuthenticationContext.php deleted file mode 100644 index 3df0ad41..00000000 --- a/app/libs/OAuth2/Models/ClientAuthenticationContext.php +++ /dev/null @@ -1,85 +0,0 @@ -client_id = $client_id; - $this->auth_type = $auth_type; - } - - /** - * @return string - */ - public function getAuthType() - { - return $this->auth_type; - } - - /** - * @return string - */ - public function getId() - { - return $this->client_id; - } - - /** - * @param IClient $client - * @return $this - */ - public function setClient(IClient $client) - { - $this->client = $client; - return $this; - } - - /** - * @return IClient - */ - public function getClient() - { - return $this->client; - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/Models/ClientCredentialsAuthenticationContext.php b/app/libs/OAuth2/Models/ClientCredentialsAuthenticationContext.php deleted file mode 100644 index f46f9b43..00000000 --- a/app/libs/OAuth2/Models/ClientCredentialsAuthenticationContext.php +++ /dev/null @@ -1,68 +0,0 @@ -client_secret = $client_secret; - } - - /** - * @return string - */ - public function getSecret() - { - return $this->client_secret; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Models/IApi.php b/app/libs/OAuth2/Models/IApi.php deleted file mode 100644 index bf489f2c..00000000 --- a/app/libs/OAuth2/Models/IApi.php +++ /dev/null @@ -1,16 +0,0 @@ -sig_alg = $sig_alg; - $this->alg = $alg; - $this->enc = $enc; - } - - /** - * @return IntegrityCheckingAlgorithm - */ - public function getSigningAlgorithm() - { - return $this->sig_alg; - } - - /** - * @return EncryptionAlgorithm - */ - public function getEncryptionKeyAlgorithm() - { - return $this->alg; - } - - /** - * @return ContentEncryptionAlgorithm - */ - public function getEncryptionContentAlgorithm() - { - return $this->enc; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Models/Principal.php b/app/libs/OAuth2/Models/Principal.php deleted file mode 100644 index 132bae96..00000000 --- a/app/libs/OAuth2/Models/Principal.php +++ /dev/null @@ -1,59 +0,0 @@ -auth_time; - } - - /** - * @return int - */ - public function getUserId() - { - return (int)$this->user_id; - } - - /** - * @return string - */ - public function getOPBrowserState() - { - return $this->opbs; - } - - /** - * @param array $state - * @return $this - */ - public function setState(array $state) - { - $this->user_id = intval($state[0]); - $this->auth_time = intval($state[1]); - $this->opbs = $state[2]; - return $this; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Models/RefreshToken.php b/app/libs/OAuth2/Models/RefreshToken.php deleted file mode 100644 index acd1d304..00000000 --- a/app/libs/OAuth2/Models/RefreshToken.php +++ /dev/null @@ -1,96 +0,0 @@ -scope = $access_token->getScope(); - $instance->user_id = $access_token->getUserId(); - $instance->client_id = $access_token->getClientId(); - $instance->audience = $access_token->getAudience(); - $instance->from_ip = IPHelper::getUserIp(); - $instance->lifetime = intval($lifetime); - $instance->is_hashed = false; - return $instance; - } - - public static function load(array $params, $lifetime = 0){ - $instance = new self(); - $instance->value = $params['value']; - $instance->scope = $params['scope']; - $instance->client_id = $params['client_id']; - $instance->user_id = $params['user_id']; - $instance->audience = $params['audience']; - $instance->from_ip = $params['from_ip']; - $instance->issued = $params['issued']; - $instance->is_hashed = isset($params['is_hashed'])?$params['is_hashed']:false; - $instance->lifetime = intval($lifetime); - return $instance; - } - - public function toJSON() - { - return '{}'; - } - - public function fromJSON($json) - { - // TODO: Implement fromJSON() method. - } - - /** - * @return string - */ - public function getType() - { - return 'refresh_token'; - } - - /** - * @inheritDoc - */ - public function toArray(): array - { - return []; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Models/SecurityContext.php b/app/libs/OAuth2/Models/SecurityContext.php deleted file mode 100644 index deef0d02..00000000 --- a/app/libs/OAuth2/Models/SecurityContext.php +++ /dev/null @@ -1,76 +0,0 @@ -requested_user_id; - } - - /** - * @param int $requested_user_id - * @return $this - */ - public function setRequestedUserId($requested_user_id) - { - $this->requested_user_id = $requested_user_id; - return $this; - } - - /** - * @return bool - */ - public function isAuthTimeRequired() - { - return $this->requested_auth_time; - } - - /** - * @param bool $requested_auth_time - * @return $this - */ - public function setAuthTimeRequired($requested_auth_time) - { - $this->requested_auth_time = $requested_auth_time; - return $this; - } - - /** - * @return array - */ - public function getState() - { - return array - ( - $this->requested_user_id, - $this->requested_auth_time, - ); - } - - /** - * @param array $state - * @return $this - */ - public function setState(array $state) - { - $this->requested_user_id = $state[0]; - $this->requested_auth_time = $state[1]; - return $this; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Models/Token.php b/app/libs/OAuth2/Models/Token.php deleted file mode 100644 index ab02b16c..00000000 --- a/app/libs/OAuth2/Models/Token.php +++ /dev/null @@ -1,144 +0,0 @@ -is_hashed = false; - $this->issued = gmdate("Y-m-d H:i:s", time()); - $this->from_ip = IPHelper::getUserIp(); - } - - public function getIssued() - { - return $this->issued; - } - - /** - * @return string - */ - public function getScope() - { - return $this->scope; - } - - /** - * oauth2 client id - * @return string - */ - public function getClientId() - { - return $this->client_id; - } - - /** - * @return mixed - */ - public function getAudience() - { - return $this->audience; - } - - /** - * @return string - */ - public function getFromIp() - { - return $this->from_ip; - } - - /** - * @return int - */ - public function getUserId() - { - return intval($this->user_id); - } - - public function getRemainingLifetime() - { - //check is refresh token is stills alive... (ZERO is infinite lifetime) - if (intval($this->lifetime) == 0) { - return 0; - } - $created_at = new DateTime($this->issued, new DateTimeZone("UTC")); - $created_at->add(new DateInterval('PT' . intval($this->lifetime) . 'S')); - $now = new DateTime(gmdate("Y-m-d H:i:s", time()), new DateTimeZone("UTC")); - //check validity... - if ($now > $created_at) { - return -1; - } - $seconds = abs($created_at->getTimestamp() - $now->getTimestamp());; - - return $seconds; - } - - /** - * @return bool - */ - public function isHashed() - { - return $this->is_hashed; - } - - public abstract function toJSON(); - - - public abstract function fromJSON($json); -} \ No newline at end of file diff --git a/app/libs/OAuth2/Models/TokenEndpointAuthInfo.php b/app/libs/OAuth2/Models/TokenEndpointAuthInfo.php deleted file mode 100644 index 1836f124..00000000 --- a/app/libs/OAuth2/Models/TokenEndpointAuthInfo.php +++ /dev/null @@ -1,55 +0,0 @@ -auth_method = $auth_method; - $this->auth_signing_alg = $auth_signing_alg; - } - - /** - * @return string - */ - public function getAuthenticationMethod(){ - return $this->auth_method; - } - - /** - * @return IntegrityCheckingAlgorithm - */ - public function getSigningAlgorithm(){ - return $this->auth_signing_alg; - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/OAuth2Message.php b/app/libs/OAuth2/OAuth2Message.php deleted file mode 100644 index 91621073..00000000 --- a/app/libs/OAuth2/OAuth2Message.php +++ /dev/null @@ -1,86 +0,0 @@ -container, true); - return $string; - } - - /** - * @param string $param - * @return null|mixed - */ - public function getParam($param) - { - return isset($this->container[$param])? $this->container[$param] : null; - } - - /** - * @param string $param - * @param mixed $value - * @return $this - */ - public function setParam($param, $value) - { - $this->container[$param] = $value; - return $this; - } - - /** - * @return OAuth2RequestMemento - */ - public function createMemento(){ - return OAuth2RequestMemento::buildFromRequest($this); - } - - /** - * @param OAuth2RequestMemento $memento - * @return $this - */ - public function setMemento(OAuth2RequestMemento $memento){ - $this->container = $memento->getState(); - return $this; - } - - /** - * @param OAuth2RequestMemento $memento - * @return OAuth2Message - */ - static public function buildFromMemento(OAuth2RequestMemento $memento){ - $msg = new self; - $msg->setMemento($memento); - return $msg; - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/OAuth2Protocol.php b/app/libs/OAuth2/OAuth2Protocol.php deleted file mode 100644 index 96b61e73..00000000 --- a/app/libs/OAuth2/OAuth2Protocol.php +++ /dev/null @@ -1,1565 +0,0 @@ - self::OAuth2Protocol_ResponseType_Code, - self::OAuth2Protocol_ResponseType_Token => self::OAuth2Protocol_ResponseType_Token - ); - - // http://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication - - const TokenEndpoint_AuthMethod_ClientSecretBasic = 'client_secret_basic'; - const TokenEndpoint_AuthMethod_ClientSecretPost = 'client_secret_post'; - const TokenEndpoint_AuthMethod_ClientSecretJwt = 'client_secret_jwt'; - const TokenEndpoint_AuthMethod_PrivateKeyJwt = 'private_key_jwt'; - const TokenEndpoint_AuthMethod_None = 'none'; - - const OAuth2Protocol_ClientAssertionType = 'client_assertion_type'; - const OAuth2Protocol_ClientAssertion = 'client_assertion'; - - public static $token_endpoint_auth_methods = array - ( - self::TokenEndpoint_AuthMethod_ClientSecretBasic, - self::TokenEndpoint_AuthMethod_ClientSecretPost, - self::TokenEndpoint_AuthMethod_ClientSecretJwt, - self::TokenEndpoint_AuthMethod_PrivateKeyJwt, - // PKCE only - self::TokenEndpoint_AuthMethod_None, - ); - - const OpenIdConnect_Scope = 'openid'; - const OfflineAccess_Scope = 'offline_access'; - - public static $supported_signing_algorithms = array - ( - // MAC SHA2 - JSONWebSignatureAndEncryptionAlgorithms::HS256, - JSONWebSignatureAndEncryptionAlgorithms::HS384, - JSONWebSignatureAndEncryptionAlgorithms::HS512, - // RSA - JSONWebSignatureAndEncryptionAlgorithms::RS256, - JSONWebSignatureAndEncryptionAlgorithms::RS384, - JSONWebSignatureAndEncryptionAlgorithms::RS512, - JSONWebSignatureAndEncryptionAlgorithms::PS256, - JSONWebSignatureAndEncryptionAlgorithms::PS384, - JSONWebSignatureAndEncryptionAlgorithms::PS512, - JSONWebSignatureAndEncryptionAlgorithms::None - ); - - public static $supported_signing_algorithms_hmac_sha2 = array - ( - JSONWebSignatureAndEncryptionAlgorithms::HS256, - JSONWebSignatureAndEncryptionAlgorithms::HS384, - JSONWebSignatureAndEncryptionAlgorithms::HS512, - ); - - public static $supported_signing_algorithms_rsa = array - ( - JSONWebSignatureAndEncryptionAlgorithms::RS256, - JSONWebSignatureAndEncryptionAlgorithms::RS384, - JSONWebSignatureAndEncryptionAlgorithms::RS512, - JSONWebSignatureAndEncryptionAlgorithms::PS256, - JSONWebSignatureAndEncryptionAlgorithms::PS384, - JSONWebSignatureAndEncryptionAlgorithms::PS512, - ); - - // https://tools.ietf.org/html/rfc7518#page-12 - public static $supported_key_management_algorithms = array - ( - JSONWebSignatureAndEncryptionAlgorithms::RSA1_5, - JSONWebSignatureAndEncryptionAlgorithms::RSA_OAEP, - JSONWebSignatureAndEncryptionAlgorithms::RSA_OAEP_256, - JSONWebSignatureAndEncryptionAlgorithms::Dir, - JSONWebSignatureAndEncryptionAlgorithms::None, - ); - - // https://tools.ietf.org/html/rfc7518#page-22 - public static $supported_content_encryption_algorithms = array - ( - JSONWebSignatureAndEncryptionAlgorithms::A128CBC_HS256, - JSONWebSignatureAndEncryptionAlgorithms::A192CBC_HS384, - JSONWebSignatureAndEncryptionAlgorithms::A256CBC_HS512, - JSONWebSignatureAndEncryptionAlgorithms::None, - ); - - /** - * @see http://tools.ietf.org/html/rfc6749#appendix-A - * VSCHAR = %x20-7E - */ - const VsChar = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-_~'; - - /** - * PKCE - * @see https://tools.ietf.org/html/rfc7636 - **/ - - // auth request new params - - const PKCE_CodeChallenge = 'code_challenge'; - const PKCE_CodeChallengeMethod = 'code_challenge_method'; - - const PKCE_CodeChallengeMethodPlain = 'plain'; - const PKCE_CodeChallengeMethodSHA256 = 'S256'; - - const PKCE_ValidCodeChallengeMethods = [self::PKCE_CodeChallengeMethodPlain, self::PKCE_CodeChallengeMethodSHA256]; - - // token request new params - - const PKCE_CodeVerifier = 'code_verifier'; - - //services - /** - * @var ILogService - */ - private $log_service; - /** - * @var ICheckPointService - */ - private $checkpoint_service; - - /** - * @var IClientService - */ - private $client_service; - - /** - * @var IClientRepository - */ - private $client_repository; - - /** - * @var IAuthService - */ - private $auth_service; - - /** - * @var IPrincipalService - */ - private $principal_service; - - /** - * @var ITokenService - */ - private $token_service; - - //endpoints - /** - * @var AuthorizationEndpoint - */ - private $authorize_endpoint; - /** - * @var TokenEndpoint - */ - private $token_endpoint; - /** - * @var TokenRevocationEndpoint - */ - private $revoke_endpoint; - /** - * @var TokenIntrospectionEndpoint - */ - private $introspection_endpoint; - - /** - * grant types - * @var array - */ - private $grant_types = []; - - /** - * @var IServerPrivateKeyRepository - */ - private $server_private_keys_repository; - - /** - * @var IOpenIDProviderConfigurationService - */ - private $oidc_provider_configuration_service; - - /** - * @var IMementoOAuth2SerializerService - */ - private $memento_service; - - - /** - * OAuth2Protocol constructor. - * @param ILogService $log_service - * @param IClientService $client_service - * @param IClientRepository $client_repository - * @param ITokenService $token_service - * @param IAuthService $auth_service - * @param IOAuth2AuthenticationStrategy $auth_strategy - * @param ICheckPointService $checkpoint_service - * @param IApiScopeService $scope_service - * @param IUserConsentService $user_consent_service - * @param IServerPrivateKeyRepository $server_private_keys_repository - * @param IOpenIDProviderConfigurationService $oidc_provider_configuration_service - * @param IMementoOAuth2SerializerService $memento_service - * @param ISecurityContextService $security_context_service - * @param IPrincipalService $principal_service - * @param IServerPrivateKeyRepository $server_private_key_repository - * @param IClientJWKSetReader $jwk_set_reader_service - * @param UserIPHelperProvider $ip_helper - */ - public function __construct - ( - ILogService $log_service, - IClientService $client_service, - IClientRepository $client_repository, - ITokenService $token_service, - IAuthService $auth_service, - IOAuth2AuthenticationStrategy $auth_strategy, - ICheckPointService $checkpoint_service, - IApiScopeService $scope_service, - IUserConsentService $user_consent_service, - IServerPrivateKeyRepository $server_private_keys_repository, - IOpenIDProviderConfigurationService $oidc_provider_configuration_service, - IMementoOAuth2SerializerService $memento_service, - ISecurityContextService $security_context_service, - IPrincipalService $principal_service, - IServerPrivateKeyRepository $server_private_key_repository, - IClientJWKSetReader $jwk_set_reader_service, - UserIPHelperProvider $ip_helper - ) - { - - $this->server_private_keys_repository = $server_private_keys_repository; - $this->oidc_provider_configuration_service = $oidc_provider_configuration_service; - $this->memento_service = $memento_service; - - $authorization_code_grant_type = new AuthorizationCodeGrantType - ( - $scope_service, - $client_service, - $client_repository, - $token_service, - $auth_service, - $auth_strategy, - $log_service, - $user_consent_service, - $this->memento_service, - $security_context_service, - $principal_service, - $server_private_key_repository, - $jwk_set_reader_service - ); - - $implicit_grant_type = new ImplicitGrantType - ( - $scope_service, - $client_service, - $client_repository, - $token_service, - $auth_service, - $auth_strategy, - $log_service, - $user_consent_service, - $this->memento_service, - $security_context_service, - $principal_service, - $server_private_key_repository, - $jwk_set_reader_service - ); - - $hybrid_grant_type = new HybridGrantType - ( - $scope_service, - $client_service, - $client_repository, - $token_service, - $auth_service, - $auth_strategy, - $log_service, - $user_consent_service, - $this->memento_service, - $security_context_service, - $principal_service, - $server_private_key_repository, - $jwk_set_reader_service - ); - - $refresh_bearer_token_grant_type = new RefreshBearerTokenGrantType - ( - $client_service, - $client_repository, - $token_service, - $log_service - ); - - $client_credential_grant_type = new ClientCredentialsGrantType - ( - $scope_service, - $client_service, - $client_repository, - $token_service, - $log_service - ); - - $this->grant_types[$authorization_code_grant_type->getType()] = $authorization_code_grant_type; - $this->grant_types[$implicit_grant_type->getType()] = $implicit_grant_type; - $this->grant_types[$refresh_bearer_token_grant_type->getType()] = $refresh_bearer_token_grant_type; - $this->grant_types[$client_credential_grant_type->getType()] = $client_credential_grant_type; - $this->grant_types[$hybrid_grant_type->getType()] = $hybrid_grant_type; - - $this->log_service = $log_service; - $this->checkpoint_service = $checkpoint_service; - $this->client_service = $client_service; - $this->client_repository = $client_repository; - $this->auth_service = $auth_service; - $this->principal_service = $principal_service; - $this->token_service = $token_service; - - $this->authorize_endpoint = new AuthorizationEndpoint($this); - $this->token_endpoint = new TokenEndpoint($this); - $this->revoke_endpoint = new TokenRevocationEndpoint($this, $client_service, $client_repository, $token_service, $log_service); - $this->introspection_endpoint = new TokenIntrospectionEndpoint - ( - $this, - $client_service, - $client_repository, - $token_service, - $auth_service, - $log_service, - $ip_helper - ); - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - * @throws Exception - * @throws UriNotAllowedException - */ - public function authorize(OAuth2Request $request = null) - { - try - { - $this->last_request = $request; - - if (is_null($this->last_request)) throw new InvalidOAuth2Request; - - if(!$this->last_request->isValid()) - { - // then check if we have a memento .... - if (!$this->memento_service->exists()) - throw new InvalidOAuth2Request($this->last_request->getLastValidationError()); - - $this->last_request = OAuth2AuthorizationRequestFactory::getInstance()->build - ( - OAuth2Message::buildFromMemento($this->memento_service->load()) - ); - - if(!$this->last_request->isValid()) - throw new InvalidOAuth2Request($this->last_request->getLastValidationError()); - - } - return $this->authorize_endpoint->handle($this->last_request); - } - catch (UriNotAllowedException $ex1) - { - $this->log_service->warning($ex1); - $this->checkpoint_service->trackException($ex1); - throw $ex1; - } - catch(OAuth2BaseException $ex2) - { - $this->log_service->warning($ex2); - $this->checkpoint_service->trackException($ex2); - - $redirect_uri = $this->validateRedirectUri($this->last_request); - - if (is_null($redirect_uri)) - throw $ex2; - - return OAuth2IndirectErrorResponseFactoryMethod::buildResponse - ( - $this->last_request, - $ex2->getError(), - $ex2->getMessage(), - $redirect_uri - ); - } - catch (AbsentClientException $ex3){ - $this->log_service->warning($ex3); - $this->checkpoint_service->trackException($ex3); - - $redirect_uri = $this->validateRedirectUri($this->last_request); - if (is_null($redirect_uri)) - throw $ex3; - - return OAuth2IndirectErrorResponseFactoryMethod::buildResponse - ( - $this->last_request, - OAuth2Protocol::OAuth2Protocol_Error_ServerError, - $ex3->getMessage(), - $redirect_uri - ); - } - catch (AbsentCurrentUserException $ex4){ - $this->log_service->warning($ex4); - $this->checkpoint_service->trackException($ex4); - - $redirect_uri = $this->validateRedirectUri($this->last_request); - if (is_null($redirect_uri)) - throw $ex4; - - return OAuth2IndirectErrorResponseFactoryMethod::buildResponse - ( - $this->last_request, - OAuth2Protocol::OAuth2Protocol_Error_ServerError, - $ex4->getMessage(), - $redirect_uri - ); - } - catch (Exception $ex) - { - $this->log_service->error($ex); - $this->checkpoint_service->trackException($ex); - - $redirect_uri = $this->validateRedirectUri($this->last_request); - if (is_null($redirect_uri)) - throw $ex; - - return OAuth2IndirectErrorResponseFactoryMethod::buildResponse - ( - $this->last_request, - OAuth2Protocol::OAuth2Protocol_Error_ServerError, - $ex->getMessage(), - $redirect_uri - ); - } - } - - /** - * @param OAuth2Request $request - * @return OAuth2Response - */ - public function token(OAuth2Request $request = null) - { - try - { - $this->last_request = $request; - - if (is_null($this->last_request)) - throw new InvalidOAuth2Request; - - if(!$this->last_request->isValid()) - throw new InvalidOAuth2Request($this->last_request->getLastValidationError()); - - return $this->token_endpoint->handle($this->last_request); - } - catch(OAuth2BaseException $ex1) - { - $this->log_service->warning($ex1); - $this->checkpoint_service->trackException($ex1); - - return new OAuth2DirectErrorResponse($ex1->getError(), $ex1->getMessage()); - } - catch (Exception $ex) - { - $this->log_service->error($ex); - $this->checkpoint_service->trackException($ex); - - return new OAuth2DirectErrorResponse - ( - OAuth2Protocol::OAuth2Protocol_Error_ServerError, - $ex->getMessage() - ); - } - } - - /** - * Revoke Token Endpoint - * @see http://tools.ietf.org/html/rfc7009 - * @param OAuth2Request $request - * @return OAuth2Response - */ - public function revoke(OAuth2Request $request = null){ - - try { - $this->last_request = $request; - - if (is_null($this->last_request)) - throw new InvalidOAuth2Request; - - if(!$this->last_request->isValid()) - throw new InvalidOAuth2Request($this->last_request->getLastValidationError()); - - return $this->revoke_endpoint->handle($this->last_request); - } - catch (Exception $ex) { - $this->log_service->error($ex); - $this->checkpoint_service->trackException($ex); - //simple say "OK" and be on our way ... - return new OAuth2TokenRevocationResponse; - } - } - - /** - * Introspection Token Endpoint - * @see http://tools.ietf.org/html/draft-richer-oauth-introspection-04 - * @param OAuth2Request $request - * @return OAuth2Response - */ - public function introspection(OAuth2Request $request = null) - { - try - { - $this->last_request = $request; - - if (is_null($this->last_request)) - throw new InvalidOAuth2Request; - - if(!$this->last_request->isValid()) - throw new InvalidOAuth2Request($this->last_request->getLastValidationError()); - - return $this->introspection_endpoint->handle($this->last_request); - } - catch(ExpiredAccessTokenException $ex1) - { - $this->log_service->warning($ex1); - return new OAuth2DirectErrorResponse($ex1->getError(), $ex1->getMessage()); - } - catch(OAuth2BaseException $ex2) - { - $this->log_service->warning($ex2); - $this->checkpoint_service->trackException($ex2); - return new OAuth2DirectErrorResponse($ex2->getError(), $ex2->getMessage()); - } - catch (Exception $ex) - { - $this->log_service->error($ex); - $this->checkpoint_service->trackException($ex); - - return new OAuth2DirectErrorResponse - ( - OAuth2Protocol::OAuth2Protocol_Error_InvalidRequest, - OAuth2Protocol::OAuth2Protocol_Error_InvalidRequest - ); - } - } - - public function getAvailableGrants() - { - return $this->grant_types; - } - - /** - * @param IClient $client - * @return bool - */ - static public function isClientAllowedToUseTokenEndpointAuth(IClient $client) - { - return $client->getClientType() === IClient::ClientType_Confidential || - $client->getApplicationType() === IClient::ApplicationType_Native; - } - - static public function getTokenEndpointAuthMethodsPerClientType(IClient $client) - { - if($client->getClientType() == IClient::ClientType_Public) - { - return ArrayUtils::convert2Assoc - ( - array - ( - self::TokenEndpoint_AuthMethod_PrivateKeyJwt, - self::TokenEndpoint_AuthMethod_None - ) - ); - } - - return ArrayUtils::convert2Assoc - ( - array_merge - ( - self::$token_endpoint_auth_methods, - array - ( - self::TokenEndpoint_AuthMethod_None - ) - ) - ); - } - - /** - * @param IClient $client - * @return array - */ - static public function getSigningAlgorithmsPerClientType(IClient $client) - { - if($client->getClientType() == IClient::ClientType_Public) - { - return ArrayUtils::convert2Assoc - ( - array_merge - ( - self::$supported_signing_algorithms_rsa, - array - ( - JSONWebSignatureAndEncryptionAlgorithms::None - ) - ) - ); - } - return ArrayUtils::convert2Assoc - ( - array_merge - ( - self::$supported_signing_algorithms_hmac_sha2, - self::$supported_signing_algorithms_rsa, - array - ( - JSONWebSignatureAndEncryptionAlgorithms::None - ) - ) - ); - } - - - /** - * @param IClient $client - * @return array - */ - static public function getKeyManagementAlgorithmsPerClientType(IClient $client) - { - if($client->getClientType() == IClient::ClientType_Public) - { - return ArrayUtils::convert2Assoc - ( - array_diff - ( - self::$supported_key_management_algorithms, - array - ( - JSONWebSignatureAndEncryptionAlgorithms::Dir - ) - ) - ); - } - return ArrayUtils::convert2Assoc - ( - self::$supported_key_management_algorithms - ); - } - - - /** - * @return string - */ - public function getJWKSDocument() - { - $keys = $this->server_private_keys_repository->getActives(); - $set = []; - - foreach($keys as $private_key) - { - $jwk = RSAJWKFactory::build - ( - new RSAJWKPEMPrivateKeySpecification - ( - $private_key->getPEM(), - $private_key->getPassword() - ) - ); - - $jwk->setVisibility(JSONWebKeyVisibility::PublicOnly); - - $jwk - ->setId($private_key->getKeyId()) - ->setKeyUse($private_key->getUse()) - ->setType($private_key->getType()) - ->setAlgorithm($private_key->getAlg()->getName()); - - array_push($set, $jwk); - } - - $jkws = new JWKSet($set); - return $jkws->toJson(); - } - - /** - * @see http://openid.net/specs/openid-connect-discovery-1_0.html - * @return string - */ - public function getDiscoveryDocument() - { - $builder = new DiscoveryDocumentBuilder(); - - return $builder - ->setIssuer($this->oidc_provider_configuration_service->getIssuerUrl()) - ->setAuthEndpoint($this->oidc_provider_configuration_service->getAuthEndpoint()) - ->setTokenEndpoint($this->oidc_provider_configuration_service->getTokenEndpoint()) - ->setUserInfoEndpoint($this->oidc_provider_configuration_service->getUserInfoEndpoint()) - ->setJWKSUrl($this->oidc_provider_configuration_service->getJWKSUrl()) - ->setRevocationEndpoint($this->oidc_provider_configuration_service->getRevocationEndpoint()) - ->setIntrospectionEndpoint($this->oidc_provider_configuration_service->getIntrospectionEndpoint()) - // session management http://openid.net/specs/openid-connect-session-1_0.html - ->setEndSessionEndpoint($this->oidc_provider_configuration_service->getEndSessionEndpoint()) - ->setCheckSessionIframe($this->oidc_provider_configuration_service->getCheckSessionIFrame()) - // response types - ->addResponseTypeSupported('code') - ->addResponseTypeSupported('token') - ->addResponseTypeSupported('code token') - ->addResponseTypeSupported('token id_token') - ->addResponseTypeSupported('code token id_token') - // claims - ->addClaimSupported('aud') - ->addClaimSupported('exp') - ->addClaimSupported('iat') - ->addClaimSupported('iss') - ->addClaimSupported('sub') - ->addClaimSupported(StandardClaims::Email) - ->addClaimSupported(StandardClaims::EmailVerified) - ->addClaimSupported(StandardClaims::Name) - ->addClaimSupported(StandardClaims::GivenName) - ->addClaimSupported(StandardClaims::FamilyName) - ->addClaimSupported(StandardClaims::NickName) - ->addClaimSupported(StandardClaims::Picture) - ->addClaimSupported(StandardClaims::Birthdate) - ->addClaimSupported(StandardClaims::Locale) - ->addClaimSupported(StandardClaims::Gender) - ->addClaimSupported(StandardClaims::Address) - // scopes - ->addScopeSupported(self::OpenIdConnect_Scope) - ->addScopeSupported(IUserService::UserProfileScope_Address) - ->addScopeSupported(IUserService::UserProfileScope_Email) - ->addScopeSupported(IUserService::UserProfileScope_Profile) - // id token signing alg - ->addIdTokenSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::HS256) - ->addIdTokenSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::HS384) - ->addIdTokenSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::HS512) - ->addIdTokenSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RS256) - ->addIdTokenSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RS384) - ->addIdTokenSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RS512) - ->addIdTokenSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::PS256) - ->addIdTokenSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::PS384) - ->addIdTokenSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::PS512) - // id token enc alg - ->addIdTokenEncryptionAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RSA1_5) - ->addIdTokenEncryptionAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RSA_OAEP) - ->addIdTokenEncryptionAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RSA_OAEP_256) - ->addIdTokenEncryptionAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::Dir) - // id token enc enc - ->addIdTokenEncryptionEncSupported(JSONWebSignatureAndEncryptionAlgorithms::A128CBC_HS256) - ->addIdTokenEncryptionEncSupported(JSONWebSignatureAndEncryptionAlgorithms::A192CBC_HS384) - ->addIdTokenEncryptionEncSupported(JSONWebSignatureAndEncryptionAlgorithms::A256CBC_HS512) - // user info signing alg - ->addUserInfoSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::HS256) - ->addUserInfoSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::HS384) - ->addUserInfoSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::HS512) - ->addUserInfoSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RS256) - ->addUserInfoSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RS384) - ->addUserInfoSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RS512) - ->addUserInfoSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::PS256) - ->addUserInfoSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::PS384) - ->addUserInfoSigningAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::PS512) - // user info enc alg - ->addUserInfoEncryptionAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RSA1_5) - ->addUserInfoEncryptionAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RSA_OAEP) - ->addUserInfoEncryptionAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::RSA_OAEP_256) - ->addUserInfoEncryptionAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::Dir) - // user info enc enc - ->addUserInfoEncryptionAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::A128CBC_HS256) - ->addUserInfoEncryptionAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::A192CBC_HS384) - ->addUserInfoEncryptionAlgSupported(JSONWebSignatureAndEncryptionAlgorithms::A256CBC_HS512) - ->addSubjectTypeSupported(IClient::SubjectType_Public) - ->addSubjectTypeSupported(IClient::SubjectType_Pairwise) - ->addTokenEndpointAuthMethodSupported(self::TokenEndpoint_AuthMethod_ClientSecretBasic) - ->addTokenEndpointAuthMethodSupported(self::TokenEndpoint_AuthMethod_ClientSecretPost) - ->addTokenEndpointAuthMethodSupported(self::TokenEndpoint_AuthMethod_PrivateKeyJwt) - ->addTokenEndpointAuthMethodSupported(self::TokenEndpoint_AuthMethod_ClientSecretJwt) - ->addResponseModeSupported(self::OAuth2Protocol_ResponseMode_FormPost) - ->addResponseModeSupported(self::OAuth2Protocol_ResponseMode_Query) - ->addResponseModeSupported(self::OAuth2Protocol_ResponseMode_Fragment) - ->addDisplayValueSupported(self::OAuth2Protocol_Display_Page) - ->addDisplayValueSupported(self::OAuth2Protocol_Display_PopUp) - ->addDisplayValueSupported(self::OAuth2Protocol_Display_Touch) - ->addDisplayValueSupported(self::OAuth2Protocol_Display_Wap) - ->addDisplayValueSupported(self::OAuth2Protocol_Display_Native) - ->render(); - } - - /** - * @see http://openid.net/specs/openid-connect-session-1_0.html#RPLogout - * @param OAuth2Request $request - * @return OAuth2Response - */ - public function endSession(OAuth2Request $request = null) - { - try - { - $this->log_service->debug_msg("OAuth2Protocol::endSession"); - - $this->last_request = $request; - - if (is_null($this->last_request)) { - $this->log_service->debug_msg("OAuth2Protocol::endSession last request is null"); - throw new InvalidOAuth2Request; - } - - if(!$this->last_request->isValid()) { - $this->log_service->debug_msg(sprintf("OAuth2Protocol::endSession last request is invalid error %s", $this->last_request->getLastValidationError())); - throw new InvalidOAuth2Request($this->last_request->getLastValidationError()); - } - - if(!$this->last_request instanceof OAuth2LogoutRequest) throw new InvalidOAuth2Request; - - $id_token_hint = $this->last_request->getIdTokenHint(); - $client_id = null; - $user_id = null; - $user = null; - - if(!empty($id_token_hint)){ - $jwt = BasicJWTFactory::build($id_token_hint); - - if((!$jwt instanceof IJWT)) { - $this->log_service->debug_msg("OAuth2Protocol::endSession invalid id_token_hint!"); - throw new InvalidOAuth2Request('invalid id_token_hint!'); - } - - $client_id = $jwt->getClaimSet()->getAudience()->getString(); - $user_id = $jwt->getClaimSet()->getSubject(); - } - if(empty($client_id)){ - $client_id = $this->last_request->getClientId(); - } - - if(is_null($client_id)) { - $this->log_service->debug_msg("OAuth2Protocol::endSession client_id can not be inferred."); - throw new InvalidClientException('client_id can not be inferred.'); - } - - $client = $this->client_repository->getClientById($client_id); - - if(is_null($client)){ - $this->log_service->debug_msg("OAuth2Protocol::endSession client not found!"); - throw new InvalidClientException('Client not found!'); - } - - $redirect_logout_uri = $this->last_request->getPostLogoutRedirectUri(); - $state = $this->last_request->getState(); - - if(!empty($redirect_logout_uri) && !$client->isPostLogoutUriAllowed($redirect_logout_uri)) { - $this->log_service->debug_msg("OAuth2Protocol::endSession post_logout_redirect_uri not allowed!"); - throw new InvalidOAuth2Request('post_logout_redirect_uri not allowed!'); - } - - if(!is_null($user_id)){ - // try to get the user from id token ( if its set ) - $user_id = $this->auth_service->unwrapUserId(intval($user_id->getString())); - $user = $this->auth_service->getUserById($user_id); - - if(is_null($user)){ - Log::warning(sprintf("OAuth2Protocol::endSession user hint not found (%s)", $user_id)); - } - } - - // get current user - $logged_user = $this->auth_service->getCurrentUser(); - - if(!is_null($logged_user) && !is_null($user) && $logged_user->getId() !== $user->getId()) { - Log::warning - ( - sprintf - ( - "OAuth2Protocol::endSession user does not match with current session! logged user id %s - user id %s", - $logged_user->getId(), - $user->getId() - ) - ); - } - - if(!is_null($logged_user)) - $this->auth_service->logout(); - - if(!empty($redirect_logout_uri)) - { - return new OAuth2LogoutResponse($redirect_logout_uri, $state); - } - - return null; - } - catch (UriNotAllowedException $ex1) - { - $this->log_service->warning($ex1); - $this->checkpoint_service->trackException($ex1); - - return new OAuth2DirectErrorResponse(OAuth2Protocol::OAuth2Protocol_Error_UnauthorizedClient); - } - catch(OAuth2BaseException $ex2) - { - $this->log_service->warning($ex2); - $this->checkpoint_service->trackException($ex2); - - return new OAuth2DirectErrorResponse($ex2->getError(), $ex2->getMessage()); - } - catch (Exception $ex) - { - $this->log_service->error($ex); - $this->checkpoint_service->trackException($ex); - - return new OAuth2DirectErrorResponse - ( - OAuth2Protocol::OAuth2Protocol_Error_ServerError, - $ex->getMessage() - ); - } - } - - /** - * @return OAuth2Request - */ - public function getLastRequest() - { - return $this->last_request; - } - - /** - * @param OAuth2Request|null $request - * @return null - */ - private function validateRedirectUri(OAuth2Request $request = null) - { - if (is_null($request)) - return null; - $redirect_uri = $request->getRedirectUri(); - if (is_null($redirect_uri)) - return null; - $client_id = $request->getClientId(); - if (is_null($client_id)) - return null; - $client = $this->client_repository->getClientById($client_id); - if (is_null($client)) - return null; - if (!$client->isUriAllowed($redirect_uri)) - return null; - return $redirect_uri; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/OAuth2ServiceProvider.php b/app/libs/OAuth2/OAuth2ServiceProvider.php deleted file mode 100644 index 49d8b917..00000000 --- a/app/libs/OAuth2/OAuth2ServiceProvider.php +++ /dev/null @@ -1,37 +0,0 @@ -getRedirectUri(); - - if (is_null($redirect_uri)) - { - $this->last_validation_error = 'redirect_uri not set'; - return false; - } - - return true; - } - - /** - * @return null|string - */ - public function getRedirectUri() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_RedirectUri); - } - - /** - * @return null|string - */ - public function getClientId() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_ClientId); - } - - /** - * @return null|string - */ - public function getCode() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_ResponseType_Code); - } - - public function getCodeVerifier():?string{ - return $this->getParam(OAuth2Protocol::PKCE_CodeVerifier); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Requests/OAuth2AccessTokenRequestClientCredentials.php b/app/libs/OAuth2/Requests/OAuth2AccessTokenRequestClientCredentials.php deleted file mode 100644 index af090caf..00000000 --- a/app/libs/OAuth2/Requests/OAuth2AccessTokenRequestClientCredentials.php +++ /dev/null @@ -1,52 +0,0 @@ -getParam(OAuth2Protocol::OAuth2Protocol_Scope); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Requests/OAuth2AccessTokenValidationRequest.php b/app/libs/OAuth2/Requests/OAuth2AccessTokenValidationRequest.php deleted file mode 100644 index 81692b60..00000000 --- a/app/libs/OAuth2/Requests/OAuth2AccessTokenValidationRequest.php +++ /dev/null @@ -1,55 +0,0 @@ -last_validation_error = ''; - $token = $this->getToken(); - - if(is_null($token)) { - $this->last_validation_error = 'token not set'; - return false; - } - - return true; - } - - /** - * @return null|string - */ - public function getToken(){ - return $this->getParam(OAuth2Protocol::OAuth2Protocol_Token); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Requests/OAuth2AuthenticationRequest.php b/app/libs/OAuth2/Requests/OAuth2AuthenticationRequest.php deleted file mode 100644 index 454363a6..00000000 --- a/app/libs/OAuth2/Requests/OAuth2AuthenticationRequest.php +++ /dev/null @@ -1,234 +0,0 @@ -getParam(OAuth2Protocol::OAuth2Protocol_Nonce); - } - - /** - * @param bool|false $raw - * @return array|string|null - */ - public function getPrompt($raw = false) - { - $prompt = $this->getParam(OAuth2Protocol::OAuth2Protocol_Prompt); - if($raw) return $prompt; - if(!empty($prompt)) - return explode(' ', $prompt); - return []; - } - - /** - * @return null|int - */ - public function getMaxAge() - { - $value = $this->getParam(OAuth2Protocol::OAuth2Protocol_MaxAge); - if(!is_null($value)) - $value = intval($value); - return $value; - } - - /** - * @return null|string - */ - public function getUILocales() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_UILocales); - } - - /** - * @return null|string - */ - public function getIdTokenHint() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_IDTokenHint); - } - - /** - * @return null|string - */ - public function getLoginHint() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_LoginHint); - } - - /** - * @return null|string - */ - public function getACRValues() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_ACRValues); - } - - /** - * @return bool - */ - public function offlineAccessRequested() - { - return str_contains($this->getScope(), OAuth2Protocol::OfflineAccess_Scope); - } - - /** - * @param OAuth2AuthorizationRequest $auth_request - */ - public function __construct(OAuth2AuthorizationRequest $auth_request) - { - parent::__construct($auth_request->getMessage()); - } - - - /** - * Validates current request - * @return bool - */ - public function isValid() - { - $res = parent::isValid(); - - if($res) - { - // Reject requests without nonce unless using the code flow - $nonce = $this->getNonce(); - if(empty($nonce) && !OAuth2Protocol::responseTypeBelongsToFlow($this->getResponseType(false), OAuth2Protocol::OAuth2Protocol_GrantType_AuthCode)) - { - $this->last_validation_error = 'nonce not set'; - return false; - } - - $current_scope = trim($this->getScope()); - - if(!str_contains($current_scope, OAuth2Protocol::OpenIdConnect_Scope)) - { - $this->last_validation_error = 'missing openid scope'; - return false; - } - - if($current_scope === OAuth2Protocol::OpenIdConnect_Scope) - { - // add as default scope to current request - $this->setParam(OAuth2Protocol::OAuth2Protocol_Scope, sprintf('%s %s', $current_scope, IUserService::UserProfileScope_Profile)); - } - - $display = $this->getDisplay(); - - if(!in_array($display, OAuth2Protocol::$valid_display_values)) - { - $this->last_validation_error = 'not valid display value'; - return false; - } - - $prompt = $this->getPrompt(); - - if(!empty($prompt) && is_array($prompt)) - { - // if this parameter contains none with any other value, an error is returned. - if(in_array(OAuth2Protocol::OAuth2Protocol_Prompt_None, $prompt) && count($prompt) > 1) - { - $this->last_validation_error = 'not valid prompt'; - return false; - } - - foreach($prompt as $p) - { - if(!in_array($p, OAuth2Protocol::$valid_prompt_values)) - { - $this->last_validation_error = 'not valid prompt'; - return false; - } - } - } - - // http://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess - // MUST ensure that the prompt parameter contains consent unless other conditions for processing the request - // permitting offline access to the requested resources are in place - if($this->offlineAccessRequested() && empty($prompt)) - { - $this->last_validation_error = 'invalid offline access'; - return false; - } - - if($this->offlineAccessRequested() && !in_array(OAuth2Protocol::OAuth2Protocol_Prompt_Consent, $prompt)) - { - $this->last_validation_error = 'invalid offline access'; - return false; - } - - // if has requested offline access - if($this->offlineAccessRequested() && $this->getAccessType() === OAuth2Protocol::OAuth2Protocol_AccessType_Offline) - { - $this->last_validation_error = 'invalid param access_type=offline (OAUTH2.0)'; - return false; - } - } - - return $res; - } - - /** - * @param string $param_name - * @return bool - */ - public function isProcessedParam($param_name){ - $res = explode(' ', $this->getParam('processed_params')); - return in_array($param_name, $res); - } - - /** - * @param string $param_name - * @return $this - */ - public function markParamAsProcessed($param_name) - { - $res = $this->getParam('processed_params'); - if(!empty($res)) - { - $res = $res .' '; - } - $res = $res .$param_name; - $this->setParam('processed_params', $res); - return $this; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Requests/OAuth2AuthorizationRequest.php b/app/libs/OAuth2/Requests/OAuth2AuthorizationRequest.php deleted file mode 100644 index 945d0a95..00000000 --- a/app/libs/OAuth2/Requests/OAuth2AuthorizationRequest.php +++ /dev/null @@ -1,243 +0,0 @@ - OAuth2Protocol::OAuth2Protocol_ResponseType, - OAuth2Protocol::OAuth2Protocol_ClientId => OAuth2Protocol::OAuth2Protocol_ClientId, - OAuth2Protocol::OAuth2Protocol_RedirectUri => OAuth2Protocol::OAuth2Protocol_RedirectUri, - OAuth2Protocol::OAuth2Protocol_Scope => OAuth2Protocol::OAuth2Protocol_Scope, - OAuth2Protocol::OAuth2Protocol_State => OAuth2Protocol::OAuth2Protocol_State, - OAuth2Protocol::OAuth2Protocol_Approval_Prompt => OAuth2Protocol::OAuth2Protocol_Approval_Prompt, - OAuth2Protocol::OAuth2Protocol_AccessType => OAuth2Protocol::OAuth2Protocol_AccessType, - OAuth2Protocol::OAuth2Protocol_ResponseMode => OAuth2Protocol::OAuth2Protocol_ResponseMode, - ]; - - /** - * The Response Type request parameter response_type informs the Authorization Server of the desired authorization - * processing flow - * @param bool|true $raw - * @return array|string|null - */ - public function getResponseType($raw = true) - { - if($raw) - return $this->getParam(OAuth2Protocol::OAuth2Protocol_ResponseType); - - return explode - ( - OAuth2Protocol::OAuth2Protocol_ResponseType_Delimiter, - $this->getParam(OAuth2Protocol::OAuth2Protocol_ResponseType) - ); - } - - /** - * @see http://openid.net/specs/oauth-v2-multiple-response-types-1_0.html#ResponseModes - * The Response Mode request parameter response_mode informs the Authorization Server of the mechanism to be used - * for returning Authorization Response parameters from the Authorization Endpoint - */ - public function getResponseMode() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_ResponseMode); - } - - /** - * Identifies the client that is making the request. - * The value passed in this parameter must exactly match the value shown in the Admin Console. - * @return null|string - */ - public function getClientId() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_ClientId); - } - - /** - * One of the redirect_uri values registered - * @return null|string - */ - public function getRedirectUri() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_RedirectUri); - } - - /** - * Space-delimited set of permissions that the application requests. - * @return null|string - */ - public function getScope() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_Scope); - } - - /** - * Provides any state that might be useful to your application upon receipt of the response. - * The Authorization Server roundtrips this parameter, so your application receives the same value it sent. - * Possible uses include redirecting the user to the correct resource in your site, nonces, and - * cross-site-request-forgery mitigations. - * @return null|string - */ - public function getState() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_State); - } - - /** - * Indicates whether the user should be re-prompted for consent. The default is auto, - * so a given user should only see the consent page for a given set of scopes the first time - * through the sequence. If the value is force, then the user sees a consent page even if they - * previously gave consent to your application for a given set of scopes. - * @return null|string - */ - public function getApprovalPrompt() - { - $approval = $this->getParam(OAuth2Protocol::OAuth2Protocol_Approval_Prompt); - if (is_null($approval)) - { - $approval = OAuth2Protocol::OAuth2Protocol_Approval_Prompt_Auto; - } - - return $approval; - } - - /** - * Indicates whether your application needs to access an API when the user is not present at the browser. - * This parameter defaults to online. If your application needs to refresh access tokens when the user is - * not present at the browser, then use offline. This will result in your application obtaining a refresh - * token the first time your application exchanges an authorization code for a user. - * @return null|string - */ - public function getAccessType() - { - $access_type = $this->getParam(OAuth2Protocol::OAuth2Protocol_AccessType); - if (is_null($access_type)) - { - $access_type = OAuth2Protocol::OAuth2Protocol_AccessType_Online; - } - - return $access_type; - } - - /** - * Validates current request - * @return bool - */ - public function isValid() - { - $this->last_validation_error = ''; - - if (is_null($this->getResponseType())) - { - $this->last_validation_error = 'response_type not set'; - return false; - } - - if(!OAuth2Protocol::responseTypeBelongsToFlow($this->getResponseType(false), 'all')) - { - $this->last_validation_error = 'response_type does not belong to current flow'; - return false; - } - - if (is_null($this->getClientId())) - { - $this->last_validation_error = 'client_id not set'; - return false; - } - - if (is_null($this->getRedirectUri())) - { - $this->last_validation_error = 'redirect_url not set'; - return false; - } - - //approval_prompt - $valid_approvals = [ - OAuth2Protocol::OAuth2Protocol_Approval_Prompt_Auto, - OAuth2Protocol::OAuth2Protocol_Approval_Prompt_Force - ]; - - if (!in_array($this->getApprovalPrompt(), $valid_approvals)) - { - $this->last_validation_error = 'approval_prompt is not valid'; - return false; - } - - $response_mode = $this->getResponseMode(); - - if(!empty($response_mode)) - { - if(!in_array($response_mode, OAuth2Protocol::$valid_response_modes)) - { - $this->last_validation_error = 'invalid response_mode'; - return false; - } - - $default_response_mode = OAuth2Protocol::getDefaultResponseMode($this->getResponseType(false)); - - if($default_response_mode === $response_mode) - { - $this->last_validation_error = 'invalid response_mode'; - return false; - } - } - - // PCKE validation - if(!is_null($this->getCodeChallenge())){ - if(!in_array( $this->getCodeChallengeMethod(), OAuth2Protocol::PKCE_ValidCodeChallengeMethods)){ - $this->last_validation_error = sprintf("%s not valid", OAuth2Protocol::PKCE_CodeChallengeMethod); - return false; - } - } - return true; - } - - /** - * @return null|string - */ - public function getDisplay() - { - $display = $this->getParam(OAuth2Protocol::OAuth2Protocol_Display); - if(empty($display)) return OAuth2Protocol::OAuth2Protocol_Display_Page; - return $display; - } - - // PKCE - - public function getCodeChallenge():?string{ - return $this->getParam(OAuth2Protocol::PKCE_CodeChallenge); - } - - public function getCodeChallengeMethod():?string{ - return $this->getParam(OAuth2Protocol::PKCE_CodeChallengeMethod); - } -} diff --git a/app/libs/OAuth2/Requests/OAuth2LogoutRequest.php b/app/libs/OAuth2/Requests/OAuth2LogoutRequest.php deleted file mode 100644 index 1143042e..00000000 --- a/app/libs/OAuth2/Requests/OAuth2LogoutRequest.php +++ /dev/null @@ -1,91 +0,0 @@ -last_validation_error = ''; - $log_out_uri = $this->getPostLogoutRedirectUri(); - $token_id = $this->getIdTokenHint(); - $client_id = $this->getClientId(); - // mandatory - if(empty($log_out_uri)) - { - $this->last_validation_error = 'log_out_uri not set.'; - return false; - } - if(empty($token_id)){ - // if token id hint is not set client id is mandatory - if(empty($client_id)){ - $this->last_validation_error = "client_id is not set."; - return false; - } - } - - return true; - } - - /** - * @return string|null - */ - public function getIdTokenHint() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_IDTokenHint); - } - - /** - * @return string|null - */ - public function getPostLogoutRedirectUri() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_PostLogoutRedirectUri); - } - - /** - * @return string|null - */ - public function getClientId() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_ClientId); - } - - /** - * @return string|null - */ - public function getState() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_State); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Requests/OAuth2RefreshAccessTokenRequest.php b/app/libs/OAuth2/Requests/OAuth2RefreshAccessTokenRequest.php deleted file mode 100644 index 78c2bdc7..00000000 --- a/app/libs/OAuth2/Requests/OAuth2RefreshAccessTokenRequest.php +++ /dev/null @@ -1,64 +0,0 @@ -getRefreshToken(); - - if(is_null($refresh_token)) { - $this->last_validation_error = 'refresh_token not set'; - return false; - } - - return true; - } - - /** - * @return null|string - */ - public function getRefreshToken(){ - return $this->getParam(OAuth2Protocol::OAuth2Protocol_RefreshToken); - } - - /** - * @return null|string - */ - public function getScope(){ - return $this->getParam(OAuth2Protocol::OAuth2Protocol_Scope); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Requests/OAuth2Request.php b/app/libs/OAuth2/Requests/OAuth2Request.php deleted file mode 100644 index 0aeb3a58..00000000 --- a/app/libs/OAuth2/Requests/OAuth2Request.php +++ /dev/null @@ -1,88 +0,0 @@ -message = $msg; - } - - /** - * @return OAuth2Message - */ - public function getMessage(){ - return $this->message; - } - - /** - * @param string $param - * @return null - */ - public function getParam($param) - { - $value = $this->message->getParam($param); - if(!empty($value)) $value = trim(urldecode($value)); - return $value; - } - - /** - * @param string $param - * @param mixed $value - * @return $this - */ - public function setParam($param, $value) - { - $this->message->setParam($param, $value); - return $this; - } - - /** - * @return string - */ - public function __toString() - { - return $this->message->__toString(); - } - - /** - * @return bool - */ - public abstract function isValid(); - - protected $last_validation_error = ''; - - /** - * @return string - */ - public function getLastValidationError() - { - return $this->last_validation_error; - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/Requests/OAuth2RequestMemento.php b/app/libs/OAuth2/Requests/OAuth2RequestMemento.php deleted file mode 100644 index aa0b5c07..00000000 --- a/app/libs/OAuth2/Requests/OAuth2RequestMemento.php +++ /dev/null @@ -1,64 +0,0 @@ -state = $state; - } - - /** - * @return array - */ - public function getState() - { - return $this->state; - } - - /** - * @param OAuth2Message $request - * @return OAuth2RequestMemento - */ - static public function buildFromRequest(OAuth2Message $request) - { - $r = new ReflectionObject($request); - $p = $r->getProperty('container'); - $p->setAccessible(true); - return new self($p->getValue($request)); - } - - /** - * @param array $state - * @return OAuth2RequestMemento - */ - static public function buildFromState(array $state){ - return new self($state); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Requests/OAuth2TokenRequest.php b/app/libs/OAuth2/Requests/OAuth2TokenRequest.php deleted file mode 100644 index 9fcb144f..00000000 --- a/app/libs/OAuth2/Requests/OAuth2TokenRequest.php +++ /dev/null @@ -1,59 +0,0 @@ -last_validation_error = ''; - - $grant_type = $this->getGrantType(); - - if(is_null($grant_type)) { - $this->last_validation_error = 'grant_type not set'; - return false; - } - - return true; - } - - /** - * @return null|string - */ - public function getGrantType() - { - return $this->getParam(OAuth2Protocol::OAuth2Protocol_GrantType); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Requests/OAuth2TokenRevocationRequest.php b/app/libs/OAuth2/Requests/OAuth2TokenRevocationRequest.php deleted file mode 100644 index 787d82b2..00000000 --- a/app/libs/OAuth2/Requests/OAuth2TokenRevocationRequest.php +++ /dev/null @@ -1,63 +0,0 @@ -last_validation_error = ''; - - $token = $this->getToken(); - - if(is_null($token)) { - $this->last_validation_error = 'token not set'; - return false; - } - - return true; - } - - /** - * @return null|string - */ - public function getToken(){ - return $this->getParam(OAuth2Protocol::OAuth2Protocol_Token); - } - - /** - * @return null|string - */ - public function getTokenHint(){ - return $this->getParam(OAuth2Protocol::OAuth2Protocol_TokenType_Hint); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/ResourceServer/IUserService.php b/app/libs/OAuth2/ResourceServer/IUserService.php deleted file mode 100644 index 66a0a40f..00000000 --- a/app/libs/OAuth2/ResourceServer/IUserService.php +++ /dev/null @@ -1,45 +0,0 @@ -log_service = $log_service; - $this->resource_server_context = $resource_server_context; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Responses/.gitkeep b/app/libs/OAuth2/Responses/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/libs/OAuth2/Responses/OAuth2AccessTokenFragmentResponse.php b/app/libs/OAuth2/Responses/OAuth2AccessTokenFragmentResponse.php deleted file mode 100644 index e9dcdf72..00000000 --- a/app/libs/OAuth2/Responses/OAuth2AccessTokenFragmentResponse.php +++ /dev/null @@ -1,49 +0,0 @@ -setReturnTo($return_to); - - if(!is_null($access_token) && !empty($access_token)) - { - $this[OAuth2Protocol::OAuth2Protocol_AccessToken] = $access_token; - $this[OAuth2Protocol::OAuth2Protocol_AccessToken_ExpiresIn] = $expires_in; - $this[OAuth2Protocol::OAuth2Protocol_TokenType] = 'Bearer'; - } - - if(!is_null($scope) && !empty($scope)) - $this[OAuth2Protocol::OAuth2Protocol_Scope] = $scope; - - if(!is_null($state) && !empty($state)) - $this[OAuth2Protocol::OAuth2Protocol_State] = $state; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Responses/OAuth2AccessTokenResponse.php b/app/libs/OAuth2/Responses/OAuth2AccessTokenResponse.php deleted file mode 100644 index cdff1e84..00000000 --- a/app/libs/OAuth2/Responses/OAuth2AccessTokenResponse.php +++ /dev/null @@ -1,51 +0,0 @@ -getClientId(); - $this['application_type'] = $client->getApplicationType(); - $this[OAuth2Protocol::OAuth2Protocol_TokenType] = 'Bearer'; - $this[OAuth2Protocol::OAuth2Protocol_Scope] = $scope; - $this[OAuth2Protocol::OAuth2Protocol_Audience] = $audience; - $this[OAuth2Protocol::OAuth2Protocol_AccessToken_ExpiresIn] = $expires_in; - - if(!is_null($user)) - { - // user info if present - $this[OAuth2Protocol::OAuth2Protocol_UserId] = $user->getId(); - $this['user_identifier'] = $user->getIdentifier(); - $this['user_email'] = $user->getEmail(); - $this['user_first_name'] = $user->getFirstName(); - $this['user_last_name'] = $user->getLastName(); - $this['user_language'] = $user->getLanguage(); - $this['user_country'] = $user->getCountry(); - $this['user_email_verified'] = $user->isEmailVerified(); - $this['user_pic'] = $user->getPic(); - // default empty value - $user_groups = []; - foreach ($user->getGroups() as $group){ - $user_groups[] = SerializerRegistry::getInstance()->getSerializer($group)->serialize(); - } - - $this['user_groups'] = $user_groups; - } - - if(count($allowed_urls)){ - $this['allowed_return_uris'] = implode(' ', $allowed_urls); - } - - if(count($allowed_origins)){ - $this['allowed_origins'] = implode(' ', $allowed_origins); - } - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Responses/OAuth2AuthorizationResponse.php b/app/libs/OAuth2/Responses/OAuth2AuthorizationResponse.php deleted file mode 100644 index 6d6200cb..00000000 --- a/app/libs/OAuth2/Responses/OAuth2AuthorizationResponse.php +++ /dev/null @@ -1,81 +0,0 @@ -setReturnTo($return_url); - - if(!empty($scope)) - $this[OAuth2Protocol::OAuth2Protocol_Scope] = $scope; - - if(!empty($state)) - $this[OAuth2Protocol::OAuth2Protocol_State] = $state; - - if(!empty($session_state)) - $this[OAuth2Protocol::OAuth2Protocol_Session_State] = $session_state; - } - - /** - * @return null|string - */ - public function getAuthCode() - { - return isset($this[OAuth2Protocol::OAuth2Protocol_ResponseType_Code])?$this[OAuth2Protocol::OAuth2Protocol_ResponseType_Code] :null; - } - - /** - * @return null|string - */ - public function getState() - { - return isset($this[OAuth2Protocol::OAuth2Protocol_State])?$this[OAuth2Protocol::OAuth2Protocol_State] :null; - } - - /** - * @return null|string - */ - public function getScope() - { - return isset($this[OAuth2Protocol::OAuth2Protocol_Scope])?$this[OAuth2Protocol::OAuth2Protocol_Scope] :null; - } - - /** - * @return null|string - */ - public function getSessionState() - { - return isset($this[OAuth2Protocol::OAuth2Protocol_Session_State])?$this[OAuth2Protocol::OAuth2Protocol_Session_State] :null; - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/Responses/OAuth2DirectErrorResponse.php b/app/libs/OAuth2/Responses/OAuth2DirectErrorResponse.php deleted file mode 100644 index c3527986..00000000 --- a/app/libs/OAuth2/Responses/OAuth2DirectErrorResponse.php +++ /dev/null @@ -1,74 +0,0 @@ -setError($error); - - if(!empty ($error_description)) - $this->setErrorDescription($error_description); - - if(!empty($state)) - $this->setState($state); - } - - /** - * @param $error - * @return $this - */ - public function setError($error) - { - $this[OAuth2Protocol::OAuth2Protocol_Error] = $error; - return $this; - } - - /** - * @param $state - * @return $this - */ - public function setState($state) - { - $this[OAuth2Protocol::OAuth2Protocol_State] = $state; - return $this; - } - - /** - * @param $error_description - * @return $this - */ - public function setErrorDescription($error_description) - { - $this[OAuth2Protocol::OAuth2Protocol_ErrorDescription] = $error_description; - return $this; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Responses/OAuth2DirectResponse.php b/app/libs/OAuth2/Responses/OAuth2DirectResponse.php deleted file mode 100644 index dc843c53..00000000 --- a/app/libs/OAuth2/Responses/OAuth2DirectResponse.php +++ /dev/null @@ -1,41 +0,0 @@ -container); - return $json_encoded_format; - } - - public function getType() - { - return self::OAuth2DirectResponse; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Responses/OAuth2HybridTokenFragmentResponse.php b/app/libs/OAuth2/Responses/OAuth2HybridTokenFragmentResponse.php deleted file mode 100644 index 20199141..00000000 --- a/app/libs/OAuth2/Responses/OAuth2HybridTokenFragmentResponse.php +++ /dev/null @@ -1,53 +0,0 @@ -setErrorDescription($error_description); - - $this->setHttpCode(HttpResponse::HttpErrorResponse); - - $this->setError($error); - - $this->setReturnTo($return_to); - } - - /** - * @param string $error - */ - public function setError($error) - { - $this[OAuth2Protocol::OAuth2Protocol_Error] = $error; - } - - /** - * @param string $state - */ - public function setState($state) - { - $this[OAuth2Protocol::OAuth2Protocol_State] = $state; - } - - /** - * @param string $error_description - */ - public function setErrorDescription($error_description) - { - $this[OAuth2Protocol::OAuth2Protocol_ErrorDescription] = $error_description; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Responses/OAuth2IndirectFragmentErrorResponse.php b/app/libs/OAuth2/Responses/OAuth2IndirectFragmentErrorResponse.php deleted file mode 100644 index 30b8db1b..00000000 --- a/app/libs/OAuth2/Responses/OAuth2IndirectFragmentErrorResponse.php +++ /dev/null @@ -1,55 +0,0 @@ -setErrorDescription($error_description); - - $this->setError($error); - - $this->setReturnTo($return_to); - } - - public function setError($error) - { - $this[OAuth2Protocol::OAuth2Protocol_Error] = $error; - } - - public function setErrorDescription($error_description) - { - $this[OAuth2Protocol::OAuth2Protocol_ErrorDescription] = $error_description; - } - -} \ No newline at end of file diff --git a/app/libs/OAuth2/Responses/OAuth2IndirectFragmentResponse.php b/app/libs/OAuth2/Responses/OAuth2IndirectFragmentResponse.php deleted file mode 100644 index 7b36c011..00000000 --- a/app/libs/OAuth2/Responses/OAuth2IndirectFragmentResponse.php +++ /dev/null @@ -1,23 +0,0 @@ -return_to = $return_to; - } - - public function getReturnTo() - { - return $this->return_to; - } - - public function getContent() - { - $url_encoded_format = ""; - if ($this->container !== null) - { - ksort($this->container); - foreach ($this->container as $key => $value) - { - if (is_array($value)) - { - list($key, $value) = array($value[0], $value[1]); - } - $value = urlencode($value); - $url_encoded_format .= "$key=$value&"; - } - $url_encoded_format = rtrim($url_encoded_format, '&'); - } - return $url_encoded_format; - } - - public function getContentType() - { - return HttpContentType::Form; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Responses/OAuth2LogoutResponse.php b/app/libs/OAuth2/Responses/OAuth2LogoutResponse.php deleted file mode 100644 index 3fb171b4..00000000 --- a/app/libs/OAuth2/Responses/OAuth2LogoutResponse.php +++ /dev/null @@ -1,38 +0,0 @@ -setReturnTo($return_to); - - if(!is_null($state) && !empty($state)) - $this[OAuth2Protocol::OAuth2Protocol_State] = $state; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Responses/OAuth2PostResponse.php b/app/libs/OAuth2/Responses/OAuth2PostResponse.php deleted file mode 100644 index 643f59df..00000000 --- a/app/libs/OAuth2/Responses/OAuth2PostResponse.php +++ /dev/null @@ -1,100 +0,0 @@ -return_to; - $fields = ''; - if ($this->container !== null) - { - ksort($this->container); - foreach ($this->container as $key => $value) - { - if (is_array($value)) - { - list($key, $value) = array($value[0], $value[1]); - } - - $fields .= ''; - } - } - $content = << - Submit This Form - -

- $fields - - - -HTML; - return $content; - - } - - public function getType() - { - return self::OAuth2PostResponse; - } - - /** - * @param string $return_to - */ - public function setReturnTo($return_to) - { - $this->return_to = $return_to; - } - - /** - * @return string - */ - public function getReturnTo() - { - return $this->return_to; - } - - public function getContentType() - { - return HttpContentType::Html; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Responses/OAuth2Response.php b/app/libs/OAuth2/Responses/OAuth2Response.php deleted file mode 100644 index eaa5f034..00000000 --- a/app/libs/OAuth2/Responses/OAuth2Response.php +++ /dev/null @@ -1,24 +0,0 @@ -realm = $realm; - $this->error = $error; - $this->error_description = $error_description; - $this->scope = $scope; - $this->http_error = $http_error; - } - - public function getWWWAuthenticateHeaderValue(){ - $value=sprintf('Bearer realm="%s"',$this->realm); - $value=$value.sprintf(', error="%s"',$this->error); - $value=$value.sprintf(', error_description="%s"',$this->error_description); - if(!is_null($this->scope)) - $value=$value.sprintf(', scope="%s"',$this->scope); - return $value; - } - - /** - * @return array - */ - public function getContent() - { - $content = array( - 'error' => $this->error, - 'error_description' => $this->error_description - ); - if(!is_null($this->scope)) - $content['scope'] = $this->scope; - - return $content; - } - - public function getType() - { - return null; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Services/.gitkeep b/app/libs/OAuth2/Services/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/libs/OAuth2/Services/AccessTokenGenerator.php b/app/libs/OAuth2/Services/AccessTokenGenerator.php deleted file mode 100644 index 1d4ccfa9..00000000 --- a/app/libs/OAuth2/Services/AccessTokenGenerator.php +++ /dev/null @@ -1,19 +0,0 @@ -setValue(Rand::getString($identifier->getLenght(), OAuth2Protocol::VsChar, true)); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Services/RefreshTokenGenerator.php b/app/libs/OAuth2/Services/RefreshTokenGenerator.php deleted file mode 100644 index 5e78cb99..00000000 --- a/app/libs/OAuth2/Services/RefreshTokenGenerator.php +++ /dev/null @@ -1,19 +0,0 @@ -token_endpoint_url = $token_endpoint_url; - return $this; - } - - /** - * @param ClientAuthenticationContext $context - * @param JsonValue $kid - * @throws InvalidClientAuthenticationContextException - * @return IJWK - */ - abstract protected function getKey(ClientAuthenticationContext $context, JsonValue $kid = null); - - /** - * @param ClientAuthenticationContext $context - * @return bool - * @throws InvalidClientAuthenticationContextException - */ - public function validate(ClientAuthenticationContext $context) - { - if(!($context instanceof ClientAssertionAuthenticationContext)) - throw new InvalidClientAuthenticationContextException; - - if(empty($this->token_endpoint_url)) - throw new InvalidClientAuthenticationContextException('token_endpoint_url not set!'); - - if( $context->getClient()->getTokenEndpointAuthInfo()->getAuthenticationMethod() !== $context->getAuthType()) - return false; - - $jws = $context->getAssertion(); - - $client = $context->getClient(); - - $original_alg = $client->getTokenEndpointAuthInfo()->getSigningAlgorithm()->getName(); - - if($original_alg !== $jws->getJOSEHeader()->getAlgorithm()->getString()) - return false; - - $key = $this->getKey - ( - $context, - $jws->getJOSEHeader()->getKeyID() - ); - - if(is_null($key)) - return false; - - $verified = $jws->setKey($key)->verify($original_alg); - - if(!$verified) return false; - - $iss = $jws->getClaimSet()->getIssuer()->getString(); - $aud = $jws->getClaimSet()->getAudience()->getString(); - $sub = $jws->getClaimSet()->getSubject()->getString(); - $jti = $jws->getClaimSet()->getJWTID(); - - //todo: prevent reuse of the token - if(empty($jti)) return false; - - if($iss !== $sub) - throw new InvalidClientAuthenticationContextException('iss not match with sub!'); - - if($aud !== $this->token_endpoint_url) - return false; - - if($jws->isExpired(180)) return false; - - return true; - - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Strategies/ClientAuthContextValidatorFactory.php b/app/libs/OAuth2/Strategies/ClientAuthContextValidatorFactory.php deleted file mode 100644 index 838aa23b..00000000 --- a/app/libs/OAuth2/Strategies/ClientAuthContextValidatorFactory.php +++ /dev/null @@ -1,89 +0,0 @@ -getAuthType()) - { - case OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretBasic: - case OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretPost: - { - return new ClientPlainCredentialsAuthContextValidator; - } - break; - case OAuth2Protocol::TokenEndpoint_AuthMethod_None: - { - return new ClientPKCEAuthContextValidator; - } - break; - case OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretJwt: - { - $validator = new ClientSharedSecretAssertionAuthContextValidator; - $validator->setTokenEndpointUrl(self::$token_endpoint_url); - return $validator; - } - break; - case OAuth2Protocol::TokenEndpoint_AuthMethod_PrivateKeyJwt: - { - $validator = new ClientPrivateKeyAssertionAuthContextValidator; - $validator->setTokenEndpointUrl(self::$token_endpoint_url); - $validator->setJWKSetReader(self::$jwks_reader ); - return $validator; - } - break; - } - throw new InvalidTokenEndpointAuthMethodException($context->getAuthType()); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Strategies/ClientPKCEAuthContextValidator.php b/app/libs/OAuth2/Strategies/ClientPKCEAuthContextValidator.php deleted file mode 100644 index 1aa0e0fa..00000000 --- a/app/libs/OAuth2/Strategies/ClientPKCEAuthContextValidator.php +++ /dev/null @@ -1,56 +0,0 @@ -getClient(); - if (is_null($client)) - throw new InvalidClientAuthenticationContextException('client not set!'); - - if ($client->getTokenEndpointAuthInfo()->getAuthenticationMethod() !== $context->getAuthType()) - throw new InvalidClientCredentials(sprintf('invalid token endpoint auth method %s', $context->getAuthType())); - - if ($client->getClientType() !== IClient::ClientType_Public) - throw new InvalidClientCredentials(sprintf('invalid client type %s', $client->getClientType())); - - $providedClientId = $context->getId(); - - Log::debug(sprintf("ClientPKCEAuthContextValidator::validate client id %s - provide client id %s", $client->getClientId(), $providedClientId)); - - return $client->getClientId() === $providedClientId && $client->isPKCEEnabled(); - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Strategies/ClientPlainCredentialsAuthContextValidator.php b/app/libs/OAuth2/Strategies/ClientPlainCredentialsAuthContextValidator.php deleted file mode 100644 index 0bc665c1..00000000 --- a/app/libs/OAuth2/Strategies/ClientPlainCredentialsAuthContextValidator.php +++ /dev/null @@ -1,56 +0,0 @@ -getClient(); - if(is_null($client)) - throw new InvalidClientAuthenticationContextException('client not set!'); - - if($client->getTokenEndpointAuthInfo()->getAuthenticationMethod() !== $context->getAuthType()) - throw new InvalidClientCredentials(sprintf('invalid token endpoint auth method %s', $context->getAuthType())); - - if($client->getClientType() !== IClient::ClientType_Confidential) - throw new InvalidClientCredentials(sprintf('invalid client type %s', $client->getClientType())); - - $providedClientId = $context->getId(); - $providedClientSecret = $context->getSecret(); - - Log::debug(sprintf("ClientPlainCredentialsAuthContextValidator::validate client id %s - provide client id %s", $client->getClientId(), $providedClientId)); - Log::debug(sprintf("ClientPlainCredentialsAuthContextValidator::validate client secret %s - provide client secret %s", $client->getClientSecret(), $providedClientSecret)); - - return $client->getClientId() === $providedClientId && $client->getClientSecret() === $providedClientSecret; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Strategies/ClientPrivateKeyAssertionAuthContextValidator.php b/app/libs/OAuth2/Strategies/ClientPrivateKeyAssertionAuthContextValidator.php deleted file mode 100644 index 5f3f5664..00000000 --- a/app/libs/OAuth2/Strategies/ClientPrivateKeyAssertionAuthContextValidator.php +++ /dev/null @@ -1,107 +0,0 @@ -jwks_reader = $jwks_reader; - - return $this; - } - - /** - * @param ClientAuthenticationContext $context - * @param JsonValue $kid - * @throws InvalidClientAuthenticationContextException - * @return IJWK - */ - protected function getKey(ClientAuthenticationContext $context, JsonValue $kid = null) - { - - if(!($context instanceof ClientAssertionAuthenticationContext)) - throw new InvalidClientAuthenticationContextException; - - $client = $context->getClient(); - - $jws = $context->getAssertion(); - - - if(!is_null($kid)) - { - $key = $client->getPublicKeyByIdentifier($kid->getValue()); - if($key->isActive() && !$key->isExpired()) return $key->toJWK(); - } - $alg = $jws->getJOSEHeader()->getAlgorithm()->getString(); - - $key = $client->getCurrentPublicKeyByUse - ( - JSONWebKeyPublicKeyUseValues::Signature, - $alg - ); - - if(!is_null($key)) return $key->toJWK(); - - // no public keys set, try with jwks_url ... - if (is_null($this->jwks_reader)) - { - throw new InvalidClientAuthenticationContextException('jwks_reader not set!'); - } - - $jwk_set = $this->jwks_reader->read($client); - - if(!is_null($kid)) - { - $key = $jwk_set->getKeyById($kid->getValue()); - if(!is_null($key)) return $key; - } - - foreach ($jwk_set->getKeys() as $key) - { - if - ( - $key->getKeyUse() === JSONWebKeyPublicKeyUseValues::Signature && - $key->getAlgorithm()->getString() === $alg - ) - { - return $key; - } - } - - return null; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Strategies/ClientSharedSecretAssertionAuthContextValidator.php b/app/libs/OAuth2/Strategies/ClientSharedSecretAssertionAuthContextValidator.php deleted file mode 100644 index fefe8e99..00000000 --- a/app/libs/OAuth2/Strategies/ClientSharedSecretAssertionAuthContextValidator.php +++ /dev/null @@ -1,67 +0,0 @@ -getClient(); - - $jws = $context->getAssertion(); - - $key = OctetSequenceJWKFactory::build - ( - new OctetSequenceJWKSpecification - ( - $client->getClientSecret(), - $jws->getJOSEHeader()->getAlgorithm()->getString() - ) - ); - - return $key; - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Strategies/IClientAuthContextValidator.php b/app/libs/OAuth2/Strategies/IClientAuthContextValidator.php deleted file mode 100644 index a265d24a..00000000 --- a/app/libs/OAuth2/Strategies/IClientAuthContextValidator.php +++ /dev/null @@ -1,29 +0,0 @@ -getResponseType(false); - - if (OAuth2Protocol::responseTypeBelongsToFlow($response_type, OAuth2Protocol::OAuth2Protocol_GrantType_AuthCode)) - { - return new OAuth2IndirectErrorResponse - ( - $error, - $error_description, - $return_url, - $request->getState() - ); - } - if - ( - OAuth2Protocol::responseTypeBelongsToFlow($response_type, OAuth2Protocol::OAuth2Protocol_GrantType_Implicit) || - OAuth2Protocol::responseTypeBelongsToFlow($response_type, OAuth2Protocol::OAuth2Protocol_GrantType_Hybrid) - ) - { - return new OAuth2IndirectFragmentErrorResponse - ( - $error, - $error_description, - $return_url, - $request->getState() - ); - } - - throw new UnsupportedResponseTypeException - ( - sprintf - ( - "invalid response type %s", - $request->getResponseType() - ) - ); - } - } -} \ No newline at end of file diff --git a/app/libs/OAuth2/Strategies/OAuth2ResponseStrategyFactoryMethod.php b/app/libs/OAuth2/Strategies/OAuth2ResponseStrategyFactoryMethod.php deleted file mode 100644 index de533cb2..00000000 --- a/app/libs/OAuth2/Strategies/OAuth2ResponseStrategyFactoryMethod.php +++ /dev/null @@ -1,96 +0,0 @@ -getType(); - - if($request instanceof OAuth2AuthorizationRequest) - { - $response_mode = $request->getResponseMode(); - - if(is_null($response_mode)) - { - $response_mode = OAuth2Protocol::getDefaultResponseMode($request->getResponseType(false)); - } - - switch($response_mode) - { - case OAuth2Protocol::OAuth2Protocol_ResponseMode_Fragment: - $type = OAuth2IndirectFragmentResponse::OAuth2IndirectFragmentResponse; - break; - case OAuth2Protocol::OAuth2Protocol_ResponseMode_Query: - $type = OAuth2IndirectResponse::OAuth2IndirectResponse; - break; - case OAuth2Protocol::OAuth2Protocol_ResponseMode_FormPost: - $type = OAuth2PostResponse::OAuth2PostResponse; - break; - case OAuth2Protocol::OAuth2Protocol_ResponseMode_Direct: - $type = OAuth2DirectResponse::OAuth2DirectResponse; - break; - } - } - - switch ($type) - { - case OAuth2PostResponse::OAuth2PostResponse: - { - return ServiceLocator::getInstance()->getService(OAuth2PostResponse::OAuth2PostResponse); - } - break; - case OAuth2IndirectResponse::OAuth2IndirectResponse: - { - return ServiceLocator::getInstance()->getService(OAuth2IndirectResponse::OAuth2IndirectResponse); - } - break; - - case OAuth2IndirectFragmentResponse::OAuth2IndirectFragmentResponse: - { - return ServiceLocator::getInstance()->getService(OAuth2IndirectFragmentResponse::OAuth2IndirectFragmentResponse); - } - break; - case OAuth2DirectResponse::OAuth2DirectResponse: - { - return ServiceLocator::getInstance()->getService(OAuth2DirectResponse::OAuth2DirectResponse); - } - break; - default: - throw new Exception(sprintf("Invalid OAuth2 response Type %s", $type)); - break; - } - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Exceptions/InvalidAssociation.php b/app/libs/OpenId/Exceptions/InvalidAssociation.php deleted file mode 100644 index 6c617898..00000000 --- a/app/libs/OpenId/Exceptions/InvalidAssociation.php +++ /dev/null @@ -1,26 +0,0 @@ -auth_service = $auth_service; - - self::$available_properties[OpenIdAXExtension::Country] = "http://axschema.org/contact/country/home"; - self::$available_properties[OpenIdAXExtension::Email] = "http://axschema.org/contact/email"; - self::$available_properties[OpenIdAXExtension::FirstMame] = "http://axschema.org/namePerson/first"; - self::$available_properties[OpenIdAXExtension::LastName] = "http://axschema.org/namePerson/last"; - self::$available_properties[OpenIdAXExtension::Language] = "http://axschema.org/pref/language"; - } - - /** - * @param OpenIdRequest $request - * @param RequestContext $context - * @return void - */ - public function parseRequest(OpenIdRequest $request, RequestContext $context) - { - try { - $ax_request = new OpenIdAXRequest($request->getMessage()); - if (!$ax_request->isValid()) return; - $attributes = $ax_request->getRequiredAttributes(); - $data = []; - foreach ($attributes as $attr) { - array_push($data, $attr); - } - $partial_view = new PartialView($this->view, array("attributes" => $data)); - $context->addPartialView($partial_view); - } catch (Exception $ex) { - $this->log_service->error($ex); - } - } - - /** - * @param OpenIdRequest $request - * @param OpenIdResponse $response - * @param ResponseContext $context - * @return void - */ - public function prepareResponse(OpenIdRequest $request, OpenIdResponse $response, ResponseContext $context) - { - try { - $ax_request = new OpenIdAXRequest($request->getMessage()); - if (!$ax_request->isValid()) return; - - $response->addParam(self::paramNamespace(), self::NamespaceUrl); - $response->addParam(self::param(self::Mode), self::FetchResponse); - $context->addSignParam(self::param(self::Mode)); - - $attributes = $ax_request->getRequiredAttributes(); - $user = $this->auth_service->getCurrentUser(); - - foreach ($attributes as $attr) { - $response->addParam(self::param(self::Type) . "." . $attr, self::$available_properties[$attr]); - $context->addSignParam(self::param(self::Type) . "." . $attr); - $context->addSignParam(self::param(self::Value) . "." . $attr); - if ($attr == "email") { - $response->addParam(self::param(self::Value) . "." . $attr, $user->getEmail()); - } - if ($attr == "country") { - $response->addParam(self::param(self::Value) . "." . $attr, $user->getCountry()); - } - if ($attr == "firstname") { - $response->addParam(self::param(self::Value) . "." . $attr, $user->getFirstName()); - } - if ($attr == "lastname") { - $response->addParam(self::param(self::Value) . "." . $attr, $user->getLastName()); - } - if ($attr == "language") { - $response->addParam(self::param(self::Value) . "." . $attr, $user->getLanguage()); - } - } - } catch (Exception $ex) { - $this->log_service->error($ex); - } - } - - /** - * @param string $separator - * @return string - */ - public static function paramNamespace($separator = '.') - { - return OpenIdProtocol::OpenIdPrefix . $separator . OpenIdProtocol::OpenIDProtocol_NS . $separator . self::Prefix; - } - - /** - * @param $param - * @param string $separator - * @return string - */ - public static function param($param, $separator = '.') - { - return OpenIdProtocol::OpenIdPrefix . $separator . self::Prefix . $separator . $param; - } - - /** - * @param OpenIdRequest $request - * @return array - */ - public function getTrustedData(OpenIdRequest $request) - { - $data = []; - try { - $ax_request = new OpenIdAXRequest($request->getMessage()); - if ($ax_request->isValid()) { - $attributes = $ax_request->getRequiredAttributes(); - foreach ($attributes as $attr) { - array_push($data, $attr); - } - } - } catch (Exception $ex) { - $this->log_service->debug_msg($request->__toString()); - $this->log_service->error($ex); - } - return $data; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Extensions/Implementations/OpenIdAXRequest.php b/app/libs/OpenId/Extensions/Implementations/OpenIdAXRequest.php deleted file mode 100644 index 34528e5f..00000000 --- a/app/libs/OpenId/Extensions/Implementations/OpenIdAXRequest.php +++ /dev/null @@ -1,96 +0,0 @@ -attributes = []; - } - - /** - * @return bool - * @throws InvalidOpenIdMessageException - */ - public function isValid() - { - - //check identifier - if (isset($this->message[OpenIdAXExtension::paramNamespace(HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]) - && $this->message[OpenIdAXExtension::paramNamespace(HttpMessage::PHP_REQUEST_VAR_SEPARATOR)] == OpenIdAXExtension::NamespaceUrl - ) { - - //check required fields - - if (!isset($this->message[OpenIdAXExtension::param(OpenIdAXExtension::Mode, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]) - || $this->message[OpenIdAXExtension::param(OpenIdAXExtension::Mode, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)] != OpenIdAXExtension::FetchRequest - ) - throw new InvalidOpenIdMessageException(OpenIdErrorMessages::AXInvalidModeMessage); - - if (!isset($this->message[OpenIdAXExtension::param(OpenIdAXExtension::RequiredAttributes, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)])) - throw new InvalidOpenIdMessageException(OpenIdErrorMessages::AXInvalidRequiredAttributesMessage); - - //get attributes - $attributes = $this->message[OpenIdAXExtension::param(OpenIdAXExtension::RequiredAttributes, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]; - $attributes = explode(",", $attributes); - - foreach ($attributes as $attr) { - $attr = trim($attr); - if (!isset(OpenIdAXExtension::$available_properties[$attr])) - continue; - - $attr_ns = OpenIdAXExtension::param(OpenIdAXExtension::Type, HttpMessage::PHP_REQUEST_VAR_SEPARATOR) . HttpMessage::PHP_REQUEST_VAR_SEPARATOR . $attr; - - if (!isset($this->message[$attr_ns])) - throw new InvalidOpenIdMessageException(sprintf(OpenIdErrorMessages::AXInvalidNamespaceMessage,$attr_ns, $attr)); - - $ns = $this->message[$attr_ns]; - - if ($ns != OpenIdAXExtension::$available_properties[$attr]) - throw new InvalidOpenIdMessageException(sprintf(OpenIdErrorMessages::AXInvalidNamespaceMessage, $ns, $attr)); - - $this->attributes[] = $attr; - } - return true; - } - return false; - } - - /** - * @return array - */ - public function getRequiredAttributes() - { - return $this->attributes; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Extensions/Implementations/OpenIdOAuth2Extension.php b/app/libs/OpenId/Extensions/Implementations/OpenIdOAuth2Extension.php deleted file mode 100644 index 7ec5cec0..00000000 --- a/app/libs/OpenId/Extensions/Implementations/OpenIdOAuth2Extension.php +++ /dev/null @@ -1,257 +0,0 @@ -oauth2_protocol = $oauth2_protocol; - $this->client_repository = $client_repository; - $this->scope_repository = $scope_repository; - $this->checkpoint_service = $checkpoint_service; - } - - /** - * @param $param - * @param string $separator - * @return string - */ - public static function param($param, $separator = '.') - { - return OpenIdProtocol::OpenIdPrefix . $separator . self::Prefix . $separator . $param; - } - - /** - * @param string $separator - * @return string - */ - public static function paramNamespace($separator = '.') - { - return OpenIdProtocol::OpenIdPrefix . $separator . OpenIdProtocol::OpenIDProtocol_NS . $separator . self::Prefix; - } - - /** - * @param OpenIdRequest $request - * @param RequestContext $context - * @return mixed|void - */ - public function parseRequest(OpenIdRequest $request, RequestContext $context) - { - try { - - $oauth2_request = new OpenIdOAuth2Request($request->getMessage()); - - if (!$oauth2_request->isValid()){ - return; - } - - $scopes = $oauth2_request->getScope(); - $client_id = $oauth2_request->getClientId(); - - $client = $this->client_repository->getClientById($client_id); - // do some validations to allow show the oauth2 sub view... - if(is_null($client)){ - $this->log_service->warning_msg(sprintf("OpenIdOAuth2Extension: client id %s not found!.",$client_id)); - return; - } - - //check is redirect uri is allowed for client - $redirect_uri = $request->getParam(OpenIdProtocol::OpenIDProtocol_ReturnTo); - if (!$client->isUriAllowed($redirect_uri)){ - $this->log_service->warning_msg(sprintf("OpenIdOAuth2Extension: url %s not allowed for client id %s ",$redirect_uri,$client_id)); - return; - } - - //check if requested client is allowed to use this scopes - if(!$client->isScopeAllowed($scopes)){ - $this->log_service->warning_msg(sprintf("OpenIdOAuth2Extension: scope %s not allowed for client id %s ",$scopes,$client_id)); - return; - } - - $scopes = explode(' ', $scopes); - //get scopes entities - $requested_scopes = $this->scope_repository->getByNames($scopes); - - // set view data - - $return_to = $request->getParam(OpenIdProtocol::OpenIDProtocol_ReturnTo); - $url_parts = @parse_url($return_to); - $return_to = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path']; - - $partial_view = new PartialView ($this->view, [ - 'requested_scopes' => $requested_scopes, - 'app_name' => $client->getApplicationName(), - 'app_logo' => $client->getApplicationLogo(), - 'redirect_to' => $return_to, - 'website' => $client->getWebsite(), - 'dev_info_email' => $client->getDeveloperEmail() - ]); - - $context->addPartialView($partial_view); - } catch (Exception $ex) { - $this->log_service->error($ex); - } - } - - /** - * @param OpenIdRequest $request - * @param OpenIdResponse $response - * @param ResponseContext $context - * @return mixed|void - */ - public function prepareResponse(OpenIdRequest $request, OpenIdResponse $response, ResponseContext $context) - { - try{ - $oauth2_request = new OpenIdOAuth2Request($request->getMessage()); - if (!$oauth2_request->isValid()) return; - //get auth code - $oauth2_msg = new OAuth2Message( - [ - OAuth2Protocol::OAuth2Protocol_ClientId => $oauth2_request->getClientId(), - OAuth2Protocol::OAuth2Protocol_Scope => $oauth2_request->getScope(), - OAuth2Protocol::OAuth2Protocol_RedirectUri => $request->getParam(OpenIdProtocol::OpenIDProtocol_ReturnTo), - OAuth2Protocol::OAuth2Protocol_State => $oauth2_request->getState(), - OAuth2Protocol::OAuth2Protocol_Approval_Prompt => $oauth2_request->getApprovalPrompt(), - OAuth2Protocol::OAuth2Protocol_AccessType => $oauth2_request->getAccessType(), - OAuth2Protocol::OAuth2Protocol_ResponseType => OAuth2Protocol::OAuth2Protocol_ResponseType_Code - ] - ); - // do oauth2 Authorization Code Grant 1st step (get auth code to exchange for an access token) - // http://tools.ietf.org/html/rfc6749#section-4.1 - $oauth2_response = $this->oauth2_protocol->authorize(new OAuth2AuthorizationRequest($oauth2_msg)); - if ( $oauth2_response instanceof OAuth2AuthorizationResponse ) { - //add namespace - $response->addParam(self::paramNamespace(),self::NamespaceUrl ); - $context->addSignParam(self::paramNamespace()); - - //add auth code - $response->addParam(self::param(self::RequestToken), $oauth2_response->getAuthCode()); - $context->addSignParam(self::param(self::RequestToken)); - - //add requested scope - $response->addParam(self::param(self::Scope), $oauth2_response->getScope()); - $context->addSignParam(self::param(self::Scope)); - - //add state - $response->addParam(self::param(self::State), $oauth2_request->getState()); - $context->addSignParam(self::param(self::State)); - - } - } - catch (Exception $ex) { - $this->log_service->error($ex); - $this->checkpoint_service->trackException($ex); - //http://step2.googlecode.com/svn/spec/openid_oauth_extension/latest/openid_oauth_extension.html#AuthResp - /* - * To note that the OAuth Authorization was declined or not valid, the Combined Provider SHALL only - * respond with the parameter "openid.ns.oauth". - */ - //add namespace - $response->addParam(self::paramNamespace(),self::NamespaceUrl ); - $context->addSignParam(self::paramNamespace()); - } - } - - /** - * @param OpenIdRequest $request - * @return array|mixed - */ - public function getTrustedData(OpenIdRequest $request) - { - $data = []; - try { - $oauth2_request = new OpenIdOAuth2Request($request->getMessage()); - if ($oauth2_request->isValid()) { - array_push($data,$oauth2_request->getScope()); - array_push($data,$oauth2_request->getClientId()); - } - } catch (Exception $ex) { - $this->log_service->error($ex); - } - return $data; - } - -} \ No newline at end of file diff --git a/app/libs/OpenId/Extensions/Implementations/OpenIdOAuth2Request.php b/app/libs/OpenId/Extensions/Implementations/OpenIdOAuth2Request.php deleted file mode 100644 index 493c919c..00000000 --- a/app/libs/OpenId/Extensions/Implementations/OpenIdOAuth2Request.php +++ /dev/null @@ -1,104 +0,0 @@ -message[$ns]) - && $this->message[$ns] == OpenIdOAuth2Extension::NamespaceUrl - ) { - if(is_null($this->getClientId())) - throw new InvalidOpenIdMessageException(sprintf(OpenIdErrorMessages::OAuth2MissingRequiredParam,'client_id')); - if(is_null($this->getScope())) - throw new InvalidOpenIdMessageException(sprintf(OpenIdErrorMessages::OAuth2MissingRequiredParam,'scope')); - if(is_null($this->getState())) - throw new InvalidOpenIdMessageException(sprintf(OpenIdErrorMessages::OAuth2MissingRequiredParam,'state')); - - return true; - } - return false; - } - - /** - * Indicates whether the user should be re-prompted for consent. The default is auto, - * so a given user should only see the consent page for a given set of scopes the first time - * through the sequence. If the value is force, then the user sees a consent page even if they - * previously gave consent to your application for a given set of scopes. - * @return null|string - */ - public function getApprovalPrompt(){ - return isset($this->message[OpenIdOAuth2Extension::param(OAuth2Protocol::OAuth2Protocol_Approval_Prompt, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)])? - $this->message[OpenIdOAuth2Extension::param(OAuth2Protocol::OAuth2Protocol_Approval_Prompt, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]:OAuth2Protocol::OAuth2Protocol_Approval_Prompt_Auto; - } - - /** - * Indicates whether your application needs to access an API when the user is not present at the browser. - * This parameter defaults to online. If your application needs to refresh access tokens when the user is - * not present at the browser, then use offline. This will result in your application obtaining a refresh - * token the first time your application exchanges an authorization code for a user. - * @return null|string - */ - public function getAccessType(){ - return isset($this->message[OpenIdOAuth2Extension::param(OAuth2Protocol::OAuth2Protocol_AccessType, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)])? - $this->message[OpenIdOAuth2Extension::param(OAuth2Protocol::OAuth2Protocol_AccessType, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]:OAuth2Protocol::OAuth2Protocol_AccessType_Online; - } - - /** - * @return null|string - */ - public function getClientId(){ - return isset($this->message[OpenIdOAuth2Extension::param(OAuth2Protocol::OAuth2Protocol_ClientId, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)])? - $this->message[OpenIdOAuth2Extension::param(OAuth2Protocol::OAuth2Protocol_ClientId, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]:null; - } - - /** - * @return null|string - */ - public function getScope(){ - return isset($this->message[OpenIdOAuth2Extension::param(OAuth2Protocol::OAuth2Protocol_Scope, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)])? - $this->message[OpenIdOAuth2Extension::param(OAuth2Protocol::OAuth2Protocol_Scope, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]:null; - } - - /** - * @return null|string - */ - public function getState(){ - return isset($this->message[OpenIdOAuth2Extension::param(OAuth2Protocol::OAuth2Protocol_State, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)])? - $this->message[OpenIdOAuth2Extension::param(OAuth2Protocol::OAuth2Protocol_State, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]:null; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Extensions/Implementations/OpenIdPAPEExtension.php b/app/libs/OpenId/Extensions/Implementations/OpenIdPAPEExtension.php deleted file mode 100644 index 32a0db91..00000000 --- a/app/libs/OpenId/Extensions/Implementations/OpenIdPAPEExtension.php +++ /dev/null @@ -1,82 +0,0 @@ -getMessage()); - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Extensions/Implementations/OpenIdSREGExtension_1_0.php b/app/libs/OpenId/Extensions/Implementations/OpenIdSREGExtension_1_0.php deleted file mode 100644 index 8b90b959..00000000 --- a/app/libs/OpenId/Extensions/Implementations/OpenIdSREGExtension_1_0.php +++ /dev/null @@ -1,210 +0,0 @@ -auth_service = $auth_service; - - self::$available_properties[OpenIdSREGExtension::Nickname] = OpenIdSREGExtension::Nickname; - self::$available_properties[OpenIdSREGExtension::Email] = OpenIdSREGExtension::Email; - self::$available_properties[OpenIdSREGExtension::FullName] = OpenIdSREGExtension::FullName; - self::$available_properties[OpenIdSREGExtension::Country] = OpenIdSREGExtension::Country; - self::$available_properties[OpenIdSREGExtension::Language] = OpenIdSREGExtension::Language; - self::$available_properties[OpenIdSREGExtension::Gender] = OpenIdSREGExtension::Gender; - self::$available_properties[OpenIdSREGExtension::DateOfBirthday] = OpenIdSREGExtension::DateOfBirthday; - self::$available_properties[OpenIdSREGExtension::Postcode] = OpenIdSREGExtension::Postcode; - self::$available_properties[OpenIdSREGExtension::Timezone] = OpenIdSREGExtension::Timezone; - } - - /** - * @param OpenIdRequest $request - * @return OpenIdSREGRequest_1_0 - */ - protected function buildRequest(OpenIdRequest $request){ - return new OpenIdSREGRequest_1_0($request->getMessage()); - } - - public function parseRequest(OpenIdRequest $request, RequestContext $context) - { - try { - - $simple_reg_request = $this->buildRequest($request); - - if (!$simple_reg_request->isValid()) return; - $attributes = $simple_reg_request->getRequiredAttributes(); - $opt_attributes = $simple_reg_request->getOptionalAttributes(); - $policy_url = $simple_reg_request->getPolicyUrl(); - $attributes = array_merge($attributes, $opt_attributes); - - $view_data = array('attributes' => array_keys($attributes)); - - if (!empty($policy_url)) { - $view_data['policy_url'] = $policy_url; - } - - $partial_view = new PartialView($this->view, $view_data); - $context->addPartialView($partial_view); - - } catch (Exception $ex) { - $this->log_service->error($ex); - } - } - - /** - * @param OpenIdRequest $request - * @param OpenIdResponse $response - * @param ResponseContext $context - * @return void - */ - public function prepareResponse(OpenIdRequest $request, OpenIdResponse $response, ResponseContext $context) - { - try { - $simple_reg_request = $this->buildRequest($request); - if (!$simple_reg_request->isValid()) return; - - $response->addParam(self::paramNamespace(), $this->getNamespace()); - $attributes = $simple_reg_request->getRequiredAttributes(); - $opt_attributes = $simple_reg_request->getOptionalAttributes(); - $attributes = array_merge($attributes, $opt_attributes); - - $user = $this->auth_service->getCurrentUser(); - - foreach ($attributes as $attr => $value) { - $context->addSignParam(self::param($attr)); - - if ($attr == self::Email) { - $response->addParam(self::param($attr), $user->getEmail()); - } - if ($attr == self::Country) { - $response->addParam(self::param($attr), $user->getCountry()); - } - if ($attr == self::FullName) { - $response->addParam(self::param($attr), $user->getFullName()); - } - if ($attr == self::Nickname) { - $response->addParam(self::param($attr), $user->getIdentifier()); - } - if ($attr == self::Language) { - $response->addParam(self::param($attr), $user->getLanguage()); - } - } - } catch (Exception $ex) { - $this->log_service->error($ex); - } - } - - /** - * @param string $separator - * @return string - */ - public static function paramNamespace($separator = '.') - { - return OpenIdProtocol::OpenIdPrefix . $separator . OpenIdProtocol::OpenIDProtocol_NS . $separator . self::Prefix; - } - - /** - * @param $param - * @param string $separator - * @return string - */ - public static function param($param, $separator = '.') - { - return OpenIdProtocol::OpenIdPrefix . $separator . self::Prefix . $separator . $param; - } - - /** - * @param OpenIdRequest $request - * @return array - */ - public function getTrustedData(OpenIdRequest $request) - { - $data = []; - try { - $simple_reg_request = $this->buildRequest($request); - - if ($simple_reg_request->isValid()) { - - $attributes = $simple_reg_request->getRequiredAttributes(); - $opt_attributes = $simple_reg_request->getOptionalAttributes(); - $attributes = array_merge($attributes, $opt_attributes); - - foreach ($attributes as $key => $value) { - $data[] = $key; - } - } - } catch (Exception $ex) { - $this->log_service->debug_msg($request->__toString()); - $this->log_service->error($ex); - } - return $data; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Extensions/Implementations/OpenIdSREGRequest.php b/app/libs/OpenId/Extensions/Implementations/OpenIdSREGRequest.php deleted file mode 100644 index b567bb04..00000000 --- a/app/libs/OpenId/Extensions/Implementations/OpenIdSREGRequest.php +++ /dev/null @@ -1,37 +0,0 @@ -attributes = []; - $this->optional_attributes = []; - } - - /** - * @return string - */ - protected function getNameSpace(){ - return OpenIdSREGExtension_1_0::NamespaceUrl; - } - - /** - * @return bool - * @throws Exception - */ - public function isValid() - { - try { - //check identifier - if (isset($this->message[OpenIdSREGExtension_1_0::paramNamespace(HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]) - && $this->message[OpenIdSREGExtension_1_0::paramNamespace(HttpMessage::PHP_REQUEST_VAR_SEPARATOR)] == $this->getNameSpace()) - { - - /* - * All of the following request fields are OPTIONAL, though at least one of "openid.sreg.required" - * or "openid.sreg.optional" MUST be specified in the request. - * openid.sreg.required: - * Comma-separated list of field names which, if absent from the response, will prevent the Consumer f - * rom completing the registration without End User interation. The field names are those that are - * specified in the Response Format, with the "openid.sreg." prefix removed. - * openid.sreg.optional: - * Comma-separated list of field names Fields that will be used by the Consumer, but whose absence will - * not prevent the registration from completing. The field names are those that are specified in the - * Response Format, with the "openid.sreg." prefix removed. - * openid.sreg.policy_url: - * A URL which the Consumer provides to give the End User a place to read about the how the profile data - * will be used. The Identity Provider SHOULD display this URL to the End User if it is given. - */ - - //check required fields - - if ( - !isset($this->message[OpenIdSREGExtension_1_0::param(OpenIdSREGExtension_1_0::Required, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]) && - !isset($this->message[OpenIdSREGExtension_1_0::param(OpenIdSREGExtension_1_0::Optional, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]) - ) - throw new InvalidOpenIdMessageException("SREG: at least one of \"openid.sreg.required\" or \"openid.sreg.optional\" MUST be specified in the request."); - - //get required attributes - if (isset($this->message[OpenIdSREGExtension_1_0::param(OpenIdSREGExtension_1_0::Required, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)])) { - $attributes = $this->message[OpenIdSREGExtension_1_0::param(OpenIdSREGExtension_1_0::Required, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]; - $attributes = explode(",", $attributes); - - foreach ($attributes as $attr) { - $attr = trim($attr); - if (!isset(OpenIdSREGExtension_1_0::$available_properties[$attr])) - continue; - $this->attributes[$attr] = $attr; - } - } - - //get optional attributes - if (isset($this->message[OpenIdSREGExtension_1_0::param(OpenIdSREGExtension_1_0::Optional, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)])) { - $opt_attributes = $this->message[OpenIdSREGExtension_1_0::param(OpenIdSREGExtension_1_0::Optional, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]; - $opt_attributes = explode(",", $opt_attributes); - foreach ($opt_attributes as $opt_attr) { - $opt_attr = trim($opt_attr); - if (!isset(OpenIdSREGExtension_1_0::$available_properties[$opt_attr])) - continue; - if (isset($this->attributes[$opt_attr])) - throw new InvalidOpenIdMessageException(sprintf("SREG: optional attribute %s is already set as required one!", $opt_attr)); - $this->optional_attributes[$opt_attr] = $opt_attr; - } - } - - //check policy url.. - if (isset($this->message[OpenIdSREGExtension_1_0::param(OpenIdSREGExtension_1_0::PolicyUrl, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)])) { - $this->policy_url = $this->message[OpenIdSREGExtension_1_0::param(OpenIdSREGExtension_1_0::PolicyUrl, HttpMessage::PHP_REQUEST_VAR_SEPARATOR)]; - } - return true; - } - } catch (Exception $ex) { - throw $ex; - } - return false; - } - - /** - * @return array - */ - public function getRequiredAttributes() - { - return $this->attributes; - } - - /** - * @return array - */ - public function getOptionalAttributes() - { - return $this->optional_attributes; - } - - /** - * @return string - */ - public function getPolicyUrl() - { - return $this->policy_url; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Extensions/OpenIdAuthenticationExtension.php b/app/libs/OpenId/Extensions/OpenIdAuthenticationExtension.php deleted file mode 100644 index ba7fc8d9..00000000 --- a/app/libs/OpenId/Extensions/OpenIdAuthenticationExtension.php +++ /dev/null @@ -1,90 +0,0 @@ -server_configuration = $server_configuration; - $this->memento_service = $memento_service; - } - - /** - * @param User $user - * @return void - * @throws AuthenticationException - */ - public function process(User $user) - { - if(!$this->memento_service->exists()) return; - - //check if we have a current openid message - $msg = OpenIdMessage::buildFromMemento($this->memento_service->load()); - - if (!is_null($msg) && $msg->isValid() && OpenIdAuthenticationRequest::IsOpenIdAuthenticationRequest($msg)) - { - //check if current user is has the same identity that the one claimed on openid message - $auth_request = new OpenIdAuthenticationRequest($msg); - if (!$auth_request->isIdentitySelectByOP()) - { - $claimed_id = $auth_request->getClaimedId(); - $identity = $auth_request->getIdentity(); - $current_identity = $this->server_configuration->getUserIdentityEndpointURL($user->getIdentifier()); - - //if not return fail ( we cant log in with a different user that the one stated on the authentication message! - if ($claimed_id !== $current_identity && $identity !== $current_identity) { - Log::warning(sprintf(OpenIdErrorMessages::AlreadyExistSessionMessage, $current_identity, $identity)); - throw new AuthenticationException - ( - sprintf - ( - OpenIdErrorMessages::AlreadyExistSessionMessage, - $current_identity, - $identity - ) - ); - } - } - - } - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Extensions/OpenIdExtension.php b/app/libs/OpenId/Extensions/OpenIdExtension.php deleted file mode 100644 index 9d67b485..00000000 --- a/app/libs/OpenId/Extensions/OpenIdExtension.php +++ /dev/null @@ -1,95 +0,0 @@ -namespace = $namespace; - $this->name = $name; - $this->view = $view_name; - $this->description = $description; - $this->log_service = $log_service; - } - - /** - * @return string - */ - public function getNamespace() - { - return $this->namespace; - } - - /** parse extension request - * @param OpenIdRequest $request - * @param RequestContext $context - * @return mixed - * @throws InvalidOpenIdMessageException - */ - abstract public function parseRequest(OpenIdRequest $request, RequestContext $context); - - /** Get a set of data that user allowed to be marked as trusted for futures request - * @param OpenIdRequest $request - * @return mixed - */ - abstract public function getTrustedData(OpenIdRequest $request); - - /** build extension response - * @param OpenIdRequest $request - * @param OpenIdResponse $response - * @param ResponseContext $context - * @return mixed - */ - abstract public function prepareResponse(OpenIdRequest $request, OpenIdResponse $response, ResponseContext $context); -} \ No newline at end of file diff --git a/app/libs/OpenId/Handlers/Factories/SessionAssociationRequestFactory.php b/app/libs/OpenId/Handlers/Factories/SessionAssociationRequestFactory.php deleted file mode 100644 index 6cb8988a..00000000 --- a/app/libs/OpenId/Handlers/Factories/SessionAssociationRequestFactory.php +++ /dev/null @@ -1,57 +0,0 @@ -getService(OpenIdServiceCatalog::AssociationService); - $configuration_service = ServiceLocator::getInstance()->getService(UtilsServiceCatalog::ServerConfigurationService); - $log_service = ServiceLocator::getInstance()->getService(UtilsServiceCatalog::LogService); - - if (OpenIdDHAssociationSessionRequest::IsOpenIdDHAssociationSessionRequest($message)) - return new SessionAssociationDHStrategy(new OpenIdDHAssociationSessionRequest($message),$association_service,$configuration_service,$log_service); - if (OpenIdAssociationSessionRequest::IsOpenIdAssociationSessionRequest($message)) - return new SessionAssociationUnencryptedStrategy(new OpenIdAssociationSessionRequest($message),$association_service,$configuration_service,$log_service); - return null; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Handlers/IOpenIdAuthenticationStrategy.php b/app/libs/OpenId/Handlers/IOpenIdAuthenticationStrategy.php deleted file mode 100644 index 4b8fc509..00000000 --- a/app/libs/OpenId/Handlers/IOpenIdAuthenticationStrategy.php +++ /dev/null @@ -1,38 +0,0 @@ -auth_service = $authService; - $this->memento_service = $memento_service; - $this->auth_strategy = $auth_strategy; - $this->server_extensions_service = $server_extensions_service; - $this->association_service = $association_service; - $this->trusted_sites_service = $trusted_sites_service; - $this->server_configuration_service = $server_configuration_service; - $this->extensions = $this->server_extensions_service->getAllActiveExtensions(); - $this->nonce_service = $nonce_service; - } - - /** - * @param OpenIdMessage $message - * @return OpenIdResponse - * @throws InvalidOpenIdAuthenticationRequestMode - */ - protected function internalHandle(OpenIdMessage $message) - { - $this->current_request = null; - - try { - - $this->current_request = new OpenIdAuthenticationRequest( - $message, - $this->server_configuration_service->getUserIdentityEndpointURL('@identifier') - ); - - if (!$this->current_request->isValid()) { - throw new InvalidOpenIdMessageException(OpenIdErrorMessages::InvalidOpenIdAuthenticationRequestMessage); - } - - $this->current_request_context = new RequestContext; - $mode = $this->current_request->getMode(); - - switch ($mode) { - case OpenIdProtocol::SetupMode: { - return $this->doSetupMode(); - } - break; - case OpenIdProtocol::ImmediateMode: { - return $this->doImmediateMode(); - } - break; - default: - throw new InvalidOpenIdAuthenticationRequestMode(sprintf(OpenIdErrorMessages::InvalidAuthenticationRequestModeMessage, - $mode)); - break; - } - } catch (InvalidAssociationTypeException $inv_assoc_type) { - $this->checkpoint_service->trackException($inv_assoc_type); - $this->log_service->warning($inv_assoc_type); - if (!is_null($this->current_request)) { - $this->log_service->warning_msg("current request: ".$this->current_request); - } - return new OpenIdIndirectGenericErrorResponse($inv_assoc_type->getMessage(), null, null,$this->current_request); - } catch (OpenIdInvalidRealmException $inv_realm_ex) { - $this->checkpoint_service->trackException($inv_realm_ex); - $this->log_service->warning($inv_realm_ex); - if (!is_null($this->current_request)) { - $this->log_service->warning_msg("current request: ".$this->current_request); - } - return new OpenIdIndirectGenericErrorResponse($inv_realm_ex->getMessage(), null, null, $this->current_request); - } catch (ReplayAttackException $replay_ex) { - $this->checkpoint_service->trackException($replay_ex); - $this->log_service->warning($replay_ex); - if (!is_null($this->current_request)) { - $this->log_service->warning_msg("current request: ".$this->current_request);; - } - return new OpenIdIndirectGenericErrorResponse($replay_ex->getMessage(), null, null, $this->current_request); - } catch (InvalidOpenIdMessageException $inv_msg_ex) { - $this->checkpoint_service->trackException($inv_msg_ex); - $this->log_service->warning($inv_msg_ex); - if (!is_null($this->current_request)) { - $this->log_service->warning_msg("current request: ".$this->current_request);; - } - return new OpenIdIndirectGenericErrorResponse($inv_msg_ex->getMessage(), null, null, $this->current_request); - } - catch(InvalidAssociation $inv_assoc_ex){ - $this->checkpoint_service->trackException($inv_assoc_ex); - $this->log_service->warning($inv_assoc_ex); - if (!is_null($this->current_request)) { - $this->log_service->warning_msg("current request: ".$this->current_request);; - } - return new OpenIdIndirectGenericErrorResponse($inv_assoc_ex->getMessage(), null, null, $this->current_request); - } - catch (Exception $ex) { - $this->checkpoint_service->trackException($ex); - $this->log_service->error($ex); - if (!is_null($this->current_request)) { - $this->log_service->warning_msg("current request: ".$this->current_request);; - } - return new OpenIdIndirectGenericErrorResponse("Server Error", null, null, $this->current_request); - } - } - - /** - * @return OpenIdResponse - * @throws Exception - */ - private function doSetupMode() - { - - $authentication_response = $this->auth_service->getUserAuthenticationResponse(); - if ($authentication_response == IAuthService::AuthenticationResponse_Cancel) { - //clear saved data ... - $this->memento_service->forget(); - $this->auth_service->clearUserAuthenticationResponse(); - $this->auth_service->clearUserAuthorizationResponse(); - - return new OpenIdNonImmediateNegativeAssertion($this->current_request->getReturnTo()); - } - - if (!$this->auth_service->isUserLogged()) { - return $this->doLogin(); - } - - //user already logged - $currentUser = $this->auth_service->getCurrentUser(); - - if (!$this->current_request->isIdentitySelectByOP()) { - - $current_claimed_id = $this->current_request->getClaimedId(); - $current_identity = $this->current_request->getIdentity(); - // check is claimed identity match with current one - // if not logs out and do re login - $current_user = $this->auth_service->getCurrentUser(); - if (is_null($current_user)) { - throw new Exception("User not set!"); - } - - $current_owned_identity = $this->server_configuration_service->getUserIdentityEndpointURL($current_user->getIdentifier()); - - if ($current_claimed_id != $current_owned_identity && $current_identity != $current_owned_identity) { - $this->log_service->warning_msg(sprintf(OpenIdErrorMessages::AlreadyExistSessionMessage, - $current_owned_identity, $current_identity)); - $this->auth_service->logout(); - - return $this->doLogin(); - } - } - - $authorization_response = $this->auth_service->getUserAuthorizationResponse(); - if ($authorization_response !== IAuthService::AuthorizationResponse_None) { - return $this->checkAuthorizationResponse($authorization_response); - } - - // $authorization_response is none ... - $this->current_request_context->cleanTrustedData(); - foreach ($this->extensions as $ext) { - $data = $ext->getTrustedData($this->current_request); - $this->current_request_context->setTrustedData($data); - } - - $requested_data = $this->current_request_context->getTrustedData(); - $sites = $this->trusted_sites_service->getTrustedSites( - $currentUser, - $this->current_request->getRealm(), - $requested_data - ); - - //check trusted sites - if (is_null($sites) || count($sites) == 0) { - return $this->doConsentProcess(); - } - //there are trusted sites ... check the former authorization decision - $site = $sites[0]; - $policy = $site->getAuthorizationPolicy(); - switch ($policy) { - case IAuthService::AuthorizationResponse_AllowForever: { - //save former user choice on session - $this->auth_service->setUserAuthorizationResponse($policy); - - return $this->doAssertion(); - } - break; - case IAuthService::AuthorizationResponse_DenyForever: - // black listed site - return new OpenIdIndirectGenericErrorResponse(sprintf(OpenIdErrorMessages::RealmNotAllowedByUserMessage, - $site->getRealm()), null, null, $this->current_request); - break; - default: - throw new Exception("Invalid Realm Policy"); - break; - } - } - - /** - * @return mixed - */ - private function doLogin() - { - //do login process - foreach ($this->extensions as $ext) { - $ext->parseRequest($this->current_request, $this->current_request_context); - } - - $this->memento_service->serialize($this->current_request->getMessage()->createMemento()); - - return $this->auth_strategy->doLogin($this->current_request, $this->current_request_context); - } - - - /** - * Create Positive Identity Assertion - * implements @see http://openid.net/specs/openid-authentication-2_0.html#positive_assertions - * @return OpenIdPositiveAssertionResponse - * @throws InvalidAssociationTypeException - */ - private function doAssertion() - { - - $currentUser = $this->auth_service->getCurrentUser(); - $context = new ResponseContext; - - //initial signature params - $context->addSignParam(OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_OpEndpoint)); - $context->addSignParam(OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Realm)); - $context->addSignParam(OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_ReturnTo)); - $context->addSignParam(OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Nonce)); - $context->addSignParam(OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_AssocHandle)); - $context->addSignParam(OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_ClaimedId)); - $context->addSignParam(OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Identity)); - - $op_endpoint = $this->server_configuration_service->getOPEndpointURL(); - $identity = $this->server_configuration_service->getUserIdentityEndpointURL($currentUser->getIdentifier()); - $nonce = $this->nonce_service->generateNonce(); - $realm = $this->current_request->getRealm(); - - $response = new OpenIdPositiveAssertionResponse($op_endpoint, $identity, $identity, - $this->current_request->getReturnTo(), $nonce->getRawFormat(), $realm); - - foreach ($this->extensions as $ext) { - $ext->prepareResponse($this->current_request, $response, $context); - } - - //check former assoc handle... - - if (is_null($assoc_handle = $this->current_request->getAssocHandle()) || is_null($association = $this->association_service->getAssociation($assoc_handle))) { - //create private association ... - $association = $this->association_service->addAssociation - ( - AssociationFactory::getInstance()->buildPrivateAssociation - ( - $realm, - $this->server_configuration_service->getConfigValue("Private.Association.Lifetime") - ) - ); - - $response->setAssocHandle($association->getHandle()); - - if (!empty($assoc_handle)) { - $response->setInvalidateHandle($assoc_handle); - } - } else { - if ($association->getType() != IAssociation::TypeSession) { - throw new InvalidAssociationTypeException(OpenIdErrorMessages::InvalidAssociationTypeMessage); - } - $response->setAssocHandle($assoc_handle); - } - - //create signature ... - OpenIdSignatureBuilder::build($context, $association->getMacFunction(), $association->getSecret(), $response); - /* - * To prevent replay attacks, the OP MUST NOT issue more than one verification response for each - * authentication response it had previously issued. An authentication response and its matching - * verification request may be identified by their "openid.response_nonce" values. - * so associate $nonce with signature and realm - */ - $this->nonce_service->associateNonce($nonce, $response->getSig(), $realm); - //do cleaning ... - $this->memento_service->forget(); - $this->auth_service->clearUserAuthorizationResponse(); - - return $response; - } - - /** - * @return mixed - */ - private function doConsentProcess() - { - //do consent process - $this->memento_service->serialize($this->current_request->getMessage()->createMemento()); - - foreach ($this->extensions as $ext) { - $ext->parseRequest($this->current_request, $this->current_request_context); - } - - return $this->auth_strategy->doConsent($this->current_request, $this->current_request_context); - } - - /** - * @param $authorization_response - * @return OpenIdResponse - * @throws Exception - */ - private function checkAuthorizationResponse($authorization_response) - { - // check response - $currentUser = $this->auth_service->getCurrentUser(); - switch ($authorization_response) { - case IAuthService::AuthorizationResponse_AllowForever: { - - $this->current_request_context->cleanTrustedData(); - foreach ($this->extensions as $ext) { - $data = $ext->getTrustedData($this->current_request); - $this->current_request_context->setTrustedData($data); - } - - $this->trusted_sites_service->addTrustedSite($currentUser, $this->current_request->getRealm(), - IAuthService::AuthorizationResponse_AllowForever, $this->current_request_context->getTrustedData()); - - return $this->doAssertion(); - } - break; - case IAuthService::AuthorizationResponse_AllowOnce: - return $this->doAssertion(); - break; - case IAuthService::AuthorizationResponse_DenyOnce: { - $this->memento_service->forget(); - $this->auth_service->clearUserAuthorizationResponse(); - - return new OpenIdNonImmediateNegativeAssertion($this->current_request->getReturnTo()); - } - break; - case IAuthService::AuthorizationResponse_DenyForever: { - - $this->current_request_context->cleanTrustedData(); - foreach ($this->extensions as $ext) { - $data = $ext->getTrustedData($this->current_request); - $this->current_request_context->setTrustedData($data); - } - - $this->trusted_sites_service->addTrustedSite($currentUser, $this->current_request->getRealm(), - IAuthService::AuthorizationResponse_DenyForever, $this->current_request_context->getTrustedData()); - $this->memento_service->forget(); - $this->auth_service->clearUserAuthorizationResponse(); - - return new OpenIdNonImmediateNegativeAssertion($this->current_request->getReturnTo()); - } - break; - default: - $this->memento_service->forget(); - $this->auth_service->clearUserAuthorizationResponse(); - throw new Exception("Invalid Authorization response!"); - break; - } - } - - /** - * @return OpenIdImmediateNegativeAssertion|OpenIdIndirectGenericErrorResponse|OpenIdPositiveAssertionResponse - */ - protected function doImmediateMode() - { - if (!$this->auth_service->isUserLogged()) { - return new OpenIdImmediateNegativeAssertion($this->current_request->getReturnTo()); - } - - $currentUser = $this->auth_service->getCurrentUser(); - - $this->current_request_context->cleanTrustedData(); - foreach ($this->extensions as $ext) { - $data = $ext->getTrustedData($this->current_request); - $this->current_request_context->setTrustedData($data); - } - - $requested_data = $this->current_request_context->getTrustedData(); - - $sites = $this->trusted_sites_service->getTrustedSites - ( - $currentUser, - $this->current_request->getRealm(), - $requested_data - ); - - if (is_null($sites) || count($sites) == 0) { - //need setup to continue - return new OpenIdImmediateNegativeAssertion($this->current_request->getReturnTo()); - } - $site = $sites[0]; - $policy = $site->getAuthorizationPolicy(); - - switch ($policy) { - case IAuthService::AuthorizationResponse_DenyForever: { - // black listed site by user - return new OpenIdIndirectGenericErrorResponse(sprintf(OpenIdErrorMessages::RealmNotAllowedByUserMessage, - $site->getRealm()), null, null, $this->current_request); - } - break; - case IAuthService::AuthorizationResponse_AllowForever: { - //save former user choice on session - $this->auth_service->setUserAuthorizationResponse($policy); - - return $this->doAssertion(); - } - break; - default: - return new OpenIdIndirectGenericErrorResponse(sprintf(OpenIdErrorMessages::RealmNotAllowedByUserMessage, - $this->current_request->getRealm()), null, null, $this->current_request); - break; - } - } - - /** - * @param OpenIdMessage $message - * @return bool - */ - protected function canHandle(OpenIdMessage $message) - { - return OpenIdAuthenticationRequest::IsOpenIdAuthenticationRequest($message); - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Handlers/OpenIdCheckAuthenticationRequestHandler.php b/app/libs/OpenId/Handlers/OpenIdCheckAuthenticationRequestHandler.php deleted file mode 100644 index 7ba1f3e4..00000000 --- a/app/libs/OpenId/Handlers/OpenIdCheckAuthenticationRequestHandler.php +++ /dev/null @@ -1,211 +0,0 @@ -association_service = $association_service; - $this->nonce_service = $nonce_service; - $this->configuration_service = $configuration_service; - $this->openid_configuration_service = $openid_configuration_service; - } - - /** - * @param OpenIdMessage $message - * @return OpenIdCheckAuthenticationResponse|OpenIdDirectGenericErrorResponse - */ - protected function internalHandle(OpenIdMessage $message) - { - $this->current_request = null; - try { - - $this->current_request = new OpenIdCheckAuthenticationRequest - ( - $message,$this->openid_configuration_service->getOPEndpointURL() - ); - - if (!$this->current_request->isValid()) - throw new InvalidOpenIdMessageException - ( - OpenIdErrorMessages::InvalidOpenIdCheckAuthenticationRequestMessage - ); - - /** - * For verifying signatures an OP MUST only use private associations and MUST NOT - * use associations that have shared keys. If the verification request contains a handle - * for a shared association, it means the Relying Party no longer knows the shared secret, - * or an entity other than the RP (e.g. an attacker) has established this association with - * the OP. - * To prevent replay attacks, the OP MUST NOT issue more than one verification response for each - * authentication response it had previously issued. An authentication response and its matching - * verification request may be identified by their "openid.response_nonce" values. - */ - - $claimed_assoc = $this->current_request->getAssocHandle(); - $claimed_realm = $this->current_request->getRealm(); - $stored_assoc = $this->association_service->getAssociation($claimed_assoc, $claimed_realm); - - if (is_null($stored_assoc) || $stored_assoc->getType() != IAssociation::TypePrivate) - throw new InvalidAssociationTypeException(OpenIdErrorMessages::InvalidAssociationTypeMessage); - - $claimed_nonce = OpenIdNonce::fromValue($this->current_request->getNonce()); - - if(!$claimed_nonce->isValid(intval($this->configuration_service->getConfigValue('Nonce.Lifetime')))) - throw new InvalidNonce(); - - $this->nonce_service->lockNonce($claimed_nonce); - - $claimed_sig = $this->current_request->getSig(); - $claimed_invalidate_handle = $this->current_request->getInvalidateHandle(); - - if (!is_null($claimed_invalidate_handle) && !empty($claimed_invalidate_handle)) { - $invalidate_stored_assoc = $this->association_service->getAssociation($claimed_invalidate_handle); - if (!is_null($invalidate_stored_assoc)) { - $claimed_invalidate_handle = null; - } - } - - $this->nonce_service->markNonceAsInvalid($claimed_nonce, $claimed_sig, $claimed_realm); - - $res = OpenIdSignatureBuilder::verify - ( - $this->current_request, - $stored_assoc->getMacFunction(), - $stored_assoc->getSecret(), - $claimed_sig - ); - - //delete association - $this->association_service->deleteAssociation($claimed_assoc); - $is_valid = $res ? 'true':'false'; - return new OpenIdCheckAuthenticationResponse($is_valid, $claimed_invalidate_handle); - - } catch (InvalidAssociationTypeException $inv_assoc_ex) { - $this->checkpoint_service->trackException($inv_assoc_ex); - $this->log_service->warning($inv_assoc_ex); - $response = new OpenIdDirectGenericErrorResponse($inv_assoc_ex->getMessage()); - if(!is_null($this->current_request)) - $this->log_service->warning_msg("current request: ".$this->current_request); - return $response; - } catch (ReplayAttackException $replay_ex) { - $this->checkpoint_service->trackException($replay_ex); - $this->log_service->warning($replay_ex); - $response = new OpenIdDirectGenericErrorResponse($replay_ex->getMessage()); - if(!is_null($this->current_request)) - $this->log_service->warning_msg("current request: ".$this->current_request); - return $response; - } catch (InvalidNonce $inv_nonce_ex) { - $this->checkpoint_service->trackException($inv_nonce_ex); - $this->log_service->warning($inv_nonce_ex); - $response = new OpenIdDirectGenericErrorResponse($inv_nonce_ex->getMessage()); - if(!is_null($this->current_request)) - $this->log_service->warning_msg("current request: ".$this->current_request); - return $response; - } catch (InvalidOpenIdMessageException $inv_msg_ex) { - $this->checkpoint_service->trackException($inv_msg_ex); - $this->log_service->warning($inv_msg_ex); - $response = new OpenIdDirectGenericErrorResponse($inv_msg_ex->getMessage()); - if(!is_null($this->current_request)) - $this->log_service->warning_msg("current request: ".$this->current_request); - return $response; - } - catch(InvalidAssociation $inv_assoc_ex){ - $this->checkpoint_service->trackException($inv_assoc_ex); - $this->log_service->warning($inv_assoc_ex); - $response = new OpenIdDirectGenericErrorResponse($inv_assoc_ex->getMessage()); - if(!is_null($this->current_request)) - $this->log_service->warning_msg("current request: ".$this->current_request); - return $response; - } - catch (Exception $ex) { - $this->checkpoint_service->trackException($ex); - $this->log_service->error($ex); - if(!is_null($this->current_request)) - $this->log_service->warning_msg("current request: ".$this->current_request); - return new OpenIdDirectGenericErrorResponse("Server Error"); - } - } - - /** - * @param OpenIdMessage $message - * @return bool - */ - protected function canHandle(OpenIdMessage $message) - { - return OpenIdCheckAuthenticationRequest::IsOpenIdCheckAuthenticationRequest($message); - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Handlers/OpenIdMessageHandler.php b/app/libs/OpenId/Handlers/OpenIdMessageHandler.php deleted file mode 100644 index 498b2c2c..00000000 --- a/app/libs/OpenId/Handlers/OpenIdMessageHandler.php +++ /dev/null @@ -1,92 +0,0 @@ -successor = $successor; - $this->log_service = $log_service; - $this->checkpoint_service = $checkpoint_service; - } - - /** - * Implements chain of responsibility logic, if current handler could - * manage the current message then do it, if not, then pass msg to next sibling - * @param OpenIdMessage $message - * @return mixed - * @throws InvalidOpenIdMessageException - */ - public function handleMessage(OpenIdMessage $message) - { - if ($this->canHandle($message)) { - //handle request - return $this->internalHandle($message); - } else if (isset($this->successor) && !is_null($this->successor)) { - return $this->successor->handleMessage($message); - } - $this->log_service->warning_msg(sprintf(OpenIdErrorMessages::UnhandledMessage, $message)); - $ex = new InvalidOpenIdMessageException(sprintf(OpenIdErrorMessages::UnhandledMessage, $message)); - $this->checkpoint_service->trackException($ex); - throw $ex; - } - - /** - * Returns true if current message could be managed by this handler - * false otherwise. - * @param OpenIdMessage $message - * @return bool - */ - abstract protected function canHandle(OpenIdMessage $message); - - /** - * Handler specific logic - * @param OpenIdMessage $message - * @return mixed - */ - abstract protected function internalHandle(OpenIdMessage $message); -} \ No newline at end of file diff --git a/app/libs/OpenId/Handlers/OpenIdSessionAssociationRequestHandler.php b/app/libs/OpenId/Handlers/OpenIdSessionAssociationRequestHandler.php deleted file mode 100644 index d63ce9f2..00000000 --- a/app/libs/OpenId/Handlers/OpenIdSessionAssociationRequestHandler.php +++ /dev/null @@ -1,104 +0,0 @@ -current_request = null; - try { - - $this->current_request = SessionAssociationRequestFactory::buildRequest($message); - - if (!$this->current_request->isValid()) - throw new InvalidOpenIdMessageException(OpenIdErrorMessages::InvalidAssociationSessionRequest); - - $strategy = SessionAssociationRequestFactory::buildSessionAssociationStrategy($message); - return $strategy->handle(); - } catch (InvalidSessionTypeException $inv_session_ex) { - $this->checkpoint_service->trackException($inv_session_ex); - $response = new OpenIdAssociationSessionUnsuccessfulResponse($inv_session_ex->getMessage()); - $this->log_service->warning($inv_session_ex); - if(!is_null($this->current_request)) - $this->log_service->warning_msg("current request: ".$this->current_request); - return $response; - } catch (InvalidAssociationTypeException $inv_assoc_ex) { - $this->checkpoint_service->trackException($inv_assoc_ex); - $response = new OpenIdAssociationSessionUnsuccessfulResponse($inv_assoc_ex->getMessage()); - $this->log_service->warning($inv_assoc_ex); - if(!is_null($this->current_request)) - $this->log_service->warning_msg("current request: ".$this->current_request); - return $response; - } catch (InvalidOpenIdMessageException $inv_msg_ex) { - $response = new OpenIdDirectGenericErrorResponse($inv_msg_ex->getMessage()); - $this->checkpoint_service->trackException($inv_msg_ex); - $this->log_service->warning($inv_msg_ex); - if(!is_null($this->current_request)) - $this->log_service->warning_msg("current request: ".$this->current_request); - return $response; - } catch (Exception $ex) { - $this->checkpoint_service->trackException($ex); - $response = new OpenIdDirectGenericErrorResponse('Server Error'); - $this->log_service->error($ex); - if(!is_null($this->current_request)) - $this->log_service->warning_msg("current request: ".$this->current_request); - return $response; - } - } - - /** - * @param OpenIdMessage $message - * @return bool - */ - protected function canHandle(OpenIdMessage $message) { - return OpenIdAssociationSessionRequest::IsOpenIdAssociationSessionRequest($message); - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Handlers/Strategies/SessionAssociation/ISessionAssociationStrategy.php b/app/libs/OpenId/Handlers/Strategies/SessionAssociation/ISessionAssociationStrategy.php deleted file mode 100644 index 1f9fa384..00000000 --- a/app/libs/OpenId/Handlers/Strategies/SessionAssociation/ISessionAssociationStrategy.php +++ /dev/null @@ -1,28 +0,0 @@ -current_request = $request; - $this->association_service = $association_service; - $this->server_configuration_service = $server_configuration_service; - $this->log_service = $log_service; - } - - /** - * @return null|\OpenId\Responses\OpenIdAssociationSessionResponse|OpenIdDiffieHellmanAssociationSessionResponse|OpenIdDirectGenericErrorResponse - * @throws \OpenId\Exceptions\ReplayAttackException - */ - public function handle() - { - $response = null; - try { - $assoc_type = $this->current_request->getAssocType(); - $session_type = $this->current_request->getSessionType(); - //DH parameters - $public_prime = $this->current_request->getDHModulus(); //p - $public_generator = $this->current_request->getDHGen(); //g - //get (g ^ xa mod p) where xa is rp secret key - $rp_public_key = $this->current_request->getDHConsumerPublic(); - //create association - $association = $this->association_service->addAssociation(AssociationFactory::getInstance() - ->buildSessionAssociation - ( - $assoc_type, - $this->server_configuration_service->getConfigValue("Session.Association.Lifetime") - ) - ); - - $dh = new DiffieHellman($public_prime, $public_generator); - $dh->generateKeys(); - //server public key (g ^ xb mod p ), where xb is server private key - // g ^ (xa * xb) mod p = (g ^ xa) ^ xb mod p = (g ^ xb) ^ xa mod p - $shared_secret = $dh->computeSecretKey($rp_public_key, DiffieHellman::FORMAT_NUMBER, DiffieHellman::FORMAT_BTWOC); - $hashed_shared_secret = OpenIdCryptoHelper::digest($session_type, $shared_secret); - $server_public_key = base64_encode($dh->getPublicKey(DiffieHellman::FORMAT_BTWOC)); - $enc_mac_key = base64_encode($association->getSecret() ^ $hashed_shared_secret); - - $response = new OpenIdDiffieHellmanAssociationSessionResponse($association->getHandle(), $session_type, $assoc_type, $association->getLifetime(), $server_public_key, $enc_mac_key); - - } catch (InvalidDHParam $exDH) { - $response = new OpenIdDirectGenericErrorResponse($exDH->getMessage()); - $this->log_service->error($exDH); - } catch (InvalidArgumentException $exDH1) { - $response = new OpenIdDirectGenericErrorResponse($exDH1->getMessage()); - $this->log_service->error($exDH1); - } catch (RuntimeException $exDH2) { - $response = new OpenIdDirectGenericErrorResponse($exDH2->getMessage()); - $this->log_service->error($exDH2); - } - return $response; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Handlers/Strategies/SessionAssociation/Implementations/SessionAssociationUnencryptedStrategy.php b/app/libs/OpenId/Handlers/Strategies/SessionAssociation/Implementations/SessionAssociationUnencryptedStrategy.php deleted file mode 100644 index 8a7a6368..00000000 --- a/app/libs/OpenId/Handlers/Strategies/SessionAssociation/Implementations/SessionAssociationUnencryptedStrategy.php +++ /dev/null @@ -1,110 +0,0 @@ -current_request = $request; - $this->association_service = $association_service; - $this->server_configuration_service = $server_configuration_service; - $this->log_service = $log_service; - } - - /** - * @return OpenIdDirectGenericErrorResponse - */ - public function handle() - { - $response = null; - try { - $assoc_type = $this->current_request->getAssocType(); - $session_type = $this->current_request->getSessionType(); - $association = $this->association_service->addAssociation - ( - AssociationFactory::getInstance()->buildSessionAssociation - ( - $assoc_type, - $this->server_configuration_service->getConfigValue("Session.Association.Lifetime") - ) - ); - - $response = new OpenIdUnencryptedAssociationSessionResponse - ( - $association->getHandle(), - $session_type, - $assoc_type, - $association->getLifetime(), - $association->getSecret() - ); - - } catch (InvalidDHParam $exDH) { - $response = new OpenIdDirectGenericErrorResponse($exDH->getMessage()); - $this->log_service->error($exDH); - } catch (InvalidArgumentException $exDH1) { - $response = new OpenIdDirectGenericErrorResponse($exDH1->getMessage()); - $this->log_service->error($exDH1); - - } catch (RuntimeException $exDH2) { - $response = new OpenIdDirectGenericErrorResponse($exDH2->getMessage()); - $this->log_service->error($exDH2); - } - return $response; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Helpers/AssocHandleGenerator.php b/app/libs/OpenId/Helpers/AssocHandleGenerator.php deleted file mode 100644 index 0bbe5f8f..00000000 --- a/app/libs/OpenId/Helpers/AssocHandleGenerator.php +++ /dev/null @@ -1,40 +0,0 @@ - 255) - throw new InvalidArgumentException(sprintf("assoc handle len must be lower or equal to 255(%d)", $len)); - $new_assoc_handle = Rand::getString($len, self::PrintableNonWhitespaceCharacters, true); - return $new_assoc_handle; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Helpers/AssociationFactory.php b/app/libs/OpenId/Helpers/AssociationFactory.php deleted file mode 100644 index 05c4a32a..00000000 --- a/app/libs/OpenId/Helpers/AssociationFactory.php +++ /dev/null @@ -1,82 +0,0 @@ -buildAssociation(IAssociation::TypePrivate, OpenIdProtocol::SignatureAlgorithmHMAC_SHA256, $lifetime, $realm); - } - - /** - * @param $mac_function - * @param $lifetime - * @return IAssociation - */ - public function buildSessionAssociation($mac_function, $lifetime) - { - return $this->buildAssociation(IAssociation::TypeSession, $mac_function, $lifetime, null); - } - - /** - * @param string $type - * @param string $mac_function - * @param int $lifetime - * @param string $realm - * @return IAssociation - */ - private function buildAssociation(string $type, string $mac_function, int $lifetime, ?string $realm) - { - $new_secret = OpenIdCryptoHelper::generateSecret($mac_function); - $new_handle = AssocHandleGenerator::generate(); - $expires_in = intval($lifetime); - $issued = new \DateTime('now', new \DateTimeZone('UTC')); - return new Association($new_handle, $new_secret, $mac_function, $expires_in, $issued, $type, $realm); - } - - private function __clone() - { - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Helpers/OpenIdCryptoHelper.php b/app/libs/OpenId/Helpers/OpenIdCryptoHelper.php deleted file mode 100644 index 1780b2a3..00000000 --- a/app/libs/OpenId/Helpers/OpenIdCryptoHelper.php +++ /dev/null @@ -1,204 +0,0 @@ - "sha1", - OpenIdProtocol::AssociationSessionTypeDHSHA1 => "sha1", - OpenIdProtocol::SignatureAlgorithmHMAC_SHA256 => "sha256", - OpenIdProtocol::AssociationSessionTypeDHSHA256 => "sha256", - ); - - /** - * @param $number - * @param string $inputFormat - * @param string $outputFormat - * @return string - */ - public static function convert($number, $inputFormat = DiffieHellman::FORMAT_NUMBER, $outputFormat = DiffieHellman::FORMAT_BINARY) - { - $math = BigInteger::factory(); - if ($inputFormat == $outputFormat) { - return $number; - } - // convert to number - switch ($inputFormat) { - case DiffieHellman::FORMAT_BINARY: - case DiffieHellman::FORMAT_BTWOC: - $number = $math->binToInt($number); - break; - case DiffieHellman::FORMAT_NUMBER: - default: - // do nothing - break; - } - - // convert to output format - switch ($outputFormat) { - case DiffieHellman::FORMAT_BINARY: - return $math->intToBin($number); - break; - case DiffieHellman::FORMAT_BTWOC: - return $math->intToBin($number, true); - break; - case DiffieHellman::FORMAT_NUMBER: - default: - return $number; - break; - } - } - - /** - * @param $func - * @return string - */ - public static function generateSecret($func) - { - if ($func == OpenIdProtocol::SignatureAlgorithmHMAC_SHA1) { - $macLen = 20; /* 160 bit */ - } else if ($func == OpenIdProtocol::SignatureAlgorithmHMAC_SHA256) { - $macLen = 32; /* 256 bit */ - } else { - $macLen = 20;/* 160 bit */ - } - $bytes = self::randomBytes($macLen); - return $bytes; - } - - /** - * Produces string of random byte of given length. - * - * @param integer $len length of requested string - * @return string RAW random binary string - */ - static public function randomBytes($len) - { - return Rand::getBytes($len, true); - } - - /** - * @param $macFunc - * @param $data - * @param $secret - * @return string - * @throws OpenIdCryptoException - */ - static public function computeHMAC($macFunc, $data, $secret) - { - if (!isset(self::$signature_algorithms[$macFunc])) - throw new OpenIdCryptoException(sprintf(OpenIdErrorMessages::InvalidMacFunctionMessage, $macFunc)); - $macFunc = self::$signature_algorithms[$macFunc]; - - if (function_exists('hash_hmac')) { - return hash_hmac($macFunc, $data, $secret, 1); - } else { - if (self::strlen($secret) > 64) { - $secret = self::digest($macFunc, $secret); - } - $secret = str_pad($secret, 64, chr(0x00)); - $ipad = str_repeat(chr(0x36), 64); - $opad = str_repeat(chr(0x5c), 64); - $hash1 = self::digest($macFunc, ($secret ^ $ipad) . $data); - return self::digest($macFunc, ($secret ^ $opad) . $hash1); - } - } - - /** - * Returns length of binary string in bytes - * - * @param string $str - * @return int the string length - */ - static public function strlen($str) - { - if (extension_loaded('mbstring') && - (((int)ini_get('mbstring.func_overload')) & 2) - ) { - return mb_strlen($str, 'latin1'); - } else { - return strlen($str); - } - } - - /** - * Generates a hash value (message digest) according to given algorithm. - * It returns RAW binary string. - * - * This is a wrapper function that uses one of available internal function - * dependent on given PHP configuration. It may use various functions from - * ext/openssl, ext/hash, ext/mhash or ext/standard. - * - * @param string $func digest algorithm - * @param string $data data to sign - * @return string RAW digital signature - * @throws Exception - */ - static public function digest($func, $data) - { - if (!isset(self::$signature_algorithms[$func])) - throw new OpenIdCryptoException(sprintf(OpenIdErrorMessages::InvalidMacFunctionMessage, $func)); - $func = self::$signature_algorithms[$func]; - - if (function_exists('openssl_digest')) { - return openssl_digest($data, $func, true); - } else if (function_exists('hash')) { - return hash($func, $data, true); - } else if ($func == 'sha1') { - return sha1($data, true); - } else if ($func == 'sha256') { - if (function_exists('mhash')) { - return mhash(MHASH_SHA256, $data); - } - } - throw new \Exception('Unsupported digest algorithm "' . $func . '".'); - } - - /** - * Takes an arbitrary precision integer and returns its shortest big-endian - * two's complement representation. - * - * Arbitrary precision integers MUST be encoded as big-endian signed two's - * complement binary strings. Henceforth, "btwoc" is a function that takes - * an arbitrary precision integer and returns its shortest big-endian two's - * complement representation. All integers that are used with - * Diffie-Hellman Key Exchange are positive. This means that the left-most - * bit of the two's complement representation MUST be zero. If it is not, - * implementations MUST add a zero byte at the front of the string. - * - * @param string $str binary representation of arbitrary precision integer - * @return string big-endian signed representation - */ - static public function btwoc($str) - { - if (ord($str[0]) > 127) { - return "\0" . $str; - } - return $str; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Helpers/OpenIdErrorMessages.php b/app/libs/OpenId/Helpers/OpenIdErrorMessages.php deleted file mode 100644 index 18a2a750..00000000 --- a/app/libs/OpenId/Helpers/OpenIdErrorMessages.php +++ /dev/null @@ -1,33 +0,0 @@ -getSigned(); - $claimed_signed = explode(',', $signed); - ksort($claimed_signed); - $data = ''; - foreach ($claimed_signed as $key) { - $key_php = str_ireplace('.', HttpMessage::PHP_REQUEST_VAR_SEPARATOR, $key); - $val = $request->getParam($key_php); - $data .= $key . ':' . $val . "\n"; - } - $computed_sig = base64_encode(OpenIdCryptoHelper::computeHMAC($macAlg, $data, $secret)); - if ($claimed_sig == $computed_sig) - $res = true; - return $res; - } - - /** - * @param ResponseContext $context - * @param $macAlg - * @param $secret - * @param OpenIdPositiveAssertionResponse $response - */ - public static function build(ResponseContext $context, $macAlg, $secret, OpenIdPositiveAssertionResponse &$response) - { - //do signing ... - $signed = ''; - $data = ''; - $params = $context->getSignParams(); - - foreach ($params as $key) { - if (strpos($key, 'openid.') == 0) { - $val = $response[$key]; - $key = substr($key, strlen('openid.')); - if (!empty($signed)) { - $signed .= ','; - } - $signed .= $key; - $data .= $key . ':' . $val . "\n"; - } - } - $signed .= ',signed'; - $data .= 'signed:' . $signed . "\n"; - $sig = base64_encode(OpenIdCryptoHelper::computeHMAC($macAlg, $data, $secret)); - - $response->setSigned($signed); - $response->setSig($sig); - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Helpers/OpenIdUriHelper.php b/app/libs/OpenId/Helpers/OpenIdUriHelper.php deleted file mode 100644 index c7a57681..00000000 --- a/app/libs/OpenId/Helpers/OpenIdUriHelper.php +++ /dev/null @@ -1,711 +0,0 @@ - 1 ? $dir : '') - . '/' - . $url; - } - } - } - return $url; - } - - /** - * Normalizes URL according to RFC 3986 to use it in comparison operations. - * The function gets URL argument by reference and modifies it. - * It returns true on success and false of failure. - * - * @param string &$id url to be normalized - * @return bool - */ - public static function normalizeUrl(&$id) - { - // RFC 3986, 6.2.2. Syntax-Based Normalization - - // RFC 3986, 6.2.2.2 Percent-Encoding Normalization - $i = 0; - $n = strlen($id); - $res = ''; - while ($i < $n) { - if ($id[$i] == '%') { - if ($i + 2 >= $n) { - return false; - } - ++$i; - if ($id[$i] >= '0' && $id[$i] <= '9') { - $c = ord($id[$i]) - ord('0'); - } else if ($id[$i] >= 'A' && $id[$i] <= 'F') { - $c = ord($id[$i]) - ord('A') + 10; - } else if ($id[$i] >= 'a' && $id[$i] <= 'f') { - $c = ord($id[$i]) - ord('a') + 10; - } else { - return false; - } - ++$i; - if ($id[$i] >= '0' && $id[$i] <= '9') { - $c = ($c << 4) | (ord($id[$i]) - ord('0')); - } else if ($id[$i] >= 'A' && $id[$i] <= 'F') { - $c = ($c << 4) | (ord($id[$i]) - ord('A') + 10); - } else if ($id[$i] >= 'a' && $id[$i] <= 'f') { - $c = ($c << 4) | (ord($id[$i]) - ord('a') + 10); - } else { - return false; - } - ++$i; - $ch = chr($c); - if (($ch >= 'A' && $ch <= 'Z') || - ($ch >= 'a' && $ch <= 'z') || - $ch == '-' || - $ch == '.' || - $ch == '_' || - $ch == '~' - ) { - $res .= $ch; - } else { - $res .= '%'; - if (($c >> 4) < 10) { - $res .= chr(($c >> 4) + ord('0')); - } else { - $res .= chr(($c >> 4) - 10 + ord('A')); - } - $c = $c & 0xf; - if ($c < 10) { - $res .= chr($c + ord('0')); - } else { - $res .= chr($c - 10 + ord('A')); - } - } - } else { - $res .= $id[$i++]; - } - } - - if (!preg_match('|^([^:]+)://([^:@]*(?:[:][^@]*)?@)?([^/:@?#]*)(?:[:]([^/?#]*))?(/[^?#]*)?((?:[?](?:[^#]*))?)((?:#.*)?)$|', $res, $reg)) { - return false; - } - $scheme = $reg[1]; - $auth = $reg[2]; - $host = $reg[3]; - $port = $reg[4]; - $path = $reg[5]; - $query = $reg[6]; - $fragment = $reg[7]; /* strip it */ /* ZF-4358 Fragment retained under OpenID 2.0 */ - - if (empty($scheme) || empty($host)) { - return false; - } - - // RFC 3986, 6.2.2.1. Case Normalization - $scheme = strtolower($scheme); - $host = strtolower($host); - - // RFC 3986, 6.2.2.3. Path Segment Normalization - if (!empty($path)) { - $i = 0; - $n = strlen($path); - $res = ""; - while ($i < $n) { - if ($path[$i] == '/') { - ++$i; - while ($i < $n && $path[$i] == '/') { - ++$i; - } - if ($i < $n && $path[$i] == '.') { - ++$i; - if ($i < $n && $path[$i] == '.') { - ++$i; - if ($i == $n || $path[$i] == '/') { - if (($pos = strrpos($res, '/')) !== false) { - $res = substr($res, 0, $pos); - } - } else { - $res .= '/..'; - } - } else if ($i != $n && $path[$i] != '/') { - $res .= '/.'; - } - } else { - $res .= '/'; - } - } else { - $res .= $path[$i++]; - } - } - $path = $res; - } - - // RFC 3986,6.2.3. Scheme-Based Normalization - if ($scheme == 'http') { - if ($port == 80) { - $port = ''; - } - } else if ($scheme == 'https') { - if ($port == 443) { - $port = ''; - } - } - if (empty($path)) { - $path = '/'; - } - - $id = $scheme - . '://' - . $auth - . $host - . (empty($port) ? '' : (':' . $port)) - . $path - . $query - . $fragment; - return true; - } - - /** - * @param $trust_root - * @return bool - */ - public static function isValidRealm($trust_root){ - - if (!self::isSaneRealm($trust_root)) return false; - - return self::_parse($trust_root) != false; - } - - /** - * Does this URL match the given trust root? - * - * Return whether the URL falls under the given trust root. This - * does not check whether the trust root is sane. If the URL or - * trust root do not parse, this function will return false. - * - * @param string $trust_root The trust root to match against - * - * @param string $url The URL to check - * - * @return bool $matches Whether the URL matches against the - * trust root - */ - public static function checkRealm($trust_root, $url) - { - if (!self::isSaneRealm($trust_root)) return false; - - $trust_root_parsed = self::_parse($trust_root); - $url_parsed = self::_parse($url); - if (!$trust_root_parsed || !$url_parsed) { - return false; - } - - // Check hosts matching - if ($url_parsed['wildcard']) { - return false; - } - if ($trust_root_parsed['wildcard']) { - $host_tail = $trust_root_parsed['host']; - $host = $url_parsed['host']; - if ($host_tail && - substr($host, -(strlen($host_tail))) != $host_tail && - substr($host_tail, 1) != $host - ) { - return false; - } - } else { - if ($trust_root_parsed['host'] != $url_parsed['host']) { - return false; - } - } - - // Check path and query matching - $base_path = $trust_root_parsed['path']; - $path = $url_parsed['path']; - if (!isset($trust_root_parsed['query'])) { - if ($base_path != $path) { - if (substr($path, 0, strlen($base_path)) != $base_path) { - return false; - } - if (substr($base_path, strlen($base_path) - 1, 1) != '/' && - substr($path, strlen($base_path), 1) != '/' - ) { - return false; - } - } - } else { - $base_query = $trust_root_parsed['query']; - $query = @$url_parsed['query']; - $qplus = substr($query, 0, strlen($base_query) + 1); - $bqplus = $base_query . '&'; - if ($base_path != $path || - ($base_query != $query && $qplus != $bqplus) - ) { - return false; - } - } - - // The port and scheme need to match exactly - return ($trust_root_parsed['scheme'] == $url_parsed['scheme'] && - $url_parsed['port'] === $trust_root_parsed['port']); - } - - /** - * http://openid.net/specs/openid-authentication-2_0.html#realms - * It is RECOMMENDED that OPs protect their users from making assertions with overly-general realms, like - * http://*.com/ or http://*.co.uk/. Overly general realms can be dangerous when the realm is used for identifying - * a particular Relying Party. Whether a realm is overly-general is at the discretion of the OP. - * - * Is this trust root sane? - * - * A trust root is sane if it is syntactically valid and it has a - * reasonable domain name. Specifically, the domain name must be - * more than one level below a standard TLD or more than two - * levels below a two-letter tld. - * - * For example, '*.com' is not a sane trust root, but '*.foo.com' - * is. '*.co.uk' is not sane, but '*.bbc.co.uk' is. - * - * This check is not always correct, but it attempts to err on the - * side of marking sane trust roots insane instead of marking - * insane trust roots sane. For example, 'kink.fm' is marked as - * insane even though it "should" (for some meaning of should) be - * marked sane. - * - * This function should be used when creating OpenID servers to - * alert the users of the server when a consumer attempts to get - * the user to accept a suspicious trust root. - * - * @static - * @param string $trust_root The trust root to check - * @return bool $sanity Whether the trust root looks OK - */ - private static function isSaneRealm($trust_root) - { - $parts = self::_parse($trust_root); - - if ($parts === false) { - return false; - } - - // Localhost is a special case - if ($parts['host'] == 'localhost') { - return true; - } - // if host its a valid ip address - if( filter_var($parts['host'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== FALSE || - filter_var($parts['host'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== FALSE){ - return true; - } - - $host_parts = explode('.', $parts['host']); - if ($parts['wildcard']) { - // Remove the empty string from the beginning of the array - array_shift($host_parts); - } - - if ($host_parts && !$host_parts[count($host_parts) - 1]) { - array_pop($host_parts); - } - - if (!$host_parts) { - return false; - } - - // Don't allow adjacent dots - if (in_array('', $host_parts, true)) { - return false; - } - - if ($parts['wildcard']) { - - if(count($host_parts) == 1) { - // like *.uk - return false; - } - // It's a 2-letter tld with a short second to last segment - // so there needs to be more than two segments specified - // (e.g. *.co.uk is insane) - $second_level = $host_parts[count($host_parts) - 2]; - if (strlen($second_level) <= 3) { - return count($host_parts) > 2; - } - } - - return true; - } - - /** - * @param $trust_root - * @return bool|mixed - */ - private static function _parse($trust_root) - { - $trust_root = self::urinorm($trust_root); - if ($trust_root === null) { - return false; - } - - if (preg_match("/:\/\/[^:]+(:\d+){2,}(\/|$)/", $trust_root)) { - return false; - } - - $parts = @parse_url($trust_root); - if ($parts === false) { - return false; - } - - $required_parts = ['scheme', 'host']; - $forbidden_parts = ['user', 'pass', 'fragment']; - $keys = array_keys($parts); - - if (array_intersect($keys, $required_parts) != $required_parts) { - return false; - } - - if (array_intersect($keys, $forbidden_parts) != []) { - return false; - } - - if (!preg_match(OpenIdUriHelper_HostSegmentRe, $parts['host'])) { - return false; - } - - $scheme = strtolower($parts['scheme']); - $allowed_schemes = ['http', 'https']; - - if (!in_array($scheme, $allowed_schemes)) { - return false; - } - - $parts['scheme'] = $scheme; - - $host = strtolower($parts['host']); - $hostparts = explode('*', $host); - - switch (count($hostparts)) { - case 1: - $parts['wildcard'] = false; - break; - case 2: - if ($hostparts[0] || - ($hostparts[1] && substr($hostparts[1], 0, 1) != '.') - ) { - return false; - } - $host = $hostparts[1]; - $parts['wildcard'] = true; - break; - default: - return false; - } - if (strpos($host, ':') !== false) { - return false; - } - - $parts['host'] = $host; - - if (isset($parts['path'])) { - $path = strtolower($parts['path']); - if (substr($path, 0, 1) != '/') { - return false; - } - } else { - $path = '/'; - } - - $parts['path'] = $path; - if (!isset($parts['port'])) { - $parts['port'] = false; - } - - $parts['unparsed'] = $trust_root; - - return $parts; - } - - /** - * @param $uri - * @return string - */ - private static function urinorm($uri) - { - $uri_matches = []; - preg_match(self::URIPattern, $uri, $uri_matches); - - if (count($uri_matches) < 9) { - for ($i = count($uri_matches); $i <= 9; $i++) { - $uri_matches[] = ''; - } - } - - $illegal_matches = []; - preg_match(self::URLIllegalCharRE, - $uri, $illegal_matches); - if ($illegal_matches) { - return null; - } - - $scheme = $uri_matches[2]; - if ($scheme) { - $scheme = strtolower($scheme); - } - - $scheme = $uri_matches[2]; - if ($scheme === '') { - // No scheme specified - return null; - } - - $scheme = strtolower($scheme); - if (!in_array($scheme, array('http', 'https'))) { - // Not an absolute HTTP or HTTPS URI - return null; - } - - $authority = $uri_matches[4]; - if ($authority === '') { - // Not an absolute URI - return null; - } - - $authority_matches = []; - preg_match(self::AuthorityPattern, - $authority, $authority_matches); - if (count($authority_matches) === 0) { - // URI does not have a valid authority - return null; - } - - if (count($authority_matches) < 4) { - for ($i = count($authority_matches); $i <= 4; $i++) { - $authority_matches[] = ''; - } - } - - list($_whole, $userinfo, $host, $port) = $authority_matches; - - if ($userinfo === null) { - $userinfo = ''; - } - - if (strpos($host, '%') !== -1) { - $host = strtolower($host); - $host = preg_replace_callback( - self::EncodedPattern, - function ($mo) { - return chr(intval($mo[1], 16)); - }, $host); - // NO IDNA. - // $host = unicode($host, 'utf-8').encode('idna'); - } else { - $host = strtolower($host); - } - - if ($port) { - if (($port == ':') || - ($scheme == 'http' && $port == ':80') || - ($scheme == 'https' && $port == ':443') - ) { - $port = ''; - } - } else { - $port = ''; - } - - $authority = $userinfo . $host . $port; - - $path = $uri_matches[5]; - $path = preg_replace_callback( - self::EncodedPattern, - function ($mo) { - $_unreserved = OpenIdUriHelper::getUnreserved(); - - $i = intval($mo[1], 16); - if ($_unreserved[$i]) { - return chr($i); - } else { - return strtoupper($mo[0]); - } - - return $mo[0]; - }, $path); - - $path = self::remove_dot_segments($path); - if (!$path) { - $path = '/'; - } - - $query = $uri_matches[6]; - if ($query === null) { - $query = ''; - } - - $fragment = $uri_matches[8]; - if ($fragment === null) { - $fragment = ''; - } - - return $scheme . '://' . $authority . $path . $query . $fragment; - } - - /** - * @return array - */ - public static function getUnreserved() - { - $_unreserved = []; - for ($i = 0; $i < 256; $i++) { - $_unreserved[$i] = false; - } - - for ($i = ord('A'); $i <= ord('Z'); $i++) { - $_unreserved[$i] = true; - } - - for ($i = ord('0'); $i <= ord('9'); $i++) { - $_unreserved[$i] = true; - } - - for ($i = ord('a'); $i <= ord('z'); $i++) { - $_unreserved[$i] = true; - } - - $_unreserved[ord('-')] = true; - $_unreserved[ord('.')] = true; - $_unreserved[ord('_')] = true; - $_unreserved[ord('~')] = true; - - return $_unreserved; - } - - /** - * @param $path - * @return string - */ - private static function remove_dot_segments($path) - { - $result_segments = []; - - while ($path) { - if (self::startswith($path, '../')) { - $path = substr($path, 3); - } else if (self::startswith($path, './')) { - $path = substr($path, 2); - } else if (self::startswith($path, '/./')) { - $path = substr($path, 2); - } else if ($path == '/.') { - $path = '/'; - } else if (self::startswith($path, '/../')) { - $path = substr($path, 3); - if ($result_segments) { - array_pop($result_segments); - } - } else if ($path == '/..') { - $path = '/'; - if ($result_segments) { - array_pop($result_segments); - } - } else if (($path == '..') || - ($path == '.') - ) { - $path = ''; - } else { - $i = 0; - if ($path[0] == '/') { - $i = 1; - } - $i = strpos($path, '/', $i); - if ($i === false) { - $i = strlen($path); - } - $result_segments[] = substr($path, 0, $i); - $path = substr($path, $i); - } - } - - return implode('', $result_segments); - } - - /** - * @param $s - * @param $stuff - * @return bool - */ - private static function startswith($s, $stuff) - { - return strpos($s, $stuff) === 0; - } - - /** - * @param $return_to - * @return bool - */ - public static function checkReturnTo($return_to) - { - if (!filter_var($return_to, FILTER_VALIDATE_URL)) return false; - $url_parsed = self::_parse($return_to); - if (!$url_parsed) { - return false; - } - return true; - } - - /** - * @param $url - * @return mixed - */ - public static function isValidUrl($url) - { - return filter_var($url, FILTER_VALIDATE_URL); - } -} \ No newline at end of file diff --git a/app/libs/OpenId/IOpenIdProtocol.php b/app/libs/OpenId/IOpenIdProtocol.php deleted file mode 100644 index 38b8683b..00000000 --- a/app/libs/OpenId/IOpenIdProtocol.php +++ /dev/null @@ -1,40 +0,0 @@ -handle = $handle; - $this->secret = $secret; - $this->mac_function = $mac_function; - $this->lifetime = $lifetime; - $this->issued = $issued; - $this->type = $type; - $this->realm = $realm; - } - - public function getMacFunction():string - { - return $this->mac_function; - } - - public function setMacFunction(string $mac_function):void - { - $this->mac_function = $mac_function; - } - - public function getSecret():string - { - return $this->secret; - } - - public function setSecret(string $secret): void - { - $this->secret = $secret; - } - - public function getLifetime():int - { - return intval($this->lifetime); - } - - public function setLifetime(int $lifetime):void - { - $this->lifetime = $lifetime; - } - - public function getIssued():DateTime - { - return $this->issued; - } - - public function setIssued(DateTime $issued):void - { - $this->issued = $issued; - } - - public function getType():int - { - return $this->type; - } - - public function setType(int $type):void - { - $this->type = $type; - } - - public function getRealm():?string - { - return $this->realm; - } - - public function setRealm(string $realm):void - { - $this->realm = $realm; - } - - public function IsExpired():bool - { - // TODO: Implement IsExpired() method. - } - - public function getRemainingLifetime():int - { - // TODO: Implement getRemainingLifetime() method. - } - - public function getHandle():string - { - return $this->handle; - } - - /** - * @return int - */ - public function getId() - { - // TODO: Implement getId() method. - } - - /** - * @return int - */ - public function getIdentifier() - { - // TODO: Implement getIdentifier() method. - } - - /** - * @return bool - */ - public function isNew(): bool - { - // TODO: Implement isNew() method. - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Models/IAssociation.php b/app/libs/OpenId/Models/IAssociation.php deleted file mode 100644 index b6042a47..00000000 --- a/app/libs/OpenId/Models/IAssociation.php +++ /dev/null @@ -1,100 +0,0 @@ -value; - } - - /** - * @return string - */ - public function getTimestamp() - { - return $this->timestamp; - } - - /** - * @return string - */ - public function getUniqueId() - { - return $this->unique_id; - } - - /** - * The time-stamp MAY be used to reject responses that are too far away from the current time, - * limiting the amount of time that nonces must be stored to prevent attacks. - * The acceptable range is out of the scope of this specification. - * A larger range requires storing more nonces for a longer time. - * A shorter range increases the chance that clock-skew and transaction time will cause - * a spurious rejection. - * @param $allowed_skew - * @return bool - */ - public function isValid($allowed_skew) - { - $now = time(); - // Time after which we should not use the nonce - $past = $now - $allowed_skew; - // Time that is too far in the future for us to allow - $future = $now + $allowed_skew; - - // the stamp is not too far in the future and is not too far - // in the past - return (($past <= $this->timestamp) && ($this->timestamp <= $future)); - } - - /** - * @param string $value - * @return $this - * @throws InvalidNonce - */ - public function setValue($value) - { - // Extract a timestamp from the given nonce string - $result = preg_match(self::NonceRegexFormat, $value, $matches); - if ($result != 1 || count($matches) != 8) { - throw new InvalidNonce(sprintf(OpenIdErrorMessages::InvalidNonceFormatMessage, $value)); - } - - list($unused, - $tm_year, - $tm_mon, - $tm_mday, - $tm_hour, - $tm_min, - $tm_sec, - $unique_id) = $matches; - - $timestamp = @gmmktime($tm_hour, $tm_min, $tm_sec, $tm_mon, $tm_mday, $tm_year); - - if ($timestamp == false || $timestamp < 0) { - throw new InvalidNonce(sprintf(OpenIdErrorMessages::InvalidNonceTimestampMessage, $value)); - } - - $this->timestamp = $timestamp; - $this->unique_id = $unique_id; - $this->len = strlen($value); - - return parent::setValue($value); - } - - /** - * @param string $value - * @return OpenIdNonce - * @throws InvalidNonce - */ - static public function fromValue($value) - { - $nonce = new OpenIdNonce(255); - - return $nonce->setValue($value); - } - - /** - * @return string - */ - public function getType() - { - return 'nonce'; - } - - /** - * @inheritDoc - */ - public function toArray(): array - { - return []; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/OpenIdMessage.php b/app/libs/OpenId/OpenIdMessage.php deleted file mode 100644 index 1c41e731..00000000 --- a/app/libs/OpenId/OpenIdMessage.php +++ /dev/null @@ -1,117 +0,0 @@ -getParam(OpenIdProtocol::OpenIDProtocol_Mode); - } - - /** - * @param OpenIDProtocol_ * $param - * @return string - */ - public function getParam($param) - { - if (isset($this->container[OpenIdProtocol::param($param, "_")])) - { - return $this->container[OpenIdProtocol::param($param, "_")]; - } - - if (isset($this->container[OpenIdProtocol::param($param, ".")])) - { - return $this->container[OpenIdProtocol::param($param, ".")]; - } - return null; - } - - /** - * @return bool - */ - public function isValid() - { - $ns = $this->getParam(OpenIdProtocol::OpenIDProtocol_NS); - $mode = $this->getParam(OpenIdProtocol::OpenIDProtocol_Mode); - if (!is_null($ns) - && $ns == OpenIdProtocol::OpenID2MessageType - && !is_null($mode) - ) { - return true; - } - return false; - } - - /** - * @param string $mode - * @return $this - * @throws InvalidOpenIdMessageMode - */ - protected function setMode($mode) - { - if (!OpenIdProtocol::isValidMode($mode)) - throw new InvalidOpenIdMessageMode(sprintf(OpenIdErrorMessages::InvalidOpenIdMessageModeMessage, $mode)); - $this->container[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Mode)] = $mode; - return $this; - } - - /** - * @return OpenIdMessageMemento - */ - public function createMemento() - { - return OpenIdMessageMemento::buildFromRequest($this); - } - - /** - * @param OpenIdMessageMemento $memento - * @return $this - */ - public function setMemento(OpenIdMessageMemento $memento) - { - $this->container = $memento->getState(); - return $this; - } - - /** - * @param OpenIdMessageMemento $memento - * @return OpenIdMessage - */ - static public function buildFromMemento(OpenIdMessageMemento $memento) - { - $msg = new self; - $msg->setMemento($memento); - return $msg; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/OpenIdProtocol.php b/app/libs/OpenId/OpenIdProtocol.php deleted file mode 100644 index ecc2ff84..00000000 --- a/app/libs/OpenId/OpenIdProtocol.php +++ /dev/null @@ -1,223 +0,0 @@ - self::OpenIDProtocol_Mode, - self::OpenIDProtocol_NS => self::OpenIDProtocol_NS, - self::OpenIDProtocol_ReturnTo => self::OpenIDProtocol_ReturnTo, - self::OpenIDProtocol_ClaimedId => self::OpenIDProtocol_ClaimedId, - self::OpenIDProtocol_Identity => self::OpenIDProtocol_Identity, - self::OpenIDProtocol_AssocHandle => self::OpenIDProtocol_AssocHandle, - self::OpenIDProtocol_Realm => self::OpenIDProtocol_Realm, - self::OpenIDProtocol_OpEndpoint => self::OpenIDProtocol_OpEndpoint, - self::OpenIDProtocol_Nonce => self::OpenIDProtocol_Nonce, - self::OpenIDProtocol_InvalidateHandle => self::OpenIDProtocol_InvalidateHandle, - self::OpenIDProtocol_Signed => self::OpenIDProtocol_Signed, - self::OpenIDProtocol_Sig => self::OpenIDProtocol_Sig, - self::OpenIDProtocol_Error => self::OpenIDProtocol_Error, - self::OpenIDProtocol_ErrorCode => self::OpenIDProtocol_ErrorCode, - self::OpenIDProtocol_Contact => self::OpenIDProtocol_Contact, - self::OpenIDProtocol_Reference => self::OpenIDProtocol_Reference, - self::OpenIDProtocol_IsValid => self::OpenIDProtocol_IsValid, - self::OpenIDProtocol_AssocType => self::OpenIDProtocol_AssocType, - self::OpenIDProtocol_SessionType => self::OpenIDProtocol_SessionType, - self::OpenIdProtocol_DHModulus => self::OpenIdProtocol_DHModulus, - self::OpenIdProtocol_DHGen => self::OpenIdProtocol_DHGen, - self::OpenIdProtocol_DHConsumerPublic => self::OpenIdProtocol_DHConsumerPublic, - self::OpenIdProtocol_ExpiresIn => self::OpenIdProtocol_ExpiresIn, - self::OpenIdProtocol_DHServerPublic => self::OpenIdProtocol_DHServerPublic, - self::OpenIdProtocol_DHEncMacKey => self::OpenIdProtocol_DHEncMacKey, - self::OpenIdProtocol_MacKey => self::OpenIdProtocol_MacKey, - ); - - /** - * @var OpenIdAuthenticationRequestHandler - */ - private $request_handlers; - /** - * @var IServerExtensionsService - */ - private $server_extension_service; - /** - * @var IServerConfigurationService - */ - private $server_config_service; - - /** - * @param IAuthService $auth_service - * @param IMementoOpenIdSerializerService $memento_request_service - * @param IOpenIdAuthenticationStrategy $auth_strategy - * @param IServerExtensionsService $server_extension_service - * @param IAssociationService $association_service - * @param ITrustedSitesService $trusted_sites_service - * @param IServerConfigurationService $server_config_service - * @param INonceService $nonce_service - * @param ILogService $log_service - * @param ICheckPointService $checkpoint_service - * @param IUtilsServerConfigurationService $utils_configuration_service - */ - public function __construct( - IAuthService $auth_service, - IMementoOpenIdSerializerService $memento_request_service, - IOpenIdAuthenticationStrategy $auth_strategy, - IServerExtensionsService $server_extension_service, - IAssociationService $association_service, - ITrustedSitesService $trusted_sites_service, - IServerConfigurationService $server_config_service, - INonceService $nonce_service, - ILogService $log_service, - ICheckPointService $checkpoint_service, - IUtilsServerConfigurationService $utils_configuration_service) - { - //create chain of responsibility - $check_auth = new OpenIdCheckAuthenticationRequestHandler($association_service, $nonce_service, $log_service,$checkpoint_service,$utils_configuration_service,$server_config_service, null); - $session_assoc = new OpenIdSessionAssociationRequestHandler($log_service,$checkpoint_service, $check_auth); - $this->request_handlers = new OpenIdAuthenticationRequestHandler($auth_service, $memento_request_service, $auth_strategy, $server_extension_service, $association_service, $trusted_sites_service, $server_config_service, $nonce_service, $log_service,$checkpoint_service, $session_assoc); - $this->server_extension_service = $server_extension_service; - $this->server_config_service = $server_config_service; - } - - public static function isAssocTypeSupported($assoc_type) - { - return in_array($assoc_type, self::$OpenIDProtocol_SupportedAssocType); - } - - public static function isSessionTypeSupported($session_type) - { - return in_array($session_type, self::$OpenIDProtocol_SupportedSessionType); - } - - /** - * check if a provide message mode is valid or not in openid 2.0 protocol - * @param $mode - * @return bool - */ - public static function isValidMode($mode) - { - return in_array($mode, self::$OpenIDProtocol_ValidModes); - } - - public static function param($param, $separator = '.') - { - return self::OpenIdPrefix . $separator . $param ; - } - - public function getXRDSDiscovery($mode, $canonical_id = null) - { - $active_extensions = $this->server_extension_service->getAllActiveExtensions(); - $extensions = []; - foreach ($active_extensions as $ext) { - array_push($extensions, $ext->getNamespace()); - } - $services = []; - array_push($services, new XRDSService(0, $mode == IOpenIdProtocol::OpenIdXRDSModeUser ? self::ClaimedIdentifierType : self::OPIdentifierType, $this->server_config_service->getOPEndpointURL(), $extensions, $canonical_id)); - $builder = new XRDSDocumentBuilder($services, $canonical_id); - $xrds = $builder->render(); - return $xrds; - } - - public function handleOpenIdMessage(OpenIdMessage $openIdMessage) - { - return $this->request_handlers->handleMessage($openIdMessage); - } -} diff --git a/app/libs/OpenId/OpenIdServiceProvider.php b/app/libs/OpenId/OpenIdServiceProvider.php deleted file mode 100644 index 6dc5d004..00000000 --- a/app/libs/OpenId/OpenIdServiceProvider.php +++ /dev/null @@ -1,59 +0,0 @@ -addExtension( - new OpenIdAuthenticationExtension( - $memento_service, - $server_configuration_service - ) - ); - } - } - - public function provides() - { - return [\OpenId\IOpenIdProtocol::class]; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Repositories/IOpenIdAssociationRepository.php b/app/libs/OpenId/Repositories/IOpenIdAssociationRepository.php deleted file mode 100644 index abd777d5..00000000 --- a/app/libs/OpenId/Repositories/IOpenIdAssociationRepository.php +++ /dev/null @@ -1,27 +0,0 @@ -name = $name; - $this->data = $data; - } - - /** - * @return array|null - */ - public function getData() - { - return $this->data; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Requests/Contexts/RequestContext.php b/app/libs/OpenId/Requests/Contexts/RequestContext.php deleted file mode 100644 index 01f9929f..00000000 --- a/app/libs/OpenId/Requests/Contexts/RequestContext.php +++ /dev/null @@ -1,67 +0,0 @@ -partial_views = []; - $this->trusted_data = []; - } - - /** - * @param PartialView $partial_view - * @return $this - */ - public function addPartialView(PartialView $partial_view) - { - $this->partial_views[$partial_view->getName()] = $partial_view; - return $this; - } - - /** - * @return array - */ - public function getPartials() - { - return $this->partial_views; - } - - /** - * Gets an associative array of current request trusted data - * @return array - */ - public function getTrustedData() - { - return $this->trusted_data; - } - - /** - * @return $this - */ - public function cleanTrustedData(){ - $this->trusted_data = []; - return $this; - } - - /** - * @param $trusted_data - * @return $this - */ - public function setTrustedData($trusted_data) - { - $this->trusted_data = array_merge($this->trusted_data, $trusted_data); - return $this; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Requests/OpenIdAssociationSessionRequest.php b/app/libs/OpenId/Requests/OpenIdAssociationSessionRequest.php deleted file mode 100644 index f75fd2c1..00000000 --- a/app/libs/OpenId/Requests/OpenIdAssociationSessionRequest.php +++ /dev/null @@ -1,90 +0,0 @@ -getMode(); - if ($mode == OpenIdProtocol::AssociateMode) return true; - return false; - } - - /** - * @return bool - * @throws InvalidSessionTypeException - * @throws InvalidAssociationTypeException - */ - public function isValid() - { - $mode = $this->getMode(); - if ($mode != OpenIdProtocol::AssociateMode) - return false; - - $assoc_type = $this->getAssocType(); - - if (is_null($assoc_type) || empty($assoc_type)) - return false; - - $session_type = $this->getSessionType(); - - if (is_null($session_type) || empty($session_type)) - return false; - - if (!OpenIdProtocol::isSessionTypeSupported($session_type)) - throw new InvalidSessionTypeException(sprintf(OpenIdErrorMessages::UnsupportedSessionTypeMessage, $session_type)); - - if (!OpenIdProtocol::isAssocTypeSupported($assoc_type)) - throw new InvalidAssociationTypeException(sprintf(OpenIdErrorMessages::UnsupportedAssociationTypeMessage, $assoc_type)); - - return true; - } - - /** - * @return string - */ - public function getAssocType() - { - return $this->getParam(OpenIdProtocol::OpenIDProtocol_AssocType); - } - - /** - * @return string - */ - public function getSessionType() - { - return $this->getParam(OpenIdProtocol::OpenIDProtocol_SessionType); - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Requests/OpenIdAuthenticationRequest.php b/app/libs/OpenId/Requests/OpenIdAuthenticationRequest.php deleted file mode 100644 index 32d55a91..00000000 --- a/app/libs/OpenId/Requests/OpenIdAuthenticationRequest.php +++ /dev/null @@ -1,218 +0,0 @@ -user_identity_endpoint = $user_identity_endpoint; - if (!empty($this->user_identity_endpoint)) { - if (!str_contains($this->user_identity_endpoint, '@identifier')) { - throw new InvalidOpenIdMessageException("user_identity_endpoint value must contain @identifier placeholder!."); - } - } - } - - /** - * @param OpenIdMessage $message - * @return bool - */ - public static function IsOpenIdAuthenticationRequest(OpenIdMessage $message) - { - $mode = $message->getMode(); - if ($mode == OpenIdProtocol::ImmediateMode || $mode == OpenIdProtocol::SetupMode) { - return true; - } - - return false; - } - - /** - * @return string - */ - public function getAssocHandle() - { - return $this->getParam(OpenIdProtocol::OpenIDProtocol_AssocHandle); - } - - /** - * @return bool - * @throws InvalidOpenIdMessageException - */ - public function isValid() - { - $return_to = $this->getReturnTo(); - $claimed_id = $this->getClaimedId(); - $identity = $this->getIdentity(); - $mode = $this->getMode(); - $realm = $this->getRealm(); - $valid_id = $this->isValidIdentifier($claimed_id, $identity); - $valid_realm = OpenIdUriHelper::isValidRealm($realm); - $valid_return_to_against_realm = OpenIdUriHelper::checkRealm($realm, $return_to); - $valid_return_to = OpenIdUriHelper::checkReturnTo($return_to); - - if (empty($return_to)) { - throw new InvalidOpenIdMessageException('return_to is empty.'); - } - - if (empty($realm)) { - throw new InvalidOpenIdMessageException('realm is empty.'); - } - - if (!$valid_realm) { - throw new InvalidOpenIdMessageException - ( - sprintf - ( - 'realm is not valid ( %s )', - $realm - ) - ); - } - - if (!$valid_return_to_against_realm) { - throw new InvalidOpenIdMessageException - ( - sprintf - ( - 'return to url check against provided realm is not valid ( realm %s - return_to %s).', - $realm, - $return_to - ) - ); - } - - if (!$valid_return_to) { - throw new InvalidOpenIdMessageException(sprintf('invalid return_to url ( %s )', $return_to)); - } - - if (empty($claimed_id)) { - throw new InvalidOpenIdMessageException('claimed_id is empty.'); - } - - if (empty($identity)) { - throw new InvalidOpenIdMessageException('identity is empty.'); - } - - if (!$valid_id) { - throw new InvalidOpenIdMessageException(sprintf('identity check is not valid claimed_id %s - identity %s.', - $claimed_id, $identity)); - } - - if (empty($mode)) { - throw new InvalidOpenIdMessageException('mode is empty.'); - } - - if (!($mode == OpenIdProtocol::ImmediateMode || $mode == OpenIdProtocol::SetupMode)) { - throw new InvalidOpenIdMessageException(sprintf('mode %s is invalid.', $mode)); - } - - return true; - } - - public function getReturnTo() - { - return $this->getParam(OpenIdProtocol::OpenIDProtocol_ReturnTo); - } - - public function getClaimedId() - { - return $this->getParam(OpenIdProtocol::OpenIDProtocol_ClaimedId); - } - - public function getIdentity() - { - return $this->getParam(OpenIdProtocol::OpenIDProtocol_Identity); - } - - public function getRealm() - { - $realm = $this->getParam(OpenIdProtocol::OpenIDProtocol_Realm); - - return $realm; - } - - public function isIdentitySelectByOP() - { - $claimed_id = $this->getClaimedId(); - $identity = $this->getIdentity(); - //http://specs.openid.net/auth/2.0/identifier_select - if ($claimed_id == $identity && $identity == OpenIdProtocol::IdentifierSelectType) { - return true; - } - - return false; - } - - /** - * @param $claimed_id - * @param $identity - * @return bool - * @throws InvalidOpenIdMessageException - */ - private function isValidIdentifier($claimed_id, $identity) - { - /* - * openid.claimed_id" and "openid.identity" SHALL be either both present or both absent. - * If neither value is present, the assertion is not about an identifier, and will contain - * other information in its payload, using extensions. - */ - - if (empty($this->user_identity_endpoint)) { - throw new InvalidOpenIdMessageException("user_identity_endpoint is not set."); - } - - if (is_null($claimed_id) && is_null($identity)) { - return false; - } - //http://specs.openid.net/auth/2.0/identifier_select - if ($claimed_id == $identity && $identity == OpenIdProtocol::IdentifierSelectType) { - return true; - } - - if (OpenIdUriHelper::isValidUrl($claimed_id) && OpenIdUriHelper::isValidUrl($identity)) { - $identity_url_pattern = $this->user_identity_endpoint; - $url_parts = explode("@", $identity_url_pattern, 2); - $base_identity_url = $url_parts[0]; - if (strpos($identity, $base_identity_url) !== false) { - return true; - } - if (strpos($claimed_id, $base_identity_url) !== false) { - return true; - } - } - - return false; - } - -} diff --git a/app/libs/OpenId/Requests/OpenIdCheckAuthenticationRequest.php b/app/libs/OpenId/Requests/OpenIdCheckAuthenticationRequest.php deleted file mode 100644 index d2d68e47..00000000 --- a/app/libs/OpenId/Requests/OpenIdCheckAuthenticationRequest.php +++ /dev/null @@ -1,133 +0,0 @@ -op_endpoint_url = $op_endpoint_url; - } - - /** - * @param OpenIdMessage $message - * @return bool - */ - public static function IsOpenIdCheckAuthenticationRequest(OpenIdMessage $message) - { - $mode = $message->getMode(); - if ($mode == OpenIdProtocol::CheckAuthenticationMode) { - return true; - } - return false; - } - - /** - * @return bool - * @throws InvalidOpenIdMessageException - */ - public function isValid() - { - $mode = $this->getMode(); - $claimed_assoc = $this->getAssocHandle(); - $claimed_nonce = $this->getNonce(); - $claimed_sig = $this->getSig(); - $claimed_op_endpoint = $this->getOPEndpoint(); - $claimed_identity = $this->getClaimedId(); - $claimed_realm = $this->getRealm(); - $claimed_returnTo = $this->getReturnTo(); - $signed = $this->getSigned(); - $valid_realm = OpenIdUriHelper::checkRealm($claimed_realm, $claimed_returnTo); - - $res = !is_null($mode) && !empty($mode) && $mode == OpenIdProtocol::CheckAuthenticationMode - && !is_null($claimed_returnTo) && !empty($claimed_returnTo) && OpenIdUriHelper::checkReturnTo($claimed_returnTo) - && !is_null($claimed_realm) && !empty($claimed_realm) && $valid_realm - && !is_null($claimed_assoc) && !empty($claimed_assoc) - && !is_null($claimed_sig) && !empty($claimed_sig) - && !is_null($signed) && !empty($signed) - && !is_null($claimed_nonce) && !empty($claimed_nonce) - && !is_null($claimed_op_endpoint) && !empty($claimed_op_endpoint) && $claimed_op_endpoint == $this->op_endpoint_url - && !is_null($claimed_identity) && !empty($claimed_identity) && OpenIdUriHelper::isValidUrl($claimed_identity); - - if (!$res) - { - $msg = sprintf("return_to is empty? %b.", empty($claimed_returnTo)) . PHP_EOL; - $msg = $msg . sprintf("realm is empty? %b.", empty($claimed_realm)) . PHP_EOL; - $msg = $msg . sprintf("claimed_id is empty? %b.", empty($claimed_id)) . PHP_EOL; - $msg = $msg . sprintf("identity is empty? %b.", empty($claimed_identity)) . PHP_EOL; - $msg = $msg . sprintf("mode is empty? %b.", empty($mode)) . PHP_EOL; - $msg = $msg . sprintf("is valid realm? %b.", $valid_realm) . PHP_EOL; - throw new InvalidOpenIdMessageException($msg); - } - - return $res; - } - - /** - * @return string - */ - public function getNonce() - { - return $this->getParam(OpenIdProtocol::OpenIDProtocol_Nonce); - } - - /** - * @return string - */ - public function getSig() - { - return $this->getParam(OpenIdProtocol::OpenIDProtocol_Sig); - } - - /** - * @return string - */ - public function getOPEndpoint() - { - return $this->getParam(OpenIdProtocol::OpenIDProtocol_OpEndpoint); - } - - /** - * @return string - */ - public function getSigned() - { - return $this->getParam(OpenIdProtocol::OpenIDProtocol_Signed); - } - - /** - * @return string - */ - public function getInvalidateHandle() - { - return $this->getParam(OpenIdProtocol::OpenIDProtocol_InvalidateHandle); - } -} diff --git a/app/libs/OpenId/Requests/OpenIdDHAssociationSessionRequest.php b/app/libs/OpenId/Requests/OpenIdDHAssociationSessionRequest.php deleted file mode 100644 index 918069b3..00000000 --- a/app/libs/OpenId/Requests/OpenIdDHAssociationSessionRequest.php +++ /dev/null @@ -1,142 +0,0 @@ -g_number = null; - $this->p_number = null; - $this->rp_pub_key = null; - } - - /** - * @param OpenIdMessage $message - * @return bool - */ - public static function IsOpenIdDHAssociationSessionRequest(OpenIdMessage $message) - { - if (OpenIdAssociationSessionRequest::IsOpenIdAssociationSessionRequest($message)) { - $session_type = $message->getParam(OpenIdProtocol::OpenIDProtocol_SessionType); - if ($session_type == OpenIdProtocol::AssociationSessionTypeDHSHA1 || $session_type == OpenIdProtocol::AssociationSessionTypeDHSHA256) - return true; - } - return false; - } - - /** - * @return bool - * @throws InvalidDHParam - * @throws InvalidAssociationTypeException - * @throws InvalidSessionTypeException - */ - public function isValid() - { - $res = parent::isValid(); - if (!$res) return false; - $dh_modulus = $this->getDHModulus(); - $dh_gen = $this->getDHGen(); - $dh_consumer_public = $this->getDHConsumerPublic(); - - if (empty($dh_modulus) || empty($dh_gen) || empty($dh_consumer_public)) - return false; - - if (!preg_match('/^\d+$/', $dh_modulus) || $dh_modulus < 11) { - return false; - } - // not a positive natural number greater than 1 ... - if (!preg_match('/^\d+$/', $dh_gen) || $dh_gen < 2) { - return false; - } - - return true; - } - - /** - * @return null|string - * @throws InvalidDHParam - */ - public function getDHModulus() - { - if (is_null($this->p_number)) { - $p_param = $this->getParam(OpenIdProtocol::OpenIdProtocol_DHModulus); - $p_bin = empty($p_param) ? pack('H*', OpenIdDHAssociationSessionRequest::DH_P) : base64_decode($p_param); - if (!$p_bin) - throw new InvalidDHParam(sprintf(OpenIdErrorMessages::InvalidDHParamMessage, OpenIdProtocol::OpenIdProtocol_DHModulus)); - $this->p_number = OpenIdCryptoHelper::convert($p_bin, DiffieHellman::FORMAT_BINARY, DiffieHellman::FORMAT_NUMBER); - } - return $this->p_number; - } - - /** - * @return null|string - * @throws InvalidDHParam - */ - public function getDHGen() - { - if (is_null($this->g_number)) { - $g_param = $this->getParam(OpenIdProtocol::OpenIdProtocol_DHGen); - $g_bin = empty($g_param) ? pack('H*', OpenIdDHAssociationSessionRequest::DH_G) : base64_decode($g_param); - if (!$g_bin) - throw new InvalidDHParam(sprintf(OpenIdErrorMessages::InvalidDHParamMessage, OpenIdProtocol::OpenIdProtocol_DHGen)); - $this->g_number = OpenIdCryptoHelper::convert($g_bin, DiffieHellman::FORMAT_BINARY, DiffieHellman::FORMAT_NUMBER); - } - return $this->g_number; - } - - /** - * @return null|string - * @throws InvalidDHParam - */ - public function getDHConsumerPublic() - { - if (is_null($this->rp_pub_key)) { - $rp_pub_key_param = $this->getParam(OpenIdProtocol::OpenIdProtocol_DHConsumerPublic); - if (empty($rp_pub_key_param)) - throw new InvalidDHParam(sprintf(OpenIdErrorMessages::InvalidDHParamMessage, OpenIdProtocol::OpenIdProtocol_DHConsumerPublic)); - $rp_pub_key_bin = base64_decode($rp_pub_key_param); - if (!$rp_pub_key_bin) - throw new InvalidDHParam(sprintf(OpenIdErrorMessages::InvalidDHParamMessage, OpenIdProtocol::OpenIdProtocol_DHConsumerPublic)); - $this->rp_pub_key = OpenIdCryptoHelper::convert($rp_pub_key_bin, DiffieHellman::FORMAT_BINARY, DiffieHellman::FORMAT_NUMBER); - } - return $this->rp_pub_key; - } - -} \ No newline at end of file diff --git a/app/libs/OpenId/Requests/OpenIdMessageMemento.php b/app/libs/OpenId/Requests/OpenIdMessageMemento.php deleted file mode 100644 index 7ddf9d77..00000000 --- a/app/libs/OpenId/Requests/OpenIdMessageMemento.php +++ /dev/null @@ -1,59 +0,0 @@ -state = $state; - } - - /** - * @return array - */ - public function getState(){ - return $this->state; - } - - /** - * @param OpenIdMessage $request - * @return OpenIdMessageMemento - */ - static public function buildFromRequest(OpenIdMessage $request){ - $r = new ReflectionObject($request); - $p = $r->getProperty('container'); - $p->setAccessible(true); - return new self($p->getValue($request)); - } - - /** - * @param array $state - * @return OpenIdMessageMemento - */ - static public function buildFromState(array $state){ - return new self($state); - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Requests/OpenIdRequest.php b/app/libs/OpenId/Requests/OpenIdRequest.php deleted file mode 100644 index de411b79..00000000 --- a/app/libs/OpenId/Requests/OpenIdRequest.php +++ /dev/null @@ -1,72 +0,0 @@ -message = $message; - } - - /** - * @return OpenIdMessage - */ - public function getMessage() - { - return $this->message; - } - - /** - * @return string - */ - public function getMode() - { - return $this->message->getMode(); - } - - /** - * @return bool - */ - abstract public function isValid(); - - /** - * @param OpenIDProtocol_ * $param - * @return string - */ - public function getParam($param) - { - return $this->message->getParam($param); - } - - /** - * @return string - */ - public function __toString() - { - return $this->message->__toString(); - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Responses/Contexts/ResponseContext.php b/app/libs/OpenId/Responses/Contexts/ResponseContext.php deleted file mode 100644 index 7a3f1bee..00000000 --- a/app/libs/OpenId/Responses/Contexts/ResponseContext.php +++ /dev/null @@ -1,36 +0,0 @@ -sign_params = []; - } - - /** - * @param string $param - * @return $this - */ - public function addSignParam($param) - { - array_push($this->sign_params, $param); - return $this; - } - - /** - * @return array - */ - public function getSignParams() - { - ksort($this->sign_params); - return $this->sign_params; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Responses/OpenIdAssociationSessionResponse.php b/app/libs/OpenId/Responses/OpenIdAssociationSessionResponse.php deleted file mode 100644 index 831af86d..00000000 --- a/app/libs/OpenId/Responses/OpenIdAssociationSessionResponse.php +++ /dev/null @@ -1,47 +0,0 @@ -setHttpCode(self::HttpErrorResponse); - $this[OpenIdProtocol::OpenIDProtocol_Error] = $error; - //opt values - if (!is_null($contact)) - $this[OpenIdProtocol::OpenIDProtocol_Contact] = $contact; - if (!is_null($reference)) - $this[OpenIdProtocol::OpenIDProtocol_Reference] = $reference; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Responses/OpenIdDirectResponse.php b/app/libs/OpenId/Responses/OpenIdDirectResponse.php deleted file mode 100644 index 724bf7e3..00000000 --- a/app/libs/OpenId/Responses/OpenIdDirectResponse.php +++ /dev/null @@ -1,80 +0,0 @@ -container !== null) { - ksort($this->container); - foreach ($this->container as $key => $value) { - if (is_array($value)) { - list($key, $value) = array($value[0], $value[1]); - } - - if (strpos($key, ':') !== false) { - throw new InvalidKVFormat(sprintf(OpenIdErrorMessages::InvalidKVFormatChar, $key, ':')); - } - - if (strpos($key, "\n") !== false) { - throw new InvalidKVFormat(sprintf(OpenIdErrorMessages::InvalidKVFormatChar, $key, '\\n')); - } - - if (strpos($value, "\n") !== false) { - throw new InvalidKVFormat(sprintf(OpenIdErrorMessages::InvalidKVFormatChar, $value, '\\n')); - } - $kv_format .= "$key:$value\n"; - } - } - return $kv_format; - } - - /** - * @return string - */ - public function getType() - { - return self::OpenIdDirectResponse; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Responses/OpenIdImmediateNegativeAssertion.php b/app/libs/OpenId/Responses/OpenIdImmediateNegativeAssertion.php deleted file mode 100644 index a3de1cb1..00000000 --- a/app/libs/OpenId/Responses/OpenIdImmediateNegativeAssertion.php +++ /dev/null @@ -1,37 +0,0 @@ -setMode(OpenIdProtocol::SetupNeededMode); - if (!is_null($return_url) && !empty($return_url)) { - $this->setReturnTo($return_url); - } - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Responses/OpenIdIndirectGenericErrorResponse.php b/app/libs/OpenId/Responses/OpenIdIndirectGenericErrorResponse.php deleted file mode 100644 index f423c01f..00000000 --- a/app/libs/OpenId/Responses/OpenIdIndirectGenericErrorResponse.php +++ /dev/null @@ -1,48 +0,0 @@ -setHttpCode(self::HttpErrorResponse); - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Error)] = $error; - //opt values - if (!is_null($contact)) - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Contact)] = $contact; - if (!is_null($reference)) - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Reference)] = $reference; - - if (!is_null($request)) { - $return_to = $request->getParam(OpenIdProtocol::OpenIDProtocol_ReturnTo); - if (!is_null($return_to) && !empty($return_to) && OpenIdUriHelper::checkReturnTo($return_to)) - $this->setReturnTo($return_to); - } - } - -} \ No newline at end of file diff --git a/app/libs/OpenId/Responses/OpenIdIndirectResponse.php b/app/libs/OpenId/Responses/OpenIdIndirectResponse.php deleted file mode 100644 index bf2120c7..00000000 --- a/app/libs/OpenId/Responses/OpenIdIndirectResponse.php +++ /dev/null @@ -1,83 +0,0 @@ -container !== null) { - ksort($this->container); - foreach ($this->container as $key => $value) { - if (is_array($value)) { - list($key, $value) = array($value[0], $value[1]); - } - $value = urlencode($value); - $url_encoded_format .= "$key=$value&"; - } - $url_encoded_format = rtrim($url_encoded_format, '&'); - } - return $url_encoded_format; - } - - /** - * @return string - */ - public function getType() - { - return self::OpenIdIndirectResponse; - } - - /** - * @param string $return_to - * @return $this - */ - public function setReturnTo($return_to) - { - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_ReturnTo)] = $return_to; - return $this; - } - - /** - * @return string - */ - public function getReturnTo() - { - return $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_ReturnTo)]; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Responses/OpenIdNonImmediateNegativeAssertion.php b/app/libs/OpenId/Responses/OpenIdNonImmediateNegativeAssertion.php deleted file mode 100644 index d270ba4c..00000000 --- a/app/libs/OpenId/Responses/OpenIdNonImmediateNegativeAssertion.php +++ /dev/null @@ -1,36 +0,0 @@ -setMode(OpenIdProtocol::CancelMode); - if (!is_null($return_url) && !empty($return_url)) { - $this->setReturnTo($return_url); - } - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Responses/OpenIdPositiveAssertionResponse.php b/app/libs/OpenId/Responses/OpenIdPositiveAssertionResponse.php deleted file mode 100644 index fa126d88..00000000 --- a/app/libs/OpenId/Responses/OpenIdPositiveAssertionResponse.php +++ /dev/null @@ -1,91 +0,0 @@ -setMode(OpenIdProtocol::IdMode); - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_OpEndpoint)] = $op_endpoint; - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_ClaimedId)] = $claimed_id; - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Identity)] = $identity; - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_ReturnTo)] = $return_to; - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Nonce)] = $nonce; - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Realm)] = $realm; - } - - /** - * @param string $assoc_handle - * @return $this - */ - public function setAssocHandle($assoc_handle) - { - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_AssocHandle)] = $assoc_handle; - return $this; - } - - /** - * @param string $signed - * @return $this - */ - public function setSigned($signed) - { - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Signed)] = $signed; - return $this; - } - - /** - * @return null|string - */ - public function getSig() - { - return $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Sig)]; - } - - /** - * @param string $sig - * @return $this - */ - public function setSig($sig) - { - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Sig)] = $sig; - return $this; - } - - /** - * @param string $invalidate_handle - * @return $this - */ - public function setInvalidateHandle($invalidate_handle) - { - $this[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_InvalidateHandle)] = $invalidate_handle; - return $this; - } - -} diff --git a/app/libs/OpenId/Responses/OpenIdResponse.php b/app/libs/OpenId/Responses/OpenIdResponse.php deleted file mode 100644 index 54847449..00000000 --- a/app/libs/OpenId/Responses/OpenIdResponse.php +++ /dev/null @@ -1,46 +0,0 @@ -container[OpenIdProtocol::param(OpenIdProtocol::OpenIDProtocol_Mode)] = $mode;; - } - -} \ No newline at end of file diff --git a/app/libs/OpenId/Responses/OpenIdUnencryptedAssociationSessionResponse.php b/app/libs/OpenId/Responses/OpenIdUnencryptedAssociationSessionResponse.php deleted file mode 100644 index a980d64b..00000000 --- a/app/libs/OpenId/Responses/OpenIdUnencryptedAssociationSessionResponse.php +++ /dev/null @@ -1,34 +0,0 @@ -setValue($raw_nonce); - return $identifier; - } - -} \ No newline at end of file diff --git a/app/libs/OpenId/Services/OpenIdServiceCatalog.php b/app/libs/OpenId/Services/OpenIdServiceCatalog.php deleted file mode 100644 index d3eb96da..00000000 --- a/app/libs/OpenId/Services/OpenIdServiceCatalog.php +++ /dev/null @@ -1,16 +0,0 @@ -getType(); - switch ($type) { - case OpenIdIndirectResponse::OpenIdIndirectResponse: - { - return ServiceLocator::getInstance()->getService(OpenIdIndirectResponse::OpenIdIndirectResponse); - } - break; - case OpenIdDirectResponse::OpenIdDirectResponse: - { - return ServiceLocator::getInstance()->getService(OpenIdDirectResponse::OpenIdDirectResponse); - } - break; - default: - throw new \Exception("Invalid OpenId response Type"); - break; - } - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Xrds/XRDSDocumentBuilder.php b/app/libs/OpenId/Xrds/XRDSDocumentBuilder.php deleted file mode 100644 index 90e80a71..00000000 --- a/app/libs/OpenId/Xrds/XRDSDocumentBuilder.php +++ /dev/null @@ -1,52 +0,0 @@ -elements = $elements; - $this->canonical_id = $canonical_id; - } - - public function render() - { - $XRDNamespace = self::XRDNamespace; - $XRDSNamespace = self::XRDSNamespace; - $header = "\n\n\n"; - $footer = "\n"; - $xrds = $header; - if (!is_null($this->canonical_id)) { - $xrds .= "{$this->canonical_id}\n"; - } - foreach ($this->elements as $service) { - $xrds .= $service->render(); - } - $xrds .= $footer; - return $xrds; - } -} \ No newline at end of file diff --git a/app/libs/OpenId/Xrds/XRDSService.php b/app/libs/OpenId/Xrds/XRDSService.php deleted file mode 100644 index 2dd7da92..00000000 --- a/app/libs/OpenId/Xrds/XRDSService.php +++ /dev/null @@ -1,70 +0,0 @@ -priority = $priority; - $this->type = $type; - $this->uri = $uri; - $this->local_id = $local_id; - $this->extensions = $extensions; - } - - public function render() - { - $local_id = empty($this->local_id) ? "" : "{$this->local_id}\n"; - - $extensions = ""; - foreach ($this->extensions as $extension) { - $extensions .= "{$extension}\n"; - } - - $element = "priority}\">\n{$this->type}\n{$extensions}{$this->uri}\n{$local_id}\n"; - return $element; - } - - public function getPriority() - { - return $this->priority; - } - - public function getType() - { - return $this->type; - } - - public function getUri() - { - return $this->uri; - } - - public function getLocalId() - { - return $this->local_id; - } -} \ No newline at end of file diff --git a/app/libs/Utils/.gitkeep b/app/libs/Utils/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/libs/Utils/ArrayUtils.php b/app/libs/Utils/ArrayUtils.php deleted file mode 100644 index 650b434b..00000000 --- a/app/libs/Utils/ArrayUtils.php +++ /dev/null @@ -1,42 +0,0 @@ -file_handle = fopen($filename, "r"); - if(!$this->file_handle) - throw new InvalidArgumentException; - } - - /** - * @param string $content - * @return array - */ - public static function load($content) - { - $data = str_getcsv($content,"\n" ); - $lines = array(); - $header = array(); - $idx = 0; - foreach($data as $row) - { - $row = str_getcsv($row, ","); - ++$idx; - if($idx === 1) { $header = $row; continue;} - $line = array(); - for($i=0; $i < count($header); $i++){ - $line[$header[$i]] = trim($row[$i]); - } - $lines[] = $line; - - } //parse the items in rows - return $lines; - } - - function __destruct() { - if($this->file_handle) fclose($this->file_handle); - } - - /** - * @return array|bool - */ - function getLine(){ - if (!feof($this->file_handle) ) { - return fgetcsv($this->file_handle, 1024); - } - return false; - } -} \ No newline at end of file diff --git a/app/libs/Utils/Db/ITransactionService.php b/app/libs/Utils/Db/ITransactionService.php deleted file mode 100644 index d555212e..00000000 --- a/app/libs/Utils/Db/ITransactionService.php +++ /dev/null @@ -1,28 +0,0 @@ - '-', // remove whitespace - '/_/' => '-', // underscores to dashes - '/[^A-Za-z0-9+.\-]+/' => '', // remove non-ASCII chars, only allow alphanumeric plus dash and dot - '/[\-]{2,}/' => '-', // remove duplicate dashes - '/^[\.\-_]+/' => '', // Remove all leading dots, dashes or underscores - ]; - - /** - * @param string $filename - * @return string - */ - public static function sanitize(string $filename):string { - $filename = trim(Transliterator::utf8ToAscii($filename)); - foreach(self::$default_replacements as $regex => $replace) { - $filename = preg_replace($regex, $replace, $filename); - } - return $filename; - } -} \ No newline at end of file diff --git a/app/libs/Utils/FileSystem/SwiftAdapter.php b/app/libs/Utils/FileSystem/SwiftAdapter.php deleted file mode 100644 index bf6e5480..00000000 --- a/app/libs/Utils/FileSystem/SwiftAdapter.php +++ /dev/null @@ -1,357 +0,0 @@ -setPathPrefix($prefix); - $this->container = $container; - } - - /** - * {@inheritdoc} - */ - public function write($path, $contents, Config $config, $size = 0) - { - $path = $this->applyPathPrefix($path); - - $data = $this->getWriteData($path, $config); - $type = 'content'; - - if (is_a($contents, 'GuzzleHttp\Psr7\Stream')) { - $type = 'stream'; - } - - $data[$type] = $contents; - - // Create large object if the stream is larger than 300 MiB (default). - if ($type === 'stream' && $size > $config->get('swiftLargeObjectThreshold', 314572800)) { - // Set the segment size to 100 MiB by default as suggested in OVH docs. - $data['segmentSize'] = $config->get('swiftSegmentSize', 104857600); - // Set segment container to the same container by default. - $data['segmentContainer'] = $config->get('swiftSegmentContainer', $this->container->name); - - $response = $this->container->createLargeObject($data); - } else { - $response = $this->container->createObject($data); - } - - return $this->normalizeObject($response); - } - - /** - * {@inheritdoc} - */ - public function writeStream($path, $resource, Config $config) - { - return $this->write($path, new Stream($resource), $config, fstat($resource)['size']); - } - - /** - * {@inheritdoc} - */ - public function update($path, $contents, Config $config) - { - return $this->write($path, $contents, $config); - } - - /** - * {@inheritdoc} - */ - public function updateStream($path, $resource, Config $config) - { - return $this->write($path, new Stream($resource), $config, fstat($resource)['size']); - } - - /** - * {@inheritdoc} - */ - public function rename($path, $newpath) - { - $object = $this->getObject($path); - $newLocation = $this->applyPathPrefix($newpath); - $destination = '/'.$this->container->name.'/'.ltrim($newLocation, '/'); - - try { - $response = $object->copy(compact('destination')); - } catch (BadResponseError $e) { - return false; - } - - $object->delete(); - - return true; - } - - /** - * {@inheritdoc} - */ - public function delete($path) - { - $object = $this->getObjectInstance($path); - - try { - $object->delete(); - } catch (BadResponseError $e) { - return false; - } - - return true; - } - - /** - * {@inheritdoc} - */ - public function deleteDir($dirname) - { - $objects = $this->container->listObjects([ - 'prefix' => $this->applyPathPrefix($dirname) - ]); - - try { - foreach ($objects as $object) { - $object->containerName = $this->container->name; - $object->delete(); - } - } catch (BadResponseError $e) { - return false; - } - - return true; - } - - /** - * {@inheritdoc} - */ - public function createDir($dirname, Config $config) - { - return ['path' => $dirname]; - } - - /** - * {@inheritdoc} - */ - public function has($path) - { - try { - $object = $this->getObject($path); - } catch (BadResponseError $e) { - $code = $e->getResponse()->getStatusCode(); - - if ($code == 404) return false; - - throw $e; - } - - return $this->normalizeObject($object); - } - - /** - * {@inheritdoc} - */ - public function read($path) - { - $object = $this->getObject($path); - $data = $this->normalizeObject($object); - - $stream = $object->download(); - $stream->rewind(); - $data['contents'] = $stream->getContents(); - - return $data; - } - - /** - * {@inheritdoc} - */ - public function readStream($path) - { - $object = $this->getObject($path); - $data = $this->normalizeObject($object); - - $stream = $object->download(); - $stream->rewind(); - $data['stream'] = StreamWrapper::getResource($stream); - - return $data; - } - - /** - * {@inheritdoc} - */ - public function listContents($directory = '', $recursive = false) - { - $location = $this->applyPathPrefix($directory); - - $objectList = $this->container->listObjects([ - 'prefix' => $directory - ]); - - $response = iterator_to_array($objectList); - - return Util::emulateDirectories(array_map([$this, 'normalizeObject'], $response)); - } - - /** - * {@inheritdoc} - */ - public function getMetadata($path) - { - $object = $this->getObject($path); - - return $this->normalizeObject($object); - } - - /** - * {@inheritdoc} - */ - public function getSize($path) - { - return $this->getMetadata($path); - } - - /** - * {@inheritdoc} - */ - public function getMimetype($path) - { - return $this->getMetadata($path); - } - - /** - * {@inheritdoc} - */ - public function getTimestamp($path) - { - return $this->getMetadata($path); - } - - /** - * Get the data properties to write or update an object. - * - * @param string $path - * @param Config $config - * - * @return array - */ - protected function getWriteData($path, $config) - { - return ['name' => $path]; - } - - /** - * Get an object instance. - * - * @param string $path - * - * @return StorageObject - */ - protected function getObjectInstance($path) - { - $location = $this->applyPathPrefix($path); - - $object = $this->container->getObject($location); - - return $object; - } - - /** - * Get an object instance and retrieve its metadata from storage. - * - * @param string $path - * - * @return StorageObject - */ - protected function getObject($path) - { - $object = $this->getObjectInstance($path); - $object->retrieve(); - - return $object; - } - - /** - * Normalize Openstack "StorageObject" object into an array - * - * @param StorageObject $object - * @return array - */ - protected function normalizeObject(StorageObject $object) - { - $name = $this->removePathPrefix($object->name); - $mimetype = explode('; ', $object->contentType); - - if ($object->lastModified instanceof \DateTimeInterface) { - $timestamp = $object->lastModified->getTimestamp(); - } else { - $timestamp = strtotime($object->lastModified); - } - - return [ - 'type' => 'file', - 'dirname' => Util::dirname($name), - 'path' => $name, - 'timestamp' => $timestamp, - 'mimetype' => reset($mimetype), - 'size' => $object->contentLength, - ]; - } - - - public function getTemporaryLink(string $path): ?string - { - return $this->getUrl($path); - } - - public function getTemporaryUrl(string $path): ?string - { - return $this->getUrl($path); - } - - public function getUrl(string $path): ?string - { - $obj = $this->container->getObject($path); - if(is_null($obj)) - return null; - return $obj->getPublicUri(); - } -} diff --git a/app/libs/Utils/FileSystem/SwiftServiceProvider.php b/app/libs/Utils/FileSystem/SwiftServiceProvider.php deleted file mode 100644 index 7152d368..00000000 --- a/app/libs/Utils/FileSystem/SwiftServiceProvider.php +++ /dev/null @@ -1,93 +0,0 @@ - $config["auth_url"], - 'region' => $config["region"], - ]; - - $userName = $config["user_name"] ?? null; - $userPassword = $config["api_key"] ?? null; - - if (!empty($userName) && !empty($userPassword)) { - - $configOptions['user'] = [ - 'name' => $userName, - 'password' => $userPassword, - 'domain' => ['id' => $config["user_domain"] ?? 'default'] - ]; - - $configOptions['scope'] = [ - 'project' => [ - 'name' => $config["project_name"], - 'domain' => ['id' => $config["project_domain"] ?? 'default'] - ], - ]; - } - - $appCredentialId = $config["app_credential_id"] ?? null; - $appCredentialSecret = $config["app_credential_secret"] ?? null; - - if (!empty($appCredentialId) && !empty($appCredentialSecret)) { - $configOptions['application_credential'] = [ - 'id' => $appCredentialId, - 'secret' => $appCredentialSecret, - ]; - } - - $openstackClient = new OpenStack($configOptions); - - $container = $openstackClient->objectStoreV1()->getContainer($config["container"]); - - return new Filesystem(new SwiftAdapter($container)); - } - catch (\Exception $ex){ - Log::error($ex); - return null; - } - }); - } -} diff --git a/app/libs/Utils/Http/HttpContentType.php b/app/libs/Utils/Http/HttpContentType.php deleted file mode 100644 index a7ee4105..00000000 --- a/app/libs/Utils/Http/HttpContentType.php +++ /dev/null @@ -1,41 +0,0 @@ - becomes $_REQUEST["a_b"]. - */ - const PHP_REQUEST_VAR_SEPARATOR = "_"; - /** - * @var array - */ - protected $container = []; - - /** - * @param array $values - */ - public function __construct(array $values = []) - { - $this->container = $values; - } - - /** - * @param mixed $offset - * @param mixed $value - */ - public function offsetSet($offset, $value) - { - if (is_null($offset)) { - $this->container[] = $value; - } else { - $this->container[$offset] = $value; - } - } - - /** - * @param mixed $offset - * @return bool - */ - public function offsetExists($offset) - { - return isset($this->container[$offset]); - } - - /** - * @param mixed $offset - */ - public function offsetUnset($offset) - { - unset($this->container[$offset]); - } - - /** - * @param mixed $offset - * @return null - */ - public function offsetGet($offset) - { - return isset($this->container[$offset]) ? $this->container[$offset] : null; - } - - /** - * @return string - */ - public function __toString() - { - $string = var_export(array_merge(array('from_ip' => IPHelper::getUserIp()), $this->container), true); - return (string)$string; - } -} diff --git a/app/libs/Utils/Http/HttpResponse.php b/app/libs/Utils/Http/HttpResponse.php deleted file mode 100644 index 14d508da..00000000 --- a/app/libs/Utils/Http/HttpResponse.php +++ /dev/null @@ -1,87 +0,0 @@ -http_code = $http_code; - $this->content_type = $content_type; - } - - abstract public function getContent(); - - /** - * @return int - */ - public function getHttpCode() - { - return $this->http_code; - } - - /** - * @param int $http_code - * @return $this; - */ - protected function setHttpCode($http_code) - { - $this->http_code = $http_code; - return $this; - } - - /** - * @return string - */ - public function getContentType() - { - return $this->content_type; - } - - /** - * @return mixed - */ - abstract public function getType(); - - /** - * @param string $name - * @param mixed $value - * @return $this - */ - public function addParam($name, $value) - { - $this[$name] = $value; - return $this; - } -} \ No newline at end of file diff --git a/app/libs/Utils/Http/HttpUtils.php b/app/libs/Utils/Http/HttpUtils.php deleted file mode 100644 index ce5acc7d..00000000 --- a/app/libs/Utils/Http/HttpUtils.php +++ /dev/null @@ -1,46 +0,0 @@ -getTimestamp(); - } - - /** - * @param $value - * @return string - */ - public static function toObfuscatedEmail($value){ - $em = explode("@", $value); - $name = implode(array_slice($em, 0, count($em) - 1), '@'); - $len = floor(mb_strlen($name) / 2); - $obfuscated_email = mb_substr($name, 0, $len) . str_repeat('*', $len) . "@" . end($em); - return $obfuscated_email; - } - - /** - * @param string $url - * @return string - */ - public static function encodeUrl(?string $url):?string{ - if(empty($url)) return null; - $url= rawurlencode($url); - $url = str_replace("%3A",":", $url); - $url = str_replace("%2F","/", $url); - $url = str_replace("%3D","=", $url); - $url = str_replace("%3F","?", $url); - $url = str_replace("%26","&", $url); - return $url; - } - -} \ No newline at end of file diff --git a/app/libs/Utils/MathUtils.php b/app/libs/Utils/MathUtils.php deleted file mode 100644 index 1b38d3a5..00000000 --- a/app/libs/Utils/MathUtils.php +++ /dev/null @@ -1,59 +0,0 @@ -= 0 && $p[$i] >= $p[$i + 1]; --$i) {} - - // if this doesn't occur, we've finished our permutations - // the array is reversed: (1, 2, 3, 4) => (4, 3, 2, 1) - if ($i == -1) - { - return false; - } - - // slide down the array looking for a bigger number than what we found before - for ($j = $size; $p[$j] <= $p[$i]; --$j) {} - - // swap them - $tmp = $p[$i]; - $p[$i] = $p[$j]; - $p[$j] = $tmp; - - // now reverse the elements in between by swapping the ends - for (++$i, $j = $size; $i < $j; ++$i, --$j) - { - $tmp = $p[$i]; - $p[$i] = $p[$j]; - $p[$j] = $tmp; - } - - return $p; - } -} \ No newline at end of file diff --git a/app/libs/Utils/Model/Identifier.php b/app/libs/Utils/Model/Identifier.php deleted file mode 100644 index bc9d947e..00000000 --- a/app/libs/Utils/Model/Identifier.php +++ /dev/null @@ -1,98 +0,0 @@ -lifetime = $lifetime; - $this->len = $len; - } - - /** - * @var int - */ - protected $len; - - /** - * @var int - */ - protected $lifetime; - /** - * @var string - */ - protected $value; - - /** - * @param IdentifierGenerator $generator - * @return $this - */ - public function generate(IdentifierGenerator $generator) - { - return $generator->generate($this); - } - - /** - * @return int - */ - public function getLenght() - { - return $this->len; - } - - /** - * @return int - */ - public function getLifetime() - { - return intval($this->lifetime); - } - - /** - * @return string - */ - public function getValue() - { - return $this->value; - } - - /** - * @param string $value - * @return $this - */ - public function setValue($value) - { - $this->value = $value; - return $this; - } - - /** - * @return string - */ - abstract public function getType(); - - /** - * @return array - */ - abstract public function toArray(): array; -} \ No newline at end of file diff --git a/app/libs/Utils/RequestUtils.php b/app/libs/Utils/RequestUtils.php deleted file mode 100644 index 247ad43a..00000000 --- a/app/libs/Utils/RequestUtils.php +++ /dev/null @@ -1,45 +0,0 @@ -match($request); - if(is_null($route)) return false; - $route_path = $route->uri(); - if (strpos($route_path, '/') != 0) - $route_path = '/' . $route_path; - - return $route_path; - } - catch (\Exception $ex) - { - Log::error($ex); - } - return false; - } - -} \ No newline at end of file diff --git a/app/libs/Utils/Services/IAuthService.php b/app/libs/Utils/Services/IAuthService.php deleted file mode 100644 index 37d7fcf5..00000000 --- a/app/libs/Utils/Services/IAuthService.php +++ /dev/null @@ -1,139 +0,0 @@ -cache_service = $cache_service; - } - - /** - * @param Identifier $identifier - * @return Identifier - */ - public function generate(Identifier $identifier){ - - do - { - $key = sprintf("%s.%s", $identifier->getType(), Hash::compute('sha256', $this->_generate($identifier)->getValue())); - } - while(!$this->cache_service->addSingleValue($key, $key)); - return $identifier; - } - - /** - * @param Identifier $identifier - * @return Identifier - */ - abstract protected function _generate(Identifier $identifier); - -} \ No newline at end of file diff --git a/app/libs/Utils/Services/UtilsServiceCatalog.php b/app/libs/Utils/Services/UtilsServiceCatalog.php deleted file mode 100644 index 7bdd545b..00000000 --- a/app/libs/Utils/Services/UtilsServiceCatalog.php +++ /dev/null @@ -1,16 +0,0 @@ -normalize(); - } - - /** - * @param string $url - * @param bool $usePort - * @return string|null - */ - public static function canonicalUrl(string $url, bool $usePort = true):?string{ - if(!filter_var($url, FILTER_VALIDATE_URL)) return null; - $parts = @parse_url($url); - if ($parts == false) - { - return null; - } - $canonical_url = $parts['scheme'].'://'.strtolower($parts['host']); - if(isset($parts['port']) && $usePort) { - $canonical_url .= ':'.strtolower($parts['port']); - } - if(isset($parts['path'])) { - $canonical_url .= strtolower($parts['path']); - } - return rtrim($canonical_url, '/'); - } - - /** - * @param string $uri - * @return bool - */ - public static function isHTTPS(string $uri):bool{ - if(!filter_var($uri, FILTER_VALIDATE_URL)) return null; - $parts = @parse_url($uri); - if ($parts == false) - { - return null; - } - return $parts['scheme'] === 'https'; - } - - /** - * Get all possible sub-domains for a given url - * @param string $url - * @return array - */ - public static function getSubDomains(string $url):array - { - $res = []; - $url = strtolower($url); - $scheme = self::getScheme($url); - //add entire url as first domain - $res[] = $url; - - $ends_with_slash = substr($url, -1) == '/'; - $url = parse_url($url); - $authority = $url['host']; - $components = explode('.', $authority); - $len = count($components); - - for ($i = 0; $i < $len; $i++) { - if ($components[$i] == '*') continue; - $str = ''; - for ($j = $i; $j < $len; $j++) - $str .= $components[$j] . '.'; - $str = trim($str, '.'); - $str = $ends_with_slash ? $str . '/' : $str; - $newSubDomain = $scheme . '*.' . $str; - if(!in_array($newSubDomain, $res)) - $res[] = $newSubDomain; - } - // remove generic domain - if(count($res) > 0) - { - array_pop($res); - } - return $res; - } - - /** - * @param string $url - * @return string|null - */ - public static function getScheme(string $url):?string - { - $url = parse_url(strtolower($url)); - if(!$url) return null; - if (isset($url['scheme']) && !empty($url['scheme'])) { - return $url['scheme'] . '://'; - } - return null; - } - -} \ No newline at end of file diff --git a/artisan b/artisan deleted file mode 100755 index 5c23e2e2..00000000 --- a/artisan +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env php -make(Illuminate\Contracts\Console\Kernel::class); - -$status = $kernel->handle( - $input = new Symfony\Component\Console\Input\ArgvInput, - new Symfony\Component\Console\Output\ConsoleOutput -); - -/* -|-------------------------------------------------------------------------- -| Shutdown The Application -|-------------------------------------------------------------------------- -| -| Once Artisan has finished running, we will fire off the shutdown events -| so that any final work may be done by the application before we shut -| down the process. This is the last thing to happen to the request. -| -*/ - -$kernel->terminate($input, $status); - -exit($status); diff --git a/behat.yml b/behat.yml deleted file mode 100644 index cc02a05b..00000000 --- a/behat.yml +++ /dev/null @@ -1,13 +0,0 @@ -#behat.yml -default: - autoload: - '': %paths.base%/app/tests/features/bootstrap - suites: - default: - paths: - - %paths.base%/app/tests/features - extensions: - Behat\MinkExtension: - goutte: - guzzle_parameters: - ssl.certificate_authority: false \ No newline at end of file diff --git a/bindep.txt b/bindep.txt deleted file mode 100644 index 55338966..00000000 --- a/bindep.txt +++ /dev/null @@ -1,21 +0,0 @@ -php7.2 [platform:dpkg] - -php7.2-cli [platform:dpkg] - -php7.2-common [platform:dpkg] - -php7.2-curl [platform:dpkg] - -php7.2-gd [platform:dpkg] - -php7.2-json [platform:dpkg] - -php7.2-mysqlnd [platform:dpkg] - -php7.2-xml [platform:dpkg] - -php7.2-mbstring [platform:dpkg] - -php7.2-gmp [platform:dpkg] - -php7.2-ssh2 [platform:dpkg] diff --git a/bootstrap/app.php b/bootstrap/app.php deleted file mode 100644 index f2801adf..00000000 --- a/bootstrap/app.php +++ /dev/null @@ -1,55 +0,0 @@ -singleton( - Illuminate\Contracts\Http\Kernel::class, - App\Http\Kernel::class -); - -$app->singleton( - Illuminate\Contracts\Console\Kernel::class, - App\Console\Kernel::class -); - -$app->singleton( - Illuminate\Contracts\Debug\ExceptionHandler::class, - App\Exceptions\Handler::class -); - -/* -|-------------------------------------------------------------------------- -| Return The Application -|-------------------------------------------------------------------------- -| -| This script returns the application instance. The instance is given to -| the calling script so we can separate the building of the instances -| from the actual running of the application and sending responses. -| -*/ - -return $app; diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php deleted file mode 100644 index 38301379..00000000 --- a/bootstrap/autoload.php +++ /dev/null @@ -1,34 +0,0 @@ -=5.4" - }, - "require-dev": { - "doctrine/orm": "^2.5", - "friendsofphp/php-cs-fixer": "^2.2.19", - "nesbot/carbon": "*", - "phpunit/phpunit": "^4.5", - "symfony/yaml": "^2.6", - "zf1/zend-date": "^1.12", - "zf1/zend-registry": "^1.12" - }, - "type": "library", - "autoload": { - "psr-4": { - "DoctrineExtensions\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Steve Lacey", - "email": "steve@stevelacey.net" - } - ], - "description": "A set of extensions to Doctrine 2 that add support for additional query functions available in MySQL and Oracle.", - "keywords": [ - "database", - "doctrine", - "orm" - ], - "time": "2018-09-26T16:18:17+00:00" - }, - { - "name": "behat/transliterator", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/Behat/Transliterator.git", - "reference": "3c4ec1d77c3d05caa1f0bf8fb3aae4845005c7fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Behat/Transliterator/zipball/3c4ec1d77c3d05caa1f0bf8fb3aae4845005c7fc", - "reference": "3c4ec1d77c3d05caa1f0bf8fb3aae4845005c7fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "chuyskywalker/rolling-curl": "^3.1", - "php-yaoi/php-yaoi": "^1.0", - "phpunit/phpunit": "^4.8.36|^6.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, - "autoload": { - "psr-4": { - "Behat\\Transliterator\\": "src/Behat/Transliterator" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Artistic-1.0" - ], - "description": "String transliterator", - "keywords": [ - "i18n", - "slug", - "transliterator" - ], - "time": "2020-01-14T16:39:13+00:00" - }, - { - "name": "container-interop/container-interop", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/container-interop/container-interop.git", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "shasum": "" - }, - "require": { - "psr/container": "^1.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Interop\\Container\\": "src/Interop/Container/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", - "homepage": "https://github.com/container-interop/container-interop", - "abandoned": "psr/container", - "time": "2017-02-14T19:40:03+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "time": "2019-12-04T15:06:13+00:00" - }, - { - "name": "doctrine/annotations", - "version": "1.10.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "bfe91e31984e2ba76df1c1339681770401ec262f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/bfe91e31984e2ba76df1c1339681770401ec262f", - "reference": "bfe91e31984e2ba76df1c1339681770401ec262f", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/cache": "1.*", - "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^9.1.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "time": "2020-08-10T19:35:50+00:00" - }, - { - "name": "doctrine/cache", - "version": "1.10.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "time": "2020-07-07T18:54:01+00:00" - }, - { - "name": "doctrine/collections", - "version": "1.6.7", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "shasum": "" - }, - "require": { - "php": "^7.1.3 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", - "homepage": "https://www.doctrine-project.org/projects/collections.html", - "keywords": [ - "array", - "collections", - "iterators", - "php" - ], - "time": "2020-07-27T17:53:49+00:00" - }, - { - "name": "doctrine/common", - "version": "2.12.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", - "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.0", - "doctrine/collections": "^1.0", - "doctrine/event-manager": "^1.0", - "doctrine/inflector": "^1.0", - "doctrine/lexer": "^1.0", - "doctrine/persistence": "^1.1", - "doctrine/reflection": "^1.0", - "php": "^7.1" - }, - "require-dev": { - "doctrine/coding-standard": "^1.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpunit/phpunit": "^7.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^4.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", - "homepage": "https://www.doctrine-project.org/projects/common.html", - "keywords": [ - "common", - "doctrine", - "php" - ], - "time": "2020-01-10T15:49:25+00:00" - }, - { - "name": "doctrine/dbal", - "version": "2.10.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "47433196b6390d14409a33885ee42b6208160643" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/47433196b6390d14409a33885ee42b6208160643", - "reference": "47433196b6390d14409a33885ee42b6208160643", - "shasum": "" - }, - "require": { - "doctrine/cache": "^1.0", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.2" - }, - "require-dev": { - "doctrine/coding-standard": "^8.1", - "jetbrains/phpstorm-stubs": "^2019.1", - "nikic/php-parser": "^4.4", - "phpstan/phpstan": "^0.12.40", - "phpunit/phpunit": "^8.5.5", - "psalm/plugin-phpunit": "^0.10.0", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "^3.14.2" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.10.x-dev", - "dev-develop": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlanywhere", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "time": "2020-09-12T21:20:41+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.9@dev" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "time": "2020-05-29T18:28:51+00:00" - }, - { - "name": "doctrine/inflector", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector", - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], - "time": "2020-05-29T07:19:59+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2020-05-29T17:27:14+00:00" - }, - { - "name": "doctrine/lexer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "time": "2020-05-25T17:44:05+00:00" - }, - { - "name": "doctrine/migrations", - "version": "v1.8.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/migrations.git", - "reference": "215438c0eef3e5f9b7da7d09c6b90756071b43e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6", - "reference": "215438c0eef3e5f9b7da7d09c6b90756071b43e6", - "shasum": "" - }, - "require": { - "doctrine/dbal": "~2.6", - "ocramius/proxy-manager": "^1.0|^2.0", - "php": "^7.1", - "symfony/console": "~3.3|^4.0" - }, - "require-dev": { - "doctrine/coding-standard": "^1.0", - "doctrine/orm": "~2.5", - "jdorn/sql-formatter": "~1.1", - "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": "~7.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/yaml": "~3.3|^4.0" - }, - "suggest": { - "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command.", - "symfony/yaml": "Allows the use of yaml for migration configuration files." - }, - "bin": [ - "bin/doctrine-migrations" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "v1.8.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\Migrations\\": "lib/Doctrine/DBAL/Migrations", - "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Michael Simonson", - "email": "contact@mikesimonson.com" - } - ], - "description": "Database Schema migrations using Doctrine DBAL", - "homepage": "https://www.doctrine-project.org/projects/migrations.html", - "keywords": [ - "database", - "migrations" - ], - "time": "2018-06-06T21:00:30+00:00" - }, - { - "name": "doctrine/orm", - "version": "v2.6.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/orm.git", - "reference": "b52ef5a1002f99ab506a5a2d6dba5a2c236c5f43" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/b52ef5a1002f99ab506a5a2d6dba5a2c236c5f43", - "reference": "b52ef5a1002f99ab506a5a2d6dba5a2c236c5f43", - "shasum": "" - }, - "require": { - "doctrine/annotations": "~1.5", - "doctrine/cache": "~1.6", - "doctrine/collections": "^1.4", - "doctrine/common": "^2.7.1", - "doctrine/dbal": "^2.6", - "doctrine/instantiator": "~1.1", - "ext-pdo": "*", - "php": "^7.1", - "symfony/console": "~3.0|~4.0" - }, - "require-dev": { - "doctrine/coding-standard": "^5.0", - "phpunit/phpunit": "^7.5", - "symfony/yaml": "~3.4|~4.0" - }, - "suggest": { - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" - }, - "bin": [ - "bin/doctrine" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\ORM\\": "lib/Doctrine/ORM" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "orm" - ], - "time": "2019-09-20T14:30:26+00:00" - }, - { - "name": "doctrine/persistence", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/persistence.git", - "reference": "3da7c9d125591ca83944f477e65ed3d7b4617c48" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/3da7c9d125591ca83944f477e65ed3d7b4617c48", - "reference": "3da7c9d125591ca83944f477e65ed3d7b4617c48", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.0", - "doctrine/collections": "^1.0", - "doctrine/event-manager": "^1.0", - "doctrine/reflection": "^1.0", - "php": "^7.1" - }, - "conflict": { - "doctrine/common": "<2.10@dev" - }, - "require-dev": { - "doctrine/coding-standard": "^5.0", - "phpstan/phpstan": "^0.8", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", - "homepage": "https://doctrine-project.org/projects/persistence.html", - "keywords": [ - "mapper", - "object", - "odm", - "orm", - "persistence" - ], - "time": "2019-04-23T08:28:24+00:00" - }, - { - "name": "doctrine/reflection", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/reflection.git", - "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/55e71912dfcd824b2fdd16f2d9afe15684cfce79", - "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "ext-tokenizer": "*", - "php": "^7.1" - }, - "conflict": { - "doctrine/common": "<2.9" - }, - "require-dev": { - "doctrine/coding-standard": "^5.0", - "doctrine/common": "^2.10", - "phpstan/phpstan": "^0.11.0", - "phpstan/phpstan-phpunit": "^0.11.0", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Reflection project is a simple library used by the various Doctrine projects which adds some additional functionality on top of the reflection functionality that comes with PHP. It allows you to get the reflection information about classes, methods and properties statically.", - "homepage": "https://www.doctrine-project.org/projects/reflection.html", - "keywords": [ - "reflection", - "static" - ], - "time": "2020-03-27T11:06:43+00:00" - }, - { - "name": "dragonmantank/cron-expression", - "version": "v2.3.0", - "source": { - "type": "git", - "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27", - "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.4|^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Chris Tankersley", - "email": "chris@ctankersley.com", - "homepage": "https://github.com/dragonmantank" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "time": "2019-03-31T00:38:28+00:00" - }, - { - "name": "egulias/email-validator", - "version": "2.1.20", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "f46887bc48db66c7f38f668eb7d6ae54583617ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f46887bc48db66c7f38f668eb7d6ae54583617ff", - "reference": "f46887bc48db66c7f38f668eb7d6ae54583617ff", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" - }, - "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" - }, - "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Egulias\\EmailValidator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eduardo Gulias Davis" - } - ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", - "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" - ], - "time": "2020-09-06T13:44:32+00:00" - }, - { - "name": "enqueue/amqp-lib", - "version": "0.9.14", - "source": { - "type": "git", - "url": "https://github.com/php-enqueue/amqp-lib.git", - "reference": "11e4b3eb8df5ad9506fd048a0922303483a3e3a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/amqp-lib/zipball/11e4b3eb8df5ad9506fd048a0922303483a3e3a1", - "reference": "11e4b3eb8df5ad9506fd048a0922303483a3e3a1", - "shasum": "" - }, - "require": { - "enqueue/amqp-tools": "^0.9", - "php": "^7.1.3", - "php-amqplib/php-amqplib": "^2.10", - "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7|^0.8" - }, - "require-dev": { - "enqueue/null": "0.9.x-dev", - "enqueue/test": "0.9.x-dev", - "phpunit/phpunit": "~5.4.0", - "queue-interop/queue-spec": "^0.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Enqueue\\AmqpLib\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Message Queue Amqp Transport", - "homepage": "https://enqueue.forma-pro.com/", - "keywords": [ - "AMQP", - "messaging", - "queue" - ], - "time": "2019-10-13T19:50:26+00:00" - }, - { - "name": "enqueue/amqp-tools", - "version": "0.9.12", - "source": { - "type": "git", - "url": "https://github.com/php-enqueue/amqp-tools.git", - "reference": "eeb0f02949c49803be9a0664f2e3f90241d71913" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/amqp-tools/zipball/eeb0f02949c49803be9a0664f2e3f90241d71913", - "reference": "eeb0f02949c49803be9a0664f2e3f90241d71913", - "shasum": "" - }, - "require": { - "enqueue/dsn": "^0.9.2", - "php": "^7.1.3", - "queue-interop/amqp-interop": "^0.8", - "queue-interop/queue-interop": "^0.7|^0.8" - }, - "require-dev": { - "enqueue/null": "0.9.x-dev", - "enqueue/test": "0.9.x-dev", - "phpunit/phpunit": "~5.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Enqueue\\AmqpTools\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Message Queue Amqp Tools", - "homepage": "https://enqueue.forma-pro.com/", - "keywords": [ - "AMQP", - "messaging", - "queue" - ], - "time": "2019-05-29T15:08:39+00:00" - }, - { - "name": "enqueue/dsn", - "version": "0.9.2", - "source": { - "type": "git", - "url": "https://github.com/php-enqueue/dsn.git", - "reference": "5d011c648395307c740d8c0e420f8a9faebce72f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/dsn/zipball/5d011c648395307c740d8c0e420f8a9faebce72f", - "reference": "5d011c648395307c740d8c0e420f8a9faebce72f", - "shasum": "" - }, - "require": { - "php": "^7.1.3" - }, - "require-dev": { - "phpunit/phpunit": "~5.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Enqueue\\Dsn\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Parse DSN", - "homepage": "https://enqueue.forma-pro.com/", - "keywords": [ - "dsn", - "parse" - ], - "time": "2018-11-28T17:29:36+00:00" - }, - { - "name": "erusev/parsedown", - "version": "1.7.4", - "source": { - "type": "git", - "url": "https://github.com/erusev/parsedown.git", - "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3", - "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35" - }, - "type": "library", - "autoload": { - "psr-0": { - "Parsedown": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Emanuil Rusev", - "email": "hello@erusev.com", - "homepage": "http://erusev.com" - } - ], - "description": "Parser for Markdown.", - "homepage": "http://parsedown.org", - "keywords": [ - "markdown", - "parser" - ], - "time": "2019-12-30T22:54:17+00:00" - }, - { - "name": "ezyang/htmlpurifier", - "version": "v4.12.0", - "source": { - "type": "git", - "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "a617e55bc62a87eec73bd456d146d134ad716f03" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/a617e55bc62a87eec73bd456d146d134ad716f03", - "reference": "a617e55bc62a87eec73bd456d146d134ad716f03", - "shasum": "" - }, - "require": { - "php": ">=5.2" - }, - "require-dev": { - "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" - }, - "type": "library", - "autoload": { - "psr-0": { - "HTMLPurifier": "library/" - }, - "files": [ - "library/HTMLPurifier.composer.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ - { - "name": "Edward Z. Yang", - "email": "admin@htmlpurifier.org", - "homepage": "http://ezyang.com" - } - ], - "description": "Standards compliant HTML filter written in PHP", - "homepage": "http://htmlpurifier.org/", - "keywords": [ - "html" - ], - "time": "2019-10-28T03:44:26+00:00" - }, - { - "name": "fideloper/proxy", - "version": "4.4.0", - "source": { - "type": "git", - "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8", - "reference": "9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0", - "php": ">=5.4.0" - }, - "require-dev": { - "illuminate/http": "^5.0|^6.0|^7.0|^8.0", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Fideloper\\Proxy\\TrustedProxyServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Fideloper\\Proxy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Fidao", - "email": "fideloper@gmail.com" - } - ], - "description": "Set trusted proxies for Laravel", - "keywords": [ - "load balancing", - "proxy", - "trusted proxy" - ], - "time": "2020-06-23T01:36:47+00:00" - }, - { - "name": "firebase/php-jwt", - "version": "v5.2.0", - "source": { - "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/feb0e820b8436873675fd3aca04f3728eb2185cb", - "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": ">=4.8 <=9" - }, - "type": "library", - "autoload": { - "psr-4": { - "Firebase\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" - } - ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt", - "keywords": [ - "jwt", - "php" - ], - "time": "2020-03-25T18:49:23+00:00" - }, - { - "name": "get-stream/stream-chat", - "version": "1.1.8", - "source": { - "type": "git", - "url": "https://github.com/GetStream/stream-chat-php.git", - "reference": "be33bdc65960aff17f62b49580bc99f5cf9d8c0a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/GetStream/stream-chat-php/zipball/be33bdc65960aff17f62b49580bc99f5cf9d8c0a", - "reference": "be33bdc65960aff17f62b49580bc99f5cf9d8c0a", - "shasum": "" - }, - "require": { - "firebase/php-jwt": "^v5.0.0", - "guzzlehttp/guzzle": "^6.3.3 || ^7.0.1", - "php": ">=5.7" - }, - "require-dev": { - "phpunit/phpunit": "^8.2.1", - "ramsey/uuid": "^3.8.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "GetStream\\StreamChat": "lib/" - }, - "psr-4": { - "GetStream\\Unit\\": "tests/unit/", - "GetStream\\Integration\\": "tests/integration/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "authors": [ - { - "name": "Tommaso Barbugli", - "email": "support@getstream.io" - } - ], - "description": "A PHP client for Stream Chat (https://getstream.io/chat/)", - "homepage": "https://getstream.io/chat/", - "keywords": [ - "api", - "chat", - "chat-sdk", - "stream" - ], - "time": "2020-09-10T14:33:21+00:00" - }, - { - "name": "glenscott/url-normalizer", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/glenscott/url-normalizer.git", - "reference": "b8e79d3360a1bd7182398c9956bd74d219ad1b3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/glenscott/url-normalizer/zipball/b8e79d3360a1bd7182398c9956bd74d219ad1b3c", - "reference": "b8e79d3360a1bd7182398c9956bd74d219ad1b3c", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "URL\\": "src/URL" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Glen Scott", - "email": "glen@glenscott.co.uk" - } - ], - "description": "Syntax based normalization of URL's", - "time": "2015-06-11T16:06:02+00:00" - }, - { - "name": "greggilbert/recaptcha", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/smarcet/recaptcha.git", - "reference": "1a073444e0218f807c72a4fa01d91d6ce01bc3af" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/smarcet/recaptcha/zipball/1a073444e0218f807c72a4fa01d91d6ce01bc3af", - "reference": "1a073444e0218f807c72a4fa01d91d6ce01bc3af", - "shasum": "" - }, - "require": { - "illuminate/support": "~5.1", - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/migrations" - ], - "psr-4": { - "Greggilbert\\Recaptcha\\": "src/" - } - }, - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Greg Gilbert", - "email": "greg@greg-gilbert.com" - } - ], - "description": "reCAPTCHA Validator for Laravel 5", - "homepage": "http://github.com/greggilbert/recaptcha", - "keywords": [ - "captcha", - "laravel", - "laravel5", - "recaptcha" - ], - "support": { - "source": "https://github.com/smarcet/recaptcha/tree/master" - }, - "abandoned": true, - "time": "2020-09-14T14:33:58+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.3.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", - "shasum": "" - }, - "require": { - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4", - "php": ">=5.5" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.0" - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.3-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2018-04-22T15:46:56+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "v1.3.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2016-12-20T10:07:11+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" - }, - "suggest": { - "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "time": "2019-07-01T23:21:34+00:00" - }, - { - "name": "ircmaxell/random-lib", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/ircmaxell/RandomLib.git", - "reference": "13efa4368bb2ac88bb3b1459b487d907de4dbf7c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ircmaxell/RandomLib/zipball/13efa4368bb2ac88bb3b1459b487d907de4dbf7c", - "reference": "13efa4368bb2ac88bb3b1459b487d907de4dbf7c", - "shasum": "" - }, - "require": { - "ircmaxell/security-lib": "1.0.*@dev", - "php": ">=5.3.2" - }, - "require-dev": { - "mikey179/vfsstream": "1.1.*", - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "RandomLib": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Anthony Ferrara", - "email": "ircmaxell@ircmaxell.com", - "homepage": "http://blog.ircmaxell.com" - } - ], - "description": "A Library For Generating Secure Random Numbers", - "homepage": "https://github.com/ircmaxell/RandomLib", - "keywords": [ - "cryptography", - "random", - "random-numbers", - "random-strings" - ], - "time": "2015-01-15T16:31:45+00:00" - }, - { - "name": "ircmaxell/security-lib", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/ircmaxell/SecurityLib.git", - "reference": "80934de3c482dcafb46b5756e59ebece082b6dc7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ircmaxell/SecurityLib/zipball/80934de3c482dcafb46b5756e59ebece082b6dc7", - "reference": "80934de3c482dcafb46b5756e59ebece082b6dc7", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "mikey179/vfsstream": "1.1.*" - }, - "type": "library", - "autoload": { - "psr-0": { - "SecurityLib": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Anthony Ferrara", - "email": "ircmaxell@ircmaxell.com", - "homepage": "http://blog.ircmaxell.com" - } - ], - "description": "A Base Security Library", - "homepage": "https://github.com/ircmaxell/PHP-SecurityLib", - "time": "2013-04-30T18:00:34+00:00" - }, - { - "name": "jakub-onderka/php-console-color", - "version": "v0.2", - "source": { - "type": "git", - "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", - "reference": "d5deaecff52a0d61ccb613bb3804088da0307191" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191", - "reference": "d5deaecff52a0d61ccb613bb3804088da0307191", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "jakub-onderka/php-code-style": "1.0", - "jakub-onderka/php-parallel-lint": "1.0", - "jakub-onderka/php-var-dump-check": "0.*", - "phpunit/phpunit": "~4.3", - "squizlabs/php_codesniffer": "1.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "JakubOnderka\\PhpConsoleColor\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Jakub Onderka", - "email": "jakub.onderka@gmail.com" - } - ], - "abandoned": "php-parallel-lint/php-console-color", - "time": "2018-09-29T17:23:10+00:00" - }, - { - "name": "jakub-onderka/php-console-highlighter", - "version": "v0.4", - "source": { - "type": "git", - "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", - "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547", - "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "jakub-onderka/php-console-color": "~0.2", - "php": ">=5.4.0" - }, - "require-dev": { - "jakub-onderka/php-code-style": "~1.0", - "jakub-onderka/php-parallel-lint": "~1.0", - "jakub-onderka/php-var-dump-check": "~0.1", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "JakubOnderka\\PhpConsoleHighlighter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jakub Onderka", - "email": "acci@acci.cz", - "homepage": "http://www.acci.cz/" - } - ], - "description": "Highlight PHP code in terminal", - "abandoned": "php-parallel-lint/php-console-highlighter", - "time": "2018-09-29T18:48:56+00:00" - }, - { - "name": "jaybizzle/crawler-detect", - "version": "v1.2.99", - "source": { - "type": "git", - "url": "https://github.com/JayBizzle/Crawler-Detect.git", - "reference": "0ffea34489b258a2709bfe93a9553e1efa5d1904" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/0ffea34489b258a2709bfe93a9553e1efa5d1904", - "reference": "0ffea34489b258a2709bfe93a9553e1efa5d1904", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8|^5.5|^6.5", - "satooshi/php-coveralls": "1.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Jaybizzle\\CrawlerDetect\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Beech", - "email": "m@rkbee.ch", - "role": "Developer" - } - ], - "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent", - "homepage": "https://github.com/JayBizzle/Crawler-Detect/", - "keywords": [ - "crawler", - "crawler detect", - "crawler detector", - "crawlerdetect", - "php crawler detect" - ], - "time": "2020-08-25T21:35:55+00:00" - }, - { - "name": "jenssegers/agent", - "version": "v2.6.3", - "source": { - "type": "git", - "url": "https://github.com/jenssegers/agent.git", - "reference": "bcb895395e460478e101f41cdab139c48dc721ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jenssegers/agent/zipball/bcb895395e460478e101f41cdab139c48dc721ce", - "reference": "bcb895395e460478e101f41cdab139c48dc721ce", - "shasum": "" - }, - "require": { - "jaybizzle/crawler-detect": "^1.2", - "mobiledetect/mobiledetectlib": "^2.7.6", - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5.0|^6.0|^7.0" - }, - "suggest": { - "illuminate/support": "^4.0|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - }, - "laravel": { - "providers": [ - "Jenssegers\\Agent\\AgentServiceProvider" - ], - "aliases": { - "Agent": "Jenssegers\\Agent\\Facades\\Agent" - } - } - }, - "autoload": { - "psr-4": { - "Jenssegers\\Agent\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jens Segers", - "homepage": "https://jenssegers.com" - } - ], - "description": "Desktop/mobile user agent parser with support for Laravel, based on Mobiledetect", - "homepage": "https://github.com/jenssegers/agent", - "keywords": [ - "Agent", - "browser", - "desktop", - "laravel", - "mobile", - "platform", - "user agent", - "useragent" - ], - "time": "2019-01-19T21:32:55+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "5.2.10", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "time": "2020-05-27T16:41:55+00:00" - }, - { - "name": "kylekatarnls/update-helper", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/kylekatarnls/update-helper.git", - "reference": "429be50660ed8a196e0798e5939760f168ec8ce9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kylekatarnls/update-helper/zipball/429be50660ed8a196e0798e5939760f168ec8ce9", - "reference": "429be50660ed8a196e0798e5939760f168ec8ce9", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0.0", - "php": ">=5.3.0" - }, - "require-dev": { - "codeclimate/php-test-reporter": "dev-master", - "composer/composer": "2.0.x-dev || ^2.0.0-dev", - "phpunit/phpunit": ">=4.8.35 <6.0" - }, - "type": "composer-plugin", - "extra": { - "class": "UpdateHelper\\ComposerPlugin" - }, - "autoload": { - "psr-0": { - "UpdateHelper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kyle", - "email": "kylekatarnls@gmail.com" - } - ], - "description": "Update helper", - "time": "2020-04-07T20:44:10+00:00" - }, - { - "name": "laravel-doctrine/extensions", - "version": "1.0.14", - "source": { - "type": "git", - "url": "https://github.com/laravel-doctrine/extensions.git", - "reference": "a2e7896100559ecc64504252dbc74ec18ad59813" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel-doctrine/extensions/zipball/a2e7896100559ecc64504252dbc74ec18ad59813", - "reference": "a2e7896100559ecc64504252dbc74ec18ad59813", - "shasum": "" - }, - "require": { - "illuminate/auth": "~5.1", - "illuminate/config": "~5.1", - "illuminate/contracts": "~5.1", - "illuminate/http": "~5.1", - "illuminate/support": "~5.1", - "laravel-doctrine/orm": "~1.0", - "php": ">=5.5.9" - }, - "require-dev": { - "beberlei/doctrineextensions": "^1.0", - "gedmo/doctrine-extensions": "^2.4", - "mockery/mockery": "~0.9", - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "beberlei/DoctrineExtensions": "Query/Type Doctrine2 extensions (^1.0)", - "gedmo/doctrine-extensions": "Behavioral Doctrine2 extensions (^2.4)" - }, - "type": "library", - "autoload": { - "psr-4": { - "LaravelDoctrine\\Extensions\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Patrick Brouwers", - "email": "patrick@maatwebsite.nl" - } - ], - "description": "Doctrine extensions for Doctrine 2 and Laravel 5", - "keywords": [ - "beberlei", - "data mapper", - "database", - "doctrine", - "gedmo", - "laravel", - "orm" - ], - "time": "2018-03-01T17:07:28+00:00" - }, - { - "name": "laravel-doctrine/migrations", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/laravel-doctrine/migrations.git", - "reference": "3fa4ebc8cd5e4ce4c029c4c2a8d7cb5bf8f5f645" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel-doctrine/migrations/zipball/3fa4ebc8cd5e4ce4c029c4c2a8d7cb5bf8f5f645", - "reference": "3fa4ebc8cd5e4ce4c029c4c2a8d7cb5bf8f5f645", - "shasum": "" - }, - "require": { - "doctrine/migrations": "~1.8", - "illuminate/config": "~5.1", - "illuminate/console": "~5.1", - "illuminate/contracts": "~5.1", - "laravel-doctrine/orm": "~1.0", - "php": "^7.1" - }, - "require-dev": { - "mockery/mockery": "~0.9", - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "LaravelDoctrine\\Migrations\\MigrationsServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "LaravelDoctrine\\Migrations\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Patrick Brouwers", - "email": "patrick@maatwebsite.nl" - } - ], - "description": "Doctrine Migrations for Laravel", - "keywords": [ - "data mapper", - "database", - "doctrine", - "laravel", - "migrations", - "orm" - ], - "time": "2018-09-03T11:46:53+00:00" - }, - { - "name": "laravel-doctrine/orm", - "version": "1.4.11", - "source": { - "type": "git", - "url": "https://github.com/laravel-doctrine/orm.git", - "reference": "4d4fcb23d779ea55c43c2bbe7687a21b9ce20b7d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel-doctrine/orm/zipball/4d4fcb23d779ea55c43c2bbe7687a21b9ce20b7d", - "reference": "4d4fcb23d779ea55c43c2bbe7687a21b9ce20b7d", - "shasum": "" - }, - "require": { - "doctrine/orm": "2.5.*|2.6.*", - "illuminate/auth": "5.5.*|5.6.*|5.7.*|5.8.*", - "illuminate/console": "5.5.*|5.6.*|5.7.*|5.8.*", - "illuminate/container": "5.5.*|5.6.*|5.7.*|5.8.*", - "illuminate/contracts": "5.5.*|5.6.*|5.7.*|5.8.*", - "illuminate/pagination": "5.5.*|5.6.*|5.7.*|5.8.*", - "illuminate/routing": "5.5.*|5.6.*|5.7.*|5.8.*", - "illuminate/support": "5.5.*|5.6.*|5.7.*|5.8.*", - "illuminate/validation": "5.5.*|5.6.*|5.7.*|5.8.*", - "illuminate/view": "5.5.*|5.6.*|5.7.*|5.8.*", - "php": ">=7.0", - "symfony/serializer": "^2.7|~3.0|~4.0" - }, - "require-dev": { - "barryvdh/laravel-debugbar": "~2.0|~3.0", - "illuminate/log": "5.5.*|5.6.*|5.7.*|5.8.*", - "illuminate/notifications": "5.5.*|5.6.*|5.7.*|5.8.*", - "illuminate/queue": "5.5.*|5.6.*|5.7.*|5.8.*", - "itsgoingd/clockwork": "~1.9", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "~5.0" - }, - "suggest": { - "fzaninotto/faker": "Required to use the entity factory builder (~1.4).", - "laravel-doctrine/acl": "to integrate Doctrine roles & permissions with Laravel's Authorization system (~1.0)", - "laravel-doctrine/extensions": "to add Behavioral and Query/Type Extensions for Laravel Doctrine (~1.0)", - "laravel-doctrine/fluent": "Fluent mapping driver (alternative to xml, yaml, ... (~1.1).", - "laravel-doctrine/migrations": "to add support for migrations in Laravel Doctrine (~1.0)", - "yajra/laravel-oci8": "Support for Laravel native queue and session database drivers in Oracle (~2.0)." - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "LaravelDoctrine\\ORM\\DoctrineServiceProvider" - ], - "aliases": { - "Registry": "LaravelDoctrine\\ORM\\Facades\\Registry", - "Doctrine": "LaravelDoctrine\\ORM\\Facades\\Doctrine", - "EntityManager": "LaravelDoctrine\\ORM\\Facades\\EntityManager" - } - } - }, - "autoload": { - "psr-4": { - "LaravelDoctrine\\ORM\\": "src/" - }, - "files": [ - "src/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Patrick Brouwers", - "email": "patrick@maatwebsite.nl" - } - ], - "description": "A Doctrine ORM bridge for Laravel 5", - "keywords": [ - "data mapper", - "database", - "doctrine", - "laravel", - "orm" - ], - "time": "2019-10-17T11:20:19+00:00" - }, - { - "name": "laravel/framework", - "version": "v5.6.39", - "source": { - "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "37bb306f516669ab4f888c16003f694313ab299e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/37bb306f516669ab4f888c16003f694313ab299e", - "reference": "37bb306f516669ab4f888c16003f694313ab299e", - "shasum": "" - }, - "require": { - "doctrine/inflector": "~1.1", - "dragonmantank/cron-expression": "~2.0", - "erusev/parsedown": "~1.7", - "ext-mbstring": "*", - "ext-openssl": "*", - "league/flysystem": "^1.0.8", - "monolog/monolog": "~1.12", - "nesbot/carbon": "1.25.*", - "php": "^7.1.3", - "psr/container": "~1.0", - "psr/simple-cache": "^1.0", - "ramsey/uuid": "^3.7", - "swiftmailer/swiftmailer": "~6.0", - "symfony/console": "~4.0", - "symfony/debug": "~4.0", - "symfony/finder": "~4.0", - "symfony/http-foundation": "~4.0", - "symfony/http-kernel": "~4.0", - "symfony/process": "~4.0", - "symfony/routing": "~4.0", - "symfony/var-dumper": "~4.0", - "tijsverkoyen/css-to-inline-styles": "^2.2.1", - "vlucas/phpdotenv": "~2.2" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "illuminate/auth": "self.version", - "illuminate/broadcasting": "self.version", - "illuminate/bus": "self.version", - "illuminate/cache": "self.version", - "illuminate/config": "self.version", - "illuminate/console": "self.version", - "illuminate/container": "self.version", - "illuminate/contracts": "self.version", - "illuminate/cookie": "self.version", - "illuminate/database": "self.version", - "illuminate/encryption": "self.version", - "illuminate/events": "self.version", - "illuminate/filesystem": "self.version", - "illuminate/hashing": "self.version", - "illuminate/http": "self.version", - "illuminate/log": "self.version", - "illuminate/mail": "self.version", - "illuminate/notifications": "self.version", - "illuminate/pagination": "self.version", - "illuminate/pipeline": "self.version", - "illuminate/queue": "self.version", - "illuminate/redis": "self.version", - "illuminate/routing": "self.version", - "illuminate/session": "self.version", - "illuminate/support": "self.version", - "illuminate/translation": "self.version", - "illuminate/validation": "self.version", - "illuminate/view": "self.version" - }, - "require-dev": { - "aws/aws-sdk-php": "~3.0", - "doctrine/dbal": "~2.6", - "filp/whoops": "^2.1.4", - "league/flysystem-cached-adapter": "~1.0", - "mockery/mockery": "~1.0", - "moontoast/math": "^1.1", - "orchestra/testbench-core": "3.6.*", - "pda/pheanstalk": "~3.0", - "phpunit/phpunit": "~7.0", - "predis/predis": "^1.1.1", - "symfony/css-selector": "~4.0", - "symfony/dom-crawler": "~4.0" - }, - "suggest": { - "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.6).", - "ext-pcntl": "Required to use all features of the queue worker.", - "ext-posix": "Required to use all features of the queue worker.", - "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", - "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", - "laravel/tinker": "Required to use the tinker console command (~1.0).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", - "league/flysystem-cached-adapter": "Required to use the Flysystem cache (~1.0).", - "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", - "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (~1.0).", - "nexmo/client": "Required to use the Nexmo transport (~1.0).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", - "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~3.0).", - "symfony/css-selector": "Required to use some of the crawler integration testing tools (~4.0).", - "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~4.0).", - "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.6-dev" - } - }, - "autoload": { - "files": [ - "src/Illuminate/Foundation/helpers.php", - "src/Illuminate/Support/helpers.php" - ], - "psr-4": { - "Illuminate\\": "src/Illuminate/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Laravel Framework.", - "homepage": "https://laravel.com", - "keywords": [ - "framework", - "laravel" - ], - "time": "2018-10-04T14:50:41+00:00" - }, - { - "name": "laravel/tinker", - "version": "v1.0.10", - "source": { - "type": "git", - "url": "https://github.com/laravel/tinker.git", - "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/ad571aacbac1539c30d480908f9d0c9614eaf1a7", - "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7", - "shasum": "" - }, - "require": { - "illuminate/console": "~5.1|^6.0", - "illuminate/contracts": "~5.1|^6.0", - "illuminate/support": "~5.1|^6.0", - "php": ">=5.5.9", - "psy/psysh": "0.7.*|0.8.*|0.9.*", - "symfony/var-dumper": "~3.0|~4.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" - }, - "suggest": { - "illuminate/database": "The Illuminate Database package (~5.1)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - }, - "laravel": { - "providers": [ - "Laravel\\Tinker\\TinkerServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Laravel\\Tinker\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Powerful REPL for the Laravel framework.", - "keywords": [ - "REPL", - "Tinker", - "laravel", - "psysh" - ], - "time": "2019-08-07T15:10:45+00:00" - }, - { - "name": "laravelcollective/html", - "version": "v5.6.10", - "source": { - "type": "git", - "url": "https://github.com/LaravelCollective/html.git", - "reference": "974605fcd22a7e4d19f0b2ef635a0d1d7400387d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/974605fcd22a7e4d19f0b2ef635a0d1d7400387d", - "reference": "974605fcd22a7e4d19f0b2ef635a0d1d7400387d", - "shasum": "" - }, - "require": { - "illuminate/http": "5.6.*", - "illuminate/routing": "5.6.*", - "illuminate/session": "5.6.*", - "illuminate/support": "5.6.*", - "illuminate/view": "5.6.*", - "php": ">=7.1.3" - }, - "require-dev": { - "illuminate/database": "5.6.*", - "mockery/mockery": "~1.0", - "phpunit/phpunit": "~7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.6-dev" - }, - "laravel": { - "providers": [ - "Collective\\Html\\HtmlServiceProvider" - ], - "aliases": { - "Form": "Collective\\Html\\FormFacade", - "Html": "Collective\\Html\\HtmlFacade" - } - } - }, - "autoload": { - "psr-4": { - "Collective\\Html\\": "src/" - }, - "files": [ - "src/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylorotwell@gmail.com" - }, - { - "name": "Adam Engebretson", - "email": "adam@laravelcollective.com" - } - ], - "description": "HTML and Form Builders for the Laravel Framework", - "homepage": "https://laravelcollective.com", - "time": "2018-06-18T15:04:16+00:00" - }, - { - "name": "league/flysystem", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "9be3b16c877d477357c015cec057548cf9b2a14a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9be3b16c877d477357c015cec057548cf9b2a14a", - "reference": "9be3b16c877d477357c015cec057548cf9b2a14a", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "league/mime-type-detection": "^1.3", - "php": "^7.2.5 || ^8.0" - }, - "conflict": { - "league/flysystem-sftp": "<1.0.6" - }, - "require-dev": { - "phpspec/prophecy": "^1.11.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "ext-fileinfo": "Required for MimeType", - "ext-ftp": "Allows you to use FTP server storage", - "ext-openssl": "Allows you to use FTPS server storage", - "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", - "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", - "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", - "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", - "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", - "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", - "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", - "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", - "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Flysystem\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net" - } - ], - "description": "Filesystem abstraction: Many filesystems, one API.", - "keywords": [ - "Cloud Files", - "WebDAV", - "abstraction", - "aws", - "cloud", - "copy.com", - "dropbox", - "file systems", - "files", - "filesystem", - "filesystems", - "ftp", - "rackspace", - "remote", - "s3", - "sftp", - "storage" - ], - "time": "2020-08-23T07:39:11+00:00" - }, - { - "name": "league/mime-type-detection", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "fda190b62b962d96a069fcc414d781db66d65b69" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/fda190b62b962d96a069fcc414d781db66d65b69", - "reference": "fda190b62b962d96a069fcc414d781db66d65b69", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.36", - "phpunit/phpunit": "^8.5.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\MimeTypeDetection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "Mime-type detection for Flysystem", - "time": "2020-08-09T10:34:01+00:00" - }, - { - "name": "mobiledetect/mobiledetectlib", - "version": "2.8.34", - "source": { - "type": "git", - "url": "https://github.com/serbanghita/Mobile-Detect.git", - "reference": "6f8113f57a508494ca36acbcfa2dc2d923c7ed5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/6f8113f57a508494ca36acbcfa2dc2d923c7ed5b", - "reference": "6f8113f57a508494ca36acbcfa2dc2d923c7ed5b", - "shasum": "" - }, - "require": { - "php": ">=5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.8.35||~5.7" - }, - "type": "library", - "autoload": { - "classmap": [ - "Mobile_Detect.php" - ], - "psr-0": { - "Detection": "namespaced/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Serban Ghita", - "email": "serbanghita@gmail.com", - "homepage": "http://mobiledetect.net", - "role": "Developer" - } - ], - "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", - "homepage": "https://github.com/serbanghita/Mobile-Detect", - "keywords": [ - "detect mobile devices", - "mobile", - "mobile detect", - "mobile detector", - "php mobile detect" - ], - "time": "2019-09-18T18:44:20+00:00" - }, - { - "name": "monolog/monolog", - "version": "1.25.5", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1817faadd1846cd08be9a49e905dc68823bc38c0", - "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "graylog2/gelf-php": "~1.0", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "php-parallel-lint/php-parallel-lint": "^1.0", - "phpunit/phpunit": "~4.5", - "ruflin/elastica": ">=0.90 <3.0", - "sentry/sentry": "^0.13", - "swiftmailer/swiftmailer": "^5.3|^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "sentry/sentry": "Allow sending log messages to a Sentry server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "time": "2020-07-23T08:35:51+00:00" - }, - { - "name": "nesbot/carbon", - "version": "1.25.3", - "source": { - "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "ad6afecd38ce2d7f7bd1b5d47ffd8e93ebbd3ed8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/ad6afecd38ce2d7f7bd1b5d47ffd8e93ebbd3ed8", - "reference": "ad6afecd38ce2d7f7bd1b5d47ffd8e93ebbd3ed8", - "shasum": "" - }, - "require": { - "kylekatarnls/update-helper": "^1.1", - "php": ">=5.3.9", - "symfony/translation": "~2.6 || ~3.0 || ~4.0" - }, - "require-dev": { - "composer/composer": "^1.2", - "friendsofphp/php-cs-fixer": "~2", - "phpunit/phpunit": "^4.8.35 || ^5.7" - }, - "bin": [ - "bin/upgrade-carbon" - ], - "type": "library", - "extra": { - "update-helper": "Carbon\\Upgrade" - }, - "autoload": { - "psr-4": { - "Carbon\\": "src/Carbon/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "http://nesbot.com" - } - ], - "description": "A simple API extension for DateTime.", - "homepage": "http://carbon.nesbot.com", - "keywords": [ - "date", - "datetime", - "time" - ], - "time": "2019-06-03T17:56:44+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.9.1", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "88e519766fc58bd46b8265561fb79b54e2e00b28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/88e519766fc58bd46b8265561fb79b54e2e00b28", - "reference": "88e519766fc58bd46b8265561fb79b54e2e00b28", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "time": "2020-08-30T16:15:20+00:00" - }, - { - "name": "ocramius/package-versions", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/PackageVersions.git", - "reference": "44af6f3a2e2e04f2af46bcb302ad9600cba41c7d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/44af6f3a2e2e04f2af46bcb302ad9600cba41c7d", - "reference": "44af6f3a2e2e04f2af46bcb302ad9600cba41c7d", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0.0", - "php": "^7.1.0" - }, - "require-dev": { - "composer/composer": "^1.6.3", - "doctrine/coding-standard": "^5.0.1", - "ext-zip": "*", - "infection/infection": "^0.7.1", - "phpunit/phpunit": "^7.5.17" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "time": "2019-11-15T16:17:10+00:00" - }, - { - "name": "ocramius/proxy-manager", - "version": "2.2.3", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "4d154742e31c35137d5374c998e8f86b54db2e2f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/4d154742e31c35137d5374c998e8f86b54db2e2f", - "reference": "4d154742e31c35137d5374c998e8f86b54db2e2f", - "shasum": "" - }, - "require": { - "ocramius/package-versions": "^1.1.3", - "php": "^7.2.0", - "zendframework/zend-code": "^3.3.0" - }, - "require-dev": { - "couscous/couscous": "^1.6.1", - "ext-phar": "*", - "humbug/humbug": "1.0.0-RC.0@RC", - "nikic/php-parser": "^3.1.1", - "padraic/phpunit-accelerator": "dev-master@DEV", - "phpbench/phpbench": "^0.12.2", - "phpstan/phpstan": "dev-master#856eb10a81c1d27c701a83f167dc870fd8f4236a as 0.9.999", - "phpstan/phpstan-phpunit": "dev-master#5629c0a1f4a9c417cb1077cf6693ad9753895761", - "phpunit/phpunit": "^6.4.3", - "squizlabs/php_codesniffer": "^2.9.1" - }, - "suggest": { - "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects", - "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)", - "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)", - "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "ProxyManager\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.io/" - } - ], - "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies", - "homepage": "https://github.com/Ocramius/ProxyManager", - "keywords": [ - "aop", - "lazy loading", - "proxy", - "proxy pattern", - "service proxies" - ], - "time": "2019-08-10T08:37:15+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v2.0.18", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db", - "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db", - "shasum": "" - }, - "require": { - "php": ">=5.2.0" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "autoload": { - "files": [ - "lib/random.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "time": "2019-01-03T20:59:08+00:00" - }, - { - "name": "php-amqplib/php-amqplib", - "version": "v2.12.0", - "source": { - "type": "git", - "url": "https://github.com/php-amqplib/php-amqplib.git", - "reference": "dfcccd36bf12b4c7cc3ec74d571e00e0f767232e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/dfcccd36bf12b4c7cc3ec74d571e00e0f767232e", - "reference": "dfcccd36bf12b4c7cc3ec74d571e00e0f767232e", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "ext-sockets": "*", - "php": ">=5.6.3", - "phpseclib/phpseclib": "^2.0.0" - }, - "conflict": { - "php": "7.4.0 - 7.4.1" - }, - "replace": { - "videlalvaro/php-amqplib": "self.version" - }, - "require-dev": { - "ext-curl": "*", - "nategood/httpful": "^0.2.20", - "phpunit/phpunit": "^5.7|^6.5|^7.0", - "squizlabs/php_codesniffer": "^2.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.12-dev" - } - }, - "autoload": { - "psr-4": { - "PhpAmqpLib\\": "PhpAmqpLib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ - { - "name": "Alvaro Videla", - "role": "Original Maintainer" - }, - { - "name": "Raúl Araya", - "email": "nubeiro@gmail.com", - "role": "Maintainer" - }, - { - "name": "Luke Bakken", - "email": "luke@bakken.io", - "role": "Maintainer" - }, - { - "name": "Ramūnas Dronga", - "email": "github@ramuno.lt", - "role": "Maintainer" - } - ], - "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", - "homepage": "https://github.com/php-amqplib/php-amqplib/", - "keywords": [ - "message", - "queue", - "rabbitmq" - ], - "time": "2020-08-25T01:39:32+00:00" - }, - { - "name": "php-opencloud/openstack", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/OpenStackweb/openstack.git", - "reference": "eafc3de006ad505355556c0d2f3c4af2c6b5a44e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/OpenStackweb/openstack/zipball/eafc3de006ad505355556c0d2f3c4af2c6b5a44e", - "reference": "eafc3de006ad505355556c0d2f3c4af2c6b5a44e", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "^6.1", - "justinrainbow/json-schema": "^5.2", - "php": "~7.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.13", - "jakub-onderka/php-parallel-lint": "^1.0", - "php-coveralls/php-coveralls": "^2.0", - "phpunit/phpunit": "^6.5", - "psr/log": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "OpenStack\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "OpenStack\\Test\\": "tests/unit/", - "OpenStack\\Integration\\": "tests/integration/" - } - }, - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Jamie Hannaford", - "email": "jamie.hannaford@rackspace.com", - "homepage": "https://github.com/jamiehannaford" - }, - { - "name": "Ha Phan", - "email": "thanhha.work@gmail.com", - "homepage": "https://github.com/haphan" - } - ], - "description": "PHP SDK for OpenStack APIs. Supports BlockStorage, Compute, Identity, Images, Networking and Metric Gnocchi", - "homepage": "https://github.com/php-opencloud/openstack", - "keywords": [ - "api", - "openstack", - "php", - "sdk" - ], - "support": { - "source": "https://github.com/OpenStackweb/openstack/tree/master" - }, - "time": "2019-02-04T18:27:20+00:00" - }, - { - "name": "phpseclib/phpseclib", - "version": "2.0.11", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/7053f06f91b3de78e143d430e55a8f7889efc08b", - "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phing/phing": "~2.7", - "phpunit/phpunit": "^4.8.35|^5.7|^6.0", - "sami/sami": "~2.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "suggest": { - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "type": "library", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" - ], - "psr-4": { - "phpseclib\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "time": "2018-04-15T16:55:05+00:00" - }, - { - "name": "predis/predis", - "version": "v1.0.4", - "source": { - "type": "git", - "url": "https://github.com/predis/predis.git", - "reference": "9ead747663bb1b1ae017dfa0d152aca87792b42f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/9ead747663bb1b1ae017dfa0d152aca87792b42f", - "reference": "9ead747663bb1b1ae017dfa0d152aca87792b42f", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "suggest": { - "ext-curl": "Allows access to Webdis when paired with phpiredis", - "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" - }, - "type": "library", - "autoload": { - "psr-4": { - "Predis\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniele Alessandri", - "email": "suppakilla@gmail.com", - "homepage": "http://clorophilla.net" - } - ], - "description": "Flexible and feature-complete Redis client for PHP and HHVM", - "homepage": "http://github.com/nrk/predis", - "keywords": [ - "nosql", - "predis", - "redis" - ], - "time": "2016-05-30T15:25:52+00:00" - }, - { - "name": "psr/container", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "time": "2017-02-14T16:28:37+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2020-03-23T09:12:05+00:00" - }, - { - "name": "psr/simple-cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "time": "2017-10-23T01:57:42+00:00" - }, - { - "name": "psy/psysh", - "version": "v0.9.12", - "source": { - "type": "git", - "url": "https://github.com/bobthecow/psysh.git", - "reference": "90da7f37568aee36b116a030c5f99c915267edd4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/90da7f37568aee36b116a030c5f99c915267edd4", - "reference": "90da7f37568aee36b116a030c5f99c915267edd4", - "shasum": "" - }, - "require": { - "dnoegel/php-xdg-base-dir": "0.1.*", - "ext-json": "*", - "ext-tokenizer": "*", - "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", - "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", - "php": ">=5.4.0", - "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0|~5.0", - "symfony/var-dumper": "~2.7|~3.0|~4.0|~5.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "hoa/console": "~2.15|~3.16", - "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0" - }, - "suggest": { - "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", - "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", - "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." - }, - "bin": [ - "bin/psysh" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-develop": "0.9.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Psy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" - } - ], - "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", - "keywords": [ - "REPL", - "console", - "interactive", - "shell" - ], - "time": "2019-12-06T14:19:43+00:00" - }, - { - "name": "queue-interop/amqp-interop", - "version": "0.8.1", - "source": { - "type": "git", - "url": "https://github.com/queue-interop/amqp-interop.git", - "reference": "2029c3b3b9f10cc1c0a219650f66ab68fcfe656d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/queue-interop/amqp-interop/zipball/2029c3b3b9f10cc1c0a219650f66ab68fcfe656d", - "reference": "2029c3b3b9f10cc1c0a219650f66ab68fcfe656d", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "queue-interop/queue-interop": "^0.7|^0.8" - }, - "require-dev": { - "phpunit/phpunit": "~5.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.8.x-dev" - } - }, - "autoload": { - "psr-4": { - "Interop\\Amqp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "time": "2018-12-13T13:42:47+00:00" - }, - { - "name": "queue-interop/queue-interop", - "version": "0.8.0", - "source": { - "type": "git", - "url": "https://github.com/queue-interop/queue-interop.git", - "reference": "b43af85f635439fa2c9a6d8fd486489da4869741" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/queue-interop/queue-interop/zipball/b43af85f635439fa2c9a6d8fd486489da4869741", - "reference": "b43af85f635439fa2c9a6d8fd486489da4869741", - "shasum": "" - }, - "require": { - "php": "^7.1.3" - }, - "require-dev": { - "phpunit/phpunit": "^5.5", - "queue-interop/queue-spec": "^0.6@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.7-dev" - } - }, - "autoload": { - "psr-4": { - "Interop\\Queue\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Promoting the interoperability of MQs objects. Based on Java JMS", - "homepage": "https://github.com/queue-interop/queue-interop", - "keywords": [ - "MQ", - "jms", - "message queue", - "messaging", - "queue" - ], - "time": "2018-11-22T17:53:21+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "ramsey/uuid", - "version": "3.9.3", - "source": { - "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/7e1633a6964b48589b142d60542f9ed31bd37a92", - "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92", - "shasum": "" - }, - "require": { - "ext-json": "*", - "paragonie/random_compat": "^1 | ^2 | 9.99.99", - "php": "^5.4 | ^7 | ^8", - "symfony/polyfill-ctype": "^1.8" - }, - "replace": { - "rhumsaa/uuid": "self.version" - }, - "require-dev": { - "codeception/aspect-mock": "^1 | ^2", - "doctrine/annotations": "^1.2", - "goaop/framework": "1.0.0-alpha.2 | ^1 | ^2.1", - "jakub-onderka/php-parallel-lint": "^1", - "mockery/mockery": "^0.9.11 | ^1", - "moontoast/math": "^1.1", - "paragonie/random-lib": "^2", - "php-mock/php-mock-phpunit": "^0.3 | ^1.1", - "phpunit/phpunit": "^4.8 | ^5.4 | ^6.5", - "squizlabs/php_codesniffer": "^3.5" - }, - "suggest": { - "ext-ctype": "Provides support for PHP Ctype functions", - "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", - "ext-openssl": "Provides the OpenSSL extension for use with the OpenSslGenerator", - "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", - "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", - "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", - "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Ramsey\\Uuid\\": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" - }, - { - "name": "Marijn Huizendveld", - "email": "marijn.huizendveld@gmail.com" - }, - { - "name": "Thibaud Fabre", - "email": "thibaud@aztech.io" - } - ], - "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", - "homepage": "https://github.com/ramsey/uuid", - "keywords": [ - "guid", - "identifier", - "uuid" - ], - "time": "2020-02-21T04:36:14+00:00" - }, - { - "name": "s-ichikawa/laravel-sendgrid-driver", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/s-ichikawa/laravel-sendgrid-driver.git", - "reference": "116a6e624323883ddcc56bfaf92ef19f9218f6fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/s-ichikawa/laravel-sendgrid-driver/zipball/116a6e624323883ddcc56bfaf92ef19f9218f6fd", - "reference": "116a6e624323883ddcc56bfaf92ef19f9218f6fd", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "~5.3|~6.2", - "illuminate/mail": ">=5.5" - }, - "require-dev": { - "illuminate/container": ">=5.5", - "illuminate/filesystem": ">=5.5", - "phpunit/phpunit": "~5.7" - }, - "suggest": { - "s-ichikawa/sendgrid-api-builder": "support to build json for sendgrid api" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Sichikawa\\LaravelSendgridDriver\\SendgridTransportServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Sichikawa\\LaravelSendgridDriver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "shingo.ichikawa", - "email": "ichikawa.shingo.0829@gmail.com" - } - ], - "description": "This library adds a 'sendgrid' mail driver to Laravel.", - "keywords": [ - "laravel", - "sendgrid" - ], - "time": "2019-09-04T15:31:39+00:00" - }, - { - "name": "smarcet/jose4php", - "version": "1.0.17", - "source": { - "type": "git", - "url": "https://github.com/smarcet/JOSE4PHP.git", - "reference": "665ea87d1e4cf0e59564a131a9194c3ce0c7ac19" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/smarcet/JOSE4PHP/zipball/665ea87d1e4cf0e59564a131a9194c3ce0c7ac19", - "reference": "665ea87d1e4cf0e59564a131a9194c3ce0c7ac19", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "phpseclib/phpseclib": "2.0.11" - }, - "require-dev": { - "mockery/mockery": "0.9.*", - "phpunit/phpunit": "^5.7" - }, - "suggest": { - "ext-bcmath": "Required if GMP is not installed", - "ext-crypto": "Required to use AES GCM algorithms", - "ext-gmp": "Required if BCMath is not installed (this extension is highly recommended!)", - "ext-json": "Required to use json algorithms", - "ext-zlib": "Required to use Compression algorithms", - "lib-openssl": "Required to use AES algorithms (except AES GCM)", - "phpseclib/phpseclib": "Required to use RSA based algorithms" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/", - "tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sebastian Marcet", - "email": "smarcet@gmail.com" - } - ], - "description": "JWT, JWS, JWE, JWA and JWK implementation in PHP", - "homepage": "https://github.com/smarcet", - "keywords": [ - "ID Token", - "JOSE", - "JSON Web Algorithms", - "JSON Web Encryption", - "JSON Web Signature", - "JSON Web Token", - "JWE", - "JWS", - "OpenID Connect", - "jwa", - "jwt" - ], - "time": "2019-07-12T23:35:09+00:00" - }, - { - "name": "sokil/php-isocodes", - "version": "3.0.5", - "source": { - "type": "git", - "url": "https://github.com/sokil/php-isocodes.git", - "reference": "89b1c153afd1e27c48634a06469a4cab27858833" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sokil/php-isocodes/zipball/89b1c153afd1e27c48634a06469a4cab27858833", - "reference": "89b1c153afd1e27c48634a06469a4cab27858833", - "shasum": "" - }, - "require": { - "ext-gettext": "*", - "ext-json": "*", - "php": ">=7.1" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", - "php-coveralls/php-coveralls": "^2.1", - "phpbench/phpbench": "^0.16.9", - "phpmd/phpmd": "@stable", - "phpunit/phpunit": "^7.0", - "slevomat/coding-standard": "^5.0", - "squizlabs/php_codesniffer": "^3.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Sokil\\IsoCodes\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dmytro Sokil", - "email": "dmytro.sokil@gmail.com" - } - ], - "description": "ISO country, subdivision, language, currency and script definitions and their translations. Based on pythons pycountry and Debian's iso-codes.", - "time": "2020-05-28T22:28:43+00:00" - }, - { - "name": "spatie/laravel-cors", - "version": "1.6.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-cors.git", - "reference": "d74099d57821d5a72ae21416c0be0dcd58779355" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-cors/zipball/d74099d57821d5a72ae21416c0be0dcd58779355", - "reference": "d74099d57821d5a72ae21416c0be0dcd58779355", - "shasum": "" - }, - "require": { - "illuminate/support": "5.5.*|5.6.*|5.7.*|5.8.*|^6.0", - "php": "^7.2" - }, - "require-dev": { - "orchestra/testbench": "3.5.*|3.6.*|3.7.*|3.8.*|^4.0", - "phpunit/phpunit": "^8.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\Cors\\CorsServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Spatie\\Cors\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "Send CORS headers in a Laravel or Lumen application", - "homepage": "https://github.com/spatie/laravel-cors", - "keywords": [ - "ajax", - "api", - "cors", - "laravel-cors", - "request", - "spatie" - ], - "abandoned": "laravel/framework", - "time": "2019-09-04T06:55:15+00:00" - }, - { - "name": "swiftmailer/swiftmailer", - "version": "v6.2.3", - "source": { - "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/149cfdf118b169f7840bbe3ef0d4bc795d1780c9", - "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9", - "shasum": "" - }, - "require": { - "egulias/email-validator": "~2.0", - "php": ">=7.0.0", - "symfony/polyfill-iconv": "^1.0", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" - }, - "require-dev": { - "mockery/mockery": "~0.9.1", - "symfony/phpunit-bridge": "^3.4.19|^4.1.8" - }, - "suggest": { - "ext-intl": "Needed to support internationalized email addresses", - "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.2-dev" - } - }, - "autoload": { - "files": [ - "lib/swift_required.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "https://swiftmailer.symfony.com", - "keywords": [ - "email", - "mail", - "mailer" - ], - "time": "2019-11-12T09:31:26+00:00" - }, - { - "name": "symfony/console", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "b39fd99b9297b67fb7633b7d8083957a97e1e727" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/b39fd99b9297b67fb7633b7d8083957a97e1e727", - "reference": "b39fd99b9297b67fb7633b7d8083957a97e1e727", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", - "symfony/lock": "<4.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2020-09-02T07:07:21+00:00" - }, - { - "name": "symfony/css-selector", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "bf17dc9f6ce144e41f786c32435feea4d8e11dcc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/bf17dc9f6ce144e41f786c32435feea4d8e11dcc", - "reference": "bf17dc9f6ce144e41f786c32435feea4d8e11dcc", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony CssSelector Component", - "homepage": "https://symfony.com", - "time": "2020-07-05T09:39:30+00:00" - }, - { - "name": "symfony/debug", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "aeb73aca16a8f1fe958230fe44e6cf4c84cbb85e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/aeb73aca16a8f1fe958230fe44e6cf4c84cbb85e", - "reference": "aeb73aca16a8f1fe958230fe44e6cf4c84cbb85e", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/http-kernel": "<3.4" - }, - "require-dev": { - "symfony/http-kernel": "^3.4|^4.0|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Debug Component", - "homepage": "https://symfony.com", - "time": "2020-08-10T07:47:39+00:00" - }, - { - "name": "symfony/error-handler", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "2434fb32851f252e4f27691eee0b77c16198db62" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/2434fb32851f252e4f27691eee0b77c16198db62", - "reference": "2434fb32851f252e4f27691eee0b77c16198db62", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/debug": "^4.4.5", - "symfony/polyfill-php80": "^1.15", - "symfony/var-dumper": "^4.4|^5.0" - }, - "require-dev": { - "symfony/http-kernel": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\ErrorHandler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony ErrorHandler Component", - "homepage": "https://symfony.com", - "time": "2020-08-17T09:56:45+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "3e8ea5ccddd00556b86d69d42f99f1061a704030" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3e8ea5ccddd00556b86d69d42f99f1061a704030", - "reference": "3e8ea5ccddd00556b86d69d42f99f1061a704030", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1" - }, - "conflict": { - "symfony/dependency-injection": "<3.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2020-08-13T14:18:44+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "suggest": { - "psr/event-dispatcher": "", - "symfony/event-dispatcher-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2020-07-06T13:19:58+00:00" - }, - { - "name": "symfony/finder", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "2a78590b2c7e3de5c429628457c47541c58db9c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2a78590b2c7e3de5c429628457c47541c58db9c7", - "reference": "2a78590b2c7e3de5c429628457c47541c58db9c7", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com", - "time": "2020-08-17T09:56:45+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "e3e5a62a6631a461954d471e7206e3750dbe8ee1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e3e5a62a6631a461954d471e7206e3750dbe8ee1", - "reference": "e3e5a62a6631a461954d471e7206e3750dbe8ee1", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/mime": "^4.3|^5.0", - "symfony/polyfill-mbstring": "~1.1" - }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/expression-language": "^3.4|^4.0|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony HttpFoundation Component", - "homepage": "https://symfony.com", - "time": "2020-08-17T07:39:58+00:00" - }, - { - "name": "symfony/http-kernel", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "2bb7b90ecdc79813c0bf237b7ff20e79062b5188" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2bb7b90ecdc79813c0bf237b7ff20e79062b5188", - "reference": "2bb7b90ecdc79813c0bf237b7ff20e79062b5188", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/error-handler": "^4.4", - "symfony/event-dispatcher": "^4.4", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/browser-kit": "<4.3", - "symfony/config": "<3.4", - "symfony/console": ">=5", - "symfony/dependency-injection": "<4.3", - "symfony/translation": "<4.2", - "twig/twig": "<1.34|<2.4,>=2" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/cache": "~1.0", - "symfony/browser-kit": "^4.3|^5.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0", - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^4.3|^5.0", - "symfony/dom-crawler": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/routing": "^3.4|^4.0|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/templating": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.2|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^1.34|^2.4|^3.0" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony HttpKernel Component", - "homepage": "https://symfony.com", - "time": "2020-09-02T08:09:29+00:00" - }, - { - "name": "symfony/mime", - "version": "v5.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "89a2c9b4cb7b5aa516cf55f5194c384f444c81dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/89a2c9b4cb7b5aa516cf55f5194c384f444c81dc", - "reference": "89a2c9b4cb7b5aa516cf55f5194c384f444c81dc", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/mailer": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^4.4|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A library to manipulate MIME messages", - "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], - "time": "2020-08-17T10:01:29+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-iconv", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36", - "reference": "6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-iconv": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Iconv extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "iconv", - "polyfill", - "portable", - "shim" - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/5dcab1bc7146cf8c1beaa4502a3d9be344334251", - "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php70": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "time": "2020-08-04T06:02:08+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", - "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", - "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-php70", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", - "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", - "shasum": "" - }, - "require": { - "paragonie/random_compat": "~1.0|~2.0|~9.99", - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "639447d008615574653fb3bc60d1986d7172eaae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/639447d008615574653fb3bc60d1986d7172eaae", - "reference": "639447d008615574653fb3bc60d1986d7172eaae", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", - "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", - "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", - "shasum": "" - }, - "require": { - "php": ">=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "symfony/process", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "65e70bab62f3da7089a8d4591fb23fbacacb3479" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/65e70bab62f3da7089a8d4591fb23fbacacb3479", - "reference": "65e70bab62f3da7089a8d4591fb23fbacacb3479", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com", - "time": "2020-07-23T08:31:43+00:00" - }, - { - "name": "symfony/routing", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "e3387963565da9bae51d1d3ab8041646cc93bd04" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e3387963565da9bae51d1d3ab8041646cc93bd04", - "reference": "e3387963565da9bae51d1d3ab8041646cc93bd04", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "conflict": { - "symfony/config": "<4.2", - "symfony/dependency-injection": "<3.4", - "symfony/yaml": "<3.4" - }, - "require-dev": { - "doctrine/annotations": "~1.2", - "psr/log": "~1.0", - "symfony/config": "^4.2|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Routing Component", - "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "time": "2020-08-10T07:27:51+00:00" - }, - { - "name": "symfony/serializer", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/serializer.git", - "reference": "f8e1211fdd045d22bba98054fd7969bec955810a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/f8e1211fdd045d22bba98054fd7969bec955810a", - "reference": "f8e1211fdd045d22bba98054fd7969bec955810a", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "phpdocumentor/type-resolver": "<0.2.1", - "symfony/dependency-injection": "<3.4", - "symfony/property-access": "<3.4", - "symfony/property-info": "<3.4", - "symfony/yaml": "<3.4" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/cache": "~1.0", - "phpdocumentor/reflection-docblock": "^3.2|^4.0", - "symfony/cache": "^3.4|^4.0|^5.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/property-access": "^3.4|^4.0|^5.0", - "symfony/property-info": "^3.4.13|~4.0|^5.0", - "symfony/validator": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", - "doctrine/cache": "For using the default cached annotation reader and metadata cache.", - "psr/cache-implementation": "For using the metadata cache.", - "symfony/config": "For using the XML mapping loader.", - "symfony/http-foundation": "For using a MIME type guesser within the DataUriNormalizer.", - "symfony/property-access": "For using the ObjectNormalizer.", - "symfony/property-info": "To deserialize relations.", - "symfony/yaml": "For using the default YAML mapping loader." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Serializer\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Serializer Component", - "homepage": "https://symfony.com", - "time": "2020-08-31T16:04:23+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/translation", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "700e6e50174b0cdcf0fa232773bec5c314680575" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/700e6e50174b0cdcf0fa232773bec5c314680575", - "reference": "700e6e50174b0cdcf0fa232773bec5c314680575", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^1.1.6|^2" - }, - "conflict": { - "symfony/config": "<3.4", - "symfony/dependency-injection": "<3.4", - "symfony/http-kernel": "<4.4", - "symfony/yaml": "<3.4" - }, - "provide": { - "symfony/translation-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/finder": "~2.8|~3.0|~4.0|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/intl": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1.2|^2", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "suggest": { - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Translation Component", - "homepage": "https://symfony.com", - "time": "2020-08-17T09:56:45+00:00" - }, - { - "name": "symfony/translation-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "77ce1c3627c9f39643acd9af086631f842c50c4d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/77ce1c3627c9f39643acd9af086631f842c50c4d", - "reference": "77ce1c3627c9f39643acd9af086631f842c50c4d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "1bef32329f3166486ab7cb88599cae4875632b99" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1bef32329f3166486ab7cb88599cae4875632b99", - "reference": "1bef32329f3166486ab7cb88599cae4875632b99", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php72": "~1.5", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/console": "<3.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^1.34|^2.4|^3.0" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony mechanism for exploring and dumping PHP variables", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "time": "2020-08-17T07:31:35+00:00" - }, - { - "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.3", - "source": { - "type": "git", - "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5", - "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "php": "^5.5 || ^7.0 || ^8.0", - "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "TijsVerkoyen\\CssToInlineStyles\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Tijs Verkoyen", - "email": "css_to_inline_styles@verkoyen.eu", - "role": "Developer" - } - ], - "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", - "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", - "time": "2020-07-13T06:12:54+00:00" - }, - { - "name": "vladimir-yuldashev/laravel-queue-rabbitmq", - "version": "v7.5.0", - "source": { - "type": "git", - "url": "https://github.com/vyuldashev/laravel-queue-rabbitmq.git", - "reference": "c653c42ffb982647fede016fc45c81dd576cb712" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vyuldashev/laravel-queue-rabbitmq/zipball/c653c42ffb982647fede016fc45c81dd576cb712", - "reference": "c653c42ffb982647fede016fc45c81dd576cb712", - "shasum": "" - }, - "require": { - "enqueue/amqp-lib": "0.9.*", - "ext-json": "*", - "illuminate/database": "5.6.*|5.7.*|5.8.*", - "illuminate/queue": "5.6.*|5.7.*|5.8.*", - "illuminate/support": "5.6.*|5.7.*|5.8.*", - "php": "^7.1.3", - "queue-interop/amqp-interop": "0.8.*" - }, - "require-dev": { - "illuminate/events": "5.6.*|5.7.*|5.8.*", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.0-dev" - }, - "laravel": { - "providers": [ - "VladimirYuldashev\\LaravelQueueRabbitMQ\\LaravelQueueRabbitMQServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "VladimirYuldashev\\LaravelQueueRabbitMQ\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Vladimir Yuldashev", - "email": "misterio92@gmail.com" - } - ], - "description": "RabbitMQ driver for Laravel Queue", - "time": "2019-03-27T19:40:42+00:00" - }, - { - "name": "vlucas/phpdotenv", - "version": "v2.6.6", - "source": { - "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "e1d57f62db3db00d9139078cbedf262280701479" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/e1d57f62db3db00d9139078cbedf262280701479", - "reference": "e1d57f62db3db00d9139078cbedf262280701479", - "shasum": "" - }, - "require": { - "php": "^5.3.9 || ^7.0 || ^8.0", - "symfony/polyfill-ctype": "^1.17" - }, - "require-dev": { - "ext-filter": "*", - "ext-pcre": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7.27" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator.", - "ext-pcre": "Required to use most of the library." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, - "autoload": { - "psr-4": { - "Dotenv\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "homepage": "https://gjcampbell.co.uk/" - }, - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://vancelucas.com/" - } - ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "time": "2020-07-14T17:54:18+00:00" - }, - { - "name": "zendframework/zend-code", - "version": "3.4.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-code.git", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-code/zipball/268040548f92c2bfcba164421c1add2ba43abaaa", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa", - "shasum": "" - }, - "require": { - "php": "^7.1", - "zendframework/zend-eventmanager": "^2.6 || ^3.0" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0" - }, - "require-dev": { - "doctrine/annotations": "^1.7", - "ext-phar": "*", - "phpunit/phpunit": "^7.5.16 || ^8.4", - "zendframework/zend-coding-standard": "^1.0", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "suggest": { - "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "zendframework/zend-stdlib": "Zend\\Stdlib component" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4.x-dev", - "dev-develop": "3.5.x-dev", - "dev-dev-4.0": "4.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Code\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", - "keywords": [ - "ZendFramework", - "code", - "zf" - ], - "abandoned": "laminas/laminas-code", - "time": "2019-12-10T19:21:15+00:00" - }, - { - "name": "zendframework/zend-crypt", - "version": "3.3.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-crypt.git", - "reference": "9c2916faa9b2132a0f91cdca8e95b025c352f065" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-crypt/zipball/9c2916faa9b2132a0f91cdca8e95b025c352f065", - "reference": "9c2916faa9b2132a0f91cdca8e95b025c352f065", - "shasum": "" - }, - "require": { - "container-interop/container-interop": "^1.2", - "ext-mbstring": "*", - "php": "^5.6 || ^7.0", - "zendframework/zend-math": "^3.0", - "zendframework/zend-stdlib": "^2.7.7 || ^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", - "zendframework/zend-coding-standard": "~1.0.0" - }, - "suggest": { - "ext-openssl": "Required for most features of Zend\\Crypt" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev", - "dev-develop": "3.4.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Crypt\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Strong cryptography tools and password hashing", - "keywords": [ - "ZendFramework", - "crypt", - "zf" - ], - "abandoned": "laminas/laminas-crypt", - "time": "2018-04-24T22:01:58+00:00" - }, - { - "name": "zendframework/zend-eventmanager", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-eventmanager.git", - "reference": "a5e2583a211f73604691586b8406ff7296a946dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd", - "reference": "a5e2583a211f73604691586b8406ff7296a946dd", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "athletic/athletic": "^0.1", - "container-interop/container-interop": "^1.1.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0" - }, - "suggest": { - "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev", - "dev-develop": "3.3-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\EventManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Trigger and listen to events within a PHP application", - "homepage": "https://github.com/zendframework/zend-eventmanager", - "keywords": [ - "event", - "eventmanager", - "events", - "zf2" - ], - "abandoned": "laminas/laminas-eventmanager", - "time": "2018-04-25T15:33:34+00:00" - }, - { - "name": "zendframework/zend-math", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-math.git", - "reference": "0aa5ec1b3132dd7d749d4673d7bdc7ab6b2d202a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-math/zipball/0aa5ec1b3132dd7d749d4673d7bdc7ab6b2d202a", - "reference": "0aa5ec1b3132dd7d749d4673d7bdc7ab6b2d202a", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "paragonie/random_compat": "^2.0.11", - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", - "zendframework/zend-coding-standard": "~1.0.0" - }, - "suggest": { - "ext-bcmath": "If using the bcmath functionality", - "ext-gmp": "If using the gmp functionality" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev", - "dev-develop": "3.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Math\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Create cryptographically secure pseudo-random numbers, and manage big integers", - "keywords": [ - "ZendFramework", - "math", - "zf" - ], - "abandoned": "laminas/laminas-math", - "time": "2018-07-10T19:00:33+00:00" - }, - { - "name": "zendframework/zend-stdlib", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-stdlib.git", - "reference": "66536006722aff9e62d1b331025089b7ec71c065" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/66536006722aff9e62d1b331025089b7ec71c065", - "reference": "66536006722aff9e62d1b331025089b7ec71c065", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpbench/phpbench": "^0.13", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", - "zendframework/zend-coding-standard": "~1.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2.x-dev", - "dev-develop": "3.3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Stdlib\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "SPL extensions, array utilities, error handlers, and more", - "keywords": [ - "ZendFramework", - "stdlib", - "zf" - ], - "abandoned": "laminas/laminas-stdlib", - "time": "2018-08-28T21:34:05+00:00" - } - ], - "packages-dev": [ - { - "name": "filp/whoops", - "version": "2.7.3", - "source": { - "type": "git", - "url": "https://github.com/filp/whoops.git", - "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/5d5fe9bb3d656b514d455645b3addc5f7ba7714d", - "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d", - "shasum": "" - }, - "require": { - "php": "^5.5.9 || ^7.0", - "psr/log": "^1.0.1" - }, - "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" - }, - "suggest": { - "symfony/var-dumper": "Pretty print complex values better with var-dumper available", - "whoops/soap": "Formats errors as SOAP responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, - "autoload": { - "psr-4": { - "Whoops\\": "src/Whoops/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Filipe Dobreira", - "homepage": "https://github.com/filp", - "role": "Developer" - } - ], - "description": "php error handling for cool kids", - "homepage": "https://filp.github.io/whoops/", - "keywords": [ - "error", - "exception", - "handling", - "library", - "throwable", - "whoops" - ], - "time": "2020-06-14T09:00:00+00:00" - }, - { - "name": "fzaninotto/faker", - "version": "v1.9.1", - "source": { - "type": "git", - "url": "https://github.com/fzaninotto/Faker.git", - "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f", - "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "ext-intl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7", - "squizlabs/php_codesniffer": "^2.9.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "autoload": { - "psr-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "time": "2019-12-12T13:22:17+00:00" - }, - { - "name": "hamcrest/hamcrest-php", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "shasum": "" - }, - "require": { - "php": "^5.3|^7.0|^8.0" - }, - "replace": { - "cordoval/hamcrest-php": "*", - "davedevelopment/hamcrest-php": "*", - "kodova/hamcrest-php": "*" - }, - "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "hamcrest" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "This is the PHP port of Hamcrest Matchers", - "keywords": [ - "test" - ], - "time": "2020-07-09T08:09:16+00:00" - }, - { - "name": "laravel/browser-kit-testing", - "version": "v4.0.2", - "source": { - "type": "git", - "url": "https://github.com/laravel/browser-kit-testing.git", - "reference": "efe038f40fb8ad06655ddfcb64e8b603e9e1f999" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/browser-kit-testing/zipball/efe038f40fb8ad06655ddfcb64e8b603e9e1f999", - "reference": "efe038f40fb8ad06655ddfcb64e8b603e9e1f999", - "shasum": "" - }, - "require": { - "illuminate/support": "^5.6", - "php": ">=7.1.3", - "phpunit/phpunit": "~7.0", - "symfony/css-selector": "~4.0", - "symfony/dom-crawler": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "psr-4": { - "Laravel\\BrowserKitTesting\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Provides backwards compatibility for BrowserKit testing in Laravel 5.4.", - "keywords": [ - "laravel", - "testing" - ], - "time": "2018-09-26T13:42:46+00:00" - }, - { - "name": "mockery/mockery", - "version": "1.3.3", - "source": { - "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "60fa2f67f6e4d3634bb4a45ff3171fa52215800d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/60fa2f67f6e4d3634bb4a45ff3171fa52215800d", - "reference": "60fa2f67f6e4d3634bb4a45ff3171fa52215800d", - "shasum": "" - }, - "require": { - "hamcrest/hamcrest-php": "^2.0.1", - "lib-pcre": ">=7.0", - "php": ">=5.6.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.10|^6.5|^7.5|^8.5|^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "psr-0": { - "Mockery": "library/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Pádraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" - }, - { - "name": "Dave Marshall", - "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" - } - ], - "description": "Mockery is a simple yet flexible PHP mock object framework", - "homepage": "https://github.com/mockery/mockery", - "keywords": [ - "BDD", - "TDD", - "library", - "mock", - "mock objects", - "mockery", - "stub", - "test", - "test double", - "testing" - ], - "time": "2020-08-11T18:10:21+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.10.1", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "time": "2020-06-29T13:22:24+00:00" - }, - { - "name": "nunomaduro/collision", - "version": "v2.1.1", - "source": { - "type": "git", - "url": "https://github.com/nunomaduro/collision.git", - "reference": "b5feb0c0d92978ec7169232ce5d70d6da6b29f63" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/b5feb0c0d92978ec7169232ce5d70d6da6b29f63", - "reference": "b5feb0c0d92978ec7169232ce5d70d6da6b29f63", - "shasum": "" - }, - "require": { - "filp/whoops": "^2.1.4", - "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", - "php": "^7.1", - "symfony/console": "~2.8|~3.3|~4.0" - }, - "require-dev": { - "laravel/framework": "5.7.*", - "nunomaduro/larastan": "^0.3.0", - "phpstan/phpstan": "^0.10", - "phpunit/phpunit": "~7.3" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "NunoMaduro\\Collision\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Cli error handling for console/command-line PHP applications.", - "keywords": [ - "artisan", - "cli", - "command-line", - "console", - "error", - "handling", - "laravel", - "laravel-zero", - "php", - "symfony" - ], - "time": "2018-11-21T21:40:54+00:00" - }, - { - "name": "phar-io/manifest", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^2.0", - "php": "^5.6 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2018-07-08T19:23:20+00:00" - }, - { - "name": "phar-io/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "time": "2018-07-08T19:19:57+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d870572532cd70bc3fab58f2e23ad423c8404c44" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d870572532cd70bc3fab58f2e23ad423c8404c44", - "reference": "d870572532cd70bc3fab58f2e23ad423c8404c44", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2020-08-15T11:14:08+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "e878a14a65245fbe78f8080eba03b47c3b705651" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e878a14a65245fbe78f8080eba03b47c3b705651", - "reference": "e878a14a65245fbe78f8080eba03b47c3b705651", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2020-06-27T10:12:23+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "1.11.1", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b20034be5efcdab4fb60ca3a29cba2949aead160", - "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2", - "phpdocumentor/reflection-docblock": "^5.0", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2020-07-08T12:44:21+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "6.1.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", - "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^7.1", - "phpunit/php-file-iterator": "^2.0", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.1 || ^4.0", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "suggest": { - "ext-xdebug": "^2.6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2018-10-31T16:06:48+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2018-09-13T20:33:42+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "2.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2019-06-07T04:22:29+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "abandoned": true, - "time": "2019-09-17T06:23:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "7.5.20", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9467db479d1b0487c99733bb1e7944d32deded2c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c", - "reference": "9467db479d1b0487c99733bb1e7944d32deded2c", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "myclabs/deep-copy": "^1.7", - "phar-io/manifest": "^1.0.2", - "phar-io/version": "^2.0", - "php": "^7.1", - "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^6.0.7", - "phpunit/php-file-iterator": "^2.0.1", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1", - "sebastian/comparator": "^3.0", - "sebastian/diff": "^3.0", - "sebastian/environment": "^4.0", - "sebastian/exporter": "^3.1", - "sebastian/global-state": "^2.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0", - "sebastian/version": "^2.0.1" - }, - "conflict": { - "phpunit/phpunit-mock-objects": "*" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.5-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2020-01-08T08:45:45+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" - }, - { - "name": "sebastian/comparator", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "shasum": "" - }, - "require": { - "php": "^7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2018-07-12T15:12:46+00:00" - }, - { - "name": "sebastian/diff", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "time": "2019-02-04T06:01:07+00:00" - }, - { - "name": "sebastian/environment", - "version": "4.2.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2019-11-20T08:46:58+00:00" - }, - { - "name": "sebastian/exporter", - "version": "3.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2019-09-14T09:02:43+00:00" - }, - { - "name": "sebastian/global-state", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2017-04-27T15:39:26+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2018-10-04T04:07:39+00:00" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" - }, - { - "name": "symfony/dom-crawler", - "version": "v4.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "6dd1e7adef4b7efeeb9691fd619279027d4dcf85" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6dd1e7adef4b7efeeb9691fd619279027d4dcf85", - "reference": "6dd1e7adef4b7efeeb9691fd619279027d4dcf85", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "masterminds/html5": "<2.6" - }, - "require-dev": { - "masterminds/html5": "^2.6", - "symfony/css-selector": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/css-selector": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DomCrawler Component", - "homepage": "https://symfony.com", - "time": "2020-08-12T06:20:35+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2020-07-12T23:59:07+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.9.1", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" - }, - "type": "library", - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2020-07-08T17:02:28+00:00" - } - ], - "aliases": [], - "minimum-stability": "dev", - "stability-flags": { - "greggilbert/recaptcha": 20, - "php-opencloud/openstack": 20 - }, - "prefer-stable": true, - "prefer-lowest": false, - "platform": { - "php": "^7.1.3", - "ext-json": "*", - "ext-pdo": "*" - }, - "platform-dev": [] -} diff --git a/config/app.php b/config/app.php deleted file mode 100644 index eddf9ebc..00000000 --- a/config/app.php +++ /dev/null @@ -1,230 +0,0 @@ - env('APP_ENV', 'production'), - - /* - |-------------------------------------------------------------------------- - | Application Debug Mode - |-------------------------------------------------------------------------- - | - | When your application is in debug mode, detailed error messages with - | stack traces will be shown on every error that occurs within your - | application. If disabled, a simple generic error page is shown. - | - */ - - 'debug' => env('APP_DEBUG', false), - - /* - |-------------------------------------------------------------------------- - | Application URL - |-------------------------------------------------------------------------- - | - | This URL is used by the console to properly generate URLs when using - | the Artisan command line tool. You should set this to the root of - | your application so that it is used when running Artisan tasks. - | - */ - - 'url' => env('APP_URL', 'http://localhost'), - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | Here you may specify the default timezone for your application, which - | will be used by the PHP date and date-time functions. We have gone - | ahead and set this to a sensible default for you out of the box. - | - */ - - 'timezone' => env('APP_TIMEZONE', 'UTC'), - - /* - |-------------------------------------------------------------------------- - | Application Locale Configuration - |-------------------------------------------------------------------------- - | - | The application locale determines the default locale that will be used - | by the translation service provider. You are free to set this value - | to any of the locales which will be supported by the application. - | - */ - - 'locale' => env('APP_LOCALE','en'), - - /* - |-------------------------------------------------------------------------- - | Application Fallback Locale - |-------------------------------------------------------------------------- - | - | The fallback locale determines the locale to use when the current one - | is not available. You may change the value to correspond to any of - | the language folders that are provided through your application. - | - */ - - 'fallback_locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Encryption Key - |-------------------------------------------------------------------------- - | - | This key is used by the Illuminate encrypter service and should be set - | to a random, 32 character string, otherwise these encrypted strings - | will not be safe. Please do this before deploying an application! - | - */ - - 'key' => env('APP_KEY'), - - 'cipher' => 'AES-256-CBC', - - /* - |-------------------------------------------------------------------------- - | Autoloaded Service Providers - |-------------------------------------------------------------------------- - | - | The service providers listed here will be automatically loaded on the - | request to your application. Feel free to add your own services to - | this array to grant expanded functionality to your applications. - | - */ - - 'providers' => [ - - /* - * Laravel Framework Service Providers... - */ - Illuminate\Auth\AuthServiceProvider::class, - Illuminate\Broadcasting\BroadcastServiceProvider::class, - Illuminate\Bus\BusServiceProvider::class, - Illuminate\Cache\CacheServiceProvider::class, - Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, - Illuminate\Cookie\CookieServiceProvider::class, - Illuminate\Database\DatabaseServiceProvider::class, - Illuminate\Encryption\EncryptionServiceProvider::class, - Illuminate\Filesystem\FilesystemServiceProvider::class, - Illuminate\Foundation\Providers\FoundationServiceProvider::class, - Illuminate\Hashing\HashServiceProvider::class, - Illuminate\Mail\MailServiceProvider::class, - Illuminate\Pagination\PaginationServiceProvider::class, - Illuminate\Pipeline\PipelineServiceProvider::class, - Illuminate\Queue\QueueServiceProvider::class, - Illuminate\Redis\RedisServiceProvider::class, - Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, - Illuminate\Session\SessionServiceProvider::class, - Illuminate\Translation\TranslationServiceProvider::class, - Illuminate\Validation\ValidationServiceProvider::class, - Illuminate\View\ViewServiceProvider::class, - /* - * Application Service Providers... - */ - \App\Http\Utils\UtilsProvider::class, - Repositories\RepositoriesProvider::class, - App\Providers\AppServiceProvider::class, - App\Providers\AuthServiceProvider::class, - App\Providers\EventServiceProvider::class, - App\Providers\RouteServiceProvider::class, - Services\Utils\UtilsProvider::class, - Services\OAuth2\OAuth2ServiceProvider::class, - Services\OpenId\OpenIdProvider::class, - Auth\AuthenticationServiceProvider::class, - Services\ServicesProvider::class, - Strategies\StrategyProvider::class, - OAuth2\OAuth2ServiceProvider::class, - OpenId\OpenIdServiceProvider::class, - Collective\Html\HtmlServiceProvider::class, - \Providers\OAuth2\ClientAuthContextValidatorFactoryProvider::class, - Greggilbert\Recaptcha\RecaptchaServiceProvider::class, - Sichikawa\LaravelSendgridDriver\SendgridTransportServiceProvider::class, - // Doctrine ORM - LaravelDoctrine\ORM\DoctrineServiceProvider::class, - // Doctrine Extensions - LaravelDoctrine\Extensions\GedmoExtensionsServiceProvider::class, - // Doctrine Migrations - LaravelDoctrine\Migrations\MigrationsServiceProvider::class, - // Doctrine Beberlei (Query/Type) extensions install them: - LaravelDoctrine\Extensions\BeberleiExtensionsServiceProvider::class, - \App\Models\Utils\MySQLExtensionsServiceProvider::class, - \App\libs\Utils\FileSystem\SwiftServiceProvider::class, - ], - - /* - |-------------------------------------------------------------------------- - | Class Aliases - |-------------------------------------------------------------------------- - | - | This array of class aliases will be registered when this application - | is started. However, feel free to register as many as you wish as - | the aliases are "lazy" loaded so they don't hinder performance. - | - */ - - 'aliases' => [ - 'App' => Illuminate\Support\Facades\App::class, - 'Artisan' => Illuminate\Support\Facades\Artisan::class, - 'Auth' => Illuminate\Support\Facades\Auth::class, - 'Blade' => Illuminate\Support\Facades\Blade::class, - 'Cache' => Illuminate\Support\Facades\Cache::class, - 'Config' => Illuminate\Support\Facades\Config::class, - 'Cookie' => Illuminate\Support\Facades\Cookie::class, - 'Crypt' => Illuminate\Support\Facades\Crypt::class, - 'DB' => Illuminate\Support\Facades\DB::class, - 'Eloquent' => Illuminate\Database\Eloquent\Model::class, - 'Event' => Illuminate\Support\Facades\Event::class, - 'File' => Illuminate\Support\Facades\File::class, - 'Gate' => Illuminate\Support\Facades\Gate::class, - 'Hash' => Illuminate\Support\Facades\Hash::class, - 'Lang' => Illuminate\Support\Facades\Lang::class, - 'Log' => Illuminate\Support\Facades\Log::class, - 'Mail' => Illuminate\Support\Facades\Mail::class, - 'Password' => Illuminate\Support\Facades\Password::class, - 'Queue' => Illuminate\Support\Facades\Queue::class, - 'Redirect' => Illuminate\Support\Facades\Redirect::class, - 'Redis' => Illuminate\Support\Facades\Redis::class, - 'Request' => Illuminate\Support\Facades\Request::class, - 'Response' => Illuminate\Support\Facades\Response::class, - 'Route' => Illuminate\Support\Facades\Route::class, - 'Schema' => Illuminate\Support\Facades\Schema::class, - 'Session' => Illuminate\Support\Facades\Session::class, - 'Storage' => Illuminate\Support\Facades\Storage::class, - 'URL' => Illuminate\Support\Facades\URL::class, - 'Validator' => Illuminate\Support\Facades\Validator::class, - 'View' => Illuminate\Support\Facades\View::class, - 'Form' => Collective\Html\FormFacade::class, - 'HTML' => Collective\Html\HtmlFacade::class, - 'Input' => Illuminate\Support\Facades\Input::class, - 'Recaptcha' => Greggilbert\Recaptcha\Facades\Recaptcha::class, - 'ServerConfigurationService' => \Services\Facades\ServerConfigurationService::class, - 'ExternalUrlService'=> \Services\Facades\ExternalUrlService::class, - // Doctrine ORM Facades - 'EntityManager' => LaravelDoctrine\ORM\Facades\EntityManager::class, - 'Registry' => LaravelDoctrine\ORM\Facades\Registry::class, - 'Doctrine' => LaravelDoctrine\ORM\Facades\Doctrine::class, - ], - - 'version' => env('APP_VERSION', 'XX.XX.XX'), - 'app_name' => env('APP_NAME', 'OpenStackID'), - 'tenant_name' => env('TENANT_NAME', 'Open Infrastructure'), - 'logo_url' => env('LOGO_URL', '/assets/img/openstack-logo-full.svg'), - 'tenant_favicon' => env('TENANT_FAV_ICON_URL', '/assets/img/favicon-32x32.png'), - 'help_email' => env('HELP_EMAIL', 'support@openstack.org'), - 'code_of_conduct_link' => env("CODE_OF_CONDUCT_LINK","https://www.openstack.org/legal/community-code-of-conduct"), - 'app_info' => env("APP_INFO_TEXT"), -]; diff --git a/config/auth.php b/config/auth.php deleted file mode 100644 index eebbd311..00000000 --- a/config/auth.php +++ /dev/null @@ -1,103 +0,0 @@ - [ - 'guard' => 'web', - 'passwords' => 'users', - ], - - /* - |-------------------------------------------------------------------------- - | Authentication Guards - |-------------------------------------------------------------------------- - | - | Next, you may define every authentication guard for your application. - | Of course, a great default configuration has been defined for you - | here which uses session storage and the Eloquent user provider. - | - | All authentication drivers have a user provider. This defines how the - | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. - | - | Supported: "session", "token" - | - */ - - 'guards' => [ - 'web' => [ - 'driver' => 'session', - 'provider' => 'users', - ], - ], - - /* - |-------------------------------------------------------------------------- - | User Providers - |-------------------------------------------------------------------------- - | - | All authentication drivers have a user provider. This defines how the - | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. - | - | If you have multiple user tables or models you may configure multiple - | sources which represent each model / table. These sources may then - | be assigned to any extra authentication guards you have defined. - | - | Supported: "database", "eloquent" - | - */ - - 'providers' => [ - 'users' => [ - 'driver' => 'custom', - 'model' => auth\User::class, - ], - - // 'users' => [ - // 'driver' => 'database', - // 'table' => 'users', - // ], - ], - - /* - |-------------------------------------------------------------------------- - | Resetting Passwords - |-------------------------------------------------------------------------- - | - | Here you may set the options for resetting passwords including the view - | that is your password reset e-mail. You may also set the name of the - | table that maintains all of the reset tokens for your application. - | - | You may specify multiple password reset configurations if you have more - | than one user table or model in the application and you want to have - | separate password reset settings based on the specific user types. - | - | The expire time is the number of minutes that the reset token should be - | considered valid. This security feature keeps tokens short-lived so - | they have less time to be guessed. You may change this as needed. - | - */ - - 'passwords' => [ - 'users' => [ - 'provider' => 'custom', - 'email' => 'auth.emails.password', - 'table' => 'password_resets', - 'expire' => 60, - ], - ], - - // in seconds - 'password_reset_lifetime' => env('AUTH_PASSWORD_RESET_LIFETIME', 600), -]; diff --git a/config/broadcasting.php b/config/broadcasting.php deleted file mode 100644 index abaaac32..00000000 --- a/config/broadcasting.php +++ /dev/null @@ -1,52 +0,0 @@ - env('BROADCAST_DRIVER', 'pusher'), - - /* - |-------------------------------------------------------------------------- - | Broadcast Connections - |-------------------------------------------------------------------------- - | - | Here you may define all of the broadcast connections that will be used - | to broadcast events to other systems or over websockets. Samples of - | each available type of connection are provided inside this array. - | - */ - - 'connections' => [ - - 'pusher' => [ - 'driver' => 'pusher', - 'key' => env('PUSHER_KEY'), - 'secret' => env('PUSHER_SECRET'), - 'app_id' => env('PUSHER_APP_ID'), - 'options' => [ - // - ], - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'default', - ], - - 'log' => [ - 'driver' => 'log', - ], - - ], - -]; diff --git a/config/cache.php b/config/cache.php deleted file mode 100644 index 232416c4..00000000 --- a/config/cache.php +++ /dev/null @@ -1,81 +0,0 @@ - env('CACHE_DRIVER', 'file'), - - /* - |-------------------------------------------------------------------------- - | Cache Stores - |-------------------------------------------------------------------------- - | - | Here you may define all of the cache "stores" for your application as - | well as their drivers. You may even define multiple stores for the - | same cache driver to group types of items stored in your caches. - | - */ - - 'stores' => [ - - 'apc' => [ - 'driver' => 'apc', - ], - - 'array' => [ - 'driver' => 'array', - ], - - 'database' => [ - 'driver' => 'database', - 'table' => 'cache', - 'connection' => null, - ], - - 'file' => [ - 'driver' => 'file', - 'path' => storage_path('framework/cache'), - ], - - 'memcached' => [ - 'driver' => 'memcached', - 'servers' => [ - [ - 'host' => env('MEMCACHED_HOST', '127.0.0.1'), - 'port' => env('MEMCACHED_PORT', 11211), - 'weight' => 100, - ], - ], - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => env('CACHE_REDIS_CONN', 'cache'), - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Cache Key Prefix - |-------------------------------------------------------------------------- - | - | When utilizing a RAM based store such as APC or Memcached, there might - | be other applications utilizing the same cache. So, we'll specify a - | value to get prefixed to all our keys so we can avoid collisions. - | - */ - - 'prefix' => 'laravel', - -]; diff --git a/config/cache_regions.php b/config/cache_regions.php deleted file mode 100644 index e781e168..00000000 --- a/config/cache_regions.php +++ /dev/null @@ -1,25 +0,0 @@ - env('CACHE_REGION_RESOURCE_SERVER_LIFETIME', 60), - 'region_access_token_lifetime' => env('CACHE_REGION_ACCESS_TOKEN_LIFETIME', 1140), - 'region_api_endpoint_lifetime' => env('CACHE_REGION_API_ENDPOINT_LIFETIME', 1140), - 'region_api_scope_lifetime' => env('CACHE_REGION_API_SCOPE_LIFETIME', 1140), - 'region_clients_lifetime' => env('CACHE_REGION_CLIENT_LIFETIME', 1140), - 'region_refresh_token_lifetime' => env('CACHE_REGION_REFRESH_TOKEN_LIFETIME', 1140), - 'region_white_listed_ip_lifetime' => env('CACHE_REGION_WHITE_LISTED_IP_LIFETIME', 1140), - 'region_users_lifetime' => env('CACHE_USERS_LIFETIME', 10), -]; \ No newline at end of file diff --git a/config/compile.php b/config/compile.php deleted file mode 100644 index 04807eac..00000000 --- a/config/compile.php +++ /dev/null @@ -1,35 +0,0 @@ - [ - // - ], - - /* - |-------------------------------------------------------------------------- - | Compiled File Providers - |-------------------------------------------------------------------------- - | - | Here you may list service providers which define a "compiles" function - | that returns additional files that should be compiled, providing an - | easy way to get common files from any packages you are utilizing. - | - */ - - 'providers' => [ - // - ], - -]; diff --git a/config/cors.php b/config/cors.php deleted file mode 100644 index 5e86b754..00000000 --- a/config/cors.php +++ /dev/null @@ -1,63 +0,0 @@ - Spatie\Cors\CorsProfile\DefaultProfile::class, - - /* - * This configuration is used by `DefaultProfile`. - */ - 'default_profile' => [ - - 'allow_credentials' => false, - - 'allow_origins' => [ - '*', - ], - - 'allow_methods' => [ - 'POST', - 'GET', - 'OPTIONS', - 'PUT', - 'PATCH', - 'DELETE', - ], - - 'allow_headers' => [ - 'Accept', - 'Content-Type', - 'X-Auth-Token', - 'Origin', - 'Authorization', - 'X-Requested-With', - ], - - 'expose_headers' => [ - 'Cache-Control', - 'Content-Language', - 'Content-Type', - 'Expires', - 'Last-Modified', - 'Pragma', - ], - - 'forbidden_response' => [ - 'message' => 'Forbidden (cors).', - 'status' => 403, - ], - - /* - * Preflight request will respond with value for the max age header. - */ - 'max_age' => 60 * 60 * 24, - ], -]; diff --git a/config/curl.php b/config/curl.php deleted file mode 100644 index 17b11a98..00000000 --- a/config/curl.php +++ /dev/null @@ -1,19 +0,0 @@ - env('CURL_TIMEOUT', 60), - 'allow_redirects' => env('CURL_ALLOWS_REDIRECT', false), - 'verify_ssl_cert' => env('CURL_VERIFY_SSL_CERT', true), -); \ No newline at end of file diff --git a/config/database.php b/config/database.php deleted file mode 100644 index 7b5f2613..00000000 --- a/config/database.php +++ /dev/null @@ -1,138 +0,0 @@ - 'mysql', - 'host' => env('DB_HOST','localhost'), - 'database' => env('DB_DATABASE',''), - 'username' => env('DB_USERNAME',''), - 'password' => env('DB_PASSWORD',''), - 'port' => env('DB_PORT', 3306), - 'charset' => 'utf8', - 'collation' => 'utf8_unicode_ci', - 'prefix' => '', -]; - - -if($use_ssl){ - $idp_db_config['options'] = [ - PDO::MYSQL_ATTR_SSL_CA => env('DB_MYSQL_ATTR_SSL_CA','/etc/client-ssl/ca-cert.pem'), - PDO::MYSQL_ATTR_SSL_KEY => env('DB_MYSQL_ATTR_SSL_KEY','/etc/client-ssl/client-key.pem'), - PDO::MYSQL_ATTR_SSL_CERT => env('DB_MYSQL_ATTR_SSL_CERT','/etc/client-ssl/client-cert.pem'), - PDO::MYSQL_ATTR_SSL_CIPHER => env('DB_MYSQL_ATTR_SSL_CIPHER', 'DHE-RSA-AES256-SHA'), - ]; - - // for doctrine ... - $idp_db_config['driverOptions'] = [ - PDO::MYSQL_ATTR_SSL_CA => env('DB_MYSQL_ATTR_SSL_CA','/etc/client-ssl/ca-cert.pem'), - PDO::MYSQL_ATTR_SSL_KEY => env('DB_MYSQL_ATTR_SSL_KEY','/etc/client-ssl/client-key.pem'), - PDO::MYSQL_ATTR_SSL_CERT => env('DB_MYSQL_ATTR_SSL_CERT','/etc/client-ssl/client-cert.pem'), - PDO::MYSQL_ATTR_SSL_CIPHER => env('DB_MYSQL_ATTR_SSL_CIPHER', 'DHE-RSA-AES256-SHA'), - ]; -} - -return [ - - /* - |-------------------------------------------------------------------------- - | PDO Fetch Style - |-------------------------------------------------------------------------- - | - | By default, database results will be returned as instances of the PHP - | stdClass object; however, you may desire to retrieve records in an - | array format for simplicity. Here you can tweak the fetch style. - | - */ - - 'fetch' => PDO::FETCH_CLASS, - - /* - |-------------------------------------------------------------------------- - | Default Database Connection Name - |-------------------------------------------------------------------------- - | - | Here you may specify which of the database connections below you wish - | to use as your default connection for all database work. Of course - | you may use many connections at once using the Database library. - | - */ - - 'default' => 'openstackid', - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | Here are each of the database connections setup for your application. - | Of course, examples of configuring each database platform that is - | supported by Laravel is shown below to make development simple. - | - | - | All database work in Laravel is done through the PHP PDO facilities - | so make sure you have the driver for your particular database of - | choice installed on your machine before you begin development. - | - */ - - 'connections' => [ - //primary DB - 'openstackid' => $idp_db_config, - ], - - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. - | - */ - - 'migrations' => 'migrations', - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer set of commands than a typical key-value systems - | such as APC or Memcached. Laravel makes it easy to dig right in. - | - */ - - 'redis' => [ - /* - * @see https://github.com/predis/predis/wiki/Connection-Parameters - */ - 'cluster' => false, - - 'default' => [ - 'host' => env('REDIS_HOST'), - 'port' => env('REDIS_PORT'), - 'database' => 0, - 'password' => env('REDIS_PASSWORD'), - 'timeout' => env('REDIS_TIMEOUT', 30.0) - ], - - 'cache' => [ - 'host' => env('REDIS_HOST'), - 'port' => env('REDIS_PORT'), - 'database' => 0, - 'password' => env('REDIS_PASSWORD'), - 'timeout' => env('REDIS_TIMEOUT', 30.0) - ], - - 'session' => [ - 'host' => env('REDIS_HOST'), - 'port' => env('REDIS_PORT'), - 'database' => 1, - 'password' => env('REDIS_PASSWORD'), - 'timeout' => env('REDIS_TIMEOUT', 30.0) - ], - - ], -]; diff --git a/config/doctrine.php b/config/doctrine.php deleted file mode 100644 index 499b3be3..00000000 --- a/config/doctrine.php +++ /dev/null @@ -1,255 +0,0 @@ - Warning: Proxy auto generation should only be enabled in dev! - | - */ - 'managers' => [ - 'model' => [ - 'dev' => env('APP_DEBUG', false), - 'meta' => env('DOCTRINE_METADATA', 'annotations'), - 'connection' => 'openstackid', - 'namespaces' => [ - 'App' - ], - 'paths' => [ - base_path('app/Models'), - base_path('app/libs/Auth') - ], - 'repository' => Doctrine\ORM\EntityRepository::class, - 'proxies' => [ - 'namespace' => false, - 'path' => storage_path('proxies'), - 'auto_generate' => env('DOCTRINE_PROXY_AUTOGENERATE', false) - ], - /* - |-------------------------------------------------------------------------- - | Doctrine events - |-------------------------------------------------------------------------- - | - | The listener array expects the key to be a Doctrine event - | e.g. Doctrine\ORM\Events::onFlush - | - */ - 'events' => [ - 'listeners' => [], - 'subscribers' => [] - ], - 'filters' => [], - /* - |-------------------------------------------------------------------------- - | Doctrine mapping types - |-------------------------------------------------------------------------- - | - | Link a Database Type to a Local Doctrine Type - | - | Using 'enum' => 'string' is the same of: - | $doctrineManager->extendAll(function (\Doctrine\ORM\Configuration $configuration, - | \Doctrine\DBAL\Connection $connection, - | \Doctrine\Common\EventManager $eventManager) { - | $connection->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); - | }); - | - | References: - | http://doctrine-orm.readthedocs.org/en/latest/cookbook/custom-mapping-types.html - | http://doctrine-dbal.readthedocs.org/en/latest/reference/types.html#custom-mapping-types - | http://doctrine-orm.readthedocs.org/en/latest/cookbook/advanced-field-value-conversion-using-custom-mapping-types.html - | http://doctrine-orm.readthedocs.org/en/latest/reference/basic-mapping.html#reference-mapping-types - | http://symfony.com/doc/current/cookbook/doctrine/dbal.html#registering-custom-mapping-types-in-the-schematool - |-------------------------------------------------------------------------- - */ - 'mapping_types' => [ - 'enum' => 'string' - ] - ] - ], - /* - |-------------------------------------------------------------------------- - | Doctrine Extensions - |-------------------------------------------------------------------------- - | - | Enable/disable Doctrine Extensions by adding or removing them from the list - | - | If you want to require custom extensions you will have to require - | laravel-doctrine/extensions in your composer.json - | - */ - 'extensions' => [ - //LaravelDoctrine\ORM\Extensions\TablePrefix\TablePrefixExtension::class, - //LaravelDoctrine\Extensions\Timestamps\TimestampableExtension::class, - //LaravelDoctrine\Extensions\SoftDeletes\SoftDeleteableExtension::class, - //LaravelDoctrine\Extensions\Sluggable\SluggableExtension::class, - //LaravelDoctrine\Extensions\Sortable\SortableExtension::class, - //LaravelDoctrine\Extensions\Tree\TreeExtension::class, - //LaravelDoctrine\Extensions\Loggable\LoggableExtension::class, - //LaravelDoctrine\Extensions\Blameable\BlameableExtension::class, - //LaravelDoctrine\Extensions\IpTraceable\IpTraceableExtension::class, - //LaravelDoctrine\Extensions\Translatable\TranslatableExtension::class - ], - /* - |-------------------------------------------------------------------------- - | Doctrine custom types - |-------------------------------------------------------------------------- - | - | Create a custom or override a Doctrine Type - |-------------------------------------------------------------------------- - */ - 'custom_types' => [ - 'json' => LaravelDoctrine\ORM\Types\Json::class, - 'CarbonDate' => DoctrineExtensions\Types\CarbonDateType::class, - 'CarbonDateTime' => DoctrineExtensions\Types\CarbonDateTimeType::class, - 'CarbonDateTimeTz' => DoctrineExtensions\Types\CarbonDateTimeTzType::class, - 'CarbonTime' => DoctrineExtensions\Types\CarbonTimeType::class - ], - /* - |-------------------------------------------------------------------------- - | DQL custom datetime functions - |-------------------------------------------------------------------------- - */ - 'custom_datetime_functions' => [ - 'DATEADD' => DoctrineExtensions\Query\Mysql\DateAdd::class, - 'DATEDIFF' => DoctrineExtensions\Query\Mysql\DateDiff::class, - 'UTC_TIMESTAMP' => \App\Models\Utils\UTCTimestamp::class, - 'DATE' => DoctrineExtensions\Query\Mysql\Date::class, - 'DATE_FORMAT' => DoctrineExtensions\Query\Mysql\DateFormat::class, - 'DATESUB' => DoctrineExtensions\Query\Mysql\DateSub::class, - 'DAY' => DoctrineExtensions\Query\Mysql\Day::class, - 'DAYNAME' => DoctrineExtensions\Query\Mysql\DayName::class, - 'FROM_UNIXTIME' => DoctrineExtensions\Query\Mysql\FromUnixtime::class, - 'HOUR' => DoctrineExtensions\Query\Mysql\Hour::class, - 'LAST_DAY' => DoctrineExtensions\Query\Mysql\LastDay::class, - 'MINUTE' => DoctrineExtensions\Query\Mysql\Minute::class, - 'MONTH' => DoctrineExtensions\Query\Mysql\Month::class, - 'MONTHNAME' => DoctrineExtensions\Query\Mysql\MonthName::class, - 'SECOND' => DoctrineExtensions\Query\Mysql\Second::class, - 'STRTODATE' => DoctrineExtensions\Query\Mysql\StrToDate::class, - 'TIME' => DoctrineExtensions\Query\Mysql\Time::class, - 'TIMESTAMPADD' => DoctrineExtensions\Query\Mysql\TimestampAdd::class, - 'TIMESTAMPDIFF' => DoctrineExtensions\Query\Mysql\TimestampDiff::class, - 'WEEK' => DoctrineExtensions\Query\Mysql\Week::class, - 'WEEKDAY' => DoctrineExtensions\Query\Mysql\WeekDay::class, - 'YEAR' => DoctrineExtensions\Query\Mysql\Year::class - ], - /* - |-------------------------------------------------------------------------- - | DQL custom numeric functions - |-------------------------------------------------------------------------- - */ - 'custom_numeric_functions' => [ - 'ACOS' => DoctrineExtensions\Query\Mysql\Acos::class, - 'ASIN' => DoctrineExtensions\Query\Mysql\Asin::class, - 'ATAN' => DoctrineExtensions\Query\Mysql\Atan::class, - 'ATAN2' => DoctrineExtensions\Query\Mysql\Atan2::class, - 'COS' => DoctrineExtensions\Query\Mysql\Cos::class, - 'COT' => DoctrineExtensions\Query\Mysql\Cot::class, - 'DEGREES' => DoctrineExtensions\Query\Mysql\Degrees::class, - 'RADIANS' => DoctrineExtensions\Query\Mysql\Radians::class, - 'SIN' => DoctrineExtensions\Query\Mysql\Sin::class, - 'TAN' => DoctrineExtensions\Query\Mysql\Tan::class, - 'BINARY' => DoctrineExtensions\Query\Mysql\Binary::class, - 'CEIL' => DoctrineExtensions\Query\Mysql\Ceil::class, - 'COUNTIF' => DoctrineExtensions\Query\Mysql\CountIf::class, - 'CRC32' => DoctrineExtensions\Query\Mysql\Crc32::class, - 'FLOOR' => DoctrineExtensions\Query\Mysql\Floor::class, - 'IFELSE' => DoctrineExtensions\Query\Mysql\IfElse::class, - 'IFNULL' => DoctrineExtensions\Query\Mysql\IfNull::class, - 'MATCH_AGAINST' => DoctrineExtensions\Query\Mysql\MatchAgainst::class, - 'NULLIF' => DoctrineExtensions\Query\Mysql\NullIf::class, - 'PI' => DoctrineExtensions\Query\Mysql\Pi::class, - 'POWER' => DoctrineExtensions\Query\Mysql\Power::class, - 'QUARTER' => DoctrineExtensions\Query\Mysql\Quarter::class, - 'RAND' => DoctrineExtensions\Query\Mysql\Rand::class, - 'ROUND' => DoctrineExtensions\Query\Mysql\Round::class, - 'STD' => DoctrineExtensions\Query\Mysql\Std::class, - 'UUID_SHORT' => DoctrineExtensions\Query\Mysql\UuidShort::class - ], - /* - |-------------------------------------------------------------------------- - | DQL custom string functions - |-------------------------------------------------------------------------- - */ - 'custom_string_functions' => [ - 'CHAR_LENGTH' => DoctrineExtensions\Query\Mysql\CharLength::class, - 'CONCAT_WS' => DoctrineExtensions\Query\Mysql\ConcatWs::class, - 'FIELD' => DoctrineExtensions\Query\Mysql\Field::class, - 'FIND_IN_SET' => DoctrineExtensions\Query\Mysql\FindInSet::class, - 'REPLACE' => DoctrineExtensions\Query\Mysql\Replace::class, - 'SOUNDEX' => DoctrineExtensions\Query\Mysql\Soundex::class, - 'STR_TO_DATE' => DoctrineExtensions\Query\Mysql\StrToDate::class, - 'ASCII' => DoctrineExtensions\Query\Mysql\Ascii::class, - 'GROUP_CONCAT' => DoctrineExtensions\Query\Mysql\GroupConcat::class, - 'MD5' => DoctrineExtensions\Query\Mysql\Md5::class, - 'REGEXP' => DoctrineExtensions\Query\Mysql\Regexp::class, - 'SHA1' => DoctrineExtensions\Query\Mysql\Sha1::class, - 'SHA2' => DoctrineExtensions\Query\Mysql\Sha2::class, - 'SUBSTRING_INDEX' => DoctrineExtensions\Query\Mysql\SubstringIndex::class - ], - /* - |-------------------------------------------------------------------------- - | Enable query logging with laravel file logging, - | debugbar, clockwork or an own implementation. - | Setting it to false, will disable logging - | - | Available: - | - LaravelDoctrine\ORM\Loggers\LaravelDebugbarLogger - | - LaravelDoctrine\ORM\Loggers\ClockworkLogger - | - LaravelDoctrine\ORM\Loggers\FileLogger - |-------------------------------------------------------------------------- - */ - 'logger' => env('DOCTRINE_LOGGER', 'LaravelDoctrine\ORM\Loggers\FileLogger'), - /* - |-------------------------------------------------------------------------- - | Cache - |-------------------------------------------------------------------------- - | - | Configure meta-data, query and result caching here. - | Optionally you can enable second level caching. - | - | Available: acp|array|file|memcached|redis|void - | - */ - 'cache' => [ - 'default' => env('DOCTRINE_CACHE', 'redis'), - 'namespace' => null, - 'second_level' => [ - 'enabled' => true, - 'region_lifetime' => 3600, - 'region_lock_lifetime' => 60, - 'regions' => [ - - ], - 'log_enabled' => true, - 'file_lock_region_directory' => '/tmp' - ] - - ], - /* - |-------------------------------------------------------------------------- - | Gedmo extensions - |-------------------------------------------------------------------------- - | - | Settings for Gedmo extensions - | If you want to use this you will have to require - | laravel-doctrine/extensions in your composer.json - | - */ - 'gedmo' => [ - 'all_mappings' => false - ] -]; diff --git a/config/filesystems.php b/config/filesystems.php deleted file mode 100644 index 70a83b96..00000000 --- a/config/filesystems.php +++ /dev/null @@ -1,68 +0,0 @@ - 'local', - - /* - |-------------------------------------------------------------------------- - | Default Cloud Filesystem Disk - |-------------------------------------------------------------------------- - | - | Many applications store files both locally and in the cloud. For this - | reason, you may specify a default "cloud" driver here. This driver - | will be bound as the Cloud disk implementation in the container. - | - */ - - 'cloud' => 's3', - - /* - |-------------------------------------------------------------------------- - | Filesystem Disks - |-------------------------------------------------------------------------- - | - | Here you may configure as many filesystem "disks" as you wish, and you - | may even configure multiple disks of the same driver. Defaults have - | been setup for each driver as an example of the required options. - | - */ - - 'disks' => [ - - 'local' => [ - 'driver' => 'local', - 'root' => storage_path('app'), - ], - - 'public' => [ - 'driver' => 'local', - 'root' => storage_path('app/public'), - 'visibility' => 'public', - ], - - 'swift' => [ - 'driver' => 'swift', - 'auth_url' => env('CLOUD_STORAGE_AUTH_URL'), - 'region' => env('CLOUD_STORAGE_REGION'), - 'app_credential_id' => env('CLOUD_STORAGE_APP_CREDENTIAL_ID'), - 'app_credential_secret' => env('CLOUD_STORAGE_APP_CREDENTIAL_SECRET'), - 'container' => env('CLOUD_STORAGE_CONTAINER'), - ] - - ], - -]; diff --git a/config/hashing.php b/config/hashing.php deleted file mode 100644 index d3c8e2fb..00000000 --- a/config/hashing.php +++ /dev/null @@ -1,52 +0,0 @@ - 'bcrypt', - - /* - |-------------------------------------------------------------------------- - | Bcrypt Options - |-------------------------------------------------------------------------- - | - | Here you may specify the configuration options that should be used when - | passwords are hashed using the Bcrypt algorithm. This will allow you - | to control the amount of time it takes to hash the given password. - | - */ - - 'bcrypt' => [ - 'rounds' => env('BCRYPT_ROUNDS', 10), - ], - - /* - |-------------------------------------------------------------------------- - | Argon Options - |-------------------------------------------------------------------------- - | - | Here you may specify the configuration options that should be used when - | passwords are hashed using the Argon algorithm. These will allow you - | to control the amount of time it takes to hash the given password. - | - */ - - 'argon' => [ - 'memory' => 1024, - 'threads' => 2, - 'time' => 2, - ], - -]; diff --git a/config/log.php b/config/log.php deleted file mode 100644 index 03d97d14..00000000 --- a/config/log.php +++ /dev/null @@ -1,26 +0,0 @@ - env('LOG_EMAIL_TO'), - //The sender of the mail - 'from_email' => env('LOG_EMAIL_FROM'), - //Log Level (debug, info, notice, warning, error, critical, alert) - 'level' => env('LOG_LEVEL', 'error'), - 'email_level' => env('LOG_EMAIL_LEVEL', 'error'), - 'email_subject' => env('LOG_EMAIL_SUBJECT', ''), -); \ No newline at end of file diff --git a/config/logging.php b/config/logging.php deleted file mode 100644 index 3c5b128c..00000000 --- a/config/logging.php +++ /dev/null @@ -1,81 +0,0 @@ - env('LOG_CHANNEL', 'stack'), - - /* - |-------------------------------------------------------------------------- - | Log Channels - |-------------------------------------------------------------------------- - | - | Here you may configure the log channels for your application. Out of - | the box, Laravel uses the Monolog PHP logging library. This gives - | you a variety of powerful log handlers / formatters to utilize. - | - | Available Drivers: "single", "daily", "slack", "syslog", - | "errorlog", "monolog", - | "custom", "stack" - | - */ - - 'channels' => [ - 'stack' => [ - 'driver' => 'stack', - 'channels' => ['daily'], - ], - - 'single' => [ - 'driver' => 'single', - 'path' => storage_path('/logs/laravel.log'), - 'level' => env('LOG_LEVEL', 'error'), - ], - - 'daily' => [ - 'driver' => 'daily', - 'path' => storage_path('/logs/laravel.log'), - 'level' => env('LOG_LEVEL', 'error'), - 'days' => 7, - ], - - 'slack' => [ - 'driver' => 'slack', - 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => 'Laravel Log', - 'emoji' => ':boom:', - 'level' => 'critical', - ], - - 'stderr' => [ - 'driver' => 'monolog', - 'handler' => StreamHandler::class, - 'with' => [ - 'stream' => 'php://stderr', - ], - ], - - 'syslog' => [ - 'driver' => 'syslog', - 'level' => env('LOG_LEVEL', 'error'), - ], - - 'errorlog' => [ - 'driver' => 'errorlog', - 'level' => env('LOG_LEVEL', 'error'), - ], - ], - -]; diff --git a/config/mail.php b/config/mail.php deleted file mode 100644 index cae44756..00000000 --- a/config/mail.php +++ /dev/null @@ -1,116 +0,0 @@ - env('MAIL_DRIVER', 'log'), - - /* - |-------------------------------------------------------------------------- - | SMTP Host Address - |-------------------------------------------------------------------------- - | - | Here you may provide the host address of the SMTP server used by your - | applications. A default option is provided that is compatible with - | the Mailgun mail service which will provide reliable deliveries. - | - */ - - 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), - - /* - |-------------------------------------------------------------------------- - | SMTP Host Port - |-------------------------------------------------------------------------- - | - | This is the SMTP port used by your application to deliver e-mails to - | users of the application. Like the host we have set this value to - | stay compatible with the Mailgun e-mail application by default. - | - */ - - 'port' => env('MAIL_PORT', 587), - - /* - |-------------------------------------------------------------------------- - | Global "From" Address - |-------------------------------------------------------------------------- - | - | You may wish for all e-mails sent by your application to be sent from - | the same address. Here, you may specify a name and address that is - | used globally for all e-mails that are sent by your application. - | - */ - - 'from' => ['address' => env('MAIL_FROM_EMAIL'), 'name' => env('MAIL_FROM_NAME')], - - /* - |-------------------------------------------------------------------------- - | E-Mail Encryption Protocol - |-------------------------------------------------------------------------- - | - | Here you may specify the encryption protocol that should be used when - | the application send e-mail messages. A sensible default using the - | transport layer security protocol should provide great security. - | - */ - - 'encryption' => env('MAIL_ENCRYPTION', 'tls'), - - /* - |-------------------------------------------------------------------------- - | SMTP Server Username - |-------------------------------------------------------------------------- - | - | If your SMTP server requires a username for authentication, you should - | set it here. This will get used to authenticate with your server on - | connection. You may also set the "password" value below this one. - | - */ - - 'username' => env('MAIL_USERNAME'), - - /* - |-------------------------------------------------------------------------- - | SMTP Server Password - |-------------------------------------------------------------------------- - | - | Here you may set the password required by your SMTP server to send out - | messages from your application. This will be given to the server on - | connection so that the application will be able to send messages. - | - */ - - 'password' => env('MAIL_PASSWORD'), - - /* - |-------------------------------------------------------------------------- - | Sendmail System Path - |-------------------------------------------------------------------------- - | - | When using the "sendmail" driver to send e-mails, we will need to know - | the path to where Sendmail lives on this server. A default path has - | been provided here, which will work well on most of your systems. - | - */ - - 'sendmail' => '/usr/sbin/sendmail -bs', - 'verification_email_subject' => env('MAIL_USER_VERIFICATION_EMAIL_SUBJECT'), - 'reset_password_email_subject' => env('MAIL_USER_RESET_PASSWORD_EMAIL_SUBJECT'), - 'locked_user_email_subject' => env("MAIL_LOCKED_USER_EMAIL_SUBJECT"), - 'support_email' => env("MAIL_SUPPORT_ADDRESS"), - 'user_spam_processor_to' => env('USER_SPAM_PROCESSOR_TO') -]; diff --git a/config/migrations.php b/config/migrations.php deleted file mode 100644 index 6e16aec8..00000000 --- a/config/migrations.php +++ /dev/null @@ -1,62 +0,0 @@ - [ - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. - | - */ - 'table' => 'DoctrineMigration', - /* - |-------------------------------------------------------------------------- - | Migration Directory - |-------------------------------------------------------------------------- - | - | This directory is where all migrations will be stored for this entity - | manager. Use different directories for each entity manager. - | - */ - 'directory' => sprintf("%s", database_path('migrations')), - /* - |-------------------------------------------------------------------------- - | Migration Namespace - |-------------------------------------------------------------------------- - | - | This namespace will be used on all migrations. To prevent collisions, add - | the entity manager name (connection name). - | - */ - 'namespace' => 'Database\\Migrations', - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | Tables which are filtered by Regular Expression. You optionally - | exclude or limit to certain tables. The default will - | filter all tables. - | - */ - 'schema' => [ - 'filter' => '/^(?!password_resets|failed_jobs).*$/' - ] - ], -]; diff --git a/config/queue.php b/config/queue.php deleted file mode 100644 index 36651158..00000000 --- a/config/queue.php +++ /dev/null @@ -1,165 +0,0 @@ - env('QUEUE_DRIVER', 'database'), - 'enable_message_broker' => env("ENABLE_MESSAGE_BROKER", false), - /* - |-------------------------------------------------------------------------- - | Queue Connections - |-------------------------------------------------------------------------- - | - | Here you may configure the connection information for each server that - | is used by your application. A default configuration has been added - | for each back-end shipped with Laravel. You are free to add more. - | - */ - - 'connections' => [ - // db - 'database' => [ - 'connection' => env('QUEUE_CONN', ''), - 'database' => env('QUEUE_DATABASE', ''), - 'driver' => 'database', - 'table' => 'queue_jobs', - 'queue' => 'default', - 'expire' => 60, - ], - // redis - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'default', - 'queue' => 'default', - 'expire' => 60, - 'block_for' => 5, - ], - // ... - 'message_broker' => [ - - 'driver' => 'rabbitmq', - - 'dsn' => env('RABBITMQ_DSN', null), - - /* - * Could be one a class that implements \Interop\Amqp\AmqpConnectionFactory for example: - * - \EnqueueAmqpExt\AmqpConnectionFactory if you install enqueue/amqp-ext - * - \EnqueueAmqpLib\AmqpConnectionFactory if you install enqueue/amqp-lib - * - \EnqueueAmqpBunny\AmqpConnectionFactory if you install enqueue/amqp-bunny - */ - - 'factory_class' => Enqueue\AmqpLib\AmqpConnectionFactory::class, - - 'host' => env('RABBITMQ_HOST', '127.0.0.1'), - 'port' => env('RABBITMQ_PORT', 5672), - - 'vhost' => env('RABBITMQ_VHOST', 'default'), - 'login' => env('RABBITMQ_LOGIN', 'guest'), - 'password' => env('RABBITMQ_PASSWORD', 'guest'), - - 'queue' => env('RABBITMQ_QUEUE', ''), - - 'options' => [ - - 'exchange' => [ - - 'name' => env('RABBITMQ_EXCHANGE_NAME'), - - /* - * Determine if exchange should be created if it does not exist. - */ - - 'declare' => env('RABBITMQ_EXCHANGE_DECLARE', true), - - /* - * Read more about possible values at https://www.rabbitmq.com/tutorials/amqp-concepts.html - */ - - 'type' => env('RABBITMQ_EXCHANGE_TYPE', \Interop\Amqp\AmqpTopic::TYPE_FANOUT), - 'passive' => env('RABBITMQ_EXCHANGE_PASSIVE', false), - 'durable' => env('RABBITMQ_EXCHANGE_DURABLE', true), - 'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', true), - 'arguments' => env('RABBITMQ_EXCHANGE_ARGUMENTS'), - ], - - 'queue' => [ - - /* - * Determine if queue should be created if it does not exist. - */ - - 'declare' => env('RABBITMQ_QUEUE_DECLARE', false), - - /* - * Determine if queue should be binded to the exchange created. - */ - - 'bind' => env('RABBITMQ_QUEUE_DECLARE_BIND', false), - - /* - * Read more about possible values at https://www.rabbitmq.com/tutorials/amqp-concepts.html - */ - - 'passive' => env('RABBITMQ_QUEUE_PASSIVE', false), - 'durable' => env('RABBITMQ_QUEUE_DURABLE', true), - 'exclusive' => env('RABBITMQ_QUEUE_EXCLUSIVE', false), - 'auto_delete' => env('RABBITMQ_QUEUE_AUTODELETE', false), - 'arguments' => env('RABBITMQ_QUEUE_ARGUMENTS'), - ], - ], - - /* - * Determine the number of seconds to sleep if there's an error communicating with rabbitmq - * If set to false, it'll throw an exception rather than doing the sleep for X seconds. - */ - - 'sleep_on_error' => env('RABBITMQ_ERROR_SLEEP', 5), - - /* - * Optional SSL params if an SSL connection is used - * Using an SSL connection will also require to configure your RabbitMQ to enable SSL. More details can be founds here: https://www.rabbitmq.com/ssl.html - */ - - 'ssl_params' => [ - 'ssl_on' => env('RABBITMQ_SSL', false), - 'cafile' => env('RABBITMQ_SSL_CAFILE', null), - 'local_cert' => env('RABBITMQ_SSL_LOCALCERT', null), - 'local_key' => env('RABBITMQ_SSL_LOCALKEY', null), - 'verify_peer' => env('RABBITMQ_SSL_VERIFY_PEER', false), - 'passphrase' => env('RABBITMQ_SSL_PASSPHRASE', null), - ], - - ], - ], - - /* - |-------------------------------------------------------------------------- - | Failed Queue Jobs - |-------------------------------------------------------------------------- - | - | These options configure the behavior of failed queue job logging so you - | can control which database and table are used to store the jobs that - | have failed. You may change them to any database / table you wish. - | - */ - - 'failed' => [ - 'connection' => env('QUEUE_CONN', ''), - 'database' => env('QUEUE_DATABASE', ''), - 'table' => 'queue_failed_jobs', - ], - -]; diff --git a/config/recaptcha.php b/config/recaptcha.php deleted file mode 100644 index 5dfccd24..00000000 --- a/config/recaptcha.php +++ /dev/null @@ -1,65 +0,0 @@ - env('RECAPTCHA_PUBLIC_KEY', ''), - 'private_key' => env('RECAPTCHA_PRIVATE_KEY', ''), - - /* - |-------------------------------------------------------------------------- - | Template - |-------------------------------------------------------------------------- - | - | Set a template to use if you don't want to use the standard one. - | - */ - 'template' => env('RECAPTCHA_TEMPLATE', ''), - - /* - |-------------------------------------------------------------------------- - | Driver - |-------------------------------------------------------------------------- - | - | Determine how to call out to get response; values are 'curl' or 'native'. - | Only applies to v2. - | - */ - 'driver' => 'curl', - - /* - |-------------------------------------------------------------------------- - | Options - |-------------------------------------------------------------------------- - | - | Various options for the driver - | - */ - 'options' => [ - - 'curl_timeout' => 1, - - ], - - /* - |-------------------------------------------------------------------------- - | Version - |-------------------------------------------------------------------------- - | - | Set which version of ReCaptcha to use. - | - */ - - 'version' => 2, - -]; diff --git a/config/server.php b/config/server.php deleted file mode 100644 index 62ba874a..00000000 --- a/config/server.php +++ /dev/null @@ -1,22 +0,0 @@ - env('SSL_ENABLED', false), - 'db_log_enabled' => env('DB_LOG_ENABLED', false), - 'assets_base_url' => env('ASSETS_BASE_URL', null), - 'banning_enable' => env('BANNING_ENABLE', true), - 'support_email' => env('SUPPORT_EMAIL', 'info@openstack.org'), -); \ No newline at end of file diff --git a/config/services.php b/config/services.php deleted file mode 100644 index 06f9e7a1..00000000 --- a/config/services.php +++ /dev/null @@ -1,42 +0,0 @@ - [ - 'domain' => env('MAILGUN_DOMAIN'), - 'secret' => env('MAILGUN_SECRET'), - ], - - 'ses' => [ - 'key' => env('SES_KEY'), - 'secret' => env('SES_SECRET'), - 'region' => 'us-east-1', - ], - - 'sparkpost' => [ - 'secret' => env('SPARKPOST_SECRET'), - ], - - 'stripe' => [ - 'model' => App\User::class, - 'key' => env('STRIPE_KEY'), - 'secret' => env('STRIPE_SECRET'), - ], - - 'sendgrid' => [ - 'api_key' => env('SENDGRID_API_KEY'), - ], - -]; diff --git a/config/session.php b/config/session.php deleted file mode 100644 index 39306e12..00000000 --- a/config/session.php +++ /dev/null @@ -1,181 +0,0 @@ - env('SESSION_DRIVER', 'file'), - - /* - |-------------------------------------------------------------------------- - | Session Lifetime - |-------------------------------------------------------------------------- - | - | Here you may specify the number of minutes that you wish the session - | to be allowed to remain idle before it expires. If you want them - | to immediately expire on the browser closing, set that option. - | - */ - - 'lifetime' => env('SESSION_LIFETIME', 120), - - 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), - - /* - |-------------------------------------------------------------------------- - | Session Encryption - |-------------------------------------------------------------------------- - | - | This option allows you to easily specify that all of your session data - | should be encrypted before it is stored. All encryption will be run - | automatically by Laravel and you can use the Session like normal. - | - */ - - 'encrypt' => env('SESSION_ENCRYPT' , false), - - /* - |-------------------------------------------------------------------------- - | Session File Location - |-------------------------------------------------------------------------- - | - | When using the native session driver, we need a location where session - | files may be stored. A default has been set for you but a different - | location may be specified. This is only needed for file sessions. - | - */ - - 'files' => storage_path('framework/sessions'), - - /* - |-------------------------------------------------------------------------- - | Session Database Connection - |-------------------------------------------------------------------------- - | - | When using the "database" or "redis" session drivers, you may specify a - | connection that should be used to manage these sessions. This should - | correspond to a connection in your database configuration options. - | - */ - - 'connection' => env('SESSION_CONNECTION', 'session'), - - /* - |-------------------------------------------------------------------------- - | Session Database Table - |-------------------------------------------------------------------------- - | - | When using the "database" session driver, you may specify the table we - | should use to manage the sessions. Of course, a sensible default is - | provided for you; however, you are free to change this as needed. - | - */ - - 'table' => 'sessions', - - /* - |-------------------------------------------------------------------------- - | Session Sweeping Lottery - |-------------------------------------------------------------------------- - | - | Some session drivers must manually sweep their storage location to get - | rid of old sessions from storage. Here are the chances that it will - | happen on a given request. By default, the odds are 2 out of 100. - | - */ - - 'lottery' => [2, 100], - - /* - |-------------------------------------------------------------------------- - | Session Cookie Name - |-------------------------------------------------------------------------- - | - | Here you may change the name of the cookie used to identify a session - | instance by ID. The name specified here will get used every time a - | new session cookie is created by the framework for every driver. - | - */ - - 'cookie' => env('SESSION_COOKIE_NAME', 'openstackid_session'), - - /* - |-------------------------------------------------------------------------- - | Session Cookie Path - |-------------------------------------------------------------------------- - | - | The session cookie path determines the path for which the cookie will - | be regarded as available. Typically, this will be the root path of - | your application but you are free to change this when necessary. - | - */ - - 'path' => env('SESSION_COOKIE_PATH', '/'), - - /* - |-------------------------------------------------------------------------- - | Session Cookie Domain - |-------------------------------------------------------------------------- - | - | Here you may change the domain of the cookie used to identify a session - | in your application. This will determine which domains the cookie is - | available to in your application. A sensible default has been set. - | - */ - - 'domain' => env('SESSION_COOKIE_DOMAIN', null), - - /* - |-------------------------------------------------------------------------- - | HTTPS Only Cookies - |-------------------------------------------------------------------------- - | - | By setting this option to true, session cookies will only be sent back - | to the server if the browser has a HTTPS connection. This will keep - | the cookie from being sent to you if it can not be done securely. - | - */ - - 'secure' => true, - - /* - |-------------------------------------------------------------------------- - | HTTP Access Only - |-------------------------------------------------------------------------- - | - | Setting this value to true will prevent JavaScript from accessing the - | value of the cookie and the cookie will only be accessible through - | the HTTP protocol. You are free to modify this option if needed. - | - */ - - 'http_only' => env('SESSION_COOKIE_HTTP_ONLY', true), - - /* - |-------------------------------------------------------------------------- - | Same-Site Cookies - |-------------------------------------------------------------------------- - | - | This option determines how your cookies behave when cross-site requests - | take place, and can be used to mitigate CSRF attacks. By default, we - | do not enable this as other CSRF protection services are in place. - | - | Supported: "lax", "strict" - | - */ - - 'same_site' => 'none', - -]; diff --git a/config/view.php b/config/view.php deleted file mode 100644 index e193ab61..00000000 --- a/config/view.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - realpath(base_path('resources/views')), - ], - - /* - |-------------------------------------------------------------------------- - | Compiled View Path - |-------------------------------------------------------------------------- - | - | This option determines where all the compiled Blade templates will be - | stored for your application. Typically, this is within the storage - | directory. However, as usual, you are free to change this value. - | - */ - - 'compiled' => realpath(storage_path('framework/views')), - -]; diff --git a/database/.gitignore b/database/.gitignore deleted file mode 100644 index 9b1dffd9..00000000 --- a/database/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.sqlite diff --git a/database/factories/.gitkeep b/database/factories/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/database/migrations/.gitkeep b/database/migrations/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/database/migrations/Version20190604015804.php b/database/migrations/Version20190604015804.php deleted file mode 100644 index 392c21e6..00000000 --- a/database/migrations/Version20190604015804.php +++ /dev/null @@ -1,694 +0,0 @@ -hasTable("openid_users")) { - foreach (explode(";", $initial_state) as $sql_statement) { - $sql_statement = trim($sql_statement); - if (empty($sql_statement)) continue; - $this->addSql($sql_statement); - } - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - (new Builder($schema))->drop('initial'); - } -} diff --git a/database/migrations/Version20190604015808.php b/database/migrations/Version20190604015808.php deleted file mode 100644 index fd477a74..00000000 --- a/database/migrations/Version20190604015808.php +++ /dev/null @@ -1,44 +0,0 @@ -hasTable("openid_users")) { - $this->addSql("RENAME TABLE openid_users TO users;"); - } - - $builder = new Builder($schema); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $this->addSql("RENAME TABLE users TO openid_users;"); - - } -} diff --git a/database/migrations/Version20190604024945.php b/database/migrations/Version20190604024945.php deleted file mode 100644 index 3b47311b..00000000 --- a/database/migrations/Version20190604024945.php +++ /dev/null @@ -1,113 +0,0 @@ -table('users', function (Table $table) { - $table->string("first_name", 100)->setNotnull(false); - $table->string("last_name", 100)->setNotnull(false); - $table->timestamp("birthday")->setNotnull(false); - $table->string("email", 255)->setNotnull(false); - $table->unique("email"); - $table->string("address1", 255)->setNotnull(false); - $table->string("address2", 255)->setNotnull(false); - $table->string("state", 100)->setNotnull(false); - $table->string("city", 100)->setNotnull(false); - $table->string("post_code", 64)->setNotnull(false); - $table->string("country_iso_code", 2)->setNotnull(false); - $table->string("second_email", 255)->setNotnull(false); - $table->string("third_email", 255)->setNotnull(false); - $table->string("gender", 100)->setNotnull(false); - $table->text("statement_of_interest")->setNotnull(false); - $table->text("bio")->setNotnull(false); - $table->string("language", 10)->setNotnull(false); - $table->text("irc")->setNotnull(false); - $table->text("linked_in_profile")->setNotnull(false); - $table->text("github_user", 100)->setNotnull(false); - $table->text("wechat_user", 100)->setNotnull(false); - $table->string("password", 255)->setNotnull(false); - $table->string("password_enc", 100)->setNotnull(false); - $table->string("password_salt", 255)->setNotnull(false); - $table->boolean("email_verified")->setDefault(0); - $table->text("email_verified_token_hash")->setNotnull(false); - $table->timestamp("email_verified_date")->setNotnull(false); - $table->dropColumn("last_login_date"); - $table->timestamp("last_login_date")->setNotnull(false); - }); - - $builder->create('groups', function (Table $table) { - $table->increments('id'); - $table->timestamps(); - $table->text("name"); - $table->boolean("active")->setDefault(false); - $table->boolean("is_default")->setDefault(false); - $table->string("slug", 255); - }); - - $builder->create('user_groups', function (Table $table) { - $table->increments('id'); - $table->bigInteger("user_id")->setUnsigned(true); - $table->index("user_id", "user_id"); - $table->foreign("users", "user_id", "id"); - $table->integer("group_id")->setUnsigned(true); - $table->index("group_id", "group_id"); - $table->foreign("groups", "group_id", "id"); - }); - - $builder->create('organizations', function (Table $table) { - $table->increments('id'); - $table->timestamps(); - $table->text("name"); - }); - - $builder->create('affiliations', function (Table $table) { - $table->increments('id'); - $table->timestamps(); - $table->timestamp('start_date'); - $table->timestamp('end_date')->setNotnull(false); - $table->text("job_title"); - $table->text("role")->setNotnull(false); - $table->boolean("is_current")->setDefault(0); - $table->bigInteger("user_id")->setUnsigned(true); - $table->index("user_id", "user_id"); - $table->foreign("users", "user_id", "id"); - $table->integer("organization_id")->setUnsigned(true); - $table->index("organization_id", "organization_id"); - $table->foreign("organizations", "organization_id", "id"); - }); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $schema->dropTable("user_groups"); - $schema->dropTable("groups"); - } -} diff --git a/database/migrations/Version20190609163537.php b/database/migrations/Version20190609163537.php deleted file mode 100644 index d5f31d24..00000000 --- a/database/migrations/Version20190609163537.php +++ /dev/null @@ -1,56 +0,0 @@ -table('server_configuration', function (Table $table) { - $table->timestamps(); - }); - - $builder->table('openid_trusted_sites', function (Table $table) { - $table->timestamps(); - }); - - $builder->table('openid_associations', function (Table $table) { - $table->timestamps(); - }); - - $builder->table('oauth2_api_endpoint', function (Table $table) { - $table->boolean("allow_credentials")->setDefault(false); - $table->integer("rate_limit_decay")->setDefault(0); - }); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20190611172226.php b/database/migrations/Version20190611172226.php deleted file mode 100644 index ab36192e..00000000 --- a/database/migrations/Version20190611172226.php +++ /dev/null @@ -1,41 +0,0 @@ -addSql("ALTER TABLE oauth2_api_scope CHANGE `default` `is_default` tinyint(1);"); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20190614143948.php b/database/migrations/Version20190614143948.php deleted file mode 100644 index 49632386..00000000 --- a/database/migrations/Version20190614143948.php +++ /dev/null @@ -1,51 +0,0 @@ -create('user_password_reset_request', function (Table $table) { - $table->increments('id'); - $table->timestamps(); - $table->timestamp("redeem_at")->setNotnull(false); - $table->text('hash'); - $table->integer('lifetime'); - $table->bigInteger("owner_id")->setUnsigned(true); - $table->index("owner_id", "owner_id"); - $table->foreign("users", "owner_id", "id"); - }); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $builder = new Builder($schema); - $builder->drop('user_password_reset_request'); - } -} diff --git a/database/migrations/Version20190621173542.php b/database/migrations/Version20190621173542.php deleted file mode 100644 index 9b3b1d10..00000000 --- a/database/migrations/Version20190621173542.php +++ /dev/null @@ -1,71 +0,0 @@ -addSql($sql); - - $sql = <<addSql($sql); - - $sql = <<addSql($sql); - - $sql = <<addSql($sql); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20190627180435.php b/database/migrations/Version20190627180435.php deleted file mode 100644 index e7a22d9e..00000000 --- a/database/migrations/Version20190627180435.php +++ /dev/null @@ -1,46 +0,0 @@ -table('users', function (Table $table) { - $table->bigInteger("created_by_id")->setUnsigned(true)->setNotnull(false); - $table->index("created_by_id", "created_by_id"); - $table->foreign("users", "created_by_id", "id"); - $table->dropColumn('lock'); - }); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20190729014640.php b/database/migrations/Version20190729014640.php deleted file mode 100644 index 39d58755..00000000 --- a/database/migrations/Version20190729014640.php +++ /dev/null @@ -1,61 +0,0 @@ -hasTable("user_registration_requests")){ - $builder->create('user_registration_requests', function (Table $table) { - $table->increments('id'); - $table->timestamps(); - $table->timestamp("redeem_at")->setNotnull(false); - $table->text('hash'); - $table->string("first_name", 100)->setNotnull(false); - $table->string("last_name", 100)->setNotnull(false); - $table->string("email", 255)->setNotnull(false); - $table->string("country_iso_code", 2)->setNotnull(false); - // user associated after creation - $table->bigInteger("user_id")->setUnsigned(true)->setNotnull(false); - $table->index("user_id", "user_id"); - $table->foreign("users", "user_id", "id", ["onDelete" => "CASCADE"]); - // origination oauth2 client - $table->bigInteger("client_id")->setUnsigned(true)->setNotnull(false); - $table->index("client_id", "client_id"); - $table->foreign("oauth2_client", "client_id", "id", ["onDelete" => "CASCADE"]); - }); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $schema->dropTable("user_registration_requests"); - } -} diff --git a/database/migrations/Version20190729150610.php b/database/migrations/Version20190729150610.php deleted file mode 100644 index 58123583..00000000 --- a/database/migrations/Version20190729150610.php +++ /dev/null @@ -1,84 +0,0 @@ -findOneBy([ - 'friendly_name' => 'openstack id server' - ]); - - if(is_null($rs)) return; - - $api = new Api(); - $api->setName('user-registration'); - $api->setActive(true); - $api->setDescription('User Registration API'); - $api->setResourceServer($rs); - - EntityManager::persist($api); - - EntityManager::flush(); - - \SeedUtils::seedScopes([ - [ - 'name' => IUserScopes::Registration, - 'short_description' => 'Allows to request user registrations.', - 'description' => 'Allows to request user registrations.', - 'system' => false, - 'default' => false, - 'groups' => true, - ], - - ], 'user-registration'); - - \SeedUtils::seedApiEndpoints('user-registration', [ - [ - 'name' => 'request-user-registration', - 'active' => true, - 'route' => '/api/v1/user-registration-requests', - 'http_method' => 'POST', - 'scopes' => [ - IUserScopes::Registration - ], - ], - - ] - ); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20190828144355.php b/database/migrations/Version20190828144355.php deleted file mode 100644 index bafeb9a9..00000000 --- a/database/migrations/Version20190828144355.php +++ /dev/null @@ -1,64 +0,0 @@ -hasTable("queue_jobs")) { - $builder->create('queue_jobs', function (Table $table) { - $table->bigInteger("id", true, false); - $table->primary("id"); - $table->string('queue'); - $table->index("queue","queue"); - $table->text("payload"); - $table->unsignedSmallInteger('attempts'); - $table->unsignedInteger('reserved_at')->setNotnull(false); - $table->unsignedInteger('available_at'); - $table->unsignedInteger('created_at'); - }); - } - if(!$schema->hasTable("queue_failed_jobs")) { - $builder->create('queue_failed_jobs', function (Table $table) { - $table->bigInteger("id", true, false); - $table->primary("id"); - $table->text('connection'); - $table->text('queue'); - $table->text('payload'); - $table->text('exception'); - $table->timestamp('failed_at')->setDefault('CURRENT_TIMESTAMP'); - }); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $schema->dropTable("failed_jobs"); - $schema->dropTable("jobs"); - } -} diff --git a/database/migrations/Version20190828144405.php b/database/migrations/Version20190828144405.php deleted file mode 100644 index f7cfe019..00000000 --- a/database/migrations/Version20190828144405.php +++ /dev/null @@ -1,41 +0,0 @@ -addSql("ALTER TABLE queue_jobs MODIFY payload longtext NOT NULL;"); - $this->addSql("ALTER TABLE queue_failed_jobs MODIFY payload longtext NOT NULL;"); - $this->addSql("ALTER TABLE queue_failed_jobs MODIFY `exception` longtext NOT NULL;"); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20190829142736.php b/database/migrations/Version20190829142736.php deleted file mode 100644 index a56b7744..00000000 --- a/database/migrations/Version20190829142736.php +++ /dev/null @@ -1,62 +0,0 @@ - IUserScopes::ReadAll, - 'short_description' => 'Allows access to users info', - 'description' => 'This scope value requests access to users info', - 'system' => false, - 'default' => false, - 'groups' => true, - ], - ], 'users'); - - \SeedUtils::seedApiEndpoints('users', [ - // get users - [ - 'name' => 'get-users', - 'active' => true, - 'route' => '/api/v1/users', - 'http_method' => 'GET', - 'scopes' => [ - IUserScopes::ReadAll - ], - ] - - ] - ); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20190904133943.php b/database/migrations/Version20190904133943.php deleted file mode 100644 index ab75f1a4..00000000 --- a/database/migrations/Version20190904133943.php +++ /dev/null @@ -1,94 +0,0 @@ -findOneBy(['name' => 'super admins']); - if(is_null($group)){ - $group = new Group(); - $group->setName('super admins'); - $group->setSlug(IGroupSlugs::SuperAdminGroup); - $group->setDefault(false); - $group->setActive(true); - EntityManager::persist($group); - EntityManager::flush(); - } - - $group = EntityManager::getRepository(Group::class)->findOneBy(['name' => 'oauth2 server admins']); - if(is_null($group)){ - $group = new Group(); - $group->setName('oauth2 server admins'); - $group->setSlug(IGroupSlugs::OAuth2ServerAdminGroup); - $group->setDefault(false); - $group->setActive(true); - EntityManager::persist($group); - EntityManager::flush(); - } - - $group = EntityManager::getRepository(Group::class)->findOneBy(['name' => 'oauth2 system scope admins']); - if(is_null($group)){ - $group = new Group(); - $group->setName('oauth2 system scope admins'); - $group->setSlug(IGroupSlugs::OAuth2SystemScopeAdminsGroup); - $group->setDefault(false); - $group->setActive(true); - EntityManager::persist($group); - EntityManager::flush(); - } - - $group = EntityManager::getRepository(Group::class)->findOneBy(['name' => 'openstackid server admins']); - if(is_null($group)){ - $group = new Group(); - $group->setName('openstackid server admins'); - $group->setSlug(IGroupSlugs::OpenIdServerAdminsGroup); - $group->setDefault(false); - $group->setActive(true); - EntityManager::persist($group); - EntityManager::flush(); - } - - $group = EntityManager::getRepository(Group::class)->findOneBy(['name' => 'raw users']); - if(is_null($group)){ - $group = new Group(); - $group->setName('raw users'); - $group->setSlug(IGroupSlugs::RawUsersGroup); - $group->setDefault(true); - $group->setActive(true); - EntityManager::persist($group); - EntityManager::flush(); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20191017190223.php b/database/migrations/Version20191017190223.php deleted file mode 100644 index 2b6b9e9b..00000000 --- a/database/migrations/Version20191017190223.php +++ /dev/null @@ -1,50 +0,0 @@ -hasTable("users") && !$builder->hasColumn("users","gender_specify") ) { - $builder->table('users', function (Table $table) { - $table->string('gender_specify')->setNotnull(false); - }); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $builder = new Builder($schema); - if($schema->hasTable("users") && $builder->hasColumn("users","gender_specify") ) { - $builder->table('users', function (Table $table) { - $table->dropColumn('gender_specify'); - }); - } - } -} diff --git a/database/migrations/Version20191121032755.php b/database/migrations/Version20191121032755.php deleted file mode 100644 index ed17cf23..00000000 --- a/database/migrations/Version20191121032755.php +++ /dev/null @@ -1,40 +0,0 @@ -addSql("ALTER TABLE users MODIFY identifier varchar(255) DEFAULT NULL;"); - $this->addSql("ALTER TABLE users MODIFY gender_specify varchar(255) DEFAULT NULL;"); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20200115152348.php b/database/migrations/Version20200115152348.php deleted file mode 100644 index ae238e1c..00000000 --- a/database/migrations/Version20200115152348.php +++ /dev/null @@ -1,49 +0,0 @@ -hasTable("users") && !$builder->hasColumn("users","twitter_name") ) { - $builder->table('users', function (Table $table) { - $table->string('twitter_name')->setNotnull(false); - }); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $builder = new Builder($schema); - if($schema->hasTable("users") && $builder->hasColumn("users","twitter_name") ) { - $builder->table('users', function (Table $table) { - $table->dropColumn('twitter_name'); - }); - } - } -} diff --git a/database/migrations/Version20200306133045.php b/database/migrations/Version20200306133045.php deleted file mode 100644 index a4ff90b3..00000000 --- a/database/migrations/Version20200306133045.php +++ /dev/null @@ -1,91 +0,0 @@ -hasTable("users") && !$builder->hasColumn("users","spam_type") ) { - $builder->table('users', function (Table $table) { - $table->string('spam_type')->setNotnull(true)->setDefault('None'); - }); - } - - if(!$schema->hasTable("users_spam_estimator_feed")) { - $builder->create('users_spam_estimator_feed', function (Table $table) { - $table->increments('id'); - $table->timestamps(); - $table->string("first_name", 100)->setNotnull(false); - $table->string("last_name", 100)->setNotnull(false); - $table->string("email", 255)->setNotnull(false); - $table->unique("email"); - $table->text("bio")->setNotnull(false); - $table->string('spam_type')->setNotnull(true)->setDefault('None'); - }); - } - - if(!$schema->hasTable("users_deleted")) { - $builder->create('users_deleted', function (Table $table) { - $table->increments('id'); - $table->timestamps(); - $table->string("first_name", 100)->setNotnull(false); - $table->string("last_name", 100)->setNotnull(false); - $table->string("email", 255)->setNotnull(false); - $table->unique("email"); - $table->bigInteger("performer_id")->setUnsigned(true); - $table->index("performer_id", "performer_id"); - $table->foreign("users", "performer_id", "id", ["onDelete" => "CASCADE"]); - }); - } - - if(!$schema->hasTable("users_email_changed")) { - $builder->create('users_email_changed', function (Table $table) { - $table->increments('id'); - $table->timestamps(); - $table->string("former_email", 255)->setNotnull(false); - $table->string("new_email", 255)->setNotnull(false); - $table->bigInteger("user_id")->setUnsigned(true); - $table->index("user_id", "user_id"); - $table->foreign("users", "user_id", "id", ["onDelete" => "CASCADE"]); - $table->bigInteger("performer_id")->setUnsigned(true); - $table->index("performer_id", "performer_id"); - $table->foreign("users", "performer_id", "id", ["onDelete" => "CASCADE"]); - }); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $builder = new Builder($schema); - $builder->dropIfExists("users_email_changed"); - $builder->dropIfExists("users_deleted"); - $builder->dropIfExists("users_spam_estimator_feed"); - } -} diff --git a/database/migrations/Version20200306135446.php b/database/migrations/Version20200306135446.php deleted file mode 100644 index 3f51e668..00000000 --- a/database/migrations/Version20200306135446.php +++ /dev/null @@ -1,59 +0,0 @@ -addSql($sql); - - $sql = <<addSql($sql); - - // reset spam state to Ham - $sql = <<addSql($sql); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20200528175450.php b/database/migrations/Version20200528175450.php deleted file mode 100644 index 2b857ffa..00000000 --- a/database/migrations/Version20200528175450.php +++ /dev/null @@ -1,65 +0,0 @@ -hasTable("sso_disqus_profile")) { - $builder->create("sso_disqus_profile", function (Table $table) { - $table->increments('id'); - $table->timestamps(); - $table->string("forum_slug")->setNotnull(true); - $table->string("public_key")->setNotnull(true); - $table->string("secret_key")->setNotnull(true); - $table->unique("forum_slug"); - }); - } - - if (!$builder->hasTable("sso_rocket_chat_profile")) { - $builder->create("sso_rocket_chat_profile", function (Table $table) { - $table->increments('id'); - $table->timestamps(); - $table->string("forum_slug")->setNotnull(true); - $table->string("base_url")->setNotnull(true); - $table->string("service_name")->setNotnull(true); - $table->unique("forum_slug"); - }); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $builder = new Builder($schema); - - $builder->dropIfExists("sso_disqus_profile"); - - $builder->dropIfExists("sso_rocket_chat_profile"); - } -} diff --git a/database/migrations/Version20200530150357.php b/database/migrations/Version20200530150357.php deleted file mode 100644 index f92de6d8..00000000 --- a/database/migrations/Version20200530150357.php +++ /dev/null @@ -1,72 +0,0 @@ - IUserScopes::SSO, - 'short_description' => 'Allows SSO integration', - 'description' => 'Allows SSO integration', - 'system' => false, - 'default' => false, - 'groups' => true, - ], - - ], 'sso'); - - SeedUtils::seedApiEndpoints('sso', [ - [ - 'name' => 'sso-disqus', - 'active' => true, - 'route' => '/api/v1/sso/disqus/{forum_slug}/profile', - 'http_method' => 'GET', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::SSO - ], - ], - [ - 'name' => 'sso-rocket-chat', - 'active' => true, - 'route' => '/api/v1/sso/rocket-chat/{forum_slug}/profile', - 'http_method' => 'GET', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::SSO - ], - ], - ]); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20200715150546.php b/database/migrations/Version20200715150546.php deleted file mode 100644 index f7c2daf4..00000000 --- a/database/migrations/Version20200715150546.php +++ /dev/null @@ -1,51 +0,0 @@ -hasTable("users") && !$builder->hasColumn("users","company") ) { - $builder->table('users', function (Table $table) { - $table->string('company')->setNotnull(false); - $table->string('phone_number')->setNotnull(false); - }); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $builder = new Builder($schema); - if($schema->hasTable("users") && $builder->hasColumn("users","company") ) { - $builder->table('users', function (Table $table) { - $table->dropColumn('company'); - $table->dropColumn('phone_number'); - }); - } - } -} diff --git a/database/migrations/Version20200715195145.php b/database/migrations/Version20200715195145.php deleted file mode 100644 index 2e57a874..00000000 --- a/database/migrations/Version20200715195145.php +++ /dev/null @@ -1,53 +0,0 @@ -hasTable("sso_stream_chat_profile")) { - $builder->create("sso_stream_chat_profile", function (Table $table) { - $table->increments('id'); - $table->timestamps(); - $table->string("forum_slug")->setNotnull(true); - $table->string("api_key")->setNotnull(true); - $table->string("api_secret")->setNotnull(true); - $table->unique("forum_slug"); - }); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $builder = new Builder($schema); - - $builder->dropIfExists("sso_stream_chat_profile"); - } -} diff --git a/database/migrations/Version20200715195155.php b/database/migrations/Version20200715195155.php deleted file mode 100644 index c8348d8e..00000000 --- a/database/migrations/Version20200715195155.php +++ /dev/null @@ -1,47 +0,0 @@ - 'sso-stream-chat', - 'active' => true, - 'route' => '/api/v1/sso/stream-chat/{forum_slug}/profile', - 'http_method' => 'GET', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::SSO - ], - ], - ]); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20200803193707.php b/database/migrations/Version20200803193707.php deleted file mode 100644 index 1538b287..00000000 --- a/database/migrations/Version20200803193707.php +++ /dev/null @@ -1,50 +0,0 @@ -hasTable("users") && !$builder->hasColumn("users","pic") ) { - $builder->table('users', function (Table $table) { - $table->string('pic')->setNotnull(false)->setLength(512); - }); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - $builder = new Builder($schema); - if($schema->hasTable("users") && $builder->hasColumn("users","pic") ) { - $builder->table('users', function (Table $table) { - $table->dropColumn('pic'); - }); - } - } -} diff --git a/database/migrations/Version20200811151509.php b/database/migrations/Version20200811151509.php deleted file mode 100644 index 936b723f..00000000 --- a/database/migrations/Version20200811151509.php +++ /dev/null @@ -1,83 +0,0 @@ - IUserScopes::MeRead, - 'short_description' => 'Allows access to read your Profile', - 'description' => 'Allows access to read your Profile', - 'system' => false, - 'default' => false, - 'groups' => false, - ], - - ], 'users'); - - SeedUtils::seedScopes([ - [ - 'name' => IUserScopes::MeWrite, - 'short_description' => 'Allows access to write your Profile', - 'description' => 'Allows access to write your Profile', - 'system' => false, - 'default' => false, - 'groups' => false, - ], - - ], 'users'); - - SeedUtils::seedApiEndpoints('users', [ - [ - 'name' => 'update-my-user', - 'active' => true, - 'route' => '/api/v1/users/me', - 'http_method' => 'PUT', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::MeWrite - ], - ], - [ - 'name' => 'update-my-user-pic', - 'active' => true, - 'route' => '/api/v1/users/me/pic', - 'http_method' => 'PUT', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::MeWrite - ], - ], - ]); - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20200910212216.php b/database/migrations/Version20200910212216.php deleted file mode 100644 index 0afa3f2c..00000000 --- a/database/migrations/Version20200910212216.php +++ /dev/null @@ -1,57 +0,0 @@ -findOneBy(['name' => 'chat qa']); - if(is_null($group)){ - $group = new Group(); - $group->setName('chat qa'); - $group->setSlug(IGroupSlugs::ChatQAGroup); - $group->setDefault(false); - $group->setActive(true); - EntityManager::persist($group); - EntityManager::flush(); - } - - $group = EntityManager::getRepository(Group::class)->findOneBy(['name' => 'chat help']); - if(is_null($group)){ - $group = new Group(); - $group->setName('chat help'); - $group->setSlug(IGroupSlugs::ChatHelpGroup); - $group->setDefault(false); - $group->setActive(true); - EntityManager::persist($group); - EntityManager::flush(); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - - } -} diff --git a/database/migrations/Version20201105184620.php b/database/migrations/Version20201105184620.php deleted file mode 100644 index 4156c145..00000000 --- a/database/migrations/Version20201105184620.php +++ /dev/null @@ -1,49 +0,0 @@ -hasTable("users") && !$builder->hasColumn("users","job_title") ) { - $builder->table('users', function (Table $table) { - $table->string('job_title')->setNotnull(false)->setLength(254); - }); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $builder = new Builder($schema); - if($schema->hasTable("users") && $builder->hasColumn("users","job_title") ) { - $builder->table('users', function (Table $table) { - $table->dropColumn('job_title'); - }); - } - } -} diff --git a/database/migrations/Version20201214162511.php b/database/migrations/Version20201214162511.php deleted file mode 100644 index bc9dc0c0..00000000 --- a/database/migrations/Version20201214162511.php +++ /dev/null @@ -1,49 +0,0 @@ -hasTable("oauth2_client") && !$builder->hasColumn("oauth2_client","pkce_enabled") ) { - $builder->table('oauth2_client', function (Table $table) { - $table->boolean('pkce_enabled')->setDefault(0); - }); - } - } - - /** - * @param Schema $schema - */ - public function down(Schema $schema) - { - $builder = new Builder($schema); - if($schema->hasTable("oauth2_client") && $builder->hasColumn("oauth2_client","pkce_enabled") ) { - $builder->table('oauth2_client', function (Table $table) { - $table->dropColumn('pkce_enabled'); - }); - } - } -} diff --git a/database/seeds/.gitkeep b/database/seeds/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/database/seeds/ApiEndpointSeeder.php b/database/seeds/ApiEndpointSeeder.php deleted file mode 100644 index 73942772..00000000 --- a/database/seeds/ApiEndpointSeeder.php +++ /dev/null @@ -1,155 +0,0 @@ -delete(); - DB::table('oauth2_api_endpoint')->delete(); - $this->seedUsersEndpoints(); - $this->seedRegistrationEndpoints(); - $this->seedSSOEndpoints(); - } - - - private function seedUsersEndpoints() - { - SeedUtils::seedApiEndpoints('users', [ - // get user info - [ - 'name' => 'get-user-info', - 'active' => true, - 'route' => '/api/v1/users/me', - 'http_method' => 'GET', - 'scopes' => [ - 'profile', 'email', 'address' - ], - ], - // get user info 2 - [ - 'name' => 'get-user-claims-get', - 'active' => true, - 'route' => '/api/v1/users/info', - 'http_method' => 'GET', - 'scopes' => [ - 'profile', 'email', 'address' - ], - ], - // get user info 4 - [ - 'name' => 'get-user-claims-post', - 'active' => true, - 'route' => '/api/v1/users/info', - 'http_method' => 'POST', - 'scopes' => [ - 'profile', 'email', 'address' - ], - ] - , - // get users - [ - 'name' => 'get-users', - 'active' => true, - 'route' => '/api/v1/users', - 'http_method' => 'GET', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::ReadAll - ], - ], - // get user by id - [ - 'name' => 'get-user-by-id', - 'active' => true, - 'route' => '/api/v1/users/{id}', - 'http_method' => 'GET', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::ReadAll - ], - ], - [ - 'name' => 'update-my-user', - 'active' => true, - 'route' => '/api/v1/users/me', - 'http_method' => 'PUT', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::MeWrite - ], - ], - [ - 'name' => 'update-my-user-pic', - 'active' => true, - 'route' => '/api/v1/users/me/pic', - 'http_method' => 'PUT', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::MeWrite - ], - ], - ] - ); - } - - private function seedRegistrationEndpoints(){ - SeedUtils::seedApiEndpoints('user-registration', [ - [ - 'name' => 'request-user-registration', - 'active' => true, - 'route' => '/api/v1/user-registration-requests', - 'http_method' => 'POST', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::Registration - ], - ], - ]); - } - - private function seedSSOEndpoints(){ - SeedUtils::seedApiEndpoints('sso', [ - [ - 'name' => 'sso-disqus', - 'active' => true, - 'route' => '/api/v1/sso/disqus/{forum_slug}/profile', - 'http_method' => 'GET', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::SSO - ], - ], - [ - 'name' => 'sso-rocket-chat', - 'active' => true, - 'route' => '/api/v1/sso/rocket-chat/{forum_slug}/profile', - 'http_method' => 'GET', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::SSO - ], - ], - [ - 'name' => 'sso-stream-chat', - 'active' => true, - 'route' => '/api/v1/sso/stream-chat/{forum_slug}/profile', - 'http_method' => 'GET', - 'scopes' => [ - \App\libs\OAuth2\IUserScopes::SSO - ], - ], - ]); - } - -} \ No newline at end of file diff --git a/database/seeds/ApiScopeSeeder.php b/database/seeds/ApiScopeSeeder.php deleted file mode 100644 index ca8ee20b..00000000 --- a/database/seeds/ApiScopeSeeder.php +++ /dev/null @@ -1,134 +0,0 @@ -delete(); - DB::table('oauth2_client_api_scope')->delete(); - DB::table('oauth2_api_scope')->delete(); - $this->seedUsersScopes(); - $this->seedRegistrationScopes(); - $this->seedSSOScopes(); - } - - - private function seedUsersScopes(){ - - SeedUtils::seedScopes([ - [ - 'name' => IUserScopes::Profile, - 'short_description' => 'Allows access to your profile info.', - 'description' => 'This scope value requests access to the End-Users default profile Claims, which are: name, family_name, given_name, middle_name, nickname, preferred_username, profile, picture, website, gender, birthdate, zoneinfo, locale, and updated_at.', - 'system' => false, - 'default' => false, - ], - [ - 'name' => IUserScopes::Email, - 'short_description' => 'Allows access to your email info.', - 'description' => 'This scope value requests access to the email and email_verified Claims.', - 'system' => false, - 'default' => false, - ], - [ - 'name' => IUserScopes::Address, - 'short_description' => 'Allows access to your Address info.', - 'description' => 'This scope value requests access to the address Claim.', - 'system' => false, - 'default' => false, - ], - [ - 'name' => IUserScopes::ReadAll, - 'short_description' => 'Allows access to users info', - 'description' => 'This scope value requests access to users info', - 'system' => false, - 'default' => false, - 'groups' => true, - ], - [ - 'name' => IUserScopes::MeRead, - 'short_description' => 'Allows access to read your Profile', - 'description' => 'Allows access to read your Profile', - 'system' => false, - 'default' => false, - 'groups' => false, - ], - [ - 'name' => IUserScopes::MeWrite, - 'short_description' => 'Allows access to write your Profile', - 'description' => 'Allows access to write your Profile', - 'system' => false, - 'default' => false, - 'groups' => false, - ] - ], 'users'); - - SeedUtils::seedScopes( - [ - [ - 'name' => OAuth2Protocol::OpenIdConnect_Scope, - 'short_description' => 'OpenId Connect Protocol', - 'description' => 'OpenId Connect Protocol', - 'system' => true, - 'default' => true, - ], - [ - 'name' => OAuth2Protocol::OfflineAccess_Scope, - 'short_description' => 'allow to emit refresh tokens (offline access without user presence)', - 'description' => 'allow to emit refresh tokens (offline access without user presence)', - 'system' => true, - 'default' => true, - ] - ] - ); - } - - private function seedRegistrationScopes(){ - SeedUtils::seedScopes([ - [ - 'name' => IUserScopes::Registration, - 'short_description' => 'Allows to request user registrations.', - 'description' => 'Allows to request user registrations.', - 'system' => false, - 'default' => false, - 'groups' => true, - ], - - ], 'user-registration'); - } - - private function seedSSOScopes(){ - SeedUtils::seedScopes([ - [ - 'name' => IUserScopes::SSO, - 'short_description' => 'Allows SSO integration', - 'description' => 'Allows SSO integration', - 'system' => false, - 'default' => false, - 'groups' => true, - ], - - ], 'sso'); - } -} \ No newline at end of file diff --git a/database/seeds/ApiSeeder.php b/database/seeds/ApiSeeder.php deleted file mode 100644 index f635d12b..00000000 --- a/database/seeds/ApiSeeder.php +++ /dev/null @@ -1,66 +0,0 @@ -delete(); - DB::table('oauth2_client_api_scope')->delete(); - DB::table('oauth2_api_scope')->delete(); - DB::table('oauth2_api')->delete(); - - $resource_server_repository = EntityManager::getRepository(ResourceServer::class); - $rs = $resource_server_repository->findOneBy([ - 'friendly_name' => 'OpenStackId server' - ]); - - $api = new Api(); - $api->setName('users'); - $api->setActive(true); - $api->setDescription('User Info API'); - $api->setResourceServer($rs); - - EntityManager::persist($api); - - EntityManager::flush(); - - $api = new Api(); - $api->setName('user-registration'); - $api->setActive(true); - $api->setDescription('User Registration API'); - $api->setResourceServer($rs); - - EntityManager::persist($api); - - EntityManager::flush(); - - $api = new Api(); - $api->setName('sso'); - $api->setActive(true); - $api->setDescription('SSO Integration API'); - $api->setResourceServer($rs); - - EntityManager::persist($api); - - EntityManager::flush(); - } -} \ No newline at end of file diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php deleted file mode 100644 index 5c0b189a..00000000 --- a/database/seeds/DatabaseSeeder.php +++ /dev/null @@ -1,43 +0,0 @@ -call('OpenIdExtensionsSeeder'); - $this->call('ServerConfigurationSeeder'); - - DB::table('oauth2_api_endpoint_api_scope')->delete(); - DB::table('oauth2_client_api_scope')->delete(); - DB::table('oauth2_api_scope')->delete(); - DB::table('oauth2_api_endpoint')->delete(); - DB::table('oauth2_api')->delete(); - DB::table('oauth2_resource_server')->delete(); - - $this->call('ResourceServerSeeder'); - $this->call('ApiSeeder'); - $this->call('ApiScopeSeeder'); - $this->call('ApiEndpointSeeder'); - } -} diff --git a/database/seeds/OpenIdExtensionsSeeder.php b/database/seeds/OpenIdExtensionsSeeder.php deleted file mode 100644 index 141d45ce..00000000 --- a/database/seeds/OpenIdExtensionsSeeder.php +++ /dev/null @@ -1,71 +0,0 @@ -delete(); - - $extensions = [ - array( - 'name' => 'OAUTH2', - 'namespace' => 'http://specs.openid.net/extensions/oauth/2.0', - 'active' => true, - 'extension_class' => OpenIdOAuth2Extension::class, - 'description' => 'The OpenID OAuth2 Extension describes how to make the OpenID Authentication and OAuth2 Core specifications work well together.', - 'view_name' => 'extensions.oauth2', - ), - array( - 'name' => 'SREG', - 'namespace' => 'http://openid.net/extensions/sreg/1.1', - 'active' => true, - 'extension_class' => OpenIdSREGExtension::class, - 'description' => 'OpenID Simple Registration 1.1 is an extension to the OpenID Authentication protocol that allows for very light-weight profile exchange.', - 'view_name' => 'extensions.sreg', - ), - array( - 'name' => 'SREG_1_0', - 'namespace' => 'http://openid.net/sreg/1.0', - 'active' => true, - 'extension_class' => OpenIdSREGExtension_1_0::class, - 'description' => 'OpenID Simple Registration 1.0 is an extension to the OpenID Authentication protocol that allows for very light-weight profile exchange.', - 'view_name' => 'extensions.sreg', - ), - array( - 'name' => 'AX', - 'namespace' => 'http://openid.net/srv/ax/1.0', - 'active' => true, - 'extension_class' => OpenIdAXExtension::class, - 'description' => 'OpenID service extension for exchanging identity information between endpoints', - 'view_name' =>'extensions.ax', - ), - ]; - - foreach ($extensions as $extension){ - SeedUtils::createServerExtension($extension); - } - } - - - -} diff --git a/database/seeds/ResourceServerSeeder.php b/database/seeds/ResourceServerSeeder.php deleted file mode 100644 index f65e9224..00000000 --- a/database/seeds/ResourceServerSeeder.php +++ /dev/null @@ -1,41 +0,0 @@ -delete(); - - $current_realm = Config::get('app.url'); - - $res = @parse_url($current_realm); - - $rs = new ResourceServer(); - $rs->setFriendlyName('OpenStackId server'); - $rs->setHost($res['host']); - $rs->setIps('127.0.0.1'); - $rs->setActive(true); - EntityManager::persist($rs); - - EntityManager::flush(); - } -} \ No newline at end of file diff --git a/database/seeds/SeedUtils.php b/database/seeds/SeedUtils.php deleted file mode 100644 index 30592db2..00000000 --- a/database/seeds/SeedUtils.php +++ /dev/null @@ -1,126 +0,0 @@ -find(1); - if(is_null($rs)) return false; - $api = new Api(); - $api->setName($api_name); - $api->setActive(true); - $api->setDescription($api_description); - $api->setResourceServer($rs); - - EntityManager::persist($api); - - EntityManager::flush(); - - return true; - } - - /** - * @param string $api_name - * @param array $endpoints_info - */ - public static function seedApiEndpoints($api_name, array $endpoints_info){ - - $api = EntityManager::getRepository(Api::class)->findOneBy(['name' => $api_name]); - if(is_null($api)) return; - - foreach($endpoints_info as $endpoint_info){ - - $endpoint = new ApiEndpoint(); - $endpoint->setName($endpoint_info['name']); - $endpoint->setRoute($endpoint_info['route']); - $endpoint->setHttpMethod($endpoint_info['http_method']); - $endpoint->setStatus(true); - $endpoint->setAllowCors(true); - $endpoint->setAllowCredentials(true); - $endpoint->setApi($api); - - foreach($endpoint_info['scopes'] as $scope_name){ - $scope = EntityManager::getRepository(ApiScope::class)->findOneBy(['name' => $scope_name]); - if(is_null($scope)) continue; - $endpoint->addScope($scope); - } - - EntityManager::persist($endpoint); - } - - EntityManager::flush(); - } - - /** - * @param array $scopes_definitions - * @param string|null $api_name - */ - public static function seedScopes(array $scopes_definitions, string $api_name = null){ - - $api = null; - if(!is_null($api_name)) - $api = EntityManager::getRepository(Api::class)->findOneBy(['name' => $api_name]); - - foreach ($scopes_definitions as $scope_info) { - $scope = new ApiScope(); - $scope->setName($scope_info['name']); - $scope->setShortDescription($scope_info['short_description']); - $scope->setDescription($scope_info['description']); - $scope->setActive(true); - if(isset($scope_info['system'])) - $scope->setSystem($scope_info['system']); - - if(isset($scope_info['default'])) - $scope->setDefault($scope_info['default']); - - if(isset($scope_info['groups'])) - $scope->setAssignedByGroups($scope_info['groups']); - - if(!is_null($api)) - $scope->setApi($api); - EntityManager::persist($scope); - } - - EntityManager::flush(); - } - - public static function createServerExtension(array $payload){ - - $ext = new ServerExtension(); - $ext->setName(trim($payload['name'])); - $ext->setNamespace(trim($payload['namespace'])); - $ext->setActive(boolval($payload['active'])); - $ext->setExtensionClass(trim($payload['extension_class'])); - $ext->setDescription(trim($payload['description'])); - $ext->setViewName(trim($payload['view_name'])); - - EntityManager::persist($ext); - - EntityManager::flush(); - } -} \ No newline at end of file diff --git a/database/seeds/ServerConfigurationSeeder.php b/database/seeds/ServerConfigurationSeeder.php deleted file mode 100644 index 3f93e207..00000000 --- a/database/seeds/ServerConfigurationSeeder.php +++ /dev/null @@ -1,152 +0,0 @@ -delete(); - - $configs = [ - [ - 'key' => 'BlacklistSecurityPolicy.MinutesWithoutExceptions', - 'value' => '5', - ], - [ - 'key' => 'BannedIpLifeTimeSeconds', - 'value' => '21600', - ], - [ - 'key' => 'Assets.Url', - 'value' => 'http://www.openstack.org/', - ], - [ - 'key' => 'Nonce.Lifetime', - 'value' => '360', - ], - [ - 'key' => 'MaxFailed.LoginAttempts.2ShowCaptcha', - 'value' => '3', - ], - [ - 'key' => 'BlacklistSecurityPolicy.InvalidNonceInitialDelay', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.MaxInvalidNonceAttempts', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.ReplayAttackExceptionInitialDelay', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.MaxOpenIdInvalidRealmExceptionAttempts', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.InvalidOpenIdMessageExceptionInitialDelay', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.MaxInvalidOpenIdMessageExceptionAttempts', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.InvalidOpenIdMessageModeInitialDelay', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.MaxInvalidOpenIdMessageModeAttempts', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.OpenIdInvalidRealmExceptionInitialDelay', - 'value' => '10', - ], - [ - 'key' => 'Private.Association.Lifetime', - 'value' => '240', - ], - [ - 'key' => 'Session.Association.Lifetime', - 'value' => '21600', - ], - [ - 'key' => 'BlacklistSecurityPolicy.OAuth2.BearerTokenDisclosureAttemptInitialDelay', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.OAuth2.MaxInvalidBearerTokenDisclosureAttempt', - 'value' => '3', - ], - [ - 'key' => 'BlacklistSecurityPolicy.OAuth2.InvalidAuthorizationCodeInitialDelay', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.OAuth2.MaxInvalidAuthorizationCodeAttempts', - 'value' => '3', - ], - [ - 'key' => 'BlacklistSecurityPolicy.OAuth2.AuthCodeReplayAttackInitialDelay', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.OAuth2.MaxAuthCodeReplayAttackAttempts', - 'value' => '3', - ], - [ - 'key' => 'MaxFailed.Login.Attempts', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.AuthenticationExceptionInitialDelay', - 'value' => '20', - ], - [ - 'key' => 'BlacklistSecurityPolicy.MaxAuthenticationExceptionAttempts', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.InvalidOpenIdAuthenticationRequestModeInitialDelay', - 'value' => '10', - ], - [ - 'key' => 'BlacklistSecurityPolicy.MaxInvalidOpenIdAuthenticationRequestModeAttempts', - 'value' => '10', - ], - ]; - - foreach ($configs as $config){ - self::createServerConfiguration($config); - } - } - - public static function createServerConfiguration(array $payload){ - $config = new ServerConfiguration(); - $config->setKey(trim($payload['key'])); - $config->setValue(trim($payload['value'])); - EntityManager::persist($config); - - EntityManager::flush(); - } - -} \ No newline at end of file diff --git a/database/seeds/TestSeeder.php b/database/seeds/TestSeeder.php deleted file mode 100644 index c3dc07f5..00000000 --- a/database/seeds/TestSeeder.php +++ /dev/null @@ -1,2190 +0,0 @@ - IOAuth2User::OAuth2ServerAdminGroup, - 'slug' => IOAuth2User::OAuth2ServerAdminGroup, - ], - [ - 'name' => IOAuth2User::OAuth2SystemScopeAdminGroup, - 'slug' => IOAuth2User::OAuth2SystemScopeAdminGroup, - ], - [ - 'name' => IOpenIdUser::OpenIdServerAdminGroup, - 'slug' => IOpenIdUser::OpenIdServerAdminGroup, - ], - [ - 'name' => IGroupSlugs::SuperAdminGroup, - 'slug' => IGroupSlugs::SuperAdminGroup, - ], - [ - 'name' => IGroupSlugs::RawUsersGroup, - 'slug' => IGroupSlugs::RawUsersGroup, - ] - ]; - - foreach ($groups_payloads as $payload){ - $group = GroupFactory::build($payload); - EntityManager::persist($group); - } - EntityManager::flush(); - } - - private function createTestUsers(){ - $group_repository = EntityManager::getRepository(Group::class); - - $oauth2_admin_group = $group_repository->findOneBy(['slug' => IOAuth2User::OAuth2ServerAdminGroup]); - $opendid_admin_group = $group_repository->findOneBy(['slug' => IOpenIdUser::OpenIdServerAdminGroup,]); - $system_scopes_admin_group = $group_repository->findOneBy(['slug' => IOAuth2User::OAuth2SystemScopeAdminGroup]); - $super_admin_group = $group_repository->findOneBy(['slug' => IGroupSlugs::SuperAdminGroup]); - $raw_users_group = $group_repository->findOneBy(['slug' => IGroupSlugs::RawUsersGroup]); - - $user_payloads = [ - [ - 'first_name' => 'Sebastian', - 'last_name' => 'Marcet', - 'email' => 'sebastian@tipit.net', - 'password' => '1qaz2wsx', - 'password_enc' => \Auth\AuthHelper::AlgSHA1_V2_4, - 'gender' => 'male', - 'address1' => 'Av. Siempre Viva 111', - 'address2' => 'Av. Siempre Viva 111', - 'city' => 'Lanus Este', - 'state' => 'Buenos Aires', - 'post_code' => '1824', - 'country' => 'AR', - 'language' => 'ESP', - 'active' => true, - 'email_verified' => true, - 'groups' => [ - $super_admin_group - ], - 'identifier' => '1', - ], - [ - 'first_name' => 'Márton', - 'last_name' => 'Kiss', - 'email' => 'mkiss@tipit.net', - 'password' => '1qaz2wsx', - 'password_enc' => \Auth\AuthHelper::AlgSHA1_V2_4, - 'gender' => 'male', - 'address1' => 'Av. Siempre Viva 111', - 'address2' => 'Av. Siempre Viva 111', - 'city' => 'Lanus Este', - 'state' => 'Buenos Aires', - 'post_code' => '1824', - 'country' => 'AR', - 'language' => 'ESP', - 'active' => true, - 'email_verified' => true, - 'groups' => [ - $super_admin_group - ], - 'identifier' => '2', - ], - [ - 'first_name' => '付', - 'last_name' => '金刚', - 'email' => 'fujg573@tipit.net', - 'password' => '1qaz2wsx', - 'password_enc' => \Auth\AuthHelper::AlgSHA1_V2_4, - 'gender' => 'male', - 'address1' => 'Av. Siempre Viva 111', - 'address2' => 'Av. Siempre Viva 111', - 'city' => 'Lanus Este', - 'state' => 'Buenos Aires', - 'post_code' => '1824', - 'country' => 'AR', - 'language' => 'ESP', - 'active' => true, - 'email_verified' => true, - 'groups' => [ - $super_admin_group - ], - 'identifier' => '3', - ], - [ - 'first_name' => 'Bharath', - 'last_name' => 'Kumar M R', - 'email' => 'mrbharathee@tipit.net', - 'password' => '1qaz2wsx', - 'password_enc' => \Auth\AuthHelper::AlgSHA1_V2_4, - 'gender' => 'male', - 'address1' => 'Av. Siempre Viva 111', - 'address2' => 'Av. Siempre Viva 111', - 'city' => 'Lanus Este', - 'state' => 'Buenos Aires', - 'post_code' => '1824', - 'country' => 'AR', - 'language' => 'ESP', - 'active' => true, - 'email_verified' => true, - 'groups' => [ - $super_admin_group - ], - 'identifier' => '4', - ], - [ - 'first_name' => '大塚', - 'last_name' => '元央', - 'email' => 'yuanying@tipit.net', - 'password' => '1qaz2wsx', - 'password_enc' => \Auth\AuthHelper::AlgSHA1_V2_4, - 'gender' => 'male', - 'address1' => 'Av. Siempre Viva 111', - 'address2' => 'Av. Siempre Viva 111', - 'city' => 'Lanus Este', - 'state' => 'Buenos Aires', - 'post_code' => '1824', - 'country' => 'AR', - 'language' => 'ESP', - 'active' => true, - 'email_verified' => true, - 'groups' => [ - $super_admin_group - ], - 'identifier' => '5', - ], - [ - 'first_name' => 'Ian Y.', - 'last_name' => 'Choi', - 'email' => 'ianyrchoi@gmail.com', - 'password' => '1qaz2wsx', - 'password_enc' => \Auth\AuthHelper::AlgSHA1_V2_4, - 'gender' => 'male', - 'address1' => 'Av. Siempre Viva 111', - 'address2' => 'Av. Siempre Viva 111', - 'city' => 'Lanus Este', - 'state' => 'Buenos Aires', - 'post_code' => '1824', - 'country' => 'AR', - 'language' => 'ESP', - 'active' => true, - 'email_verified' => true, - 'groups' => [ - $super_admin_group - ], - 'identifier' => '6', - ] - ]; - - foreach ($user_payloads as $payload){ - $user = UserFactory::build($payload); - EntityManager::persist($user); - $raw_password = $payload['password']; - if(!$user->checkPassword($raw_password)) - throw new Exception("password verification failed !!!"); - } - EntityManager::flush(); - } - - public function run() - { - - DB::table('banned_ips')->delete(); - DB::table('user_exceptions_trail')->delete(); - DB::table('server_configuration')->delete(); - DB::table('server_extensions')->delete(); - - DB::table('oauth2_client_api_scope')->delete(); - DB::table('oauth2_client_authorized_uri')->delete(); - DB::table('oauth2_access_token')->delete(); - DB::table('oauth2_refresh_token')->delete(); - DB::table('oauth2_asymmetric_keys')->delete(); - DB::table('oauth2_client')->delete(); - - DB::table('openid_trusted_sites')->delete(); - DB::table('openid_associations')->delete(); - DB::table('user_actions')->delete(); - DB::table('user_groups')->delete(); - DB::table('users')->delete(); - DB::table('groups')->delete(); - - DB::table('oauth2_api_endpoint_api_scope')->delete(); - DB::table('oauth2_api_endpoint')->delete(); - DB::table('oauth2_api_scope')->delete(); - DB::table('oauth2_api')->delete(); - DB::table('oauth2_resource_server')->delete(); - - $this->createTestGroups(); - - $this->createTestUsers(); - - $this->seedServerConfiguration(); - $this->seedServerExtensions(); - $this->seedTestResourceServers(); - $this->seedApis(); - $this->seedBasicScopes(); - $this->seedResourceServerScopes(); - $this->seedApiScopes(); - $this->seedApiEndpointScopes(); - $this->seedApiScopeScopes(); - $this->seedUsersScopes(); - $this->seedUsersRegistrationScopes(); - $this->seedSSOScopes(); - $this->seedPublicCloudScopes(); - $this->seedPrivateCloudScopes(); - $this->seedConsultantScopes(); - - //endpoints - $this->seedResourceServerEndpoints(); - $this->seedApiEndpoints(); - $this->seedUsersEndpoints(); - $this->seedUserRegistrationEndpoints(); - $this->seedSSOEndpoints(); - /* - $this->seedApiEndpointEndpoints(); - $this->seedScopeEndpoints(); - $this->seedPublicCloudsEndpoints(); - $this->seedPrivateCloudsEndpoints(); - $this->seedConsultantsEndpoints(); - */ - //clients - $this->seedTestUsersAndClients(); - } - - private function seedServerConfiguration(){ - $config_payloads = [ - array( - 'key' => 'Private.Association.Lifetime', - 'value' => '240', - ), - array( - 'key' => 'Session.Association.Lifetime', - 'value' => '21600', - ), - array( - 'key' => 'MaxFailed.Login.Attempts', - 'value' => '10', - ), - array( - 'key' => 'MaxFailed.LoginAttempts.2ShowCaptcha', - 'value' => '3', - ), - array( - 'key' => 'Nonce.Lifetime', - 'value' => '360', - ), - array( - 'key' => 'Assets.Url', - 'value' => 'http://www.openstack.org/', - ), - //blacklist policy config values - array( - 'key' => 'BannedIpLifeTimeSeconds', - 'value' => '21600', - ), - array( - 'key' => 'BlacklistSecurityPolicy.MinutesWithoutExceptions', - 'value' => '5', - ), - array( - 'key' => 'BlacklistSecurityPolicy.ReplayAttackExceptionInitialDelay', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.MaxInvalidNonceAttempts', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.InvalidNonceInitialDelay', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.MaxInvalidOpenIdMessageExceptionAttempts', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.InvalidOpenIdMessageExceptionInitialDelay', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.MaxOpenIdInvalidRealmExceptionAttempts', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.OpenIdInvalidRealmExceptionInitialDelay', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.MaxInvalidOpenIdMessageModeAttempts', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.InvalidOpenIdMessageModeInitialDelay', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.MaxInvalidOpenIdAuthenticationRequestModeAttempts', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.InvalidOpenIdAuthenticationRequestModeInitialDelay', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.MaxAuthenticationExceptionAttempts', - 'value' => '10', - ), - array( - 'key' => 'BlacklistSecurityPolicy.AuthenticationExceptionInitialDelay', - 'value' => '20', - ), - array( - 'key' => 'AuthorizationCodeRedeemPolicy.MinutesWithoutExceptions', - 'value' => '5', - ), - array( - 'key' => 'AuthorizationCodeRedeemPolicy.MaxAuthCodeReplayAttackAttempts', - 'value' => '3', - ), - array( - 'key' => 'AuthorizationCodeRedeemPolicy.AuthCodeReplayAttackInitialDelay', - 'value' => '10', - ), - array( - 'key' => 'AuthorizationCodeRedeemPolicy.MaxInvalidAuthorizationCodeAttempts', - 'value' => '3', - ), - array( - 'key' => 'AuthorizationCodeRedeemPolicy.InvalidAuthorizationCodeInitialDelay', - 'value' => '10', - ) - ]; - foreach($config_payloads as $payload) { - EntityManager::persist(ServerConfigurationFactory::build($payload)); - } - EntityManager::flush(); - - } - - private function seedServerExtensions(){ - - $extensions_payloads = [ - array( - 'name' => 'SREG_1_0', - 'namespace' => 'http://openid.net/sreg/1.0', - 'active' => true, - 'extension_class' => OpenIdSREGExtension_1_0::class, - 'description' => 'OpenID Simple Registration 1.0 is an extension to the OpenID Authentication protocol that allows for very light-weight profile exchange.', - 'view_name' => 'extensions.sreg', - ), - array( - 'name' => 'AX', - 'namespace' => 'http://openid.net/srv/ax/1.0', - 'active' => false, - 'extension_class' => OpenIdAXExtension::class, - 'description' => 'OpenID service extension for exchanging identity information between endpoints', - 'view_name' =>'extensions.ax', - ), - array( - 'name' => 'SREG', - 'namespace' => 'http://openid.net/extensions/sreg/1.1', - 'active' => true, - 'extension_class' => OpenIdSREGExtension::class, - 'description' => 'OpenID Simple Registration is an extension to the OpenID Authentication protocol that allows for very light-weight profile exchange.', - 'view_name' => 'extensions.sreg', - ), - array( - 'name' => 'OAUTH2', - 'namespace' => 'http://specs.openid.net/extensions/oauth/2.0', - 'active' => true, - 'extension_class' => OpenIdOAuth2Extension::class, - 'description' => 'The OpenID OAuth2 Extension describes how to make the OpenID Authentication and OAuth2 Core specifications work well together.', - 'view_name' => 'extensions.oauth2', - ) - ]; - foreach($extensions_payloads as $payload) { - EntityManager::persist(ServerExtensionFactory::build($payload)); - } - EntityManager::flush(); - } - - private function seedTestResourceServers(){ - $current_realm = Config::get('app.url'); - $components = parse_url($current_realm); - - $resource_server_payloads = [ - array( - 'friendly_name' => 'test resource server', - 'host' => $components['host'], - 'ips' => '127.0.0.1,10.0.0.0,2001:4800:7821:101:be76:4eff:fe06:858b,174.143.201.173', - 'active' => true - ), - array( - 'friendly_name' => 'test resource server 2', - 'host' => $components['host'], - 'ips' => '10.0.0.0,2001:4800:7821:101:be76:4eff:fe06:858b,174.143.201.173', - 'active' => true, - ) - ]; - foreach($resource_server_payloads as $payload) { - EntityManager::persist(ResourceServerFactory::build($payload)); - } - EntityManager::flush(); - } - - private function seedApis(){ - $resource_server_repository = EntityManager::getRepository(ResourceServer::class); - - $resource_server = $resource_server_repository->findOneBy([ - 'friendly_name' => 'test resource server' - ]); - - $api_payloads = [ - array( - 'name' => 'resource-server', - 'active' => true, - 'description' => 'Resource Server CRUD operations', - 'resource_server' => $resource_server, - 'logo' => asset('/assets/img/apis/server.png') - ), - array( - 'name' => 'api', - 'active' => true, - 'description' => 'Api CRUD operations', - 'resource_server' => $resource_server, - 'logo' => asset('/assets/img/apis/server.png') - ), - array( - 'name' => 'api-endpoint', - 'active' => true, - 'description' => 'Api Endpoints CRUD operations', - 'resource_server' => $resource_server, - 'logo' => asset('/assets/img/apis/server.png') - ), - array( - 'name' => 'api-scope', - 'active' => true, - 'description' => 'Api Scopes CRUD operations', - 'resource_server' => $resource_server, - 'logo' => asset('/assets/img/apis/server.png') - ), - array( - 'name' => 'users', - 'active' => true, - 'description' => 'User Info', - 'resource_server' => $resource_server, - 'logo' => asset('/assets/img/apis/server.png') - ), - array( - 'name' => 'user-registration', - 'active' => true, - 'description' => 'User Registration', - 'resource_server' => $resource_server, - 'logo' => asset('/assets/img/apis/server.png') - ), - array( - 'name' => 'sso', - 'active' => true, - 'description' => 'SSO Integration', - 'resource_server' => $resource_server, - 'logo' => asset('/assets/img/apis/server.png') - ), - array( - 'name' => 'public-clouds', - 'active' => true, - 'description' => 'Marketplace Public Clouds', - 'resource_server' => $resource_server, - 'logo' => asset('/assets/img/apis/server.png') - ), - array( - 'name' => 'private-clouds', - 'active' => true, - 'description' => 'Marketplace Private Clouds', - 'resource_server' => $resource_server, - 'logo' => asset('/assets/img/apis/server.png') - ), - array( - 'name' => 'consultants', - 'active' => true, - 'description' => 'Marketplace Consultants', - 'resource_server' => $resource_server, - 'logo' => asset('/assets/img/apis/server.png') - ) - ]; - - foreach($api_payloads as $payload) { - EntityManager::persist(ApiFactory::build($payload)); - } - EntityManager::flush(); - } - - private function seedBasicScopes(){ - //scopes - - $api_scope_payloads = [ - array( - 'name' => OAuth2Protocol::OpenIdConnect_Scope, - 'short_description' => 'OIDC', - 'description' => 'OIDC', - 'system' => true, - 'default' => true, - 'active' => true, - ), - array( - 'name' => OAuth2Protocol::OfflineAccess_Scope, - 'short_description' => 'allow to emit refresh tokens (offline access without user presence)', - 'description' => 'allow to emit refresh tokens (offline access without user presence)', - 'system' => true, - 'default' => true, - 'active' => true, - ) - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiScopeFactory::build($payload)); - } - EntityManager::flush(); - } - - private function seedTestUsersAndClients(){ - - $resource_server_repository = EntityManager::getRepository(ResourceServer::class); - - $resource_server = $resource_server_repository->findOneBy([ - 'friendly_name' => 'test resource server' - ]); - - $resource_server2 = $resource_server_repository->findOneBy([ - 'friendly_name' => 'test resource server 2' - ]); - - $user_repository = EntityManager::getRepository(User::class); - - $user = $user_repository->findOneBy(['email' => 'sebastian@tipit.net']); - - $trusted_site = OpenIdTrustedSiteFactory::build([ - 'realm' => 'https://www.test.com/', - 'policy' => IAuthService::AuthorizationResponse_AllowForever - ]); - - $user->addTrustedSite($trusted_site); - EntityManager::persist($user); - //EntityManager::flush(); - - $now = new \DateTime('now', new \DateTimeZone('UTC')); - - $client_payloads = [ - array( - 'app_name' => 'oauth2_test_app', - 'app_description' => 'oauth2_test_app', - 'app_logo' => null, - 'client_id' => '.-_~87D8/Vcvr6fvQbH4HyNgwTlfSyQ3x.openstack.client', - 'client_secret' => 'ITc/6Y5N7kOtGKhgITc/6Y5N7kOtGKhgITc/6Y5N7kOtGKhgITc/6Y5N7kOtGKhg', - 'client_type' => IClient::ClientType_Confidential, - 'application_type' => IClient::ApplicationType_Web_App, - 'token_endpoint_auth_method' => OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretBasic, - 'owner' => $user, - 'rotate_refresh_token' => true, - 'use_refresh_token' => true, - 'redirect_uris' => 'https://www.test.com/oauth2,https://op.certification.openid.net:60393/authz_cb', - 'id_token_signed_response_alg' => JSONWebSignatureAndEncryptionAlgorithms::HS512, - 'id_token_encrypted_response_alg' => JSONWebSignatureAndEncryptionAlgorithms::RSA_OAEP_256, - 'id_token_encrypted_response_enc' => JSONWebSignatureAndEncryptionAlgorithms::A256CBC_HS512, - 'client_secret_expires_at' => $now->add(new \DateInterval('P6M')), - ), - array - ( - 'app_name' => 'oauth2_test_app2', - 'app_description' => 'oauth2_test_app2', - 'app_logo' => null, - 'client_id' => 'Jiz87D8/Vcvr6fvQbH4HyNgwTlfSyQ3x2.openstack.client', - 'client_secret' => 'ITc/6Y5N7kOtGKhgITc/6Y5N7kOtGKhgITc/6Y5N7kOtGKhgITc/6Y5N7kOtGKhg', - 'client_type' => IClient::ClientType_Confidential, - 'application_type' => IClient::ApplicationType_Web_App, - 'token_endpoint_auth_method' => OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretJwt, - 'token_endpoint_auth_signing_alg' => JSONWebSignatureAndEncryptionAlgorithms::HS512, - 'subject_type' => IClient::SubjectType_Pairwise, - 'owner' => $user, - 'rotate_refresh_token' => true, - 'use_refresh_token' => true, - 'redirect_uris' => 'https://www.test.com/oauth2', - 'id_token_signed_response_alg' => JSONWebSignatureAndEncryptionAlgorithms::HS512, - 'id_token_encrypted_response_alg' => JSONWebSignatureAndEncryptionAlgorithms::RSA_OAEP_256, - 'id_token_encrypted_response_enc' => JSONWebSignatureAndEncryptionAlgorithms::A256CBC_HS512, - 'client_secret_expires_at' => $now->add(new \DateInterval('P6M')), - ), - array( - 'app_name' => 'oauth2_test_app3', - 'app_description' => 'oauth2_test_app3', - 'app_logo' => null, - 'client_id' => 'Jiz87D8/Vcvr6fvQbH4HyNgwTlfSyQ33.openstack.client', - 'client_secret' => 'ITc/6Y5N7kOtGKhgITc/6Y5N7kOtGKhgITc/6Y5N7kOtGKhgITc/6Y5N585OtGKhg55', - 'client_type' => IClient::ClientType_Confidential, - 'application_type' => IClient::ApplicationType_Web_App, - 'token_endpoint_auth_method' => OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretBasic, - 'owner' => $user, - 'rotate_refresh_token' => true, - 'use_refresh_token' => true, - 'redirect_uris' => 'https://www.test.com/oauth2', - 'id_token_signed_response_alg' => JSONWebSignatureAndEncryptionAlgorithms::HS512, - 'userinfo_signed_response_alg' => JSONWebSignatureAndEncryptionAlgorithms::RS512, - 'client_secret_expires_at' => $now->add(new \DateInterval('P6M')), - ), - array( - 'app_name' => 'oauth2.service', - 'app_description' => 'oauth2.service', - 'app_logo' => null, - 'client_id' => '11z87D8/Vcvr6fvQbH4HyNgwTlfSyQ3x.openstack.client', - 'client_secret' => '11c/6Y5N7kOtGKhg11c/6Y5N7kOtGKhg11c/6Y5N7kOtGKhg11c/6Y5N7kOtGKhg', - 'client_type' => IClient::ClientType_Confidential, - 'application_type' => IClient::ApplicationType_Service, - 'token_endpoint_auth_method' => OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretBasic, - 'owner' => $user, - 'rotate_refresh_token' => true, - 'use_refresh_token' => true, - 'redirect_uris' => 'https://www.test.com/oauth2', - 'client_secret_expires_at' => $now->add(new \DateInterval('P6M')), - ), - array( - 'app_name' => 'oauth2_test_app_public', - 'app_description' => 'oauth2_test_app_public', - 'app_logo' => null, - 'client_id' => '1234/Vcvr6fvQbH4HyNgwKlfSyQ3x.openstack.client', - 'client_secret' => null, - 'application_type' => IClient::ApplicationType_JS_Client, - 'token_endpoint_auth_method' => OAuth2Protocol::TokenEndpoint_AuthMethod_PrivateKeyJwt, - 'token_endpoint_auth_signing_alg' => JSONWebSignatureAndEncryptionAlgorithms::RS512, - 'owner' => $user, - 'rotate_refresh_token' => false, - 'use_refresh_token' => false, - 'redirect_uris' => 'https://www.test.com/oauth2', - ), - array( - 'app_name' => 'oauth2_test_app_public_pkce', - 'app_description' => 'oauth2_test_app_public_pkce', - 'app_logo' => null, - 'client_id' => '1234/Vcvr6fvQbH4HyNgwKlfSpkce.openstack.client', - 'client_secret' => null, - 'application_type' => IClient::ApplicationType_JS_Client, - 'token_endpoint_auth_method' => OAuth2Protocol::TokenEndpoint_AuthMethod_None, - 'owner' => $user, - 'rotate_refresh_token' => true, - 'use_refresh_token' => true, - 'redirect_uris' => 'https://www.test.com/oauth2', - 'pkce_enabled' => true, - ), - array( - 'app_name' => 'oauth2_native_app', - 'app_description' => 'oauth2_native_app', - 'app_logo' => null, - 'client_id' => 'Jiz87D8/Vcvr6fvQbH4HyNgwKlfSyQ3x.android.openstack.client', - 'client_secret' => '11c/6Y5N7kOtGKhg11c/6Y5N7kOtGKhg11c/6Y5N7kOtGKhg11c/6Y5N7kOtGKhgfdfdfdf', - 'client_type' => IClient::ClientType_Confidential, - 'application_type' => IClient::ApplicationType_Native, - 'token_endpoint_auth_method' => OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretBasic, - 'owner' => $user, - 'rotate_refresh_token' => true, - 'use_refresh_token' => true, - 'redirect_uris' => 'androipapp://oidc_endpoint_callback', - ), - array( - 'app_name' => 'oauth2_native_app2', - 'app_description' => 'oauth2_native_app2', - 'app_logo' => null, - 'client_id' => 'Jiz87D8/Vcvr6fvQbH4HyNgwKlfSyQ3x.android2.openstack.client', - 'client_secret' => '11c/6Y5N7kOtGKhg11c/6Y5N7kOtGKhg11c/6Y5N7kOtGKhg11c/6Y5N7kOtGKhgfdfdfdf', - 'client_type' => IClient::ClientType_Confidential, - 'application_type' => IClient::ApplicationType_Native, - 'token_endpoint_auth_method' => OAuth2Protocol::TokenEndpoint_AuthMethod_PrivateKeyJwt, - 'token_endpoint_auth_signing_alg' => JSONWebSignatureAndEncryptionAlgorithms::RS512, - 'owner' => $user, - 'rotate_refresh_token' => true, - 'use_refresh_token' => true, - 'redirect_uris' => 'androipapp://oidc_endpoint_callback2', - ), - array( - 'app_name' => 'oauth2_test_app_public_2', - 'app_description' => 'oauth2_test_app_public_2', - 'app_logo' => null, - 'client_id' => 'Jiz87D8/Vcvr6fvQbH4HyNgwKlfSyQ2x.openstack.client', - 'client_secret' => null, - 'client_type' => IClient::ClientType_Public, - 'application_type' => IClient::ApplicationType_JS_Client, - 'owner' => $user, - 'rotate_refresh_token' => false, - 'use_refresh_token' => false, - 'redirect_uris' => 'https://www.test.com/oauth2' - ), - array( - 'app_name' => 'resource_server_client', - 'app_description' => 'resource_server_client', - 'app_logo' => null, - 'client_id' => 'resource.server.1.openstack.client', - 'client_secret' => '123456789123456789123456789123456789123456789', - 'client_type' => IClient::ClientType_Confidential, - 'application_type' => IClient::ApplicationType_Service, - 'token_endpoint_auth_method' => OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretBasic, - 'resource_server' => $resource_server, - 'rotate_refresh_token' => false, - 'use_refresh_token' => false, - 'client_secret_expires_at' => $now->add(new \DateInterval('P6M')), - ), - array( - 'app_name' => 'resource_server_client2', - 'app_description' => 'resource_server_client2', - 'app_logo' => null, - 'client_id' => 'resource.server.2.openstack.client', - 'client_secret' => '123456789123456789123456789123456789123456789', - 'client_type' => IClient::ClientType_Confidential, - 'application_type' => IClient::ApplicationType_Service, - 'token_endpoint_auth_method' => OAuth2Protocol::TokenEndpoint_AuthMethod_ClientSecretBasic, - 'resource_server' => $resource_server2, - 'rotate_refresh_token' => false, - 'use_refresh_token' => false, - 'client_secret_expires_at' => $now->add(new \DateInterval('P6M')), - ) - ]; - - foreach ($client_payloads as $payload){ - EntityManager::persist(ClientFactory::build($payload)); - } - - EntityManager::flush(); - - $client_repository = EntityManager::getRepository(Client::class); - - $client_confidential = $client_repository->findOneBy(['app_name' => 'oauth2_test_app']); - $client_confidential2 = $client_repository->findOneBy(['app_name' => 'oauth2_test_app2']); - $client_confidential3 = $client_repository->findOneBy(['app_name' => 'oauth2_test_app3']); - $client_public = $client_repository->findOneBy(['app_name' => 'oauth2_test_app_public']); - $client_public2 = $client_repository->findOneBy(['app_name' => 'oauth2_test_app_public_pkce']); - $client_service = $client_repository->findOneBy(['app_name' => 'oauth2.service']); - $client_native = $client_repository->findOneBy(['app_name' => 'oauth2_native_app']); - $client_native2 = $client_repository->findOneBy(['app_name' => 'oauth2_native_app2']); - - //attach all scopes - $scopes_repository = EntityManager::getRepository(ApiScope::class); - $scopes = $scopes_repository->findAll(); - - foreach($scopes as $scope) - { - $client_confidential->addScope($scope); - $client_confidential2->addScope($scope); - $client_confidential3->addScope($scope); - $client_public->addScope($scope); - $client_public2->addScope($scope); - $client_service->addScope($scope); - $client_native->addScope($scope); - $client_native2->addScope($scope); - } - - $now = new \DateTime('now', new DateTimeZone('UTC')); - $to = new \DateTime('now', new DateTimeZone('UTC')); - $to->add(new \DateInterval('P31D')); - - $public_key_1 = ClientPublicKey::buildFromPEM( - 'public_key_1', - JSONWebKeyTypes::RSA, - JSONWebKeyPublicKeyUseValues::Encryption, - self::$client_public_key_1, - JSONWebSignatureAndEncryptionAlgorithms::RSA_OAEP_256, - true, - $now, - $to - ); - - $client_confidential->addPublicKey($public_key_1); - - $public_key_2 = ClientPublicKey::buildFromPEM( - 'public_key_2', - JSONWebKeyTypes::RSA, - JSONWebKeyPublicKeyUseValues::Signature, - self::$client_public_key_2, - JSONWebSignatureAndEncryptionAlgorithms::RS512, - true, - $now, - $to - ); - - $client_confidential->addPublicKey($public_key_2); - - // confidential client 2 - $public_key_11 = ClientPublicKey::buildFromPEM( - 'public_key_1', - JSONWebKeyTypes::RSA, - JSONWebKeyPublicKeyUseValues::Encryption, - self::$client_public_key_1, - JSONWebSignatureAndEncryptionAlgorithms::RSA_OAEP_256, - true, - $now, - $to - ); - - $client_confidential2->addPublicKey($public_key_11); - - $public_key_22 = ClientPublicKey::buildFromPEM( - 'public_key_2', - JSONWebKeyTypes::RSA, - JSONWebKeyPublicKeyUseValues::Signature, - self::$client_public_key_2, - JSONWebSignatureAndEncryptionAlgorithms::RS512, - true, - $now, - $to - ); - - $client_confidential2->addPublicKey($public_key_22); - - // public native client - $public_key_33 = ClientPublicKey::buildFromPEM( - 'public_key_33', - JSONWebKeyTypes::RSA, - JSONWebKeyPublicKeyUseValues::Encryption, - self::$client_public_key_1, - JSONWebSignatureAndEncryptionAlgorithms::RSA_OAEP_256, - true, - $now, - $to - ); - - $client_native2->addPublicKey($public_key_33); - - $public_key_44 = ClientPublicKey::buildFromPEM( - 'public_key_44', - JSONWebKeyTypes::RSA, - JSONWebKeyPublicKeyUseValues::Signature, - self::$client_public_key_2, - JSONWebSignatureAndEncryptionAlgorithms::RS512, - true, - $now, - $to - ); - - $client_native2->addPublicKey($public_key_44); - - // server private keys - - $pkey_1 = ServerPrivateKey::build - ( - 'server_key_enc', - $now, - $to, - JSONWebKeyTypes::RSA, - JSONWebKeyPublicKeyUseValues::Encryption, - JSONWebSignatureAndEncryptionAlgorithms::RSA1_5, - true, - TestKeys::$private_key_pem - ); - - EntityManager::persist($pkey_1); - - $pkey_2 = ServerPrivateKey::build - ( - 'server_key_sig', - $now, - $to, - JSONWebKeyTypes::RSA, - JSONWebKeyPublicKeyUseValues::Signature, - JSONWebSignatureAndEncryptionAlgorithms::RS512, - true, - TestKeys::$private_key_pem - ); - - EntityManager::persist($pkey_2); - - EntityManager::flush(); - } - - private function seedResourceServerScopes(){ - - $api_repository = EntityManager::getRepository(Api::class); - $resource_server = $api_repository->findOneBy(['name' => 'resource-server']); - - $current_realm = Config::get('app.url'); - - $api_scope_payloads = [ - array( - 'name' => sprintf('%s/resource-server/read',$current_realm), - 'short_description' => 'Resource Server Read Access', - 'description' => 'Resource Server Read Access', - 'api' => $resource_server, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/resource-server/read.page',$current_realm), - 'short_description' => 'Resource Server Page Read Access', - 'description' => 'Resource Server Page Read Access', - 'api' => $resource_server, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/resource-server/write',$current_realm), - 'short_description' => 'Resource Server Write Access', - 'description' => 'Resource Server Write Access', - 'api' => $resource_server, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/resource-server/delete',$current_realm), - 'short_description' => 'Resource Server Delete Access', - 'description' => 'Resource Server Delete Access', - 'api' => $resource_server, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/resource-server/update',$current_realm), - 'short_description' => 'Resource Server Update Access', - 'description' => 'Resource Server Update Access', - 'api' => $resource_server, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/resource-server/update.status',$current_realm), - 'short_description' => 'Resource Server Update Status', - 'description' => 'Resource Server Update Status', - 'api' => $resource_server, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/resource-server/regenerate.secret',$current_realm), - 'short_description' => 'Resource Server Regenerate Client Secret', - 'description' => 'Resource Server Regenerate Client Secret', - 'api' => $resource_server, - 'system' => true, - 'active' => true, - ) - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiScopeFactory::build($payload)); - } - EntityManager::flush(); - } - - private function seedApiScopes(){ - - $api_repository = EntityManager::getRepository(Api::class); - $api = $api_repository->findOneBy(['name' => 'api']); - - $current_realm = Config::get('app.url'); - - $api_scope_payloads = [ - array( - 'name' => sprintf('%s/api/read',$current_realm), - 'short_description' => 'Get Api', - 'description' => 'Get Api', - 'api' => $api, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api/delete',$current_realm), - 'short_description' => 'Deletes Api', - 'description' => 'Deletes Api', - 'api' => $api, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api/write',$current_realm), - 'short_description' => 'Create Api', - 'description' => 'Create Api', - 'api' => $api, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api/update',$current_realm), - 'short_description' => 'Update Api', - 'description' => 'Update Api', - 'api' => $api, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api/update.status',$current_realm), - 'short_description' => 'Update Api Status', - 'description' => 'Update Api Status', - 'api' => $api, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api/read.page',$current_realm), - 'short_description' => 'Get Api By Page', - 'description' => 'Get Api By Page', - 'api' => $api, - 'system' => true, - 'active' => true, - ) - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiScopeFactory::build($payload)); - } - EntityManager::flush(); - } - - private function seedApiEndpointScopes(){ - - $api_repository = EntityManager::getRepository(Api::class); - $api_endpoint = $api_repository->findOneBy(['name' => 'api-endpoint']); - $current_realm = Config::get('app.url'); - $api_scope_payloads = [ - array( - 'name' => sprintf('%s/api-endpoint/read',$current_realm), - 'short_description' => 'Get Api Endpoint', - 'description' => 'Get Api Endpoint', - 'api' => $api_endpoint, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api-endpoint/delete',$current_realm), - 'short_description' => 'Deletes Api Endpoint', - 'description' => 'Deletes Api Endpoint', - 'api' => $api_endpoint, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api-endpoint/write',$current_realm), - 'short_description' => 'Create Api Endpoint', - 'description' => 'Create Api Endpoint', - 'api' => $api_endpoint, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api-endpoint/update',$current_realm), - 'short_description' => 'Update Api Endpoint', - 'description' => 'Update Api Endpoint', - 'api' => $api_endpoint, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api-endpoint/update.status',$current_realm), - 'short_description' => 'Update Api Endpoint Status', - 'description' => 'Update Api Endpoint Status', - 'api' => $api_endpoint, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api-endpoint/read.page',$current_realm), - 'short_description' => 'Get Api Endpoints By Page', - 'description' => 'Get Api Endpoints By Page', - 'api' => $api_endpoint, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api-endpoint/add.scope',$current_realm), - 'short_description' => 'Add required scope to endpoint', - 'description' => 'Add required scope to endpoint', - 'api' => $api_endpoint, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api-endpoint/remove.scope',$current_realm), - 'short_description' => 'Remove required scope to endpoint', - 'description' => 'Remove required scope to endpoint', - 'api' => $api_endpoint, - 'system' => true, - 'active' => true, - ) - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiScopeFactory::build($payload)); - } - EntityManager::flush(); - - } - - private function seedApiScopeScopes(){ - - $api_repository = EntityManager::getRepository(Api::class); - $api_scope = $api_repository->findOneBy(['name' => 'api-scope']); - $current_realm = Config::get('app.url'); - - $api_scope_payloads = [ - array( - 'name' => sprintf('%s/api-scope/read',$current_realm), - 'short_description' => 'Get Api Scope', - 'description' => 'Get Api Scope', - 'api' => $api_scope, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api-scope/delete',$current_realm), - 'short_description' => 'Deletes Api Scope', - 'description' => 'Deletes Api Scope', - 'api' => $api_scope, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api-scope/write',$current_realm), - 'short_description' => 'Create Api Scope', - 'description' => 'Create Api Scope', - 'api' => $api_scope, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api-scope/update',$current_realm), - 'short_description' => 'Update Api Scope', - 'description' => 'Update Api Scope', - 'api' => $api_scope, - 'system' => true, - ), - array( - 'name' => sprintf('%s/api-scope/update.status',$current_realm), - 'short_description' => 'Update Api Scope Status', - 'description' => 'Update Api Scope Status', - 'api' => $api_scope, - 'system' => true, - 'active' => true, - ), - array( - 'name' => sprintf('%s/api-scope/read.page',$current_realm), - 'short_description' => 'Get Api Scopes By Page', - 'description' => 'Get Api Scopes By Page', - 'api' => $api_scope, - 'system' => true, - 'active' => true, - ) - ]; - - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiScopeFactory::build($payload)); - } - EntityManager::flush(); - - } - - private function seedUsersScopes(){ - - $api_repository = EntityManager::getRepository(Api::class); - $api = $api_repository->findOneBy(['name' => 'users']); - - $current_realm = Config::get('app.url'); - - - $api_scope_payloads = [ - array( - 'name' => 'profile', - 'short_description' => 'This scope value requests access to the End-Users default profile Claims', - 'description' => 'This scope value requests access to the End-Users default profile Claims, which are: name, family_name, given_name, middle_name, nickname, preferred_username, profile, picture, website, gender, birthdate, zoneinfo, locale, and updated_at', - 'api' => $api, - 'system' => false, - 'active' => true, - ), - array( - 'name' => 'email', - 'short_description' => 'This scope value requests access to the email and email_verified Claims', - 'description' => 'This scope value requests access to the email and email_verified Claims', - 'api' => $api, - 'system' => false, - 'active' => true, - ), - [ - 'name' => 'address', - 'short_description' => 'This scope value requests access to the address Claim.', - 'description' => 'This scope value requests access to the address Claim.', - 'api' => $api, - 'system' => false, - 'active' => true, - ], - [ - 'name' => IUserScopes::MeRead, - 'short_description' => 'Allows access to read your Profile', - 'description' => 'Allows access to read your Profile', - 'api' => $api, - 'system' => false, - 'default' => false, - 'active' => true, - ], - [ - 'name' => IUserScopes::MeWrite, - 'short_description' => 'Allows access to write your Profile', - 'description' => 'Allows access to write your Profile', - 'api' => $api, - 'system' => false, - 'default' => false, - 'active' => true, - ] - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiScopeFactory::build($payload)); - } - EntityManager::flush(); - } - - private function seedUsersRegistrationScopes(){ - - $api_repository = EntityManager::getRepository(Api::class); - $api = $api_repository->findOneBy(['name' => 'user-registration']); - - $current_realm = Config::get('app.url'); - - - $api_scope_payloads = [ - array( - 'name' => IUserScopes::Registration, - 'short_description' => 'request-user-registration', - 'description' => 'request-user-registration', - 'api' => $api, - 'system' => false, - 'active' => true, - ), - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiScopeFactory::build($payload)); - } - EntityManager::flush(); - } - - private function seedSSOScopes(){ - - $api_repository = EntityManager::getRepository(Api::class); - $api = $api_repository->findOneBy(['name' => 'sso']); - - $current_realm = Config::get('app.url'); - - - $api_scope_payloads = [ - array( - 'name' => IUserScopes::SSO, - 'short_description' => 'Allows SSO integration', - 'description' => 'Allows SSO integration', - 'api' => $api, - 'system' => false, - 'active' => true, - ), - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiScopeFactory::build($payload)); - } - EntityManager::flush(); - } - - private function seedPublicCloudScopes(){ - - $api_repository = EntityManager::getRepository(Api::class); - $api = $api_repository->findOneBy(['name' => 'public-clouds']); - - $current_realm = Config::get('app.url'); - - - $api_scope_payloads = [ - array( - 'name' => sprintf('%s/public-clouds/read',$current_realm), - 'short_description' => 'Get Public Clouds', - 'description' => 'Get Public Clouds', - 'api' => $api, - 'system' => false, - 'active' => true, - ) - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiScopeFactory::build($payload)); - } - EntityManager::flush(); - } - - private function seedPrivateCloudScopes(){ - - $api_repository = EntityManager::getRepository(Api::class); - $api = $api_repository->findOneBy(['name' => 'private-clouds']); - - $current_realm = Config::get('app.url'); - - - $api_scope_payloads = [ - array( - 'name' => sprintf('%s/private-clouds/read',$current_realm), - 'short_description' => 'Get Private Clouds', - 'description' => 'Get Private Clouds', - 'api' => $api, - 'system' => false, - 'active' => true, - ) - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiScopeFactory::build($payload)); - } - EntityManager::flush(); - } - - - private function seedConsultantScopes(){ - - $api_repository = EntityManager::getRepository(Api::class); - $api = $api_repository->findOneBy(['name' => 'consultants']); - - $current_realm = Config::get('app.url'); - - $api_scope_payloads = [ - array( - 'name' => sprintf('%s/consultants/read',$current_realm), - 'short_description' => 'Get Consultants', - 'description' => 'Get Consultants', - 'api' => $api, - 'system' => false, - 'active' => true, - ) - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiScopeFactory::build($payload)); - } - EntityManager::flush(); - } - - private function seedResourceServerEndpoints(){ - - $current_realm = Config::get('app.url'); - - SeedUtils::seedApiEndpoints('resource-server', [ - array( - 'name' => 'create-resource-server', - 'route' => '/api/v1/resource-servers', - 'http_method' => 'POST', - 'scopes' => [ - sprintf('%s/resource-server/write', $current_realm) - ], - ), - array( - 'name' => 'get-resource-server', - 'route' => '/api/v1/resource-servers/{id}', - 'http_method' => 'GET', - 'scopes' => [ - sprintf('%s/resource-server/read',$current_realm) - ] - ), - array( - 'name' => 'resource-server-regenerate-secret', - 'route' => '/api/v1/resource-servers/{id}/client-secret', - 'http_method' => 'PUT', - 'scopes' => [ - sprintf('%s/resource-server/write',$current_realm), - sprintf('%s/resource-server/regenerate.secret',$current_realm) - ] - ), - array( - 'name' => 'resource-server-get-page', - 'route' => '/api/v1/resource-servers', - 'http_method' => 'GET', - 'scopes' => [ - sprintf('%s/resource-server/read',$current_realm), - sprintf('%s/resource-server/read.page',$current_realm) - ] - ), - array( - 'name' => 'resource-server-delete', - 'route' => '/api/v1/resource-servers/{id}', - 'http_method' => 'DELETE', - 'scopes' => [ - sprintf('%s/resource-server/delete',$current_realm) - ] - ), - array( - 'name' => 'resource-server-update', - 'route' => '/api/v1/resource-servers', - 'http_method' => 'PUT', - 'scopes' => [ - sprintf('%s/resource-server/write',$current_realm) - ] - ), - array( - 'name' => 'resource-server-update-status', - 'route' => '/api/v1/resource-servers/{id}/status/{active}', - 'http_method' => 'PUT', - 'scopes' => [ - sprintf('%s/resource-server/write',$current_realm) - ] - ) - ]); - - } - - private function seedApiEndpoints(){ - - $current_realm = Config::get('app.url'); - - SeedUtils::seedApiEndpoints('api', [ - array( - 'name' => 'get-api', - 'route' => '/api/v1/api/{id}', - 'http_method' => 'GET', - 'scopes' => [ - sprintf('%s/api/read', $current_realm) - ] - ), - array( - 'name' => 'delete-api', - 'route' => '/api/v1/api/{id}', - 'http_method' => 'DELETE', - 'scopes' => [ - sprintf('%s/api/delete',$current_realm) - ] - ), - array( - 'name' => 'create-api', - 'route' => '/api/v1/api', - 'http_method' => 'POST', - 'scopes' => [ - sprintf('%s/api/write',$current_realm) - ] - ), - array( - 'name' => 'update-api', - 'route' => '/api/v1/api', - 'http_method' => 'PUT', - 'scopes' => [ - sprintf('%s/api/update',$current_realm) - ] - ), - array( - 'name' => 'update-api-status', - 'route' => '/api/v1/api/status/{id}/{active}', - 'http_method' => 'GET', - 'scopes' => [ - sprintf('%s/api/update.status',$current_realm) - ] - ), - array( - 'name' => 'api-get-page', - 'route' => '/api/v1/api/{page_nbr}/{page_size}', - 'http_method' => 'GET', - 'scopes' => [ - sprintf('%s/api/read', $current_realm), - sprintf('%s/api/read.page',$current_realm) - ] - ) - ]); - - } - - private function seedUsersEndpoints(){ - $api_repository = EntityManager::getRepository(Api::class); - $endpoint_repository = EntityManager::getRepository(ApiEndpoint::class); - $users = $api_repository->findOneBy(['name' => 'users']); - - $api_scope_payloads = [ - [ - 'name' => 'get-user-info', - 'active' => true, - 'api' => $users, - 'route' => '/api/v1/users/me', - 'http_method' => 'GET' - ], - [ - 'name' => 'get-user-claims-get', - 'active' => true, - 'api' => $users, - 'route' => '/api/v1/users/info', - 'http_method' => 'GET' - ], - [ - 'name' => 'get-user-claims-post', - 'active' => true, - 'api' => $users, - 'route' => '/api/v1/users/info', - 'http_method' => 'POST' - ], - [ - 'name' => 'update-my-user', - 'active' => true, - 'route' => '/api/v1/users/me', - 'api' => $users, - 'http_method' => 'PUT', - ], - [ - 'name' => 'update-my-user-pic', - 'active' => true, - 'route' => '/api/v1/users/me/pic', - 'api' => $users, - 'http_method' => 'PUT', - ], - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiEndpointFactory::build($payload)); - } - EntityManager::flush(); - - $api_scope_repository = EntityManager::getRepository(ApiScope::class); - $profile_scope = $api_scope_repository->findOneBy(['name' => 'profile']); - $email_scope = $api_scope_repository->findOneBy(['name' => 'email']); - $address_scope = $api_scope_repository->findOneBy(['name' => 'address']); - $me_write = $api_scope_repository->findOneBy(['name' => IUserScopes::MeWrite]); - - foreach($api_scope_payloads as $payload) { - $endpoint = $endpoint_repository->findOneBy(['name' => $payload['name']]); - $endpoint->addScope($address_scope); - $endpoint->addScope($email_scope); - $endpoint->addScope($profile_scope); - $endpoint->addScope($me_write); - EntityManager::persist($endpoint); - } - - EntityManager::flush(); - } - - private function seedUserRegistrationEndpoints(){ - $api_repository = EntityManager::getRepository(Api::class); - $endpoint_repository = EntityManager::getRepository(ApiEndpoint::class); - $api = $api_repository->findOneBy(['name' => 'user-registration']); - - $api_scope_payloads = [ - array( - 'name' => 'request-user-registration', - 'active' => true, - 'api' => $api, - 'route' => '/api/v1/user-registration-requests', - 'http_method' => 'POST' - ), - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiEndpointFactory::build($payload)); - } - EntityManager::flush(); - - $api_scope_repository = EntityManager::getRepository(ApiScope::class); - $scope = $api_scope_repository->findOneBy(['name' => IUserScopes::Registration]); - - foreach($api_scope_payloads as $payload) { - $endpoint = $endpoint_repository->findOneBy(['name' => $payload['name']]); - $endpoint->addScope($scope); - EntityManager::persist($endpoint); - } - - EntityManager::flush(); - } - - private function seedSSOEndpoints(){ - $api_repository = EntityManager::getRepository(Api::class); - $endpoint_repository = EntityManager::getRepository(ApiEndpoint::class); - $api = $api_repository->findOneBy(['name' => 'sso']); - - $api_scope_payloads = [ - [ - 'name' => 'sso-disqus', - 'active' => true, - 'api' => $api, - 'route' => '/api/v1/sso/disqus/{forum_slug}/profile', - 'http_method' => 'GET' - ], - [ - 'name' => 'sso-rocket-chat', - 'active' => true, - 'api' => $api, - 'route' => '/api/v1/sso/rocket-chat/{forum_slug}/profile', - 'http_method' => 'GET' - ], - [ - 'name' => 'sso-stream-chat', - 'active' => true, - 'api' => $api, - 'route' => '/api/v1/sso/stream-chat/{forum_slug}/profile', - 'http_method' => 'GET', - - ], - ]; - - foreach($api_scope_payloads as $payload) { - EntityManager::persist(ApiEndpointFactory::build($payload)); - } - EntityManager::flush(); - - $api_scope_repository = EntityManager::getRepository(ApiScope::class); - $scope = $api_scope_repository->findOneBy(['name' => \App\libs\OAuth2\IUserScopes::SSO]); - - foreach($api_scope_payloads as $payload) { - $endpoint = $endpoint_repository->findOneBy(['name' => $payload['name']]); - $endpoint->addScope($scope); - EntityManager::persist($endpoint); - } - - EntityManager::flush(); - } - - - /* - private function seedApiEndpointEndpoints(){ - - $current_realm = Config::get('app.url'); - $api_api_endpoint = Api::where('name','=','api-endpoint')->first(); - - ApiEndpoint::create( - array( - 'name' => 'get-api-endpoint', - 'active' => true, - 'api_id' => $api_api_endpoint->id, - 'route' => '/api/v1/api-endpoint/{id}', - 'http_method' => 'GET' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'delete-api-endpoint', - 'active' => true, - 'api_id' => $api_api_endpoint->id, - 'route' => '/api/v1/api-endpoint/{id}', - 'http_method' => 'DELETE' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'create-api-endpoint', - 'active' => true, - 'api_id' => $api_api_endpoint->id, - 'route' => '/api/v1/api-endpoint', - 'http_method' => 'POST' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'update-api-endpoint', - 'active' => true, - 'api_id' => $api_api_endpoint->id, - 'route' => '/api/v1/api-endpoint', - 'http_method' => 'PUT' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'update-api-endpoint-status', - 'active' => true, - 'api_id' => $api_api_endpoint->id, - 'route' => '/api/v1/api-endpoint/status/{id}/{active}', - 'http_method' => 'GET' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'api-endpoint-get-page', - 'active' => true, - 'api_id' => $api_api_endpoint->id, - 'route' => '/api/v1/api-endpoint/{page_nbr}/{page_size}', - 'http_method' => 'GET' - ) - ); - - - ApiEndpoint::create( - array( - 'name' => 'add-api-endpoint-scope', - 'active' => true, - 'api_id' => $api_api_endpoint->id, - 'route' => '/api/v1/api-endpoint/scope/add/{id}/{scope_id}', - 'http_method' => 'GET' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'remove-api-endpoint-scope', - 'active' => true, - 'api_id' => $api_api_endpoint->id, - 'route' => '/api/v1/api-endpoint/scope/remove/{id}/{scope_id}', - 'http_method' => 'GET' - ) - ); - - //endpoint api endpoint scopes - - $api_endpoint_read_scope = ApiScope::where('name','=',sprintf('%s/api-endpoint/read',$current_realm))->first(); - $api_endpoint_write_scope = ApiScope::where('name','=',sprintf('%s/api-endpoint/write',$current_realm))->first(); - $api_endpoint_read_page_scope = ApiScope::where('name','=',sprintf('%s/api-endpoint/read.page',$current_realm))->first(); - $api_endpoint_delete_scope = ApiScope::where('name','=',sprintf('%s/api-endpoint/delete',$current_realm))->first(); - $api_endpoint_update_scope = ApiScope::where('name','=',sprintf('%s/api-endpoint/update',$current_realm))->first(); - $api_endpoint_update_status_scope = ApiScope::where('name','=',sprintf('%s/api-endpoint/update.status',$current_realm))->first(); - $api_endpoint_add_scope_scope = ApiScope::where('name','=',sprintf('%s/api-endpoint/add.scope',$current_realm))->first(); - $api_endpoint_remove_scope_scope = ApiScope::where('name','=',sprintf('%s/api-endpoint/remove.scope',$current_realm))->first(); - - $endpoint_api_endpoint_get = ApiEndpoint::where('name','=','get-api-endpoint')->first(); - $endpoint_api_endpoint_get->scopes()->attach($api_endpoint_read_scope->id); - - $endpoint_api_endpoint_get_page = ApiEndpoint::where('name','=','api-endpoint-get-page')->first(); - $endpoint_api_endpoint_get_page->scopes()->attach($api_endpoint_read_scope->id); - $endpoint_api_endpoint_get_page->scopes()->attach($api_endpoint_read_page_scope->id); - - $endpoint_api_endpoint_delete = ApiEndpoint::where('name','=','delete-api-endpoint')->first(); - $endpoint_api_endpoint_delete->scopes()->attach($api_endpoint_delete_scope->id); - - $endpoint_api_endpoint_create = ApiEndpoint::where('name','=','create-api-endpoint')->first(); - $endpoint_api_endpoint_create->scopes()->attach($api_endpoint_write_scope->id); - - $endpoint_api_endpoint_update = ApiEndpoint::where('name','=','update-api-endpoint')->first(); - $endpoint_api_endpoint_update->scopes()->attach($api_endpoint_update_scope->id); - - $endpoint_api_add_api_endpoint_scope = ApiEndpoint::where('name','=','add-api-endpoint-scope')->first(); - $endpoint_api_add_api_endpoint_scope->scopes()->attach($api_endpoint_write_scope->id); - $endpoint_api_add_api_endpoint_scope->scopes()->attach($api_endpoint_add_scope_scope->id); - - $endpoint_api_remove_api_endpoint_scope = ApiEndpoint::where('name','=','remove-api-endpoint-scope')->first(); - $endpoint_api_remove_api_endpoint_scope->scopes()->attach($api_endpoint_write_scope->id); - $endpoint_api_remove_api_endpoint_scope->scopes()->attach($api_endpoint_remove_scope_scope->id); - - - $endpoint_api_endpoint_update_status = ApiEndpoint::where('name','=','update-api-endpoint-status')->first(); - $endpoint_api_endpoint_update_status->scopes()->attach($api_endpoint_update_scope->id); - $endpoint_api_endpoint_update_status->scopes()->attach($api_endpoint_update_status_scope->id); - - } - - private function seedScopeEndpoints(){ - $api_scope = Api::where('name','=','api-scope')->first(); - $current_realm = Config::get('app.url'); - // endpoints scopes - - ApiEndpoint::create( - array( - 'name' => 'get-scope', - 'active' => true, - 'api_id' => $api_scope->id, - 'route' => '/api/v1/api-scope/{id}', - 'http_method' => 'GET' - ) - ); - - - ApiEndpoint::create( - array( - 'name' => 'delete-scope', - 'active' => true, - 'api_id' => $api_scope->id, - 'route' => '/api/v1/api-scope/{id}', - 'http_method' => 'DELETE' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'create-scope', - 'active' => true, - 'api_id' => $api_scope->id, - 'route' => '/api/v1/api-scope', - 'http_method' => 'POST' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'update-scope', - 'active' => true, - 'api_id' => $api_scope->id, - 'route' => '/api/v1/api-scope', - 'http_method' => 'PUT' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'update-scope-status', - 'active' => true, - 'api_id' => $api_scope->id, - 'route' => '/api/v1/api-scope/status/{id}/{active}', - 'http_method' => 'GET' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'scope-get-page', - 'active' => true, - 'api_id' => $api_scope->id, - 'route' => '/api/v1/api-scope/{page_nbr}/{page_size}', - 'http_method' => 'GET' - ) - ); - - $api_scope_read_scope = ApiScope::where('name','=',sprintf('%s/api-scope/read',$current_realm))->first(); - $api_scope_write_scope = ApiScope::where('name','=',sprintf('%s/api-scope/write',$current_realm))->first(); - $api_scope_read_page_scope = ApiScope::where('name','=',sprintf('%s/api-scope/read.page',$current_realm))->first(); - $api_scope_delete_scope = ApiScope::where('name','=',sprintf('%s/api-scope/delete',$current_realm))->first(); - $api_scope_update_scope = ApiScope::where('name','=',sprintf('%s/api-scope/update',$current_realm))->first(); - $api_scope_update_status_scope = ApiScope::where('name','=',sprintf('%s/api-scope/update.status',$current_realm))->first(); - - - $endpoint_api_scope_get = ApiEndpoint::where('name','=','get-scope')->first(); - $endpoint_api_scope_get->scopes()->attach($api_scope_read_scope->id); - - $endpoint_api_scope_get_page = ApiEndpoint::where('name','=','scope-get-page')->first(); - $endpoint_api_scope_get_page->scopes()->attach($api_scope_read_scope->id); - $endpoint_api_scope_get_page->scopes()->attach($api_scope_read_page_scope->id); - - $endpoint_api_scope_delete = ApiEndpoint::where('name','=','delete-scope')->first(); - $endpoint_api_scope_delete->scopes()->attach($api_scope_delete_scope->id); - - $endpoint_api_scope_create = ApiEndpoint::where('name','=','create-scope')->first(); - $endpoint_api_scope_create->scopes()->attach($api_scope_write_scope->id); - - $endpoint_api_scope_update = ApiEndpoint::where('name','=','update-scope')->first(); - $endpoint_api_scope_update->scopes()->attach($api_scope_update_scope->id); - - $endpoint_api_scope_update_status = ApiEndpoint::where('name','=','update-scope-status')->first(); - $endpoint_api_scope_update_status->scopes()->attach($api_scope_update_scope->id); - $endpoint_api_scope_update_status->scopes()->attach($api_scope_update_status_scope->id); - } - - private function seedPublicCloudsEndpoints(){ - $public_clouds = Api::where('name','=','public-clouds')->first(); - $current_realm = Config::get('app.url'); - // endpoints scopes - - ApiEndpoint::create( - array( - 'name' => 'get-public-clouds', - 'active' => true, - 'api_id' => $public_clouds->id, - 'route' => '/api/v1/marketplace/public-clouds', - 'http_method' => 'GET' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'get-public-cloud', - 'active' => true, - 'api_id' => $public_clouds->id, - 'route' => '/api/v1/marketplace/public-clouds/{id}', - 'http_method' => 'GET' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'get-public-cloud-datacenters', - 'active' => true, - 'api_id' => $public_clouds->id, - 'route' => '/api/v1/marketplace/public-clouds/{id}/data-centers', - 'http_method' => 'GET' - ) - ); - - $public_cloud_read_scope = ApiScope::where('name','=',sprintf('%s/public-clouds/read',$current_realm))->first(); - - $endpoint_get_public_clouds = ApiEndpoint::where('name','=','get-public-clouds')->first(); - $endpoint_get_public_clouds->scopes()->attach($public_cloud_read_scope->id); - - $endpoint_get_public_cloud = ApiEndpoint::where('name','=','get-public-cloud')->first(); - $endpoint_get_public_cloud->scopes()->attach($public_cloud_read_scope->id); - - $endpoint_get_public_cloud_datacenters = ApiEndpoint::where('name','=','get-public-cloud-datacenters')->first(); - $endpoint_get_public_cloud_datacenters->scopes()->attach($public_cloud_read_scope->id); - } - - private function seedPrivateCloudsEndpoints(){ - $private_clouds = Api::where('name','=','private-clouds')->first(); - $current_realm = Config::get('app.url'); - // endpoints scopes - - ApiEndpoint::create( - array( - 'name' => 'get-private-clouds', - 'active' => true, - 'api_id' => $private_clouds->id, - 'route' => '/api/v1/marketplace/private-clouds', - 'http_method' => 'GET' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'get-private-cloud', - 'active' => true, - 'api_id' => $private_clouds->id, - 'route' => '/api/v1/marketplace/private-clouds/{id}', - 'http_method' => 'GET' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'get-private-cloud-datacenters', - 'active' => true, - 'api_id' => $private_clouds->id, - 'route' => '/api/v1/marketplace/private-clouds/{id}/data-centers', - 'http_method' => 'GET' - ) - ); - - $private_cloud_read_scope = ApiScope::where('name','=',sprintf('%s/private-clouds/read',$current_realm))->first(); - - $endpoint_get_private_clouds = ApiEndpoint::where('name','=','get-private-clouds')->first(); - $endpoint_get_private_clouds->scopes()->attach($private_cloud_read_scope->id); - - $endpoint_get_private_cloud = ApiEndpoint::where('name','=','get-private-cloud')->first(); - $endpoint_get_private_cloud->scopes()->attach($private_cloud_read_scope->id); - - $endpoint_get_private_cloud_datacenters = ApiEndpoint::where('name','=','get-private-cloud-datacenters')->first(); - $endpoint_get_private_cloud_datacenters->scopes()->attach($private_cloud_read_scope->id); - - } - - private function seedConsultantsEndpoints(){ - - $consultants = Api::where('name','=','consultants')->first(); - $current_realm = Config::get('app.url'); - // endpoints scopes - - ApiEndpoint::create( - array( - 'name' => 'get-consultants', - 'active' => true, - 'api_id' => $consultants->id, - 'route' => '/api/v1/marketplace/consultants', - 'http_method' => 'GET' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'get-consultant', - 'active' => true, - 'api_id' => $consultants->id, - 'route' => '/api/v1/marketplace/consultants/{id}', - 'http_method' => 'GET' - ) - ); - - ApiEndpoint::create( - array( - 'name' => 'get-consultant-offices', - 'active' => true, - 'api_id' => $consultants->id, - 'route' => '/api/v1/marketplace/consultants/{id}/offices', - 'http_method' => 'GET' - ) - ); - - $consultant_read_scope = ApiScope::where('name','=',sprintf('%s/consultants/read',$current_realm))->first(); - - $endpoint = ApiEndpoint::where('name','=','get-consultants')->first(); - $endpoint->scopes()->attach($consultant_read_scope->id); - - $endpoint = ApiEndpoint::where('name','=','get-consultant')->first(); - $endpoint->scopes()->attach($consultant_read_scope->id); - - $endpoint = ApiEndpoint::where('name','=','get-consultant-offices')->first(); - $endpoint->scopes()->attach($consultant_read_scope->id); - } -*/ - - -} \ No newline at end of file diff --git a/doc/source/conf.py b/doc/source/conf.py deleted file mode 100644 index b60171e0..00000000 --- a/doc/source/conf.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- -# 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. - -import datetime -import os -import sys - -sys.path.insert(0, os.path.abspath('../..')) -# -- General configuration ---------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinxcontrib.httpdomain', - #'sphinx.ext.intersphinx', - 'openstackdocstheme', - 'yasfb', -] - -# Feed configuration for yasfb -feed_base_url = 'http://docs.openstack.org/infra/openstackid' -feed_author = 'OpenStack Infrastructure Team' - -exclude_patterns = [ - 'template.rst', -] - -# Optionally allow the use of sphinxcontrib.spelling to verify the -# spelling of the documents. -try: - import sphinxcontrib.spelling - extensions.append('sphinxcontrib.spelling') -except ImportError: - pass - -# autodoc generation is a bit aggressive and a nuisance when doing heavy -# text edit cycles. -# execute "export SPHINX_DEBUG=1" in your terminal to disable - -# The suffix of source filenames. -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'openstackid' -copyright = u'%s, OpenStack Foundation' % datetime.date.today().year - -# If true, '()' will be appended to :func: etc. cross-reference text. -add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -add_module_names = True - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# -- Options for HTML output -------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. Major themes that come with -# Sphinx are currently 'default' and 'sphinxdoc'. -# html_theme_path = ["."] -html_theme = 'openstackdocs' -# html_static_path = ['static'] - -# openstackdocstheme options -repository_name = 'openstack-infra/openstackid' -use_storyboard = True - -# Output file base name for HTML help builder. -htmlhelp_basename = '%sdoc' % project - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto/manual]). -latex_documents = [ - ('index', - '%s.tex' % project, - u'%s Documentation' % project, - u'OpenStack Foundation', 'manual'), -] - -# Example configuration for intersphinx: refer to the Python standard library. -#intersphinx_mapping = {'http://docs.python.org/': None} diff --git a/doc/source/index.rst b/doc/source/index.rst deleted file mode 100644 index 658db9d6..00000000 --- a/doc/source/index.rst +++ /dev/null @@ -1,60 +0,0 @@ -======================================= -Welcome to OpenStackId's documentation! -======================================= - -Introduction -============ - -OpenStackID Idp (Identity Provider) supports the `OpenID 2.0`_ protocol -providing authentication support as an OpenID provider. - -also supports the following OpenID extensions: - -* `OpenID Attribute Exchange 1.0`_ - Allows web developers to access, with the - user's approval, certain user information stored with OpenStack DB, - including user name and email address -* `OpenID Simple Registration Extension 1.0`_ - OpenID Simple Registration is - an extension to the OpenID Authentication protocol that allows for very - light-weight profile exchange. It is designed to pass eight commonly - requested pieces of information when an End User goes to register a new - account with a web service. -* `OpenID OAuth2 Extension`_ - OpenID+OAuth Hybrid protocol lets web developers - combine an OpenID request with an OAuth authentication request. - This extension is useful for web developers who use both OpenID and OAuth, - particularly in that it simplifies the process for users by requesting their - approval once instead of twice. In this way, the user can approve login and - service access at the same time. - -.. _OpenID 2.0: http://openid.net/specs/openid-authentication-2_0.html -.. _OpenID Attribute Exchange 1.0: http://openid.net/specs/openid-attribute-exc - hange-1_0.htm -.. _OpenID Simple Registration Extension 1.0: http://openid.net/specs/openid-si - mple-registration-extension-1_0.html -.. _OpenID OAuth2 Extension: http://step2.googlecode.com/svn/spec/openid_oauth_ - extension/latest/openid_oauth_extension.html - -Its also support `The OAuth 2.0 Authorization Framework `_ , turning OpenStackID Server in a Combined Provider (A web -service that is simultaneously an OpenID Identity Provider (OP) and an OAuth2 -Service Provider (SP).). - -:OAUTH2 Grants Support: - -* `Authorization Code Grant `_ -* `Implicit Grant `_ -* `Client Credentials Grant `_ - -Table of contents -================= - -Developer docs --------------- - -.. toctree:: - :maxdepth: 2 - - openid - oauth2 \ No newline at end of file diff --git a/doc/source/oauth2.rst b/doc/source/oauth2.rst deleted file mode 100644 index 1a94a6e7..00000000 --- a/doc/source/oauth2.rst +++ /dev/null @@ -1,625 +0,0 @@ -================== -OAuth 2.0 endpoint -================== - -Using OAuth 2.0 to Access OpenStackID APIs ------------------------------------------- - -OpenStackID APIs use the OAuth 2.0 protocol for authorization. OpenStackID -supports common OAuth 2.0 scenarios such as those for web server, Service -Accounts, and client-side applications. OAuth 2.0 is a relatively simple -protocol. To begin, you register your application with OpenStackID. Then your -client application requests an access token from the OpenStackID Authorization -Server, extracts a token from the response, and sends the token to the -OpenStackID API that you want to access. - - -Basic steps ------------ - -All applications follow a basic pattern when accessing an OpenStackID API using -OAuth 2.0. At a high level, you follow four steps: - -1. Register your application. - All applications that access an OpenStackID API must be registered through - the OpenStackID OAUTH2 Console. The result of this registration process is - a set of values (such as a client ID and client secret) that are known to - both OpenStackID and your application. The set of values varies based on - what type of application you are building. For example, a JavaScript - application does not require a secret, but a web server application does. - -2. Obtain an access token from the OpenStackID Authorization Server. - Before your application can access private data using an OpenStackID API, - it must obtain an access token that grants access to that API. A single - access token can grant varying degrees of access to multiple APIs. - A variable parameter called "scope" controls the set of resources and - operations that an access token permits. During the access-token request, - your application sends one or more values in the scope parameter. - Some requests require an authentication step where the user logs in with - their OpenStackID account. After logging in, the user is asked whether - they are willing to grant the permissions that your application is requesting. - This process is called user consent. - If the user grants the permission, the OpenStackID Authorization Server - sends your application an access token (or an authorization code that - your application can use to obtain an access token). If the user does not - grant the permission, the server returns an error. - -3.Send the access token to an API. - After an application obtains an access token, it sends the token to an - OpenStackID API in an HTTP authorization header. It is possible to send tokens - as URI query-string parameters, but we don't recommend it, because URI - parameters can end up in log files that are not completely secure. - Access tokens are valid only for the set of operations and resources - described in the scope of the token request. - -4.Refresh the access token (if necessary) - Access tokens have limited lifetimes. If your application needs access to an - OpenStackID API beyond the lifetime of a single access token, it can - obtain a refresh token. A refresh token allows your application to obtain - new access tokens. - -Scenarios -========= - - -Web server applications ------------------------ - -The OpenStackID OAuth 2.0 endpoint supports web server applications that use -languages and frameworks such as PHP, Java, Python, Ruby, and ASP.NET. These -applications might access an OpenStackID API while the user is present at -the application or after the user has left the application. -**This flow requires that the application can keep a secret.** - -Overview --------- - -The authorization sequence begins when your application redirects a browser to -the OpenStackID OAuth 2.0 Endpoint; the URL includes query parameters that -indicate the type of access being requested.The result is an authorization code, -which OpenStackID returns to your application in a query string. -After receiving the authorization code, your application can exchange the code -(along with a client ID and client secret) for an access token and, in some -cases, a refresh token. -The application can then use the access token to access an OpenStackID API. -If a refresh token is present in the authorization code exchange, then it can -be used to obtain new access tokens at any time. This is called -**offline access**, because the user does not have to be present at the -browser when the application obtains a new access token. - -Forming the URL ---------------- - -The URL used when authenticating a user is -https://openstackid.org/oauth2/auth. -This endpoint is accessible over SSL, and HTTP connections are refused. -This endpoint is the target of the initial request. It handles active session -lookup, authenticating the user, and user consent. The result of requests to -this endpoint include access tokens, refresh tokens, and authorization codes. - -The set of query string parameters supported by the OpenStackID Authorization -Server for web server applications are: - -+------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------+ -| Parameter | Values | Description | -+==============================+===================================================+=======================================================================================+ -| response_type | code | Determines whether the OpenStackID OAuth 2.0 endpoint returns an authorization code. | -| | | Web server applications should use code. | -| | | | -+------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------+ -| client_id | The client ID you obtain from the OpenStackID | Identifies the client that is making the request. The value passed in this parameter | -| | OAUTH2 Console when you register your app. | must exactly match the value shown in | -| | | the OpenStackID OAUTH2 Console. | -| | | | -+------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------+ -| redirect_uri | One of the redirect_uri values registered at the | Determines where the response is sent. The value of this parameter must exactly match | -| | OpenStackID OAUTH2 Console. | one of the values registered in the OpenStackID OAUTH2 Console | -| | | (including https scheme, case, and trailing '/'). | -| | | | -+------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------+ -| scope | Space-delimited set of permissions that the | Identifies the OpenStackID API access that your application is requesting. The values | -| | application requests. | passed in this parameter inform the consent screen that is shown to the user. | -| | | | -+------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------+ -| state | Any string | Provides any state that might be useful to your application upon receipt of the | -| | | response. The Openstack Authorization Server roundtrips this parameter, so your | -| | | application receives the same value it sent. Possible uses include redirecting the | -| | | user to the correct resource in your site, nonces, and cross-site-request-forgery | -| | | mitigations. | -| | | | -+------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------+ -| access_type | online or offline | Indicates whether your application needs to access an OpenStackID API when the user | -| | | is not present at the browser. This parameter defaults to online. If your application | -| | | needs to refresh access tokens when the user is not present at the browser, | -| | | then use offline. This will result in your application obtaining a refresh token the | -| | | first time your application exchanges an authorization code for a user. | -| | | | -+------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------+ -| approval_prompt | force or auto | Indicates whether the user should be re-prompted for consent. The default is auto, | -| | | so a given user should only see the consent page for a given set of scopes the first | -| | | time through the sequence. If the value is force, then the user sees a consent page | -| | | even if they previously gave consent to your application for a given set of scopes. | -| | | | -+------------------------------+---------------------------------------------------+---------------------------------------------------------------------------------------+ - -Handling the response ---------------------- - -The response will be sent to the redirect_uri as specified in the request URL. -If the user approves the access request, -then the response contains an authorization code and the state parameter -(if included in the request). If the user does not approve the request, the -response contains an error message. All responses are returned to the -web server on the query string, as shown below: - -An error response:: - - https://oauth2-demo.com/code?error=access_denied&state=xyz - -An authorization code response:: - - https://oauth2-demo.com/code?state=xyz&code=123456 - -After the web server receives the authorization code, it may exchange the -authorization code for an access token and a -refresh token. This request is an HTTPS post, and includes the following -parameters: - -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| Parameter | Description | -+==============================+=================================================================================================================================+ -| code | The authorization code returned from the initial request. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| client_id | The client ID obtained from the OpenStackID OAUTH2 Console during application registration. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| client_secret | The client secret obtained during application registration | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| redirect_uri | The URI registered with the application. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| grant_type | As defined in the OAuth 2.0 specification, this field must contain a value of authorization_code. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ - -**REMARK** - -It is advisable that you exclude client_id/client_secret params from query -string and use instead the Authorization Header -like this:: - - Authorization: Basic Base64-Encoded(client_id:client_secret) - -The actual request might look like the following:: - - POST /oauth2/token HTTP/1.1 - Host: OpenStackID.openstack.org - Authorization: Basic Base64-Encoded(client_id:client_secret) - Content-Type: application/x-www-form-urlencoded - - grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA - &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb - -A successful response to this request contains the following fields: - -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| Field | Description | -+==============================+=================================================================================================================================+ -| access_token | The token that can be sent to an OpenStackID API. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| refresh_token | A token that may be used to obtain a new access token. Refresh tokens are valid until the user revokes access. | -| | This field is only present if access_type=offline is included in the authorization code request. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| expires_in | The remaining lifetime of the access token in seconds. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| token_type | Identifies the type of token returned. At this time, this field will always have the value Bearer. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ - -An example successful response:: - - HTTP/1.1 200 OK - Content-Type: application/json;charset=UTF-8 - Cache-Control: no-store - Pragma: no-cache - - { - - "access_token":"2YotnFZFEjr1zCsicMWpAA", - "token_type":"Bearer", - "expires_in":3600, - "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", - - } - -Calling an OpenStackID API --------------------------- - -After your application obtains an access token, you can use the token to make -calls to a OpenStackID API on behalf of a given user. To do this, include -the access token in a request to the API by including either an access_token -query parameter or an Authorization: Bearer HTTP header. When possible, it -is preferable to use the HTTP Header, since query strings tend to be visible -in server logs. - -Examples - -Here is a call to the same API for the authenticated user (me) using the -access_token Authorization Bearer HTTP header:: - - - GET /api/v1/users/me HTTP/1.1 - Authorization: Bearer 1/fFBGRNJru1FQd44AzqT3Zg - Host: OpenStackID.openstack.org - -Offline access --------------- - -In some cases, your application may need to access an OpenStackID API when the -user is not present. This style of access is called offline, and web server -applications may request offline access from a user. The normal and default -style of access is called online. If your application needs offline access -to an OpenStackID API, then the request for an authorization code should -include the access_type parameter, where the value of that parameter is offline. -The first time a given user's browser is sent to this URL, they see a consent -page. If they grant access, then the response includes an authorization code -which may be redeemed for an access token and a refresh token. If this is -the first time the application has exchanged an authorization code for a user, -then the response includes an access token and a refresh token, as shown -below:: - - { - - "access_token":"1/fFAGRNJru1FTz70BzhT3Zg", - "expires_in":3600, - "token_type":"Bearer", - "refresh_token":"1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" - - } - -**IMPORTANT**: - -When your application receives a refresh token, it is important to store that -refresh token for future use. If your application loses the refresh token, -it will have to re-prompt the user for consent before obtaining another -refresh token. If you need to re-prompt the user for consent, include the -approval_prompt parameter in the authorization code request, and set the -value to force. - -After your application receives the refresh token, it may obtain new access -tokens at any time. -The next time your application requests an authorization code for that user, -the user will not be asked to grant consent (assuming they previously -granted access, and you are asking for the same scopes). As expected, the -response includes an authorization code which may be redeemed. However, -unlike the first time an authorization code is exchanged for a given user, a -refresh token will not be returned from the authorization code exchange. - -The following is an example of such a response:: - - { - - "access_token":"1/fFAGRNJru1FQd77BzhT3Zg", - "expires_in":3600, - "token_type":"Bearer" - - } - -Using a refresh token ---------------------- - -As indicated in the previous section, a refresh token is obtained in offline -scenarios during the first authorization code exchange. In these cases, your -application may obtain a new access token by sending a refresh token to the -OpenStackID OAuth 2.0 Authorization server. -To obtain a new access token this way, your application performs an HTTPS POST -to https://openstackid.org/oauth2/token. The request must include -the following parameters: - -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| Parameter | Description | -+==============================+=================================================================================================================================+ -| refresh_token | (required) The refresh token returned from the authorization code exchange. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| grant_type | (required) As defined in the OAuth 2.0 specification, this field must contain a value of refresh_token. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| scope | (optional) The requested scope MUST NOT include any scope not originally granted by the resource owner, and if omitted is | -| | treated as equal to the scope originally granted by the resource owner. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ - -Such a request will look similar to the following:: - - POST /oauth2/token HTTP/1.1 - Host: OpenStackID.openstack.org - Authorization: Basic Base64-Encoded(client_id:client_secret) - Content-Type: application/x-www-form-urlencoded - - grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA - -As long as the user has not revoked the access granted to your application, the -response includes a new access token. -A response from such a request is shown below:: - - { - - "access_token":"1/fFBGRNJru1FQd44AzqT3Zg", - "expires_in":3600, - "token_type":"Bearer" - - } - -Revoking a token ----------------- - -In some cases a user may wish to revoke access given to an application. -A user can revoke access by visiting the following URL and explicitly -revoking access: https://openstackid.org/admin/grants . It is also -possible for an application to programmatically revoke the access given to -it. Programmatic revocation is important in instances where a user -unsubscribes or removes an application. In other words, part of the removal -process can include an API request to ensure the permissions granted to the -application are removed. - -To programmatically revoke a token, your application makes a request to - -https://openstackid.org/oauth2/token/revoke and includes the token as a -parameter and a hint - - -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| Parameter | Description | -+==============================+=================================================================================================================================+ -| token | (required) Token value to revoke | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| token_type_hint | (optional) access_token/refresh_token Hint to allow Authorization Server to do a more performant token search | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ - -The token can be an access token or a refresh token. If the token is an access -token and it has a corresponding refresh token, the refresh token will also -be revoked. -If the revocation is successfully processed, then the status code of the -response is 200. -For error conditions, a status code 400 is returned along with an error code. - -Token Introspection -------------------- - -In OAuth 2.0, the contents of tokens are opaque to clients. This means that -the client does not need to know anything about the content or structure of -the token itself, if there is any. However, there is still a large amount of -metadata that may be attached to a token, such as its current validity, -approved scopes, and extra information about the authentication context in -which the token was issued. -These pieces of information are often vital to Protected Resources making -authorization decisions based on the tokens being presented. Since OAuth2 -defines no direct relationship between the Authorization Server and the -Protected Resource, -only that they must have an agreement on the tokens themselves, there have been -many different approaches to bridging this gap. - -OpenStackID Authorization Server implements `OAuth Token Introspection `_ -to fix that gap. - -To programmatically get info for a token, your application makes a request to - -https://openstackid.org/oauth2/token/introspection - -Such a request will look similar to the following:: - - POST /oauth2/token/introspection HTTP/1.1 - Host: OpenStackID.openstack.org - Authorization: Basic Base64-Encoded(client_id:client_secret) - Content-Type: application/x-www-form-urlencoded - - token=tGzv3JOkF0XG5Qx2TlKWIA - -**IMPORTANT** - -the token must belongs to clientid provided on the request, otherwise request -will fail - -The TokenInfo endpoint will respond with a JSON array that describes the token -or an error. -Below is a table of the fields included in the non-error case: - -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| Parameter | Description | -+==============================+=================================================================================================================================+ -| audience | The Resource Server that is the intended target of the token. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| access_token | Token Value | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| client_id | The application that is the intended target of the token. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| scope | The space-delimited set of scopes that the user consented to. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| expires_in | The number of seconds left in the lifetime of the token. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| token_type | Identifies the type of token returned. At this time, this field will always have the value Bearer. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| userid | This field is only present if a resource owner (end-user) had approved access on the consent screen. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| application_type | identifies the client type. (WEB_APPLICATION, JS_CLIENT OR SERVICE ) | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| allowed_return_uris | identifies the allowed return uris set for this client. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| allowed_origins | This field is only present if application_type == JS_CLIENT. | -| | identifies the allowed origin uris set for this client. | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ - -A response from such a request is shown below:: - - { - - "access_token":"1/fFBGRNJru1FQd44AzqT3Zg", - "client_id": "xyz", - "expires_in":3600, - "token_type":"Bearer", - "scope":"profile email", - "audience": "resource.server1.com", - "user_id": 123456, - "application_type": "WEB_APPLICATION", - "allowed_return_uris": "www.test.com", - "allowed_origins": "www.test1.com", - } - -Using OAuth 2.0 for Client-side Applications -============================================ - -The OpenStackID OAuth 2.0 endpoint supports JavaScript-centric applications. -These applications may access an OpenStackID API while the user is present -at the application, and this type of application cannot keep a secret. - -Overview --------- - -This scenario begins by redirecting a browser (full page or popup) to a -OpenStackID URL with a set of query parameters that indicate the type of -OpenStackID API access the application requires. As in other scenarios, -OpenStackID handles user authentication and consent, and the result is an -access token. OpenStackID returns the access token on the fragment of the -response, and client side script extracts the access token from the response. -The application may access an OpenStackID API after it receives the access token. - -**NOTE:** Your application should always use HTTPS in this scenario. - -Handling the response ---------------------- - -OpenStackID returns an access token to your application if the user grants your -application the permissions it requested. -The access token is returned to your application in the fragment as part of the -access_token parameter. Since a fragment is not returned to the server, -client-side script must parse the fragment and extract the value of the -access_token parameter. -Other parameters included in the response include expires_in and token_type. -These parameters describe the lifetime of the token in seconds, and the kind -of token that is being returned. If the state parameter was included in the -request, then it is also included in the response. - -An example User Agent flow response is shown below:: - - https://oauth2-demo.com//oauthcallback#access_token=123456&token_type=Bearer&expires_in=3600 - -Calling an OpenStackID API --------------------------- - -After your application obtains an access token, you can use the token to make -calls to an OpenStackID API on behalf of a given user. To do this, include -the access token in a request to the API by including either an access_token -query parameter or an Authorization: Bearer HTTP header. When possible, it -is preferable to use the HTTP Header, since query -strings tend to be visible in server logs. - -**NOTE**: - -Be sure that OpenStackID Endpoint API that your application wants to access -it's been `CORS `_ enabled - - -User API --------- - -Allows to get additional info about current user (Me) - -.. http:get:: api/v1/users/me - - Gets additional information about the current user - - **Example request**: - - .. sourcecode:: http - - GET /api/v1/users/me HTTP/1.1 - Host: openstackid.org - Accept: application/json, text/javascript - - **Example response**: - - .. sourcecode:: http - - { - - "name":"Sebastian", - "family_name":"Marcet", - "nickname":"Sebastian Marcet", - "picture":"http:\/\/www.openstack.org\/assets\/profile-images\/IMG-20140912-WA0003.jpg", - "birthdate":"", - "gender":"Male", - "email":"sebastian@tipit.net" - - } - - -Using OAuth 2.0 for Server to Server Applications -------------------------------------------------- - -The OpenStackID OAuth 2.0 Authorization Server supports server-to-server -interactions. The requesting application has to prove its own identity to -gain access to an API, and an end-user doesn't have to be involved. - -The client can request an access token using only its client credentials -(or other supported means of authentication) when the client is requesting -access to the protected resources under its control, or those of another -resource owner that have been previously arranged with the authorization -server. - -The client makes a request to the token endpoint by adding the following -parameters: - -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| Parameter | Description | -+==============================+=================================================================================================================================+ -| grant_type | (required) Value MUST be set to "client_credentials". | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| scope | (required) Required Scopes | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ - - -For example, the client makes the following HTTP request using -transport-layer security (with extra line breaks for display purposes -only):: - - POST /oauth2/token HTTP/1.1 - Host: https://openstackid.org/ - Authorization: Basic Base64-Encoded(client_id:client_secret) - Content-Type: application/x-www-form-urlencoded - - grant_type=client_credentials&scope=write.endpoint.api - - -An example successful response:: - - HTTP/1.1 200 OK - Content-Type: application/json;charset=UTF-8 - Cache-Control: no-store - Pragma: no-cache - - { - - "access_token":"123456", - "token_type":"Bearer", - "expires_in":3600 - } - diff --git a/doc/source/openid.rst b/doc/source/openid.rst deleted file mode 100644 index f8b8cf79..00000000 --- a/doc/source/openid.rst +++ /dev/null @@ -1,176 +0,0 @@ -=================== -OpenID 2.0 endpoint -=================== - -To get the OpenStackID OpenID endpoint, perform discovery by sending a GET -HTTP request to https://openstackid.org. We recommend setting the -Accept header to "application/xrds+xml". OpenStackID returns an XRDS document -containing an OpenID provider endpoint URL.The endpoint address is -annotated as:: - - - - http://specs.openid.net/auth/2.0/server - - {OpenStackID's login endpoint URI} - - - -OpenID 2.0 request parameters ------------------------------ - -Once you've acquired the OpenStackID endpoint, send authentication requests -to it, specifying the following parameters as relevant. Connect to the -endpoint by sending a request to the URL or by making an HTTP POST request. - -+---------------------+--------------------------------------------------------------------------------------------------------------------------+ -| Parameter | Description | -+=====================+==========================================================================================================================+ -| openid.mode | (required) Interaction mode. Specifies | -| | whether Openstack Id IdP may interact with the user to determine the outcome of the request. | -| | Valid values are: | -| | | -| | * checkid_immediate (No interaction allowed) | -| | * checkid_setup (Interaction allowed) | -| | | -+---------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.ns | (required) Protocol version. Value identifying the OpenID protocol version being used. | -| | This value should be "http://specs.openid.net/auth/2.0". | -| | | -+---------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.return_to | (required) Return URL. Value indicating the URL where the user should be returned to after signing in. | -| | Openstack Id Idp only supports HTTPS address types | -| | | -+---------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.assoc_handle | (optional) Association handle. Set if an association was established between the relying party (web application) and the | -| | identity provider (Openstack). | -| | See OpenID specification Section 8. | -| | | -+---------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.claimed_id | (required) Claimed identifier. This value must be set to "http://specs.openid.net/auth/2.0/identifier_select". | -| | or to user claimed identity (user local identifier or user owned identity | -| | [ex: custom html hosted on a owned domain set to html discover]) | -| | | -+---------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.identity | (required) Alternate identifier. This value must be set to http://specs.openid.net/auth/2.0/identifier_select. | -| | | -+---------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.realm | (required) Authenticated realm. Identifies the domain that the end user is being asked to trust. | -| | (Example: ``http://*.myexamplesite.com``) This value must be consistent with the domain defined in openid.return_to. | -| | | -+---------------------+--------------------------------------------------------------------------------------------------------------------------+ - -Attribute exchange extension ----------------------------- - -+--------------------------+--------------------------------------------------------------------------------------------------------------------------+ -| Parameter | Description | -+==========================+==========================================================================================================================+ -| openid.ns.ax |(required) Indicates request for user attribute information. This value must be set to "http://openid.net/srv/ax/1.0". | -| | | -+--------------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.ax.mode | (required) This value must be set to "fetch_request". | -| | | -+--------------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.ax.required | (required) Specifies the attribute being requested. Valid values include: | -| | "country","email","firstname","language","lastname" | -| | To request multiple attributes, set this parameter to a comma-delimited list of attributes. | -| | | -+--------------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.ax.type.country | (optional) Requests the user's home country. This value must be set to "http://axschema.org/contact/country/home". | -| | | -+--------------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.ax.type.email | (optional) Requests the user's gmail address. This value must be set to "http://axschema.org/contact/email" | -| | | -+--------------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.ax.type.firstname | (optional) Requests the user's first name. This value must be set to "http://axschema.org/namePerson/first". | -| | | -+--------------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.ax.type.language | (optional) Requests the user's preferred language. This value must be set to "http://axschema.org/pref/language". | -| | | -+--------------------------+--------------------------------------------------------------------------------------------------------------------------+ -| openid.ax.type.lastname | (optional) Requests the user's last name. This value must be set to "http://axschema.org/namePerson/last". | -| | | -+--------------------------+--------------------------------------------------------------------------------------------------------------------------+ - - -Simple Registration Extension ------------------------------ - -+--------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| Parameter | Description | -+==========================+=================================================================================================================================+ -| openid.ns.sreg | (required) Indicates request for user attribute information. This value must be set to "http://openid.net/extensions/sreg/1.1". | -| | | -+--------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| openid.sreg.required | (required) Comma-separated list of field names which, if absent from the response, will prevent the Consumer from completing | -| | the registration without End User interation. The field names are those that are specified in the Response Format, | -| | with the "openid.sreg." prefix removed. | -| | Valid values include: | -| | "country", "email", "firstname", "language", "lastname" | -+--------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| openid.sreg.optional | (required) Comma-separated list of field names Fields that will be used by the Consumer, but whose absence will not prevent | -| | the registration from completing. The field names are those that are specified in the Response Format, with the "openid.sreg." | -| | prefix removed. | -| | Valid values include: | -| | "country", "email", "firstname", "language", "lastname" | -+--------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| openid.sreg.policy_url | (optional) A URL which the Consumer provides to give the End User a place to read about the how the profile data will be used. | -| | The Identity Provider SHOULD display this URL to the End User if it is given. | -| | | -+--------------------------+---------------------------------------------------------------------------------------------------------------------------------+ - - -OAuth 2.0 Extension -------------------- - -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| Parameter | Description | -+==============================+=================================================================================================================================+ -| openid.ns.oauth | (required) Indicates request for OAuth2. This value must be set to "http://specs.openid.net/extensions/oauth/2.0". | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| openid.oauth.client_id | (required) Identifies the client that is making the request. The value passed in this parameter must exactly match the value | -| | shown in the OpenstackId OAUTH2 Console. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| openid.oauth.scope | (required) Identifies the Openstack API access that your application is requesting. The values passed in this parameter | -| | inform the consent screen that is shown to the user. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| openid.oauth.state | (required) Provides any state that might be useful to your application upon receipt of the response. | -| | The OpenstackId Authorization Server roundtrips this parameter, so your application receives the same value it sent. | -| | Possible uses include redirecting the user to the correct resource in your site, nonces, and cross-site-request-forgery | -| | mitigations. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| openid.oauth.approval_prompt | (optional) Indicates whether the user should be re-prompted for consent. The default is auto, so a given user should only | -| | see the consent page for a given set of scopes the first time through the sequence. If the value is force, | -| | then the user sees a consent page even if they previously gave consent to your application for a given set of scopes. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ -| openid.oauth.access_type | (optional) Indicates whether your application needs to access a OpenstackId API when the user is not present at the browser. | -| | This parameter defaults to "online". If your application needs to refresh access tokens when the user is not present at | -| | the browser, then use "offline". This will result in your application obtaining a refresh token the first time your application | -| | exchanges an authorization code for a user. | -| | | -+------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ - - -OpenID 2.0 request authentication response ------------------------------------------- - -Once OpenStackID accepts the authentication request, the user is redirected to -a OpenStackID authentication page. At this point the authentication sequence -takes over. On successful authentication, OpenStackID redirects the user back -to the URL specified in the openid.return_to parameter of the original request. -Response data is appended as query parameters, including a -OpenStackID-supplied identifier, user information, if requested, and an -OAuth 2.0 request token, -if requested. OpenStackID may redirect through an HTTP 302 status code to -the return URL, resulting in a GET request, or may cause the browser to issue -a POST request to the return URL, passing the OpenID 2.0 parameters in the -POST body. A website or application should be prepared to accept responses as -both GETs and POSTs. -If the user doesn't approve the authentication request, OpenStackID sends a -negative assertion to the requesting website. diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index dc6f1ebb..00000000 --- a/gulpfile.js +++ /dev/null @@ -1,16 +0,0 @@ -var elixir = require('laravel-elixir'); - -/* - |-------------------------------------------------------------------------- - | Elixir Asset Management - |-------------------------------------------------------------------------- - | - | Elixir provides a clean, fluent API for defining some basic Gulp tasks - | for your Laravel application. By default, we are compiling the Sass - | file for our application, as well as publishing vendor resources. - | - */ - -elixir(function(mix) { - mix.sass('app.scss'); -}); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 9175c4e1..00000000 --- a/package-lock.json +++ /dev/null @@ -1,12026 +0,0 @@ -{ - "name": "OpenStackId", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@github/clipboard-copy-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.1.2.tgz", - "integrity": "sha512-L6CMrcA5we0udafvoSuRCE/Ci/3xrLWKYRGup2IlhxF771bQYsQ2EB1of182pI8ZWM4oxgwzu37+igMeoZjN/A==" - }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - } - }, - "JSONStream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz", - "integrity": "sha1-J7S4+7/qtOcbz1Uefye+jZUiOb8=", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" - }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" - } - }, - "accord": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/accord/-/accord-0.28.0.tgz", - "integrity": "sha1-vsUWovci59UPX59C+Bt387lUSLo=", - "requires": { - "convert-source-map": "^1.5.0", - "glob": "^7.0.5", - "indx": "^0.2.3", - "lodash.clone": "^4.3.2", - "lodash.defaults": "^4.0.1", - "lodash.flatten": "^4.2.0", - "lodash.merge": "^4.4.0", - "lodash.partialright": "^4.1.4", - "lodash.pick": "^4.2.1", - "lodash.uniq": "^4.3.0", - "resolve": "^1.5.0", - "semver": "^5.3.0", - "uglify-js": "^2.8.22", - "when": "^3.7.8" - } - }, - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "requires": { - "acorn": "^4.0.3" - } - }, - "acorn-node": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.3.0.tgz", - "integrity": "sha1-X4bXM0Z0OBDvEmm5AdvL3tAghhs=", - "requires": { - "acorn": "^5.4.1", - "xtend": "^4.0.1" - }, - "dependencies": { - "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha1-9HPdR+AnegjijpvsWu6wR1HwuMk=" - } - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "ajv": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.0.tgz", - "integrity": "sha1-TIr/34CIfY8TLJxSq4otxNC3skw=", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0", - "uri-js": "^4.2.1" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha1-Y3S03V1HGP884npnGjscrQdxMqk=", - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" - }, - "ansicolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", - "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=" - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha1-SzXClE8GKov82mZBB2A1D+nd/CE=", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha1-O7xCdd1YTMGxCAm4nU6LY6aednU=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "optional": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz", - "integrity": "sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=", - "requires": { - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "astw": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", - "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", - "requires": { - "acorn": "^4.0.3" - } - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "async-done": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz", - "integrity": "sha1-FLe3Nme4ZMjwK1slP8nG7dt3fz4=", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^1.0.7", - "stream-exhaust": "^1.0.1" - }, - "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - } - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" - }, - "async-each-series": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=" - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" - }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "autoprefixer-core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/autoprefixer-core/-/autoprefixer-core-5.2.1.tgz", - "integrity": "sha1-5kDEFK5Bmq4hwa1DyOoPPbgqVm0=", - "requires": { - "browserslist": "~0.4.0", - "caniuse-db": "^1.0.30000214", - "num2fraction": "^1.1.0", - "postcss": "~4.1.12" - } - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha1-1NDpudv8p3vwjusKikcVUP454ok=" - }, - "axios": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz", - "integrity": "sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=", - "requires": { - "follow-redirects": "^1.2.5", - "is-buffer": "^1.1.5" - } - }, - "babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "chokidar": "^1.6.1", - "commander": "^2.11.0", - "convert-source-map": "^1.5.0", - "fs-readdir-recursive": "^1.0.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "output-file-sync": "^1.1.2", - "path-is-absolute": "^1.0.1", - "slash": "^1.0.0", - "source-map": "^0.5.6", - "v8flags": "^2.1.1" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha1-suLwnjQtDwyI4vAuBneUEl51wgc=", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=", - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - } - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-loader": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.4.tgz", - "integrity": "sha1-40Y5OL1ObVXRwXTFSF1AahiO0BU=", - "dev": true, - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha1-WKeThjqefKhwvcWogRF/+sJ9tvM=", - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - } - } - }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha1-3qefpOvriDzTXasH4mDBycBN93o=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - }, - "dependencies": { - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha1-sABTYdZHHw9ZUnl6dvyYXx+Xj8Y=", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - } - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "requires": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=" - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - } - } - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" - }, - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" - }, - "batch": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", - "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "requires": { - "callsite": "1.0.0" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=" - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha1-oWCRFxcQPAdBDO9j71Gzl8Alr5w=", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=" - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.x.x" - } - }, - "bootstrap": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", - "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" - }, - "bootstrap-datepicker": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.8.0.tgz", - "integrity": "sha1-xjUTkx5vCfFq6fEbYvMtlQ3zlY4=", - "requires": { - "jquery": ">=1.7.1 <4.0.0" - } - }, - "bootstrap-sass": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.3.7.tgz", - "integrity": "sha1-ZZbHq0D2Y3OTMjqwvIDQZPxjBJg=" - }, - "bootstrap-tagsinput": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/bootstrap-tagsinput/-/bootstrap-tagsinput-0.7.1.tgz", - "integrity": "sha1-/+Owa74qEGlF7ygUVoAFqU8hGTc=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-pack": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-5.0.1.tgz", - "integrity": "sha1-QZdxmyDG4KqglFHFER5T77b7wY0=", - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.6.1", - "defined": "^1.0.0", - "through2": "^1.0.0", - "umd": "^3.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, - "browser-sync": { - "version": "2.24.4", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.24.4.tgz", - "integrity": "sha1-5uFUTIpsCI3Hb0n3BZvD35Z+CuA=", - "requires": { - "browser-sync-ui": "v1.0.1", - "bs-recipes": "1.3.4", - "chokidar": "1.7.0", - "connect": "3.5.0", - "connect-history-api-fallback": "^1.5.0", - "dev-ip": "^1.0.1", - "easy-extender": "2.3.2", - "eazy-logger": "3.0.2", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "1.15.2", - "immutable": "3.8.2", - "localtunnel": "1.9.0", - "micromatch": "2.3.11", - "opn": "4.0.2", - "portscanner": "2.1.1", - "qs": "6.2.3", - "raw-body": "^2.3.2", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "serve-index": "1.8.0", - "serve-static": "1.13.2", - "server-destroy": "1.0.1", - "socket.io": "2.0.4", - "ua-parser-js": "0.7.17", - "yargs": "6.4.0" - } - }, - "browser-sync-ui": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-1.0.1.tgz", - "integrity": "sha1-l0BSeybR16ziWazAx55bXjfQ/fI=", - "requires": { - "async-each-series": "0.1.1", - "connect-history-api-fallback": "^1.1.0", - "immutable": "^3.7.6", - "server-destroy": "1.0.1", - "socket.io-client": "2.0.4", - "stream-throttle": "^0.1.3" - } - }, - "browserify": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-11.2.0.tgz", - "integrity": "sha1-oRu53SCdeVcrgT9+7q+Cil9cDk4=", - "requires": { - "JSONStream": "^1.0.3", - "assert": "~1.3.0", - "browser-pack": "^5.0.0", - "browser-resolve": "^1.7.1", - "browserify-zlib": "~0.1.2", - "buffer": "^3.0.0", - "builtins": "~0.0.3", - "commondir": "0.0.1", - "concat-stream": "~1.4.1", - "console-browserify": "^1.1.0", - "constants-browserify": "~0.0.1", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^1.3.7", - "domain-browser": "~1.1.0", - "duplexer2": "~0.0.2", - "events": "~1.0.0", - "glob": "^4.0.5", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "~0.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^6.4.1", - "isarray": "0.0.1", - "labeled-stream-splicer": "^1.0.0", - "module-deps": "^3.7.11", - "os-browserify": "~0.1.1", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^1.1.1", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "~0.0.1", - "stream-browserify": "^2.0.0", - "stream-http": "^1.2.0", - "string_decoder": "~0.10.0", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^1.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "~0.0.0", - "url": "~0.10.1", - "util": "~0.10.1", - "vm-browserify": "~0.0.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "commondir": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", - "integrity": "sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=" - }, - "concat-stream": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.11.tgz", - "integrity": "sha1-Hcn2ZvJiHanGGLHn+POy/3C1928=", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.9", - "typedarray": "~0.0.5" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", - "integrity": "sha1-M0MSTbbXrVPiaogmMYcSvchFD5w=", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "requires": { - "pako": "~0.2.0" - } - }, - "browserslist": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-0.4.0.tgz", - "integrity": "sha1-O9SrkZncG5FQ1NbbpNnTqrvIbdQ=", - "requires": { - "caniuse-db": "^1.0.30000153" - } - }, - "bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=" - }, - "buffer": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "requires": { - "base64-js": "0.0.8", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha1-h/yqOimDWOCt5uRCz86EB0DRrQQ=" - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "builtin-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz", - "integrity": "sha1-MGN+4mKXisBxdOFtf4LwrQbgha0=" - }, - "builtins": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", - "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha1-ZFI2eZnv+dQYiu/ZoU6dfGomNGA=", - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cached-path-relative": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", - "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=" - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - } - } - }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "requires": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - } - } - }, - "caniuse-db": { - "version": "1.0.30000846", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000846.tgz", - "integrity": "sha1-2chvkUc4202gmO7e2ZdBPERWG9I=" - }, - "caniuse-lite": { - "version": "1.0.30000846", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000846.tgz", - "integrity": "sha1-IJKRHuytcaidrh+qYrzCAv3n+Vk=", - "dev": true - }, - "cardinal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", - "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=", - "requires": { - "ansicolors": "~0.2.1", - "redeyed": "~1.0.0" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "chosen-js": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/chosen-js/-/chosen-js-1.8.7.tgz", - "integrity": "sha512-eVdrZJ2U5ISdObkgsi0od5vIJdLwq1P1Xa/Vj/mgxkMZf14DlgobfB6nrlFi3kW4kkvKLsKk4NDqZj1MU1DCpw==" - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=", - "requires": { - "chalk": "^1.1.3" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "requires": { - "colors": "1.0.3" - }, - "dependencies": { - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" - } - } - }, - "cli-usage": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/cli-usage/-/cli-usage-0.1.7.tgz", - "integrity": "sha1-6vHJ1bkeIkgjMwcqEhJ/Bc2Zo7o=", - "requires": { - "marked": "^0.3.12", - "marked-terminal": "^2.0.0" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" - }, - "clone-deep": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha1-ANs6Hhc2VnMNEYjD1qztbX6pdxM=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.0", - "shallow-clone": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - } - } - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha1-1ZHe5Kj4vBXaQ86X3O66E9Q+KmU=", - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "requires": { - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "codemirror": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.60.0.tgz", - "integrity": "sha512-AEL7LhFOlxPlCL8IdTcJDblJm8yrAGib7I+DErJPdZd4l6imx8IMgKK3RblVgBQqz3TZJR4oknQ03bz+uNjBYA==" - }, - "codemirror-spell-checker": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/codemirror-spell-checker/-/codemirror-spell-checker-1.1.2.tgz", - "integrity": "sha1-HGYPkIlIPMtRE7m6nKGcP0mTNx4=", - "requires": { - "typo-js": "*" - } - }, - "coffeescript": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", - "integrity": "sha1-5X7kxIZ89/YGv8Sg8tVQwJgd3Sc=" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", - "requires": { - "color-name": "^1.1.1" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "requires": { - "color-name": "^1.0.0" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=" - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "requires": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "combine-source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", - "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.5.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.4.2" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8=" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha1-1OqT8FriV5CVG5nns7CeOQikCC4=", - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" - } - } - }, - "connect": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.5.0.tgz", - "integrity": "sha1-s1dSWgtMH1BZnNmD4dnv7qlncZg=", - "requires": { - "debug": "~2.2.0", - "finalhandler": "0.5.0", - "parseurl": "~1.3.1", - "utils-merge": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", - "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=" - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz", - "integrity": "sha1-/E9o9K3YN8xeE9ERsgcVeTIl0pw=", - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "minimatch": "^3.0.4", - "p-limit": "^1.0.0", - "serialize-javascript": "^1.4.0" - } - }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha1-+XJgj/DOrWi4QaFqky0LGDeRgU4=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.x.x" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-js": { - "version": "3.1.9-1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", - "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=" - }, - "css": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", - "integrity": "sha1-+GH0umHnm+3JYqpUjleA/ZXLxr4=", - "requires": { - "inherits": "^2.0.1", - "source-map": "^0.1.38", - "source-map-resolve": "^0.5.1", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-loader": { - "version": "0.28.11", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", - "integrity": "sha1-w/mGSnAL4nEbtaJGKyOJsaOS2rc=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": "^3.10.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.1.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - }, - "dependencies": { - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - } - } - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" - }, - "deap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.1.tgz", - "integrity": "sha1-Bkbp4aCV/+ip5ATWjR923PV+Zvs=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { - "ms": "2.0.0" - } - }, - "debug-fabulous": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.0.4.tgz", - "integrity": "sha1-+gccXYdIRoVCSAdCHKSxawsaB2M=", - "requires": { - "debug": "2.X", - "lazy-debug-legacy": "0.0.X", - "object-assign": "4.1.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=" - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "del": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/del/-/del-1.2.1.tgz", - "integrity": "sha1-rtblvNfLcyXfNPVjEl+iZbLBoBQ=", - "requires": { - "each-async": "^1.0.0", - "globby": "^2.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^3.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globby": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-2.1.0.tgz", - "integrity": "sha1-npGSvNM/Srak+JTl5+qLcTITxII=", - "requires": { - "array-union": "^1.0.1", - "async": "^1.2.1", - "glob": "^5.0.3", - "object-assign": "^3.0.0" - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "deps-sort": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", - "integrity": "sha1-Kd//U+F7Nq7K51MK27v2IsLtGnE=", - "requires": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-file": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", - "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", - "requires": { - "fs-exists-sync": "^0.1.0" - } - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" - }, - "detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha1-DspzFDOEQv67bWXaVMELscgrJG4=", - "requires": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha1-9HPdR+AnegjijpvsWu6wR1HwuMk=" - } - } - }, - "dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha1-CyBdK2rvmCOMooZZioIE0p0KADQ=", - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha1-WSkD9dgLONA3IgVBJk1poZj7NBA=", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-async": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", - "requires": { - "onetime": "^1.0.0", - "set-immediate-shim": "^1.0.0" - } - }, - "easy-extender": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.2.tgz", - "integrity": "sha1-PTJI/r4rFZYHMW2PnPSRwWZIIh0=", - "requires": { - "lodash": "^3.10.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - } - } - }, - "eazy-logger": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", - "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", - "requires": { - "tfunk": "^3.0.1" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.48", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", - "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=" - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", - "requires": { - "once": "^1.4.0" - } - }, - "ends-with": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ends-with/-/ends-with-0.2.0.tgz", - "integrity": "sha1-L52pjVelDP2kVxzkM5AAUA9Oa4o=" - }, - "engine.io": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", - "integrity": "sha1-Dn751pDrCzVZfx1K0Comyi26OEU=", - "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "uws": "~9.14.0", - "ws": "~3.3.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-client": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz", - "integrity": "sha1-W96xMPi5SlCsXL63JYPnpKBj3f0=", - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", - "integrity": "sha1-TA9M/3mq7su9z96maoI8YIVAkZY=", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.43", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.43.tgz", - "integrity": "sha1-xwXmRSUyECM6JwhpqkY6IzO3ymQ=", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-promise": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", - "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=" - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" - }, - "events": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", - "integrity": "sha1-dYSdz+k9EPsFfDAFWv29UdBqjiQ=" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "requires": { - "fill-range": "^2.1.0" - } - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "requires": { - "os-homedir": "^1.0.1" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - } - } - }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha1-XwQ+qgL5dQqSWLeMCm4NwUCPsvc=", - "dev": true, - "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha1-skWiPKcZMAROxT+kaqAKPofGphA=", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", - "dev": true - }, - "file-loader": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha1-b+iGRJsPKpNuQ8q6rAzb+zaVBvg=", - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.4.5" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=", - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "finalhandler": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", - "integrity": "sha1-6VCKvs6bbbqHGmlCodeRG5GRGsc=", - "requires": { - "debug": "~2.2.0", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "statuses": "~1.3.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "findup-sync": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", - "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", - "requires": { - "detect-file": "^0.1.0", - "is-glob": "^2.0.1", - "micromatch": "^2.3.7", - "resolve-dir": "^0.1.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" - }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha1-xdWG7zivYJdlC0m8QbVfq7GfNb0=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "follow-redirects": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz", - "integrity": "sha1-I09Jz3cLfzW0DnkPY2zroMOgq3c=", - "requires": { - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "fork-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", - "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=" - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" - }, - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha1-4y/AMKLM7kSmtTcTCNpUvgs5fSc=", - "dev": true - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "dependencies": { - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true - } - } - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko=", - "requires": { - "globule": "^1.0.0" - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=" - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha1-Xf+xsZHyLSB5epNptJ6rTpg5aW0=", - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "glogg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", - "integrity": "sha1-3PdY5EeJzD89MsHzVio2duajSBA=", - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "gulp-autoprefixer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-2.3.1.tgz", - "integrity": "sha1-9nXTsb128IjfLySretPkoFngfmc=", - "requires": { - "autoprefixer-core": "^5.0.0", - "gulp-util": "^3.0.0", - "object-assign": "^2.0.0", - "postcss": "^4.1.5", - "through2": "^0.6.2", - "vinyl-sourcemaps-apply": "^0.1.3" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "gulp-babel": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-6.1.3.tgz", - "integrity": "sha1-Wq2Kyw22t/Lwvhnu7pUo8gZN9jE=", - "requires": { - "babel-core": "^6.23.1", - "object-assign": "^4.0.1", - "plugin-error": "^1.0.1", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "requires": { - "source-map": "^0.5.1" - } - } - } - }, - "gulp-batch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/gulp-batch/-/gulp-batch-1.0.5.tgz", - "integrity": "sha1-xA/JsjA2dIl7EhbYLhUYtzIX2lk=", - "requires": { - "async-done": "^1.0.0", - "stream-array": "^1.0.1" - } - }, - "gulp-coffee": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/gulp-coffee/-/gulp-coffee-2.3.5.tgz", - "integrity": "sha1-jGTprIhOG6tOILZqx8OGqBaFkEE=", - "requires": { - "coffeescript": "^1.10.0", - "gulp-util": "^3.0.2", - "merge": "^1.2.0", - "through2": "^2.0.1", - "vinyl-sourcemaps-apply": "^0.2.1" - }, - "dependencies": { - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "requires": { - "source-map": "^0.5.1" - } - } - } - }, - "gulp-concat": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", - "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", - "requires": { - "concat-with-sourcemaps": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, - "vinyl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", - "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, - "gulp-cssnano": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/gulp-cssnano/-/gulp-cssnano-2.1.3.tgz", - "integrity": "sha1-AgB+KBevCbNohIK0MK19uAeuv3I=", - "requires": { - "buffer-from": "^1.0.0", - "cssnano": "^3.0.0", - "object-assign": "^4.0.1", - "plugin-error": "^1.0.1", - "vinyl-sourcemaps-apply": "^0.2.1" - }, - "dependencies": { - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "requires": { - "source-map": "^0.5.1" - } - } - } - }, - "gulp-if": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-1.2.5.tgz", - "integrity": "sha1-m9nBYDLswo4BVL+wWCjSMxZvLak=", - "requires": { - "gulp-match": "~0.2.1", - "ternary-stream": "^1.2.0", - "through2": "~0.6.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "gulp-less": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-3.5.0.tgz", - "integrity": "sha1-gBT0ad38ZUTX3aUAmN7wNxu7T3g=", - "requires": { - "accord": "^0.28.0", - "less": "2.6.x || ^2.7.1", - "object-assign": "^4.0.1", - "plugin-error": "^0.1.2", - "replace-ext": "^1.0.0", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "requires": { - "source-map": "^0.5.1" - } - } - } - }, - "gulp-load-plugins": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/gulp-load-plugins/-/gulp-load-plugins-1.5.0.tgz", - "integrity": "sha1-TEGffldk2aDjMGG6uWGPgbc9QXE=", - "requires": { - "array-unique": "^0.2.1", - "fancy-log": "^1.2.0", - "findup-sync": "^0.4.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "micromatch": "^2.3.8", - "resolve": "^1.1.7" - } - }, - "gulp-match": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-0.2.1.tgz", - "integrity": "sha1-C+0I2ovW6JaG+J/7AEM3+LrQbSI=", - "requires": { - "minimatch": "^1.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "minimatch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", - "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "gulp-notify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-notify/-/gulp-notify-2.2.0.tgz", - "integrity": "sha1-BGyChcKS6X7tThWgCcJsu+XO8TU=", - "requires": { - "gulp-util": "^3.0.2", - "lodash.template": "^3.0.0", - "node-notifier": "^4.1.0", - "node.extend": "^1.1.3", - "through2": "^0.6.3" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "gulp-rename": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.3.tgz", - "integrity": "sha1-N7dSmOnT5sD+msTqwTzjvlQ0ZGs=" - }, - "gulp-rev": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gulp-rev/-/gulp-rev-5.1.0.tgz", - "integrity": "sha1-osN82uMhp7e7riDXU7YNDl6HzUg=", - "requires": { - "gulp-util": "^3.0.0", - "object-assign": "^2.0.0", - "rev-hash": "^1.0.0", - "rev-path": "^1.0.0", - "sort-keys": "^1.0.0", - "through2": "^0.6.1", - "vinyl-file": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "gulp-rev-replace": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/gulp-rev-replace/-/gulp-rev-replace-0.4.4.tgz", - "integrity": "sha1-lpaFQTECS68mQBCx9R/4oTgquUo=", - "requires": { - "plugin-error": "^0.1.2", - "through2": "^2.0.0" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - } - } - } - }, - "gulp-sass": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-2.3.2.tgz", - "integrity": "sha1-grerkP6QLNw0wE8YDZLyw0kC3VI=", - "requires": { - "gulp-util": "^3.0", - "lodash.clonedeep": "^4.3.2", - "node-sass": "^3.4.2", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "requires": { - "source-map": "^0.5.1" - } - } - } - }, - "gulp-shell": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.5.2.tgz", - "integrity": "sha1-pJWcoGUa0ce7/nCy0K27tOGuqY0=", - "requires": { - "async": "^1.5.0", - "gulp-util": "^3.0.7", - "lodash": "^4.0.0", - "through2": "^2.0.0" - } - }, - "gulp-sourcemaps": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz", - "integrity": "sha1-tDfR89mAzyboEYSCNxjOFa5ll7Y=", - "requires": { - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "4.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "0.0.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom": "2.X", - "through2": "2.X", - "vinyl": "1.X" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-uglify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.4.tgz", - "integrity": "sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk=", - "requires": { - "deap": "^1.0.0", - "fancy-log": "^1.0.0", - "gulp-util": "^3.0.0", - "isobject": "^2.0.0", - "through2": "^2.0.0", - "uglify-js": "2.6.4", - "uglify-save-license": "^0.4.1", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "uglify-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", - "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "requires": { - "source-map": "^0.5.1" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - } - } - }, - "gulp-watch": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-4.3.11.tgz", - "integrity": "sha1-Fi/FY96fx3DpH5p845VVE6mhGMA=", - "requires": { - "anymatch": "^1.3.0", - "chokidar": "^1.6.1", - "glob-parent": "^3.0.1", - "gulp-util": "^3.0.7", - "object-assign": "^4.1.0", - "path-is-absolute": "^1.0.1", - "readable-stream": "^2.2.2", - "slash": "^1.0.0", - "vinyl": "^1.2.0", - "vinyl-file": "^2.0.0" - }, - "dependencies": { - "first-chunk-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", - "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", - "requires": { - "readable-stream": "^2.0.2" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "strip-bom-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", - "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", - "requires": { - "first-chunk-stream": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", - "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.3.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^2.0.0", - "vinyl": "^1.1.0" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "requires": { - "glogg": "^1.0.0" - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } - } - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "requires": { - "function-bind": "^1.0.2" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha1-d3asYn8+p3JQz8My2rfd9eT10R0=", - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "requires": { - "sparkles": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha1-IyNbKasjDFdqqw1PE/wEawsDgiI=" - }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "dependencies": { - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - } - } - }, - "http-proxy": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", - "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", - "requires": { - "eventemitter3": "1.x.x", - "requires-port": "1.x.x" - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha1-4jt4MUkFw7kMvWFwISHnp4hI8qM=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ieee754": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", - "integrity": "sha1-wWOE/+APW3g1gk5ntvK9RKUilFU=" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha1-P46cNdOHCKOn4Omrtsc+fudweys=" - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "optional": true - }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "^2.0.0" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "indx": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", - "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=" - }, - "inline-source-map": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", - "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", - "requires": { - "source-map": "~0.4.0" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "insert-css": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-0.2.0.tgz", - "integrity": "sha1-0VeJlxZi2YmcKJd/tiINU4HSRRo=" - }, - "insert-module-globals": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", - "integrity": "sha1-IGOOKaMPntHKLjqCX7wsulJG3fw=", - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.6.1", - "concat-stream": "~1.4.1", - "is-buffer": "^1.1.0", - "lexical-scope": "^1.2.0", - "process": "~0.11.0", - "through2": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "concat-stream": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.11.tgz", - "integrity": "sha1-Hcn2ZvJiHanGGLHn+POy/3C1928=", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.9", - "typedarray": "~0.0.5" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha1-LhKWILUIkQQuROm7uzBZPnXPu+M=", - "requires": { - "lodash.isfinite": "^3.3.2" - } - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", - "dev": true - } - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=", - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jquery": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.1.4.tgz", - "integrity": "sha1-IoveaYoMYUMdwmMKahVPFYkNIxc=" - }, - "jquery-migrate": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jquery-migrate/-/jquery-migrate-1.2.1.tgz", - "integrity": "sha1-4QVq2XD7ItUAni1Nd89wm3jwR2g=" - }, - "jquery-ui-themes": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/jquery-ui-themes/-/jquery-ui-themes-1.12.0.tgz", - "integrity": "sha1-pXugrZaADYRSL+dok//L3mcIHVE=" - }, - "jquery-validation": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.17.0.tgz", - "integrity": "sha1-q2a2tYPXdAubvRSJk+UOisBB81s=", - "requires": { - "jquery": "^1.7 || ^2.0 || ^3.1" - } - }, - "jquery.cookie": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jquery.cookie/-/jquery.cookie-1.4.1.tgz", - "integrity": "sha1-1j3OIJ6raR/mMxbbCMqeR+D5OFs=" - }, - "jqueryui": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/jqueryui/-/jqueryui-1.11.1.tgz", - "integrity": "sha1-hxhVBwX1Vo0RmRlhaQlNtzsikbw=" - }, - "js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "labeled-stream-splicer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", - "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", - "requires": { - "inherits": "^2.0.1", - "isarray": "~0.0.1", - "stream-splicer": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } - }, - "laravel-elixir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/laravel-elixir/-/laravel-elixir-5.0.0.tgz", - "integrity": "sha1-dC8NhnbvDbPYU/BiDJlqX2Mw4mU=", - "requires": { - "babel-preset-es2015": "^6.1.0", - "babel-preset-react": "^6.1.18", - "babelify": "^7.2.0", - "browser-sync": "^2.7.10", - "browserify": "^11.2.0", - "del": "^1.2.0", - "glob": "^5.0.14", - "gulp-autoprefixer": "^2.3.1", - "gulp-babel": "^6.1.0", - "gulp-batch": "^1.0.5", - "gulp-coffee": "^2.3.1", - "gulp-concat": "^2.6.0", - "gulp-cssnano": "^2.0.0", - "gulp-if": "^1.2.5", - "gulp-less": "^3.0.3", - "gulp-load-plugins": "^1.0.0-rc.1", - "gulp-notify": "^2.2.0", - "gulp-rename": "^1.2.2", - "gulp-rev": "^5.1.0", - "gulp-rev-replace": "^0.4.2", - "gulp-sass": "^2.0.3", - "gulp-shell": "^0.5.0", - "gulp-sourcemaps": "^1.5.2", - "gulp-uglify": "^1.5.1", - "gulp-util": "^3.0.6", - "gulp-watch": "^4.2.4", - "insert-css": "^0.2.0", - "merge-stream": "^0.1.8", - "parse-filepath": "^0.5.0", - "partialify": "^3.1.3", - "path": "^0.11.14", - "require-dir": "^0.3.0", - "run-sequence": "^1.1.1", - "underscore": "^1.8.3", - "underscore-deep-extend": "0.0.5", - "vinyl-buffer": "^1.0.0", - "vinyl-paths": "^1.0.0", - "vinyl-source-stream": "^1.1.0", - "watchify": "^3.2.3" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lazy-debug-legacy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz", - "integrity": "sha1-U3cWwHduTPeePtG2IfdljCkRsbE=" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "less": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "integrity": "sha1-zBJg9RyQCp7A2R+2mYE54CUHtjs=", - "requires": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.2.11", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "2.81.0", - "source-map": "^0.5.3" - } - }, - "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha1-LBNSxbCaT4QQFJAnT9UWdN5BNj4=", - "dev": true, - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^3.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - } - } - }, - "lexical-scope": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", - "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", - "requires": { - "astw": "^2.0.0" - } - }, - "limiter": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.3.tgz", - "integrity": "sha1-MuLrVbIyQHaUPl0EwRhf+zh5aO8=" - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - }, - "localtunnel": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.0.tgz", - "integrity": "sha1-j/7Nz4yKFPYt8QVs+dVKy7C7mo8=", - "requires": { - "axios": "0.17.1", - "debug": "2.6.8", - "openurl": "1.1.1", - "yargs": "6.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" - } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha1-G3eTz3JZ6jj7NmHU04syYK+K5Oc=" - }, - "lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=" - }, - "lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=" - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._baseclone": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", - "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", - "requires": { - "lodash._arraycopy": "^3.0.0", - "lodash._arrayeach": "^3.0.0", - "lodash._baseassign": "^3.0.0", - "lodash._basefor": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" - }, - "lodash._basefor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=" - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" - }, - "lodash.clonedeep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", - "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", - "requires": { - "lodash._baseclone": "^3.0.0", - "lodash._bindcallback": "^3.0.0" - } - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, - "lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=" - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" - }, - "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha1-rcJdnLmbk5HFliTzefu6YNcRHVQ=" - }, - "lodash.partialright": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", - "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=" - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" - }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "^3.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha1-oRdc80lt/IQ2wVbDNLSVWZK85pw=", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", - "requires": { - "pify": "^3.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "marked": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha1-XUf3CcTJ/Dwha21GEnKA9As515A=" - }, - "marked-terminal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-2.0.0.tgz", - "integrity": "sha1-Xq9Wi+ZvaGVBr6UqVYKAMQox3i0=", - "requires": { - "cardinal": "^1.0.0", - "chalk": "^1.1.3", - "cli-table": "^0.3.1", - "lodash.assign": "^4.2.0", - "node-emoji": "^1.4.1" - } - }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" - }, - "merge-stream": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-0.1.8.tgz", - "integrity": "sha1-SKB7O0oSHXSj7b/c20sIrb8CQLE=", - "requires": { - "through2": "^0.6.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=" - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s=" - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=", - "requires": { - "mime-db": "~1.33.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8=", - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "dev": true, - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "modify-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", - "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=" - }, - "module-deps": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", - "integrity": "sha1-6nXK+RmQkNJbDVUStaysuW5/h/M=", - "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "concat-stream": "~1.4.5", - "defined": "^1.0.0", - "detective": "^4.0.0", - "duplexer2": "0.0.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^1.1.13", - "resolve": "^1.1.3", - "stream-combiner2": "~1.0.0", - "subarg": "^1.0.0", - "through2": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "concat-stream": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.11.tgz", - "integrity": "sha1-Hcn2ZvJiHanGGLHn+POy/3C1928=", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.9", - "typedarray": "~0.0.5" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "requires": { - "duplexer2": "0.0.2" - } - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha1-ltDNYQ69WNS03pzAxoKM2pnHVI8=" - }, - "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - } - } - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "neo-async": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", - "integrity": "sha1-rLkJ4yex6H7J7xX0G4omlRKtQe4=", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "node-emoji": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", - "integrity": "sha1-buxr+wdCHiFIx1xrunJCH4UwqCY=", - "requires": { - "lodash.toarray": "^4.4.0" - } - }, - "node-gyp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", - "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "2", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - } - } - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=", - "dev": true - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "stream-http": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", - "integrity": "sha1-QSboxrEHAERlkYqi/DVUnndALIc=", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha1-HSjj0qrfHVpZlsTp+VYBzQU0gK4=", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - } - } - }, - "node-notifier": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-4.6.1.tgz", - "integrity": "sha1-BW0UJE89zBzq3+aK+c/wxUc6M/M=", - "requires": { - "cli-usage": "^0.1.1", - "growly": "^1.2.0", - "lodash.clonedeep": "^3.0.0", - "minimist": "^1.1.1", - "semver": "^5.1.0", - "shellwords": "^0.1.0", - "which": "^1.0.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "node-sass": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.13.1.tgz", - "integrity": "sha1-ckD7v/I5YwS0IjUn7TAgWJwAT8I=", - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash.assign": "^4.2.0", - "lodash.clonedeep": "^4.3.2", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.3.2", - "node-gyp": "^3.3.1", - "npmlog": "^4.0.0", - "request": "^2.61.0", - "sass-graph": "^2.1.1" - }, - "dependencies": { - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - } - } - }, - "node.extend": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", - "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", - "requires": { - "is": "^3.1.0" - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" - }, - "object-path": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", - "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" - }, - "openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=" - }, - "opn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "os-browserify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", - "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "outpipe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", - "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", - "requires": { - "shell-quote": "^1.4.2" - }, - "dependencies": { - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - } - } - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "requires": { - "path-platform": "~0.11.15" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha1-9r8pOBgzK9DatU77Fgh3JHRebKg=", - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-filepath": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-0.5.0.tgz", - "integrity": "sha1-t8+biigkvXf3D7ks0X2KJAS/TWo=", - "requires": { - "path-ends-with": "^0.2.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "partialify": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/partialify/-/partialify-3.1.6.tgz", - "integrity": "sha1-f0QPHe6SqFVT9YTgK9koBXA0fRg=", - "requires": { - "string-to-js": "0.0.1", - "through": "^2.3.4" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/path/-/path-0.11.14.tgz", - "integrity": "sha1-y8dWk1XLPIOv60rOQ+z/lSMeWn0=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-ends-with": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/path-ends-with/-/path-ends-with-0.2.3.tgz", - "integrity": "sha1-KkpLYUpb7jna+g9dpI6GLG1Iw94=", - "requires": { - "ends-with": "^0.2.0", - "normalize-path": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", - "requires": { - "pify": "^3.0.0" - } - }, - "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha1-dAQgjsawG2LYW/g4U6gGT42cKlw=", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha1-dwFr2JGdCsN3/c3QMiMolTyleBw=", - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - } - } - }, - "popper.js": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.3.tgz", - "integrity": "sha1-FDj5jQRqz3tNeM1QK/QYrGTU8JU=" - }, - "portscanner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", - "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", - "requires": { - "async": "1.5.2", - "is-number-like": "^1.0.3" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-4.1.16.tgz", - "integrity": "sha1-TESbTIr53zyvbTf44eV10DYXWNw=", - "requires": { - "es6-promise": "~2.3.0", - "js-base64": "~2.1.8", - "source-map": "~0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "requires": { - "postcss": "^5.0.14" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "requires": { - "postcss": "^5.0.14" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "requires": { - "postcss": "^5.0.16" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha1-giRf34IzcEFkXkdxFNjlk6oYuOw=", - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", - "dev": true, - "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0", - "postcss-load-options": "^1.2.0", - "postcss-load-plugins": "^2.3.0" - } - }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", - "dev": true, - "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0" - } - }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", - "dev": true, - "requires": { - "cosmiconfig": "^2.1.1", - "object-assign": "^4.1.0" - } - }, - "postcss-loader": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.5.tgz", - "integrity": "sha1-PGM27mQcj5UTgXJTOuRhqDWV54g=", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^6.0.0", - "postcss-load-config": "^1.2.0", - "schema-utils": "^0.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha1-4jt4MUkFw7kMvWFwISHnp4hI8qM=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", - "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha1-4jt4MUkFw7kMvWFwISHnp4hI8qM=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha1-4jt4MUkFw7kMvWFwISHnp4hI8qM=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha1-4jt4MUkFw7kMvWFwISHnp4hI8qM=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha1-4jt4MUkFw7kMvWFwISHnp4hI8qM=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "requires": { - "postcss": "^5.0.5" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" - }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "public-encrypt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", - "integrity": "sha1-RuuRByBr9zSJ+LhbadkTNMZhCZQ=", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=" - }, - "pure": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/pure/-/pure-2.85.0.tgz", - "integrity": "sha1-vKv7vV7OHqrTwQJASJ/fdTvBb1A=" - }, - "pwstrength-bootstrap": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/pwstrength-bootstrap/-/pwstrength-bootstrap-2.2.1.tgz", - "integrity": "sha1-Z+cq6HwuO7lmOWLV2tGNozJ1yJo=", - "requires": { - "bootstrap": ">=2.0.0", - "jquery": ">=3.0.0" - }, - "dependencies": { - "jquery": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", - "integrity": "sha1-lYzinoHJeQ8xvneS311NlfxX+8o=" - } - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha1-01SQAw6091eN4pLObfsEqRoSiSM=", - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=" - } - } - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha1-0wLFIpSFiISKjTAMkytEwkIx2oA=", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha1-GzJOzmtXBuFThVvBFIxlu39uoMM=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } - }, - "read-only-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-1.1.1.tgz", - "integrity": "sha1-Xad8eZ7ROI0++IoYRxu1kk+KC6E=", - "requires": { - "readable-stream": "^1.0.31", - "readable-wrap": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readable-wrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", - "integrity": "sha1-O1ohHGMeEjA6VJkcgGwX564ga/8=", - "requires": { - "readable-stream": "^1.1.13-1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "redeyed": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", - "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", - "requires": { - "esprima": "~3.0.0" - }, - "dependencies": { - "esprima": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", - "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=" - } - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "requires": { - "balanced-match": "^0.4.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=", - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - }, - "dependencies": { - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" - } - } - }, - "require-dir": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/require-dir/-/require-dir-0.3.2.tgz", - "integrity": "sha1-wdXHXp+//eny5rM+OD209ZS1pqk=" - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha1-qt1lY3T9KYruiVvAJrgpdBhnf9M=", - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "resp-modifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", - "requires": { - "debug": "^2.2.0", - "minimatch": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", - "dev": true - }, - "rev-hash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rev-hash/-/rev-hash-1.0.0.tgz", - "integrity": "sha1-lpk5Weqb+xxZsTrfAqwuNLs3NgM=" - }, - "rev-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rev-path/-/rev-path-1.0.0.tgz", - "integrity": "sha1-1My0NqwzcMRgcXXOiOr8XGXF1lM=", - "requires": { - "modify-filename": "^1.0.0" - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", - "requires": { - "glob": "^7.0.5" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "requires": { - "aproba": "^1.1.1" - } - }, - "run-sequence": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.2.2.tgz", - "integrity": "sha1-UJWgvr6YczsBQL0I3YDsAw3azes=", - "requires": { - "chalk": "*", - "gulp-util": "*" - } - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - }, - "dependencies": { - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "sass-loader": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", - "integrity": "sha1-3S/bPn7v9KU/NbpqxAhxVIg1PQA=", - "dev": true, - "requires": { - "clone-deep": "^2.0.1", - "loader-utils": "^1.0.1", - "lodash.tail": "^4.1.1", - "neo-async": "^2.5.0", - "pify": "^3.0.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" - }, - "schema-utils": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", - "integrity": "sha1-IYNvBgiqwXt4+ePiTa/xSlyhOj4=", - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=" - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=" - } - } - }, - "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha1-GqM2FiyIqJDdrVOEuuvJOmVRYf4=" - }, - "serve-index": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.8.0.tgz", - "integrity": "sha1-fF2WwT+xMRAfk8HFd0+FFqHnjTs=", - "requires": { - "accepts": "~1.3.3", - "batch": "0.5.3", - "debug": "~2.2.0", - "escape-html": "~1.0.3", - "http-errors": "~1.5.0", - "mime-types": "~2.1.11", - "parseurl": "~1.3.1" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - } - }, - "http-errors": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", - "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=", - "requires": { - "inherits": "2.0.3", - "setprototypeof": "1.0.2", - "statuses": ">= 1.3.1 < 2" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - }, - "setprototypeof": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", - "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=" - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha1-RIDNBuiC72iyrYij6lSDLixItXE=", - "dev": true, - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^5.0.0", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - }, - "shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "requires": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shell-quote": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", - "integrity": "sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY=" - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha1-1rkYHBpI05cyTISHHvvPxz/AZUs=" - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simplemde": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/simplemde/-/simplemde-1.11.2.tgz", - "integrity": "sha1-ojo12XjSxA7wfewAjJLwcNjggOM=", - "requires": { - "codemirror": "*", - "codemirror-spell-checker": "*", - "marked": "*" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.x.x" - } - }, - "socket.io": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", - "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", - "requires": { - "debug": "~2.6.6", - "engine.io": "~3.1.0", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.0.4", - "socket.io-parser": "~3.1.1" - } - }, - "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" - }, - "socket.io-client": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", - "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~2.6.4", - "engine.io-client": "~3.1.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.1.1", - "to-array": "0.1.4" - } - }, - "socket.io-parser": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz", - "integrity": "sha1-7S2l7nnxCVUDbj2kE7/X8eTYbI4=", - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "has-binary2": "~1.0.2", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", - "requires": { - "source-map": "^0.5.6" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=" - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha1-LHrmEFbHFKW5ubKyr30xHvXHj+k=" - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha1-ujhyycbTOgcEp9cf8EXl7EiZnQY=", - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - }, - "stream-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/stream-array/-/stream-array-1.1.2.tgz", - "integrity": "sha1-nl9zRfITfDDuO0mLkRToC1K7frU=", - "requires": { - "readable-stream": "~2.1.0" - }, - "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", - "integrity": "sha1-unKmtQy/q/qVD8i8h2BL0B62BnE=", - "requires": { - "duplexer2": "~0.0.2", - "through2": "~0.5.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~3.0.0" - } - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" - } - } - }, - "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha1-joxGP5HaiZF3h2WHP+TZYNj2Fr0=", - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha1-rNrI2lnvK8HheiwMz2wyDRIOVV0=" - }, - "stream-http": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-1.7.1.tgz", - "integrity": "sha1-09Km4Uw2o4udr7GZrue7xXBRmXg=", - "requires": { - "builtin-status-codes": "^1.0.0", - "foreach": "^2.0.5", - "indexof": "0.0.1", - "inherits": "^2.0.1", - "object-keys": "^1.0.4", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" - }, - "stream-splicer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", - "integrity": "sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=", - "requires": { - "indexof": "0.0.1", - "inherits": "^2.0.1", - "isarray": "~0.0.1", - "readable-stream": "^1.1.13-1", - "readable-wrap": "^1.0.0", - "through2": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "stream-throttle": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", - "requires": { - "commander": "^2.2.0", - "limiter": "^1.0.5" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-to-js": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/string-to-js/-/string-to-js-0.0.1.tgz", - "integrity": "sha1-vxU8dgY2+qMHabgEoBlVUrp62A8=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha1-eIAiWw1K0Q4wkn0Weh1vL9OzOnI=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "^4.0.1" - } - }, - "style-loader": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", - "integrity": "sha1-WR/8gLzv4mi3fF2evAUF13Jhn4U=", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } - } - } - }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "requires": { - "minimist": "^1.1.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - } - }, - "sweetalert2": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-7.3.5.tgz", - "integrity": "sha1-/JAEBGYKoQfczQykycjpGBh+xao=" - }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha1-LZ1P9cBkrLcRWUo+O5UFStUdkHw=", - "requires": { - "acorn-node": "^1.2.0" - } - }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "ternary-stream": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-1.2.3.tgz", - "integrity": "sha1-8Zafg4R/lkImG8FC4X7iAKrag/0=", - "requires": { - "duplexer2": "~0.0.2", - "fork-stream": "~0.0.4", - "merge-stream": "~0.1.6", - "through2": "~0.6.3" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "tfunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", - "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", - "requires": { - "chalk": "^1.1.1", - "object-path": "^0.9.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "requires": { - "process": "~0.11.0" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", - "requires": { - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha1-PwUlHuF5BN/QZ3VGZw25ZRaCuBE=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "typeahead.js": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/typeahead.js/-/typeahead.js-0.11.1.tgz", - "integrity": "sha1-TmTmcbIjEKhgb0rsgFkkuoSwFbg=", - "requires": { - "jquery": ">=1.7" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typo-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.2.0.tgz", - "integrity": "sha512-dELuLBVa2jvWdU/CHTKi2L/POYaRupv942k+vRsFXsM17acXesQGAiGCio82RW7fvcr7bkuD/Zj8XpUh6aPC2A==" - }, - "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha1-6exflJi57JEOeuOsYmqAXE0J7Kw=" - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-save-license": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", - "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=" - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha1-n+FTahCmZKZSZqHjzPhf02MCvJw=" - }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha1-qp/mU8QrkJdnhInAEACstp8LJs8=" - }, - "underscore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.0.tgz", - "integrity": "sha1-MduzFM/MiPFpzTaS2RSdgaAKc+Q=" - }, - "underscore-deep-extend": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/underscore-deep-extend/-/underscore-deep-extend-0.0.5.tgz", - "integrity": "sha1-Eh7qUG+GzMDBsk3GuuHJf5t2cWI=" - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha1-NSVll+RqWB20eT0M5H+prr/J+r0=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", - "requires": { - "punycode": "^2.1.0" - } - }, - "urijs": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", - "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==" - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "url-loader": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", - "integrity": "sha1-oAenEJYg6dmI0UvOZ3od7Lmpk/c=", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "mime": "^1.4.1", - "schema-utils": "^0.3.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } - } - } - }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha1-FHFr8D/f79AwQK71jYtLhfOnxUQ=", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - } - } - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha1-EsUou51Y0LkmXZovbw/ovhf/HxQ=" - }, - "uws": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz", - "integrity": "sha1-+sg4a+/DOno3BcvVjcR7Qwyk3ZU=", - "optional": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "^1.1.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha1-gWQ7y+8b3+zUYjeT3EZIlIupgzg=", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vendors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", - "integrity": "sha1-f8te759WI7FWvOqJ7DfWNnbyGAE=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz", - "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=", - "requires": { - "bl": "^1.2.1", - "through2": "^2.0.3" - } - }, - "vinyl-file": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-1.3.0.tgz", - "integrity": "sha1-qgVjTTqGe6kUR77bs0r8sm9E9uc=", - "requires": { - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "vinyl": "^1.1.0" - }, - "dependencies": { - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "vinyl-paths": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vinyl-paths/-/vinyl-paths-1.0.0.tgz", - "integrity": "sha1-/Ccq2pFbTD6CZM+wbeddPOB8ip4=", - "requires": { - "through2": "^0.6.3" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "vinyl-source-stream": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", - "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", - "requires": { - "through2": "^2.0.3", - "vinyl": "^0.4.3" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.1.4.tgz", - "integrity": "sha1-xfy9Q+LyOEI8LcmL3db3m3K8NFs=", - "requires": { - "source-map": "^0.1.39" - }, - "dependencies": { - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } - }, - "watchify": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.0.tgz", - "integrity": "sha1-A/E1XGQ5VeerjcvzmfYkZEIhMw8=", - "requires": { - "anymatch": "^1.3.0", - "browserify": "^16.1.0", - "chokidar": "^1.0.0", - "defined": "^1.0.0", - "outpipe": "^1.1.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=" - }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha1-w0uhDQuc4WK1ryJ8cTHJLC7NV3Q=", - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - } - }, - "browserify": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.2.tgz", - "integrity": "sha1-Sx9mug5U+jnbxapL6WKRQhQ9kbA=", - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", - "integrity": "sha1-yRPkNnjHy3yL0Wr7zdtsVQXo+f4=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" - }, - "deps-sort": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", - "requires": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - } - }, - "detective": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", - "integrity": "sha1-eiDYkjbXszHM6mWDLnEjtVUbt8s=", - "requires": { - "acorn-node": "^1.3.0", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=" - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "requires": { - "readable-stream": "^2.0.2" - } - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha1-KpoeGOYQbg6BKqnr1KgZs8KcC6U=" - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "requires": { - "source-map": "~0.5.3" - } - }, - "insert-module-globals": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.1.0.tgz", - "integrity": "sha1-27POpx06Q9WgfvAxD+XweKpNvzU=", - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "lexical-scope": "^1.2.0", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "isarray": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", - "integrity": "sha1-OOe8uw87obeTPIa6GJTd/DeBu7c=" - }, - "labeled-stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", - "integrity": "sha1-nP+jL9meFhL9HYao25YkFtUpKSY=", - "requires": { - "inherits": "^2.0.1", - "isarray": "^2.0.4", - "stream-splicer": "^2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "module-deps": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.1.0.tgz", - "integrity": "sha1-0eHvxIHGiGJp9xEsUsMjYYjhZHk=", - "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.0", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.0.2", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "requires": { - "readable-stream": "^2.0.2" - } - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "stream-http": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", - "integrity": "sha1-QSboxrEHAERlkYqi/DVUnndALIc=", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", - "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "vm-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.0.1.tgz", - "integrity": "sha1-oV13YsTEj6a/nzMJohNA8A7SMGM=" - } - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha1-3L1PbLsqVbR5m6ioQKxSfl9LEXY=", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.1.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "webpack": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", - "integrity": "sha1-P540NgNwYC/PY56Xk520hvTsDXQ=", - "dev": true, - "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" - }, - "dependencies": { - "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha1-9HPdR+AnegjijpvsWu6wR1HwuMk=", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha1-skWiPKcZMAROxT+kaqAKPofGphA=", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha1-oQHrrlnWUHNU1x2AE5UKOot6WlQ=", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=" - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha1-8c+E/i1ekB686U767OeF8YeiKPI=", - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yargs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", - "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.1.0" - }, - "dependencies": { - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - } - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "requires": { - "camelcase": "^3.0.0" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 11e405a3..00000000 --- a/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "OpenStackId", - "version": "1.0.0", - "description": "OpenStackId, IDP", - "main": "resources/assets/js/index.js", - "author": "smarcet@gmail.com", - "scripts": { - "build-dev": "./node_modules/.bin/webpack --config webpack.config.js", - "build": "NODE_ENV=production ./node_modules/.bin/webpack --config webpack.config.js" - }, - "devDependencies": { - "webpack": "^3.11.0", - "babel-cli": "^6.26.0", - "babel-core": "^6.26.0", - "babel-loader": "^7.1.4", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-env": "^1.6.1", - "babel-preset-flow": "^6.23.0", - "css-loader": "^0.28.10", - "extract-text-webpack-plugin": "^3.0.2", - "file-loader": "^1.1.11", - "json-loader": "^0.5.7", - "less": "^2.7.3", - "less-loader": "^4.1.0", - "postcss-loader": "^2.1.3", - "sass-loader": "^6.0.7", - "style-loader": "^0.19.1", - "url-loader": "^0.6.2" - }, - "dependencies": { - "@github/clipboard-copy-element": "^1.1.2", - "bootstrap": "^3.3.7", - "bootstrap-datepicker": "^1.8.0", - "bootstrap-sass": "^3.0.0", - "bootstrap-tagsinput": "^0.7.1", - "chosen-js": "^1.8.7", - "copy-webpack-plugin": "^4.5.1", - "crypto-js": "^3.1.9-1", - "file-loader": "^1.1.11", - "font-awesome": "^4.7.0", - "jquery": "~2.1.4", - "jquery-migrate": "1.2.1", - "jquery-ui-themes": "^1.12.0", - "jquery-validation": "^1.17.0", - "jquery.cookie": "^1.4.1", - "jqueryui": "^1.11.1", - "laravel-elixir": "^5.0.0", - "moment": "^2.24.0", - "popper.js": "^1.14.3", - "pure": "^2.85.0", - "pwstrength-bootstrap": "^2.2.1", - "simplemde": "^1.11.2", - "sweetalert2": "7.3.5", - "typeahead.js": "^0.11.1", - "urijs": "^1.19.1" - } -} diff --git a/phpunit.xml b/phpunit.xml deleted file mode 100644 index 62336dbd..00000000 --- a/phpunit.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - ./tests/ - - - - - - diff --git a/playbooks/openstackid-release-branch/post.yaml b/playbooks/openstackid-release-branch/post.yaml deleted file mode 100644 index e5344d4b..00000000 --- a/playbooks/openstackid-release-branch/post.yaml +++ /dev/null @@ -1,15 +0,0 @@ -- hosts: all - tasks: - - - name: Ensure artifact transit directory exists - file: - path: '{{ zuul.executor.work_root }}/artifacts' - state: directory - delegate_to: localhost - - - name: Copy files from {{ zuul.project.src_dir }}/tarballs/ on node - synchronize: - src: '{{ zuul.project.src_dir }}/tarballs/' - dest: '{{ zuul.executor.work_root }}/artifacts/' - mode: pull - verify_host: true diff --git a/playbooks/openstackid-release-branch/run.yaml b/playbooks/openstackid-release-branch/run.yaml deleted file mode 100644 index 59fb3c91..00000000 --- a/playbooks/openstackid-release-branch/run.yaml +++ /dev/null @@ -1,54 +0,0 @@ -- hosts: all - name: Branch tarball job for OpenStackID - - tasks: - - - include_role: - name: setup-test-laravel-env - - - include_role: - name: bindep - - - include_role: - name: revoke-sudo - - - shell: - cmd: | - set -e - set -x - curl -s https://getcomposer.org/installer | /usr/bin/php - /usr/bin/php composer.phar self-update 1.10.15 - /usr/bin/php composer.phar install --prefer-dist \ - --ignore-platform-reqs - - # copied from https://opendev.org/openstack/openstack-zuul-jobs/ - # src/branch/master/roles/legacy-copy-jenkins-scripts/files/ - # version-properties.sh - # but there is probably a better solution for this - SCM_TAG=$(git describe --abbrev=0 --tags) || true - SCM_SHA=$(git rev-parse --short HEAD) || true - COMMITS_SINCE_TAG=$(git describe \ - | awk '{split($0,a,"-"); print a[2]}') || true - if [[ "${SCM_TAG}" == "" ]]; then - SCM_TAG=$SCM_SHA - fi - if [[ "${COMMITS_SINCE_TAG}" == "" ]]; then - PROJECT_VER=$SCM_TAG - else - PROJECT_VER="$SCM_TAG.$COMMITS_SINCE_TAG.$SCM_SHA" - fi - - # Clone to dist - rm -rf dist - mkdir dist - rsync -arv --exclude ".git*" --exclude tarballs --exclude dist . dist - # Clean/create a tarball directory - rm -rf tarballs - mkdir -p tarballs - # Create an archive tarball. - tar -czf {{ zuul.project.short_name }}-$PROJECT_VER.tar.gz dist/ - cp {{ zuul.project.short_name }}-$PROJECT_VER.tar.gz \ - tarballs/{{ zuul.project.short_name }}-latest.tar.gz - mv {{ zuul.project.short_name }}-$PROJECT_VER.tar.gz tarballs/ - executable: /bin/bash - chdir: '{{ zuul.project.src_dir }}' diff --git a/playbooks/openstackid-release-master/post.yaml b/playbooks/openstackid-release-master/post.yaml deleted file mode 100644 index e5344d4b..00000000 --- a/playbooks/openstackid-release-master/post.yaml +++ /dev/null @@ -1,15 +0,0 @@ -- hosts: all - tasks: - - - name: Ensure artifact transit directory exists - file: - path: '{{ zuul.executor.work_root }}/artifacts' - state: directory - delegate_to: localhost - - - name: Copy files from {{ zuul.project.src_dir }}/tarballs/ on node - synchronize: - src: '{{ zuul.project.src_dir }}/tarballs/' - dest: '{{ zuul.executor.work_root }}/artifacts/' - mode: pull - verify_host: true diff --git a/playbooks/openstackid-release-master/run.yaml b/playbooks/openstackid-release-master/run.yaml deleted file mode 100644 index ddfaa75d..00000000 --- a/playbooks/openstackid-release-master/run.yaml +++ /dev/null @@ -1,54 +0,0 @@ -- hosts: all - name: Tag tarball job for OpenStackID - - tasks: - - - include_role: - name: setup-test-laravel-env - - - include_role: - name: bindep - - - include_role: - name: revoke-sudo - - - shell: - cmd: | - set -e - set -x - curl -s https://getcomposer.org/installer | /usr/bin/php - /usr/bin/php composer.phar self-update 1.10.15 - /usr/bin/php composer.phar install --prefer-dist \ - --ignore-platform-reqs - - # copied from https://opendev.org/openstack/openstack-zuul-jobs/ - # src/branch/master/roles/legacy-copy-jenkins-scripts/files/ - # version-properties.sh - # but there is probably a better solution for this - SCM_TAG=$(git describe --abbrev=0 --tags) || true - SCM_SHA=$(git rev-parse --short HEAD) || true - COMMITS_SINCE_TAG=$(git describe \ - | awk '{split($0,a,"-"); print a[2]}') || true - if [[ "${SCM_TAG}" == "" ]]; then - SCM_TAG=$SCM_SHA - fi - if [[ "${COMMITS_SINCE_TAG}" == "" ]]; then - PROJECT_VER=$SCM_TAG - else - PROJECT_VER="$SCM_TAG.$COMMITS_SINCE_TAG.$SCM_SHA" - fi - - # Clone to dist - rm -rf dist - mkdir dist - rsync -arv --exclude ".git*" --exclude tarballs --exclude dist . dist - # Clean/create a tarball directory - rm -rf tarballs - mkdir -p tarballs - # Create an archive tarball. - tar -czf {{ zuul.project.short_name }}-$PROJECT_VER.tar.gz dist/ - cp {{ zuul.project.short_name }}-$PROJECT_VER.tar.gz \ - tarballs/{{ zuul.project.short_name }}-latest.tar.gz - mv {{ zuul.project.short_name }}-$PROJECT_VER.tar.gz tarballs/ - executable: /bin/bash - chdir: '{{ zuul.project.src_dir }}' diff --git a/playbooks/openstackid-unittests/run.yaml b/playbooks/openstackid-unittests/run.yaml deleted file mode 100644 index 2e11a766..00000000 --- a/playbooks/openstackid-unittests/run.yaml +++ /dev/null @@ -1,29 +0,0 @@ -- hosts: all - name: Laravel unit test job for OpenStackID - - tasks: - - - include_role: - name: setup-test-laravel-env - - - include_role: - name: bindep - - - include_role: - name: revoke-sudo - - - shell: - cmd: | - set -e - set -x - curl -s https://getcomposer.org/installer | /usr/bin/php - /usr/bin/php composer.phar self-update 1.10.15 - /usr/bin/php composer.phar install --prefer-dist --ignore-platform-reqs - /usr/bin/php artisan doctrine:clear:metadata:cache - /usr/bin/php artisan doctrine:clear:query:cache - /usr/bin/php artisan doctrine:clear:result:cache - /usr/bin/php artisan doctrine:generate:proxies - /usr/bin/php artisan view:clear - /usr/bin/php artisan view:cache - ./vendor/bin/phpunit - chdir: '{{ zuul.project.src_dir }}' diff --git a/public/.htaccess b/public/.htaccess deleted file mode 100644 index 903f6392..00000000 --- a/public/.htaccess +++ /dev/null @@ -1,20 +0,0 @@ - - - Options -MultiViews - - - RewriteEngine On - - # Redirect Trailing Slashes If Not A Folder... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^(.*)/$ /$1 [L,R=301] - - # Handle Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - - # Handle Authorization Header - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - diff --git a/public/assets/css/auth/email.css b/public/assets/css/auth/email.css deleted file mode 100644 index ef1c6786..00000000 --- a/public/assets/css/auth/email.css +++ /dev/null @@ -1,90 +0,0 @@ -body{ - color: #63738a; - background: white; - font-family: 'Roboto', sans-serif; -} -.form-control{ - height: 40px; - box-shadow: none; - color: #969fa4; -} -.form-control:focus{ - border-color: #63738a; -} -.form-control, .btn{ - border-radius: 3px; -} -.signup-form{ - max-width: 400px; - min-width: 290px; - margin: 0 auto; - padding: 30px 0; -} -.signup-form h2{ - color: #636363; - margin: 0 0 15px; - position: relative; - text-align: center; -} - -.signup-form h2:before, .signup-form h2:after{ - content: ""; - height: 2px; - width: 10%; - background: #d4d4d4; - position: absolute; - top: 50%; - z-index: 2; -} - -.signup-form h2:before{ - left: 0; -} -.signup-form h2:after{ - right: 0; -} -.signup-form .hint-text{ - color: #999; - margin-bottom: 30px; - text-align: center; -} -.signup-form form{ - color: #999; - border-radius: 3px; - margin-bottom: 15px; - background: #f2f3f7; - box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); - padding: 30px; -} -.signup-form .form-group{ - margin-bottom: 20px; -} -.signup-form input[type="checkbox"]{ - margin-top: 3px; -} -.signup-form .btn{ - font-size: 16px; - font-weight: bold; - min-width: 140px; - outline: none !important; -} -.signup-form .row div:first-child{ - padding-right: 10px; -} -.signup-form .row div:last-child{ - padding-left: 10px; -} -.signup-form a{ - color: #63738a; - text-decoration: underline; -} -.signup-form a:hover{ - text-decoration: none; -} -.signup-form form a{ - color: #5cb85c; - text-decoration: none; -} -.signup-form form a:hover{ - text-decoration: underline; -} \ No newline at end of file diff --git a/public/assets/css/auth/login.css b/public/assets/css/auth/login.css deleted file mode 100644 index ac7e6e7b..00000000 --- a/public/assets/css/auth/login.css +++ /dev/null @@ -1,9 +0,0 @@ -.field-icon { - float: right; - margin-left: -25px; - margin-top: -25px; - margin-right: 10px; - position: relative; - z-index: 2; - cursor: pointer; -} diff --git a/public/assets/css/auth/register.css b/public/assets/css/auth/register.css deleted file mode 100644 index 5e654d60..00000000 --- a/public/assets/css/auth/register.css +++ /dev/null @@ -1,99 +0,0 @@ -body{ - color: #63738a; - background: white; - font-family: 'Roboto', sans-serif; -} - -.form-control{ - height: 40px; - box-shadow: none; - color: #969fa4; -} - -.form-control:focus{ - border-color: #63738a; -} - -.form-control, .btn{ - border-radius: 3px; -} - -.signup-form{ - -} - -.signup-form h2{ - color: #636363; - margin: 0 0 15px; - position: relative; - text-align: center; -} - -.signup-form h2:before, .signup-form h2:after{ - content: ""; - height: 2px; - width: 30%; - background: #d4d4d4; - position: absolute; - top: 50%; - z-index: 2; -} - -.signup-form h2:before{ - left: 0; -} -.signup-form h2:after{ - right: 0; -} -.signup-form .hint-text{ - color: #999; - margin-bottom: 30px; - text-align: center; -} - -.signup-form form{ - color: #999; - border-radius: 3px; - margin-bottom: 15px; - background: #f2f3f7; - box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); - padding: 30px; -} - -.signup-form .form-group{ - margin-bottom: 20px; -} -.signup-form input[type="checkbox"]{ - margin-top: 3px; -} -.signup-form .btn{ - font-size: 16px; - font-weight: bold; - min-width: 140px; - outline: none !important; -} -.signup-form .row div:first-child{ - padding-right: 10px; -} -.signup-form .row div:last-child{ - padding-left: 10px; -} -.signup-form a{ - color: #63738a; - text-decoration: underline; -} -.signup-form a:hover{ - text-decoration: none; -} -.signup-form form a{ - color: #5cb85c; - text-decoration: none; -} -.signup-form form a:hover{ - text-decoration: underline; -} - -.agree_code_of_conduct a { - color: #337ab7 !important; - text-decoration: none !important; -} \ No newline at end of file diff --git a/public/assets/css/edit-client-public-keys.css b/public/assets/css/edit-client-public-keys.css deleted file mode 100644 index a28c9611..00000000 --- a/public/assets/css/edit-client-public-keys.css +++ /dev/null @@ -1,28 +0,0 @@ -.public-key-fingerprint { - color: #767676; - display: block; - font-weight: normal; -} - -.public-key-validity-range { - -} - -.public-key-title { - display: block; - max-width: 360px; -} - -.public-key-active { - background-color: #6cc644 !important; - box-shadow: 0 0 10px rgba(108, 198, 68, 0.5); - padding: 0 !important; - cursor: pointer; -} - -.public-key-deactivated { - background-image: linear-gradient(#aaa, #ccc); - box-shadow: 0 1px 0 #fff; - padding: 0 !important; - cursor: pointer; -} \ No newline at end of file diff --git a/public/assets/css/edit-client.css b/public/assets/css/edit-client.css deleted file mode 100644 index e69de29b..00000000 diff --git a/public/assets/css/main.css b/public/assets/css/main.css deleted file mode 100644 index 28a564c6..00000000 --- a/public/assets/css/main.css +++ /dev/null @@ -1,372 +0,0 @@ -body { - -} - -.header -{ - padding-top: 1em; -} - -#logo a { - display: block; - height: 54px; - margin-top: 8px; - text-indent: -1000em; -} - -.panel-heading { - background-color: #F5F5F5; - border-bottom: 1px solid #DDDDDD; - border-top-left-radius: 3px; - border-top-right-radius: 3px; - margin: -15px -15px 15px; - padding: 10px 15px; -} - -.panel { - background-color: #FFFFFF; - border: 1px solid #DDDDDD !important; - border-radius: 4px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); - margin-bottom: 20px; - padding: 15px; -} - - -* { - -moz-box-sizing: border-box; -} - -.margin-top-20 { - margin-top: 20px; -} - -#redirect_uri, #origin{ - margin-bottom: 0px!important; - height: 30px !important; - width: 90% !important; -} - -#dialog-form-register-new-app textarea { - height: auto; -} - -.label-client-secret{ - font-size: 12px; - color: darkgray; - text-transform: uppercase; - font-weight: bold; -} - -#client_id, #client_secret{ - font-weight: normal; -} - -.alert-error{ - margin-top: 5px; - margin-bottom: 5px; - padding-top: 1px; - padding-bottom: 1px; -} - -.popover-content{ - font-size: 12px; -} - -.popover { - width: auto; - max-width: 800px; -} - -.info{ - cursor: pointer; -} - -.email-row{ - margin-top: 5px; -} - -.error-modal{ - background-color: #F2DEDE !important; - border-color: #EED3D7 !important; - color: #B94A48 !important; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) -} - -.error-modal .modal-footer{ - border-top: 1px solid #EED3D7 !important; - background-color: #F2DEDE !important; - border-color: #EED3D7 !important; - color: #B94A48 !important; - box-shadow: 0 1px 0 #EED3D7 inset !important; -} - -.error-modal .modal-header{ - border-bottom: 1px solid #EED3D7 !important; -} - -.error-modal .alert-heading{ - color: #B94A48; - margin: 0; -} - - -*::after, *::before { - box-sizing: border-box; -} -*::after, *::before { - box-sizing: border-box; -} -.bs-glyphicons li { - font-size: 12px; - width: 12.5%; -} -.bs-glyphicons li { - background-color: #f9f9f9; - border: 1px solid #fff; - float: left; - font-size: 10px; - height: 115px; - line-height: 1.4; - padding: 10px; - text-align: center; - width: 25%; -} -* { - box-sizing: border-box; -} -.bs-glyphicons-list { - list-style: outside none none; -} -body { - color: #333; - font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; - font-size: 14px; - line-height: 1.42857; -} - -.accordion-toggle { - cursor: pointer; -} - -.pointable { - cursor: pointer; - color: #000; -} - -.del-client, .regenerate-client-secret, .del-allowed-uri, .revoke-access, .delete-public-key, .btn-delete { - color: #900 !important; - font-weight: bold !important; -} - -.del-client:hover, .regenerate-client-secret:hover, .del-allowed-uri:hover, .revoke-access:hover, .delete-public-key:hover, .btn-delete:hover { - color: #fff !important; - background-color: #900 !important; - border-color: #d43f3a !important; -} - -.panel-default > .panel-heading { - background-color: white !important; - border-color: #ddd !important; - color: #0078a3 !important; -} - -.bootstrap-tagsinput{ - width: 100% !important; -} - -textarea { - resize: none; -} - -.col-md-offset-neg-1 { - margin-left: -15%; -} - -.clear-padding -{ - padding:0; -} - -.formatted-credential -{ - text-align: left; -} - -.auto-width -{ - width: auto !important; -} - -.error-message -{ - color:#c40022; -} - -.privacy-policy{ - padding-top: 5px; -} - -.alert{ - margin-top: 5px; -} - -.center{ - text-align: center; -} - -.bootstrap-tagsinput { - width: 100%; -} - -.password-container > .progress { - margin-top: 5px; - font-weight: bold; - background-color: #B0BEC5 !important; -} - -.password-container> .error-list -{ - list-style: none; - margin: 0; - padding: 0; - font-size: 12px; -} - -.password-container > .error-list li span::before -{ - font: normal normal normal 14px/1 FontAwesome; - content: "\f06a"; - margin-right: 5px; -} - -span.help-block -{ - font-size: 12px; - color: #d52929 !important; -} - -span.help-block::before { - font: normal normal normal 14px/1 FontAwesome; - content: "\f06a"; - margin-right: 5px; -} - -.recaptcha-container{ - text-align:center; -} - -.recaptcha-container > .g-recaptcha { - display: inline-block; -} - -/*Iphone 5*/ -@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : portrait) { - .recaptcha-container > .g-recaptcha { - display: inline-block; - transform: scale(0.66); - transform-origin: 0 0; - } -} - -/*iPhone 6, 7, 8 in portrait*/ -@media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait) { - .recaptcha-container > .g-recaptcha { - display: inline-block; - transform: scale(0.85); - transform-origin: 0 0; - } -} - -/* Pixel 2 */ -@media only screen and (min-device-width : 411px) and (max-device-width : 667px) and (orientation : portrait) { - .recaptcha-container > .g-recaptcha { - display: inline-block; - transform: scale(0.95); - transform-origin: 0 0; - } -} - -.datepicker-dropdown{ - z-index: 999999999999999999999 !important; -} - -.add-item-button{ - margin-bottom: 10px; -} - -#search-term -{ - width: 40% !important; - height: 26px !important; - padding: 3px; - -} - -.delete-item{ - color: #900 !important; - font-weight: bold !important; -} - -#gender_specify{ - margin-top: 10px; -} - -.img-circle{ - -webkit-tap-highlight-color: rgba(0,0,0,0); - line-height: 1.42857143; - color: #333; - font-size: 14px; - font-family: "Roboto",Helvetica,Arial,sans-serif; - -webkit-font-smoothing: antialiased; - font-weight: normal; - box-sizing: border-box; - border: 0; - vertical-align: middle; - border-radius: 50%; - height: 100px; - width: 100px; -} - -.help-block{ - -webkit-tap-highlight-color: rgba(0,0,0,0); - line-height: 1.42857143; - font-weight: 400; - font-family: "Roboto",Helvetica,Arial,sans-serif; - -webkit-font-smoothing: antialiased; - box-sizing: border-box; - margin: 0 0 10px; - display: block; - margin-top: 5px; - margin-bottom: 10px; - font-size: 12px; - color: #737373; -} - -.input-group-button { - width: 1%; - vertical-align: middle; - display:table-cell; -} - -.sort-header{ - cursor: pointer; -} - -.sort-header.current.desc:after{ - content: '\f0dd'; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - margin:0px 0px 0px 10px; - text-decoration:none; -} - -.sort-header.current.asc:after{ - content: '\f0de'; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - margin:0px 0px 0px 10px; - text-decoration:none; -} diff --git a/public/assets/css/private-keys.css b/public/assets/css/private-keys.css deleted file mode 100644 index b49356a7..00000000 --- a/public/assets/css/private-keys.css +++ /dev/null @@ -1,28 +0,0 @@ -.private-key-fingerprint { - color: #767676; - display: block; - font-weight: normal; -} - -.private-key-validity-range { - -} - -.private-key-title { - display: block; - max-width: 360px; -} - -.private-key-active { - background-color: #6cc644 !important; - box-shadow: 0 0 10px rgba(108, 198, 68, 0.5); - padding: 0 !important; - cursor: pointer; -} - -.private-key-deactivated { - background-image: linear-gradient(#aaa, #ccc); - box-shadow: 0 1px 0 #fff; - padding: 0 !important; - cursor: pointer; -} diff --git a/public/assets/css/smoothness/images/animated-overlay.gif b/public/assets/css/smoothness/images/animated-overlay.gif deleted file mode 100755 index d441f75ebfbdf26a265dfccd670120d25c0a341c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1738 zcmZ|OX;ji_6b5ixNYt8>l?gOuO)6lU%W(mxn(`>1S(XO;u`D+P%xqBvMr|w-Vyr1s z7R|Cn0b8|Hu<=Zmv1mFqh9Fj!NuZfKB2MP$e75`XJ@>=!y!Ux9xR3x;EW!q1^V>X| znVFuRUN`NqJ2)ybXh%e__h!!pv(M|S3+?9F%(K}zyE40MGyhWF5-IDgL&=%2-9`Nk z!1@8uk4t%_{(K~>N;sK&dzJbwJ=$kYTlL=$%#0Pfh>U{%i@~wWbvYsD_K-D`&+u1( z#Ma`>%q<^UhzGvi(hyE`zCD{-=2|zL5>wnB=DE!U?(CZG%q4@lDnCq_%&3DCla#(X zmBhDD+RN$aMWWHm?ig*>1Onn6~r?Ma~N2JKAxN>H%UtRyRqS)6Um!-Tz%-r=& zQmTb^JFIe3W^-kAm`}`2P|niMh>RYyd)S^f(dbrx965?rzbhP|XeP}o&&DSZ4|oYQ z)I{f!SfycYw?3=9W;o-B%U5xs(pP267X~9-7L|4WzaYexC0GtG8wWygm63rF{llCEraxzkc=IxvFQ-y37=_;e5 zJLq^gsSO0Ayz?a>E_?{dmUc+t#qv$)XN8$<<}rQ#)lsiw+pmL&J>~+hgpo>i$m+;l zZIa_ZRIfSeT$~v5d`EBV&*k`apPgjv&B|+d`Q!nyu{L4rs%ZfoF0*Kq8I%ByOcFpL zK=>wzofZo<+0GZLCnWM3oQ^pb(gRSf02;~cEn@LJ>~XB9IkEX{$N#Z`m%>S!U{uPx zloI%bLdo$Adxlh(Uv^yX7s5G&C zLwNRG>~T?G{kzupp8EcyLGPoPf)@&9Wqfw_l&uU-6cexk%5;uQg%wb=0k_733{i#& z1a2p)gV3S2+QG1-K9tZ}E~I<(P0r2aFFY-c{o?TUOz3Xjod#TLE2A_c?*T7t z=1>~%YW450{Qqno4t`}gvLnuMrcu8+#xEBoY%2_+Mb#Z6S38+r*M4O`-+!zl(@m`D zQsi|GA2l3gEy}LFe<#Hv8?$_L#u8E|3-bP$*La*E>B{X!Sy4i6?TKam!49aXCAW4S*P_O^H4^*DpiA40o}Uqw~Eo&veh1`|8i zD2$x+>_b^bXE4N;AW=5>iYak2%!JAh0j1*k1{p#iRCjbB7!cSws~U{1IA@acLII$t z$>X#A+^s6iJ5~DFG!xa?>z{=lxtdi1rzbM-(nqAu3D8h-&64xo6|E!p?pK0xT;qoK z`6%+SpBk+~M?nO}>2mTw!A{yZ6O>Z@kwSd4;8aWU5z!P~tQl?u==^+R`{OmOS}oZh zOXQ3{6kuz?Is^n^L7;9ieB9C+8B{>t+pDrlq4xGDDn#T#3T5$l1g`FTQkU;b-981j zNm{zC`$wn7etklM#qHI4=3m5gwa6DNS{?Z!vSObi_od{4eUo=_S2BKNpkSdiqe(k9WtkeM79;2-%CFbb)aB=&H1?i1}uwFzoZQ(38Kn1zBP ORn*B%u*Wk|4g3!*Rv{Mv diff --git a/public/assets/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/public/assets/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100755 index c09235f60edcd94315b23a534c61ba2c49df7f9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F1SA+{?>A)!QcOwS?k)_>#w|r1Kptm-M`SUO z_5fqIli7AahM1>|V~EA+ zRdP`(kYX@0Ff`URG|)9N2r;y@GBvd_GSM|Kw=ytjiqefi(U6;;l9^VCTf=AesSkh} O7(8A5T-G@yGywo@=rd#h diff --git a/public/assets/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/public/assets/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png deleted file mode 100755 index d29011d2afd4cd7d9ba1021abfd1dce95a6565f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8A6^ejv*T7lYj6t@hpC#;TbB#aBAWwna#KLs)4eqC9V-ADTyViR>?)F zK#IZ0z|dIN&_LJ7AjHtp%GA`#$XM6F+{(bf{jcyP6b-rgDVb@NxHXt9Se*ydz~JfX K=d#Wzp$P!!$ux=p diff --git a/public/assets/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/public/assets/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100755 index 1558bea510bcd2fa70712e8388c734ca5fb4e913..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12TF&T^vI^j=w#x$i?I+((tf;UXnmgbH|3oY>pC!)f}(GR!16S-u+#{ ze6YEqRkW=8vGl=5qArKM<9}TC-}iEvB{zdaTcX5$wyRTK&ALK>z>% diff --git a/public/assets/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/public/assets/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100755 index 0359b121fe6752db9e8904ea3df6328e2a38494c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI2NH8$CE1Q=ADW)WEcNYf6yIsOdfIQ9ukH}&m z?E%JaC$sH<3_(v9#}JM4$r%X}t&0mp9yKsb%{ak$*<@oTP*SzTHKHUXu_V7+PAHnpznc=^B_@85k^HFE5RvAvZrIGp!Q0hD)E8F9&L1@O1Ta JS?83{1OV{FGsXY_ diff --git a/public/assets/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/public/assets/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png deleted file mode 100755 index 4fce6c462eee88b588110ce61c2a68fb8cf9ee4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!T=8puqDZgOs>RXUCGx5b?-VBQkUm|IuXOmYJrBRJgj{Vx zMbNnqUkncy+qa2-mWYc>swkcIuvGK#>(0d)B7)5f`@$Ei28nH~0h*~=;u=wsl30>z zm0Xkxq!^4042^XS4RnnRLJTdfOiitfOmq#*tqcsBqI6?WH00)|WTsW(*6^8q>I0w# N22WQ%mvv4FO#n8SPD=m) diff --git a/public/assets/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/public/assets/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png deleted file mode 100755 index 5299b5a0b0cae417d8824f8f7d29416ed5ae334a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!TrvH)L6@80)r*_cdCvDr%)6ghVL16=s@mbz7H!uRdGeDa z?kzLg)16i!f8fKx84s0>4nC}Q!>*kaceMJusRQ@ Ofx*+&&t;ucLK6V03{IN> diff --git a/public/assets/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/public/assets/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png deleted file mode 100755 index 398c56a9cb130485289d061475258e0a0b9e43ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12VciT^vI^j=w#>k(V)1qW$CZ|6)SVV-&*#dav<$DMuV&n0Dbpw@a7+PAHnpzne=^B_@85rcV g%D19u$jwj5OsmALK`vssB~Sx{r>mdKI;Vst0B*f;)Bpeg diff --git a/public/assets/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/public/assets/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png deleted file mode 100755 index d819aa58a13773931da0aa8877fcb4ddda94c76e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?s03;ZUuHXC*q?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z$cXZEaSV~ToLo`U+vu0Ue0cG9p8hWqa?gxxGLm=1A1u)Cewe3oSeCaf zI$k30UHXoTXA5lSJe(zTcE%W-S*bfB&J`pw9sa4-R?IGW?p~6`>jMSP&M+u3 zY@9al)zrvpHlQu4C9V-ADTyViR>?)FK#IZ0z|dIN&_LJ7AjHtp%GA`#$XM6F+{(bf i{jcyP6b-rgDVb@NxHXt9Se*ydz~JfX=d#Wzp$Pyqds=h= diff --git a/public/assets/css/smoothness/images/ui-icons_222222_256x240.png b/public/assets/css/smoothness/images/ui-icons_222222_256x240.png deleted file mode 100755 index c1cb1170c8b3795835b8831ab81fa9ae63b606b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6922 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 QJ~;stWz}Trq%1=J3#jBGg8%>k diff --git a/public/assets/css/smoothness/images/ui-icons_2e83ff_256x240.png b/public/assets/css/smoothness/images/ui-icons_2e83ff_256x240.png deleted file mode 100755 index 84b601bf0f726bf95801da487deaf2344a32e4b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4549 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 F{{S81aohj^ diff --git a/public/assets/css/smoothness/images/ui-icons_454545_256x240.png b/public/assets/css/smoothness/images/ui-icons_454545_256x240.png deleted file mode 100755 index b6db1acdd433be80a472b045018f25c7f2cf7e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6992 zcmZ{Jbx<76vhMDpfgr(y1`QHmaR~%lf_s1jS=@pJ3$lb=+yex64eoA%#UZ#ua0rVB z4KA18y{BHibKiM?%ydsxclFFS(>*ocgsQ8`;o(r?0000y1$l@j004Yc0Y}*AkG*V$ zv*e=ynJURa0J5d86F477Pd>?iaCwyS|J~jW*uDV(DD4#>Qtv!|9i+qTEablQNm$h= z&CE0X2ukQD(>|w9dGqdIX)YvBF@CS!Mo^03TqmwrllgV%KEo6shFx2oEehu^_cs!f zI;sw@aCA*YlEb$oWY?7%>bM;vUhxUi8np5~I@-VX^5GP5$Q`;Z0hf{15s`~)=nCIT z{KYcN=k)##CFFtF75!TrmQf$AG#Q`<^mG!=GIt&I#)o3-O*Wp{;A<1pI!eg?%2!!r z+zIv$wg$i}8}QOLFS=Xh+Qf4z6c-3wKnenV={H5)s729tL?tzQ^60h+rL#RDkR9~+ z^_M@C6WcitD=p^@wd$vx=;$W_mKfVOT6DDpbQ*tH$WpY5W`$H_qLZA(#re#!6)VtF zU@=7mmXUgOhjUus3l*37VNtNse7@B=>Cbiybh7iER2KOM?LhHBd$Upgt#lg+ZJO>l zxu833ex$XTUzvt!1q~LKA%ec^+*T{O{SPQ(pFDup!nZyM z??tIZc$9{v1Y+SUAeG0mvyl#&=ASO^c8)eTyrwZPrzrpP0P9l?A~{ukG)rOFeYVzq zzu|jZ{LNIs8{QUR*bR_jTemA#oduSf;ShdMO^19Z>hkCO(lWs5*T9y%kfQN0f&ePMv;kDisnr5y%7Wrrkwm3!>`zkB=ovcMAt8MEi~kp?m~ zfWU+~+`1LPuo*U~q+a~EcRcReTnZNxiS+zq!!}lR zeC}vfalp8A^dS5nePlmnMN9rV3866Yi&80me{+~71G`Bj)*jfaXC->#4ZTZKVig!J z1sxFCsdnX?F1@QQ!y+DnQc#eV>Noq!Bo%`R zCQ(53=NDNlW2@k8qW!H~j_$u4zW?zk{Da=f+F198-BsfYtYx*vT12>Pt)AGzy!EVs zB0VwU_wS7GmWz*gW3S&S4eB^Ikb#?0hD)7@zncvPpPsoT6)u8I%Ht5%p9-&@W`@hc zq>oG88M2fHhXn%KZXGzY2F)1UTR-Q#+b_iw#CvyW?X`v|_ZA%MNpC*Dt{+LRUQnfk zJ#pQcGi+Q?`h$vw+Vikh3-*uOV-5153P)ZBY5uhIuNpC?A?bRAZMWn_lu^$clDy-R zkAAPp*&jG%+0HBqQ(;%y7q1e^@eJH5@ngdrb>fH-qIkxR_W}0#N*2|w#hXUD=x0r8 zy;J7sx_ljR@Mt|^G`#6J=g;0tKIqUStGERM$dkQD1x7457!u%4xHiuJPXhk?nT47~qxNz753wpc%qyIWt|2Ng z_jZkTS6_=NSpP0`k-*q*!1RwZ7kAa1iYPUBI`_{S`|0r!((875#MsbVYZpzro`{uf z(1NYO8h`jJw@%C5!ogzs0E3AdeT3r!-m5A%6m)WJd@OVqIw|h!g`c(HYFw{tAtMv7 zf~zrF<(N8g1IBi$`-{PxQGBAk=_oNT7T1q1DM*sgATLMGy?22&M;JYSQcROI(mCZO zrNL>`KU*`J9mvW29TSQ zkoggZFYh@$?q0|Ls(JrF-t`htX7Yi_9`gjWYB?yFY$yG)m>;!D;Qm<7oB`IQ9R!DfGF|6|Lc08UQd%kf4i5$?|TTc-!(vs0SxuxHT<;OjH9i4e{GK~!f`;xI@rxNGkLi8b55(Sd*g+p zGjYqlGqEGPtnp91>kXd2jVuJ>OJu~$i8odw^qZQlVq(9gxX?It0+90@^LE$XUvX3N zYFylu(xzXrg!cz0Z87@>Rw6x%oMv6t3g%g*5|s+smzs5B@4 zQdQajJm^V%qeYzAG{oijbDQ8&j8RHRdk2HC?b zV<;R)jv?Sl!c;LWU_We`Z2jWOd+kH_J@Z$95xP9)r;Ax6!_6saYmjYY5Ks9y`#?!k zN(oS#K)=3{j>W@Q1mz)BlkO5`Z<%b-vMvUXFp7AHB>gGW@fzDRUCUnD!`So=6d|Lx>37E~b1{9RyEuRtrtcuQJ^tUmgo zhb<0OkTo!V02@;9VB8iT-7pVBircZJI_{zQv?gH7!;RKgHSi>Kq}dA!W_^Sl#=qD3 z+`y>QW9Mh)Kx+}|p_#5tl!}lt8|Ut%A7{&Df`k(5UFz^Sxr^&`POLSj#4?sBGE@Io zflPsOi(#MK73=H=>0!Q6?-LnsJiBoV%J;ha!$zCs9vHjNbcB1uI!*6LsM0VJl1w#n z5?fA%styL%3a)f+`4tZgo4#lE(`KyN(YKX|x8Xr>C4LmVGyxeye;oqGOyZrIk-|&2 zH=>-)NFueW{txOInI0Jnh>Fv_pqcb2@>sI>8v+^thI6@@+8peFs$AVKr}Hy7xu*ei zzZKr}$BOlvrC_F*`hU>D5fne(E?~z>+*@ex;50yyJakvscvIIlNy{S#Iu(uHVm&?6 z_3)RW)}4q&837WM>W!rh6^9QPzEl|p7-^Q5j#PJo$hTRj93U>As?(ZBT$$xK*P+0= z%_E)qOWKFt3r__z;xyBA5iV<$X1Ak@)>Nh1rtY%aT)}s>3Cn^Ln*vJD9a+zDnB~1z zs=tYH)ulLW1$s5~MB=Lf-k?YHb(w{y+u?uG(Ni(9`c+vb6HN1Yd%{8v*0`5>Mbq|E z%*ec`G8>KPyaGI(XtBDo{#^BxS@qO&vo|soFnQG3KEWrXDu70Yp^|fwmaALR}Dq>mmq6--TcV!Y%+e{!D*vU9fGS z<%;Ey>wOvVc?qn&@oRaC76jk2xictE><+gzs=!l1?bIh@Gom*TLZu$L_WX|B$26~G z!^+GtV9NzY__{Q|E^PPZC`eDFOfL;BiRPYPdABimd$v_@e zG63JrX4tQK$UbZ4J&&9Rg31G7d#N=dU#s9l2w#YhP&YS2$_a)Jy`D>#pZ4bAm+kPBOTt7`F=X)SbvJ!-6(%(D{u+KCqiJ zRGXraN!wWAdGBZD@S=-~Q!Xj=W$ns`%vFnK^T|l<&L0 zzF7Bc?KnKf0A%D0QiTyl0dcPy%TcSb$9qw7?c=_!DSw`zfME>V7ij#{%VhudH28{o zB55x8hm|#bDh?JaBPy!D^5#_j6%KNs7O1MDTG0$gG+RG&=DPP$Z7Eq>o5QTqBlKM{ zj^|5TOK*)mJW>iw(%AE6x@TT?rCuXBr2nns!2DZ0jlEl_rK11Pvj5PEb;6$B64$f; zERSKwc2z;}!v;6PLa%7PCMhJGW8i+@E7K}jP*->$-&BM7r)M%uguJ3*Z?-Gyn7t>y zlX2%l=&H(;(=~bPefDs?FpX!~vID-_KFsht{e0^=C3~s=l0nFeCDxkqPn%S{T;1}+ z^U0WV=8@02j-Yz`tg4+)X$O%kr*=8Kg)FuQPj0kXW^<1Vev#ZU`V4Wk+$IUdpKUb) zA_@fW>Lvt)rG$PE1PXAZ^+Nm?i#{6T`AW$d z2??rAo9}!(Wd%cbqQ(jLCvX=k4{J}kTh9o-)w`Lz<*y@X9U>0Aq+4ScSd{uv43}>L z9fmRPY!UcoY6o0`0USeBojif~*aKg`lf9lIIa)!gi6BRh8KNLjvUrs;91hLeqNMfS zCQsMu*9PMJRnWW>B;?z-E_w#`b$O1M=!ks8f7%8uYJ5zV zb;bZW_aSz$O%y-~?coWMpn7I_3YtpxTCDF?i7SbIPWAJOUt0~A??@T?@A$N|MeKTq z2HV2r=je7q7CfLiEc=-zX_E8siX%3%b-3(#7t5d+wwN^kB&%sK&3#nEr}z`}huWTw z-a3Q95`#gv;|I&a5zK|hXwC?#MqesKYAoSAA>mbf2=v=88JipZkQESDO_4Ps$kz*|4RJ3yvIWZ(OZC(W-A(zud&mfCZK^;Oi|X%ZRX1hZBT zqnpyTnlv%DBQlFDxy!t{M-l2Xl*0Y9l6-ouT0IY94V$H?@y|jxP{!KLsQjeY)MhU; zRB8L00(@^S1y`)}7ZmBGyr3^6hQ)>|Drp@DQc*@O`bt)$FjkAiFIR-J!9I!)7|YbJ z*6qbWVtG3~rx7*O;o9L3n^rgsEYi$?9HB0seONi*k)4n`wFA-;{p&gOwG}Y*@h)&> z_-g8#>+&|yv>BaL26{Od*MPOvzmx8GU@;c!aw-e=P=hW9Q<&!B{)6h4^iq1Ygnsr- zo+fT7G36pt8>MaZ*E)l9LRgerM@rjlo6ilV1|R|9)XPS@C!8Bm;w6fKDOV=9F{-Up zBpQZC1*Q|aZxzho42Yz~(N!V&AXawORuO{-EV$yGAFpg_WD7IDS7lL>Ig6rEpO3DAu^g-j&ztiixx<2cgQT(plWMHMwg?kpj!iiHLN+#}^m>=I zbNlI`>K~il&*C=+LlPd(HgkH`v{IVAU4(GnChq5-B*) z;$OjD*q;8{KjVAe>{Bn7YQw9A^jCAzbKCS(uX<__ZYp#YUc~*;3`Bsx;;@{QmMFEY z!i&@AvT67wy~hi+nMg8sVemK5s^3C#WCL?2v4OgBUW#uo4x&%KQy=X=&{olMee1*U zOc6w-6bVAzCQuG%yo7@uGq8s2v(dv}QSNSy_#_&t+<-idI-bpVK$@6JE?B4)kEKs+uQfI> zB!h$3d-=Xs_RoXFn?X|KM&-Wq!BWOq^O~xKjMWT<8ECHW>y|gm!V|%I`?=XiQ>7-~ zNL&kxvvV{_+NV`)R%AEI!D?9LY5sN`)*Q7&Ro6LFK4LjCpC&l^Y$^1sDkT0(Y=?PA; zvnObr1IRdBOGnJZ%fn9FE#yM)@?qA5Pb9;+Qqw@R>$as%$@QquyB4&Y0y;a^T;Ryg zB5&=eoyRGGbQeSJvQRXLx-Ej~ zHzi-1nbaQshcckghwHloKb%AEB^iHtwEfDr!B>}KXJYm<{6d=Ok5`07247mGu1Tol zmXG5;+oO>=5yet))qw1u?8xh0gq;xbDeF*<=^5#YYAmpzH;U>>o|7y zGX#Cr;a*1yMqm`yKK*@xTID=-`S2Pq1&TIK80~pa9;K45;Y}PK^H<8-O=+M zg~JK=P)9YRP5cD`AH+4{!~1o2);!I;2YLYfyM6ob9X4p*%it*pF#2Gx2Q;@m(3l$8 zw~IL=5G{TunViCbw!f2#k>zuPzH|EVEY(xP7_NrCYJA6pehay57n3e|3ziZ43S|zI zyeuV>a1F8Li~WL>Y)Kv@x`FvY34o_a&td}LU+va5?;eukqEA}a4wT*b*{)YBLl&WT z;$whurm@d-2&%g`#>tzPsq*AT{n9;?quB4LXc%dj4Y}a&J+AX0RpTY~YMSkpymzvp zce@5k3`B@shWuaKcSI#kiSLMK_rJ)y|IRvkO8-S}H9FO1IgI`pWYyV1 zIj^f>bKh9DF#43)Qn^5&m$*=2x?gZWD`1YIaj-llqtR-tqgOJW`w-nkR=+(M(-TO6 z#)#HO!8gH3K;spVB&3|gJq)he8Y+k<{<5S=iM3Et0shdrf% z04s}TObTG{5JuP^|I^H>;26f8+}M9X)qp7@E8JuT^WwwJ4CC;Dwyg<3KM4H%0gtkN znWhR38|$IQ=m%AjKH!nnFCWaW$TWULM2B`7i39|~KSK7W!%aGUB(S!hn467}0rgW_ z>cZih-~$qNlZU*Rwu3Fe55HFc7CdlrHOm!8LBK4oT9`CHeO?6-Px74);WjWx0nOu_ z08mbu^=6-3IL_=LfF(_i?J>p=ghET<+~F2LT(UwyviW|3BiL~@R>lcpuyb<3>FAZ zkmbGIJ!jwU+aLE<-@aAd=d0V*UG?1rZ7pRYd>VWJ06?UwqVNg;KznQgj&U&`?~3_8 zGLHh?MqOC}08>3;XMB9Z^HMSPeUvKyyp#rAr2qgLKUD=;y`Y7|yihm$-tc~D$9W=G zs$KsH?0L0bDFu}Lv_-8Byl|sU^Fyr4w-ruJ{qi&-r)73d7M0A3qE}E(mwUW%g);Mu z%CD(UI7oWi*)@exJxXw4CgFWb9-_BFs&A_*oPYD&^)RYvJ&4xi`2O-AZJoVbaO|2n zZ@s*A_%%HITLh6Kh{##REa>|@I45#I7(_^I0iYq~0|>C<<~$8x4R~S!P|&Ewa}!p@ zyx{@#cuJGUWZHV5r|&8-ss>-#A3V21192ficY@z$BF;{Fu2AF)pk_xljY@;pushQ_ z-0W8?^5Sw7&!wHuREAa(P%zm-Bp~q@3W1Zgr`n5}_%xftb8@}Rc4lg`4?u~)r}+D8~y!MZhPHlf%HERSaTF*T`sTBYB&!#+@6`1T+jdF zRnZ6@t7W*j6zkj@KBR7T*|JVj6>d7vdwNKbg-w7K|c_r-sJ$5Xkhb zW5L&t(Z{`l(40g&077&Tk}^_9wWo+4_68u*T@gC+RM6Ut#46%-o}~W_#@xud&dOy* zN`@)Pngg1k;ir7r^bfzQofqdk)x!k?r%SsW4KOHXF|w1sZgZo%WIxL&_7G^!=3LFZ z+naJPDbXCcG$#s{gmwmbFvE#$JqvjE(KMLXvP8`Hnu$jh8hVEtfpFeO(7goW72ic@qZ`tGbA*1fBpI)1X{U%_ zF8dce|M~6z6D}XY*mJrKGnu!f%nEUYjM7(g;VkZSjG| zw_IBtV^A~vrbOB5PE_#mC$w&Fjea2Juv(}rznb)0sLC=>bR?i%STt%8cMAo;ixMG* zk}sSsZX{x`+r$nl{eC$x{t|%JM_@rp}w^x@{ON1W&MDsvN?n-~`-&9PJUt*O0Vn*We}MzmHUzW>$-Lzzdg zOafa8Yd_0ljkJVwc)76^L$7bS22V(W@FhL}2A zb(v1FsgC%u-a^SwEwj>O{-#XQm$6AvjO}$krsCWc-37%$Y`KH*|>DL zKnd%O{0Qdc=?Kk0mQQo|au=4xQ^&{EZB+pX2H0|TiTRc=f0!Uma-tQ2sYV&HJv8lx#&dMtO4We+8rk;O4FM zhXyW21Q3ax-ua_=mmGY!9IbS>gq1aTM8?(r!?+R18k#xO)veq(PXRO4_!oF1Tv3nbyn>9h_0)&%U1kh55Vz+rFetsKj zRwM|)v}^8gp)G3w`I~F&g;txw#HFOLp&9@MR};!-&BmJteKTzp{G>uK6Zru{eb{}Y z%`~~)A-_O~+yQ!hzHujuGc)gp2-(-plF+2O=_6qG8{{0pVujRx%-M=!T8gY{#Z#Li zv(YbAQMqyGZFE_1d|Tn>ACL)MIkSw)!B{nVlIP3>L$4Hn4Afe(0k&~edDm~O-TYNQ z-F!f&CM(NrCyOq?%cvtTHX`|-8^V9>e@`XRoZkLmaTZLW28ft8589E7>-aO7_yun1 zyUj(ADq(Lg^|t5O^to=8sx!0j*tS&g?h77#B1i7aPytT4n}VBPI#2VosgdDMCcHXd z=~OvSE@f)_a5ebVMQeKGWi~BL17H{UThZ>qD{trw%IFXYx#n(gN!E)@_U>7k-$L!} z3~}NADQ{^_cA|S?Dq~>pkUT4_ZqR+dcNa7^X!h9#k^MF7KE2oNSvUzjnk7yGfJL9{ z-jJ!NTH4d}chw}rpUKnU6cRc1UtWSlnOi>pRLTKsR|+hDXm+#C7^)-SYzb;$C{;Fk zs>~8+)nphUCVl6_wF<}xCaC3cZDbgd=J9u@jv4ss!8mPikH`q`1-cuwcP z&yz=Yzw2ZH=%O@wrer2o$G%;8PQ{IaN%4?wX5L)G23jblq~g`Ml*tK~sCtc$HavG- zC2u74)g>-Ysb(8SglA8)USXD0wo23JCcET+DqXbc#_^5(#a3j7FGa6^e`khi!c7p> zU|2tYc2Bn>r0V#0k4mg6M}sPrgn!HzoxnP(;njBab~mKK;x+G%c4qtM4)!~#KJ|&; z(Pm@Vwn$-ji#30DqOt-VH>whhLJY^mr_5i1O`lDcpDLvBq1RUA#F`r54sZ(Y)|L$- zjc(lAWlT4`&y1e?aFbc5r+`s-t{UphpuEqECxt2P?D5xEv~Rp|vlFpo-$Swuw3jaR ziCj)A**Bck5&&-B4ZWYmWp5`T3EXH)ok{v;Cl^R@2zhO6 z!S?}GuR~z!jq`v7vkm%KewmdtlW7d7`OihUTQp1FrKCB;0MlA7Ko#fcp2o;7vI}bH zg=GlpqcnLDEcV`44DMpBPIb|PIR@&d8*|F?)vD{|ZgA75+etndI$1ShiX`tyN||+< zbYNimEx^l>Hv@X8J^s1QC_E<@rs~c2y+UdfbuBO5$QLd4`wWA&N` zws@aacvH&KriK~8A2?#DGo`km@SNEg(veO?x!5hgM^jLI zAc6-KP2=IrWB&W_ai_>qFaNmk1)Tw`{=+3Hj05;MM~=?gXkJAbu2RGrPa{a z_$dxvm_n7Y{zqs$rlp|-1sl5C%me7-K6BYs@k4{T9@(!dC*5ru7SrES5D%sl>J@L`rgjV2n1M`_yAcxOT>(XWQ)#c*BIGwW z;Uh2P(BDxz+z5zU!4cnc>DJ29^7S6jYxU}}$@gqrJg8Bn_)1rb+rxX@L)>2PJnGk! zgmBm<%Uv}LeWsYJDYZ?BJ+0FjPCPq)_|oLAQMe9!Yq?HTMI&~W&EO+g9_tKEp9)*g znp1hljDG~_))}zNPTXW=OnH~j_;K+~ec`G0Z^7_l009G&c|zu&t~CnfcJ(z{8^;q% zhWMc-COwXB93$TU78nyT=H}jo#@r2Q5ZTdONrvT-hb57R8Mk_Eh9DcI1wP?mnw1nY ztic`DhdRDr-I_(PIYicn)|}CZQvOU8XV5F)}nF#@6HTsw|iDHwsrxfBkZa9ic(#a3) z3-pT-_g9!AfZFjWIR-WYXwIFFth+jM$dC5OZl$)Zc zFAAo&g26}VX=&TfmeSi`%zsS*5=2XCl`Fnu$v5}NQ zv$6Xv9>%CW9xDld9bN9|;FRpMg9n>obNUb&Co2SJJg2frDsI^dU}XqPYIqaLai2(j zo2QWHnD7@>pOKvF4DeR9p~U7@!!pu~tD_&Zak+C{Vu2wwvHm{rTNJ4a-%6CghY+W= zVsFdkEoBKk;+^CLl-IMhEb&l+vriCuI5#V@fe8MeyWO za6zAlz3J(VZ>FS++Yuk9Di5+_r4_6~m?fA5;rr%4;}t@+d~J~tAJ zI}t13if`D(v?=#y>SLZWl*k}wosI#n2&p4?xH3W)&UVDelm+LwLgs1&T7mCsTy)R& zJH81oc6>8cyCMIG(Wjex?}B|1XyMFg#>~U#nJ8lbaaES)f1i&1o=~F{NJgX{%r0_C94ZkcJky>+< zX=~DK##TB&sG~U8hr_=(9Q@Qr5bzdNZMo%B(PJ!u960!86QU>?`KT?1-_Nr1be3n>Ftv@(9WATydpeFu7emOJl8R zR$-3^li`aoFOvip!_gG($mTD8yhZcCyeEe;I5y>$cM9`_NPOew@}p2MtS75k*!db{ zNXa~Kms4KB=JtJfs4GcjjsXQT4OS~;Jt(mLC^H|ycOpi$fnfe?9sS}62gpL>O!4z` z|HFweukO)WL9^&wOBz>j4p%GZy=R<@XRSM-7ti08IM){J7Jj@`f3(zxq}>ty zJs(5i?l=U6K;}j(c0}VuL0n8uBsRHwZKgLOuUlWk614H4yCYtt`}thR$GrTfgef#0 zlMnFE%KbSXpur?^JpE3{~LbXA0`~QV<9DSFdRA+Uxudj zy(%(`yj44}=wQrYSL(|Yx@!!!NCIC!O_A-$d&%#kwwkpizZ+{-qhu+didG-J6Bos` zI5#Vfw4%Q0?5|(7*$nC{*I8lw+Wb*4+t(0V`%`|sEP*+x6ucS;uIF9DTxDIP33y3e zl=$;I?^4|uW-|q?h&{_9%XY$I@SyrHV?_y5Sa6o;xAdhxEKPh5;$`<2OZtz2Gqq=W zLU&ro+HttGtSG<4e#g6)$Cr0jVT0&E%6B59OiK8H?Uvduju2wgbiOsF#`3E#Iy58MYiz-7x%ZMa$+8w-%heWX|8%D(mca18T z7|EbThNC7eRRspNnaCe)Io&pKutTnQu+}XYg%zC}io(f^x80E)lqN4P)9(%Xeh7uhtuYahWVK8kK^Z5eY6noTl7h2L zegI$aj1bi>+1i%E+Q$k`mzTr%dpc!Rvx|QI6yB3~&h2U5L0LE-QTH~k+g$K8jl!>N z^tLcQdT*|Z9**vUW@O(Nl+i%^Wf&x{Co9`)oE!S6R@=M!?10HtMh9TPW#IFq zrWao@)}HAL=5VdtP)gTg`j=mj3t4!{=+n)_soL%Yyytk=9Z-FskUNlhRSby?w6_IA=vXdEUmgH>PfKgVEK|aR%t-?(I;5}GQT)1siE)~31oDP zTHpYg3HM~3csfrT=jcNg{R`p`k2)-mqquot9INKrWhOO(OLh59NNZ~4lzpMj6k6L~ zLbwA;BcLK;+Q+5zKHwVfrZq2f%}C9Ch;*TQKSO4J1PKVn8S6$*7=}=T0`s99bd$3 zV8%Z%;=UQ}nOlDpl}Uz&q`$3teG$<`8Tm#1tJnuRq44o-TH#LYLSDwxTRx9m@$xHHW(a~UkGYLa z8KJAf(7XInf6#STHuj1w^F)8UA=7d=^7?9jqEE;?jNE)U_5;_8)IdsFiikl!eI*5) zxb}6*|9Go;^jCMZy3;yXBTeNk5-TkXZBtC6oC0Ii(%;7 z{IhoB$jWLfbFBGEl8o|J0c3ucF<@^NlCn~xgh+M7y0}yXT+Bk`kdWAiZ88(^>t`DQ zXPg|c=69SY^6@Rgg7fi2jkK-obqK!QKxz=l$KnubZOh*MQ$vkUAMizrf0xL*(WqVC z{!@j7hLHwyVHCsb^C}T{9YrKLYJE9g{-1I3Kh)4H$&xZmmHl(j)-uaMNLJ+gX53q;z3%Watu14E4+4r7vXEZQO0B^lo za_(k(@}E*}_4U1pf_0n@#h3TzB4Kh?V_M@l=3Um4Ts?fa&Y~UQ+J8$rI}!RwON0xd zfRv1;82uBTi$BKwQNZW%Hq_e5{);mddrfAD!^*J%0_fYQMK@YhLMS%98(|~;CeWbq zJk%+L8p;n6@Os1lT=LKOCuLahw-^+Xx|Xl(m_5OU8f3skDb_3&8*(_yDg%7MM1t;q z7ir$sKOjp1$aSIjZ&Sv)N`U`cTDRR0z00FLwIw{>#-yMEmuL9 zP*TMRx*$QTrh!Wx;D~0}KE$woROV=Lf#yL~+so#D_XEOZ5MU(S;E+{KI`X^>&lu3W zF}BMzZYJqsbGd*nar62CCu7Gc(}fVz^YKU23qM68KRatbdvRMI`$qu~0Pzd*fCP9z z{CXg;xS*goKZpk;Dh>j1SRvE?#lYRu&ec=nGObUhvX0uk5Yug1rarB_5Rks)||))pAy^{{xH72U-9C diff --git a/public/assets/css/smoothness/images/ui-icons_cd0a0a_256x240.png b/public/assets/css/smoothness/images/ui-icons_cd0a0a_256x240.png deleted file mode 100755 index ed5b6b0930f672fa08e9b9bdbe5e55370fd1dc30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4549 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 DTfr$v diff --git a/public/assets/css/smoothness/jquery-ui-1.10.3.custom.css b/public/assets/css/smoothness/jquery-ui-1.10.3.custom.css deleted file mode 100755 index 893090f6..00000000 --- a/public/assets/css/smoothness/jquery-ui-1.10.3.custom.css +++ /dev/null @@ -1,1177 +0,0 @@ -/*! jQuery UI - v1.10.3 - 2013-12-11 -* http://jqueryui.com -* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px -* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { - display: none; -} -.ui-helper-hidden-accessible { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} -.ui-helper-reset { - margin: 0; - padding: 0; - border: 0; - outline: 0; - line-height: 1.3; - text-decoration: none; - font-size: 100%; - list-style: none; -} -.ui-helper-clearfix:before, -.ui-helper-clearfix:after { - content: ""; - display: table; - border-collapse: collapse; -} -.ui-helper-clearfix:after { - clear: both; -} -.ui-helper-clearfix { - min-height: 0; /* support: IE7 */ -} -.ui-helper-zfix { - width: 100%; - height: 100%; - top: 0; - left: 0; - position: absolute; - opacity: 0; - filter:Alpha(Opacity=0); -} - -.ui-front { - z-index: 100; -} - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { - cursor: default !important; -} - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - display: block; - text-indent: -99999px; - overflow: hidden; - background-repeat: no-repeat; -} - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; -} -.ui-resizable { - position: relative; -} -.ui-resizable-handle { - position: absolute; - font-size: 0.1px; - display: block; -} -.ui-resizable-disabled .ui-resizable-handle, -.ui-resizable-autohide .ui-resizable-handle { - display: none; -} -.ui-resizable-n { - cursor: n-resize; - height: 7px; - width: 100%; - top: -5px; - left: 0; -} -.ui-resizable-s { - cursor: s-resize; - height: 7px; - width: 100%; - bottom: -5px; - left: 0; -} -.ui-resizable-e { - cursor: e-resize; - width: 7px; - right: -5px; - top: 0; - height: 100%; -} -.ui-resizable-w { - cursor: w-resize; - width: 7px; - left: -5px; - top: 0; - height: 100%; -} -.ui-resizable-se { - cursor: se-resize; - width: 12px; - height: 12px; - right: 1px; - bottom: 1px; -} -.ui-resizable-sw { - cursor: sw-resize; - width: 9px; - height: 9px; - left: -5px; - bottom: -5px; -} -.ui-resizable-nw { - cursor: nw-resize; - width: 9px; - height: 9px; - left: -5px; - top: -5px; -} -.ui-resizable-ne { - cursor: ne-resize; - width: 9px; - height: 9px; - right: -5px; - top: -5px; -} -.ui-selectable-helper { - position: absolute; - z-index: 100; - border: 1px dotted black; -} -.ui-accordion .ui-accordion-header { - display: block; - cursor: pointer; - position: relative; - margin-top: 2px; - padding: .5em .5em .5em .7em; - min-height: 0; /* support: IE7 */ -} -.ui-accordion .ui-accordion-icons { - padding-left: 2.2em; -} -.ui-accordion .ui-accordion-noicons { - padding-left: .7em; -} -.ui-accordion .ui-accordion-icons .ui-accordion-icons { - padding-left: 2.2em; -} -.ui-accordion .ui-accordion-header .ui-accordion-header-icon { - position: absolute; - left: .5em; - top: 50%; - margin-top: -8px; -} -.ui-accordion .ui-accordion-content { - padding: 1em 2.2em; - border-top: 0; - overflow: auto; -} -.ui-autocomplete { - position: absolute; - top: 0; - left: 0; - cursor: default; -} -.ui-button { - display: inline-block; - position: relative; - padding: 0; - line-height: normal; - margin-right: .1em; - cursor: pointer; - vertical-align: middle; - text-align: center; - overflow: visible; /* removes extra width in IE */ -} -.ui-button, -.ui-button:link, -.ui-button:visited, -.ui-button:hover, -.ui-button:active { - text-decoration: none; -} -/* to make room for the icon, a width needs to be set here */ -.ui-button-icon-only { - width: 2.2em; -} -/* button elements seem to need a little more width */ -button.ui-button-icon-only { - width: 2.4em; -} -.ui-button-icons-only { - width: 3.4em; -} -button.ui-button-icons-only { - width: 3.7em; -} - -/* button text element */ -.ui-button .ui-button-text { - display: block; - line-height: normal; -} -.ui-button-text-only .ui-button-text { - padding: .4em 1em; -} -.ui-button-icon-only .ui-button-text, -.ui-button-icons-only .ui-button-text { - padding: .4em; - text-indent: -9999999px; -} -.ui-button-text-icon-primary .ui-button-text, -.ui-button-text-icons .ui-button-text { - padding: .4em 1em .4em 2.1em; -} -.ui-button-text-icon-secondary .ui-button-text, -.ui-button-text-icons .ui-button-text { - padding: .4em 2.1em .4em 1em; -} -.ui-button-text-icons .ui-button-text { - padding-left: 2.1em; - padding-right: 2.1em; -} -/* no icon support for input elements, provide padding by default */ -input.ui-button { - padding: .4em 1em; -} - -/* button icon element(s) */ -.ui-button-icon-only .ui-icon, -.ui-button-text-icon-primary .ui-icon, -.ui-button-text-icon-secondary .ui-icon, -.ui-button-text-icons .ui-icon, -.ui-button-icons-only .ui-icon { - position: absolute; - top: 50%; - margin-top: -8px; -} -.ui-button-icon-only .ui-icon { - left: 50%; - margin-left: -8px; -} -.ui-button-text-icon-primary .ui-button-icon-primary, -.ui-button-text-icons .ui-button-icon-primary, -.ui-button-icons-only .ui-button-icon-primary { - left: .5em; -} -.ui-button-text-icon-secondary .ui-button-icon-secondary, -.ui-button-text-icons .ui-button-icon-secondary, -.ui-button-icons-only .ui-button-icon-secondary { - right: .5em; -} - -/* button sets */ -.ui-buttonset { - margin-right: 7px; -} -.ui-buttonset .ui-button { - margin-left: 0; - margin-right: -.3em; -} - -/* workarounds */ -/* reset extra padding in Firefox, see h5bp.com/l */ -input.ui-button::-moz-focus-inner, -button.ui-button::-moz-focus-inner { - border: 0; - padding: 0; -} -.ui-datepicker { - width: 17em; - padding: .2em .2em 0; - display: none; -} -.ui-datepicker .ui-datepicker-header { - position: relative; - padding: .2em 0; -} -.ui-datepicker .ui-datepicker-prev, -.ui-datepicker .ui-datepicker-next { - position: absolute; - top: 2px; - width: 1.8em; - height: 1.8em; -} -.ui-datepicker .ui-datepicker-prev-hover, -.ui-datepicker .ui-datepicker-next-hover { - top: 1px; -} -.ui-datepicker .ui-datepicker-prev { - left: 2px; -} -.ui-datepicker .ui-datepicker-next { - right: 2px; -} -.ui-datepicker .ui-datepicker-prev-hover { - left: 1px; -} -.ui-datepicker .ui-datepicker-next-hover { - right: 1px; -} -.ui-datepicker .ui-datepicker-prev span, -.ui-datepicker .ui-datepicker-next span { - display: block; - position: absolute; - left: 50%; - margin-left: -8px; - top: 50%; - margin-top: -8px; -} -.ui-datepicker .ui-datepicker-title { - margin: 0 2.3em; - line-height: 1.8em; - text-align: center; -} -.ui-datepicker .ui-datepicker-title select { - font-size: 1em; - margin: 1px 0; -} -.ui-datepicker select.ui-datepicker-month-year { - width: 100%; -} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { - width: 49%; -} -.ui-datepicker table { - width: 100%; - font-size: .9em; - border-collapse: collapse; - margin: 0 0 .4em; -} -.ui-datepicker th { - padding: .7em .3em; - text-align: center; - font-weight: bold; - border: 0; -} -.ui-datepicker td { - border: 0; - padding: 1px; -} -.ui-datepicker td span, -.ui-datepicker td a { - display: block; - padding: .2em; - text-align: right; - text-decoration: none; -} -.ui-datepicker .ui-datepicker-buttonpane { - background-image: none; - margin: .7em 0 0 0; - padding: 0 .2em; - border-left: 0; - border-right: 0; - border-bottom: 0; -} -.ui-datepicker .ui-datepicker-buttonpane button { - float: right; - margin: .5em .2em .4em; - cursor: pointer; - padding: .2em .6em .3em .6em; - width: auto; - overflow: visible; -} -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { - float: left; -} - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { - width: auto; -} -.ui-datepicker-multi .ui-datepicker-group { - float: left; -} -.ui-datepicker-multi .ui-datepicker-group table { - width: 95%; - margin: 0 auto .4em; -} -.ui-datepicker-multi-2 .ui-datepicker-group { - width: 50%; -} -.ui-datepicker-multi-3 .ui-datepicker-group { - width: 33.3%; -} -.ui-datepicker-multi-4 .ui-datepicker-group { - width: 25%; -} -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { - border-left-width: 0; -} -.ui-datepicker-multi .ui-datepicker-buttonpane { - clear: left; -} -.ui-datepicker-row-break { - clear: both; - width: 100%; - font-size: 0; -} - -/* RTL support */ -.ui-datepicker-rtl { - direction: rtl; -} -.ui-datepicker-rtl .ui-datepicker-prev { - right: 2px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-next { - left: 2px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-prev:hover { - right: 1px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-next:hover { - left: 1px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane { - clear: right; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button { - float: left; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, -.ui-datepicker-rtl .ui-datepicker-group { - float: right; -} -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { - border-right-width: 0; - border-left-width: 1px; -} -.ui-dialog { - position: absolute; - top: 0; - left: 0; - padding: .2em; - outline: 0; -} -.ui-dialog .ui-dialog-titlebar { - padding: .4em 1em; - position: relative; -} -.ui-dialog .ui-dialog-title { - float: left; - margin: .1em 0; - white-space: nowrap; - width: 90%; - overflow: hidden; - text-overflow: ellipsis; -} -.ui-dialog .ui-dialog-titlebar-close { - position: absolute; - right: .3em; - top: 50%; - width: 21px; - margin: -10px 0 0 0; - padding: 1px; - height: 20px; -} -.ui-dialog .ui-dialog-content { - position: relative; - border: 0; - padding: .5em 1em; - background: none; - overflow: auto; -} -.ui-dialog .ui-dialog-buttonpane { - text-align: left; - border-width: 1px 0 0 0; - background-image: none; - margin-top: .5em; - padding: .3em 1em .5em .4em; -} -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { - float: right; -} -.ui-dialog .ui-dialog-buttonpane button { - margin: .5em .4em .5em 0; - cursor: pointer; -} -.ui-dialog .ui-resizable-se { - width: 12px; - height: 12px; - right: -5px; - bottom: -5px; - background-position: 16px 16px; -} -.ui-draggable .ui-dialog-titlebar { - cursor: move; -} -.ui-menu { - list-style: none; - padding: 2px; - margin: 0; - display: block; - outline: none; -} -.ui-menu .ui-menu { - margin-top: -3px; - position: absolute; -} -.ui-menu .ui-menu-item { - margin: 0; - padding: 0; - width: 100%; - /* support: IE10, see #8844 */ - list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); -} -.ui-menu .ui-menu-divider { - margin: 5px -2px 5px -2px; - height: 0; - font-size: 0; - line-height: 0; - border-width: 1px 0 0 0; -} -.ui-menu .ui-menu-item a { - text-decoration: none; - display: block; - padding: 2px .4em; - line-height: 1.5; - min-height: 0; /* support: IE7 */ - font-weight: normal; -} -.ui-menu .ui-menu-item a.ui-state-focus, -.ui-menu .ui-menu-item a.ui-state-active { - font-weight: normal; - margin: -1px; -} - -.ui-menu .ui-state-disabled { - font-weight: normal; - margin: .4em 0 .2em; - line-height: 1.5; -} -.ui-menu .ui-state-disabled a { - cursor: default; -} - -/* icon support */ -.ui-menu-icons { - position: relative; -} -.ui-menu-icons .ui-menu-item a { - position: relative; - padding-left: 2em; -} - -/* left-aligned */ -.ui-menu .ui-icon { - position: absolute; - top: .2em; - left: .2em; -} - -/* right-aligned */ -.ui-menu .ui-menu-icon { - position: static; - float: right; -} -.ui-progressbar { - height: 2em; - text-align: left; - overflow: hidden; -} -.ui-progressbar .ui-progressbar-value { - margin: -1px; - height: 100%; -} -.ui-progressbar .ui-progressbar-overlay { - background: url("images/animated-overlay.gif"); - height: 100%; - filter: alpha(opacity=25); - opacity: 0.25; -} -.ui-progressbar-indeterminate .ui-progressbar-value { - background-image: none; -} -.ui-slider { - position: relative; - text-align: left; -} -.ui-slider .ui-slider-handle { - position: absolute; - z-index: 2; - width: 1.2em; - height: 1.2em; - cursor: default; -} -.ui-slider .ui-slider-range { - position: absolute; - z-index: 1; - font-size: .7em; - display: block; - border: 0; - background-position: 0 0; -} - -/* For IE8 - See #6727 */ -.ui-slider.ui-state-disabled .ui-slider-handle, -.ui-slider.ui-state-disabled .ui-slider-range { - filter: inherit; -} - -.ui-slider-horizontal { - height: .8em; -} -.ui-slider-horizontal .ui-slider-handle { - top: -.3em; - margin-left: -.6em; -} -.ui-slider-horizontal .ui-slider-range { - top: 0; - height: 100%; -} -.ui-slider-horizontal .ui-slider-range-min { - left: 0; -} -.ui-slider-horizontal .ui-slider-range-max { - right: 0; -} - -.ui-slider-vertical { - width: .8em; - height: 100px; -} -.ui-slider-vertical .ui-slider-handle { - left: -.3em; - margin-left: 0; - margin-bottom: -.6em; -} -.ui-slider-vertical .ui-slider-range { - left: 0; - width: 100%; -} -.ui-slider-vertical .ui-slider-range-min { - bottom: 0; -} -.ui-slider-vertical .ui-slider-range-max { - top: 0; -} -.ui-spinner { - position: relative; - display: inline-block; - overflow: hidden; - padding: 0; - vertical-align: middle; -} -.ui-spinner-input { - border: none; - background: none; - color: inherit; - padding: 0; - margin: .2em 0; - vertical-align: middle; - margin-left: .4em; - margin-right: 22px; -} -.ui-spinner-button { - width: 16px; - height: 50%; - font-size: .5em; - padding: 0; - margin: 0; - text-align: center; - position: absolute; - cursor: default; - display: block; - overflow: hidden; - right: 0; -} -/* more specificity required here to overide default borders */ -.ui-spinner a.ui-spinner-button { - border-top: none; - border-bottom: none; - border-right: none; -} -/* vertical centre icon */ -.ui-spinner .ui-icon { - position: absolute; - margin-top: -8px; - top: 50%; - left: 0; -} -.ui-spinner-up { - top: 0; -} -.ui-spinner-down { - bottom: 0; -} - -/* TR overrides */ -.ui-spinner .ui-icon-triangle-1-s { - /* need to fix icons sprite */ - background-position: -65px -16px; -} -.ui-tabs { - position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ - padding: .2em; -} -.ui-tabs .ui-tabs-nav { - margin: 0; - padding: .2em .2em 0; -} -.ui-tabs .ui-tabs-nav li { - list-style: none; - float: left; - position: relative; - top: 0; - margin: 1px .2em 0 0; - border-bottom-width: 0; - padding: 0; - white-space: nowrap; -} -.ui-tabs .ui-tabs-nav li a { - float: left; - padding: .5em 1em; - text-decoration: none; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active { - margin-bottom: -1px; - padding-bottom: 1px; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active a, -.ui-tabs .ui-tabs-nav li.ui-state-disabled a, -.ui-tabs .ui-tabs-nav li.ui-tabs-loading a { - cursor: text; -} -.ui-tabs .ui-tabs-nav li a, /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { - cursor: pointer; -} -.ui-tabs .ui-tabs-panel { - display: block; - border-width: 0; - padding: 1em 1.4em; - background: none; -} -.ui-tooltip { - padding: 8px; - position: absolute; - z-index: 9999; - max-width: 300px; - -webkit-box-shadow: 0 0 5px #aaa; - box-shadow: 0 0 5px #aaa; -} -body .ui-tooltip { - border-width: 2px; -} - -/* Component containers -----------------------------------*/ -.ui-widget { - font-family: Verdana,Arial,sans-serif; - font-size: 1.1em; -} -.ui-widget .ui-widget { - font-size: 1em; -} -.ui-widget input, -.ui-widget select, -.ui-widget textarea, -.ui-widget button { - font-family: Verdana,Arial,sans-serif; - font-size: 1em; -} -.ui-widget-content { - border: 1px solid #aaaaaa; - background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; - color: #222222; -} -.ui-widget-content a { - color: #222222; -} -.ui-widget-header { - border: 1px solid #aaaaaa; - background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; - color: #222222; - font-weight: bold; -} -.ui-widget-header a { - color: #222222; -} - -/* Interaction states -----------------------------------*/ -.ui-state-default, -.ui-widget-content .ui-state-default, -.ui-widget-header .ui-state-default { - border: 1px solid #d3d3d3; - background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; - font-weight: normal; - color: #555555; -} -.ui-state-default a, -.ui-state-default a:link, -.ui-state-default a:visited { - color: #555555; - text-decoration: none; -} -.ui-state-hover, -.ui-widget-content .ui-state-hover, -.ui-widget-header .ui-state-hover, -.ui-state-focus, -.ui-widget-content .ui-state-focus, -.ui-widget-header .ui-state-focus { - border: 1px solid #999999; - background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; - font-weight: normal; - color: #212121; -} -.ui-state-hover a, -.ui-state-hover a:hover, -.ui-state-hover a:link, -.ui-state-hover a:visited { - color: #212121; - text-decoration: none; -} -.ui-state-active, -.ui-widget-content .ui-state-active, -.ui-widget-header .ui-state-active { - border: 1px solid #aaaaaa; - background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; - font-weight: normal; - color: #212121; -} -.ui-state-active a, -.ui-state-active a:link, -.ui-state-active a:visited { - color: #212121; - text-decoration: none; -} - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, -.ui-widget-content .ui-state-highlight, -.ui-widget-header .ui-state-highlight { - border: 1px solid #fcefa1; - background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; - color: #363636; -} -.ui-state-highlight a, -.ui-widget-content .ui-state-highlight a, -.ui-widget-header .ui-state-highlight a { - color: #363636; -} -.ui-state-error, -.ui-widget-content .ui-state-error, -.ui-widget-header .ui-state-error { - border: 1px solid #cd0a0a; - background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; - color: #cd0a0a; -} -.ui-state-error a, -.ui-widget-content .ui-state-error a, -.ui-widget-header .ui-state-error a { - color: #cd0a0a; -} -.ui-state-error-text, -.ui-widget-content .ui-state-error-text, -.ui-widget-header .ui-state-error-text { - color: #cd0a0a; -} -.ui-priority-primary, -.ui-widget-content .ui-priority-primary, -.ui-widget-header .ui-priority-primary { - font-weight: bold; -} -.ui-priority-secondary, -.ui-widget-content .ui-priority-secondary, -.ui-widget-header .ui-priority-secondary { - opacity: .7; - filter:Alpha(Opacity=70); - font-weight: normal; -} -.ui-state-disabled, -.ui-widget-content .ui-state-disabled, -.ui-widget-header .ui-state-disabled { - opacity: .35; - filter:Alpha(Opacity=35); - background-image: none; -} -.ui-state-disabled .ui-icon { - filter:Alpha(Opacity=35); /* For IE8 - See #6059 */ -} - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - width: 16px; - height: 16px; -} -.ui-icon, -.ui-widget-content .ui-icon { - background-image: url(images/ui-icons_222222_256x240.png); -} -.ui-widget-header .ui-icon { - background-image: url(images/ui-icons_222222_256x240.png); -} -.ui-state-default .ui-icon { - background-image: url(images/ui-icons_888888_256x240.png); -} -.ui-state-hover .ui-icon, -.ui-state-focus .ui-icon { - background-image: url(images/ui-icons_454545_256x240.png); -} -.ui-state-active .ui-icon { - background-image: url(images/ui-icons_454545_256x240.png); -} -.ui-state-highlight .ui-icon { - background-image: url(images/ui-icons_2e83ff_256x240.png); -} -.ui-state-error .ui-icon, -.ui-state-error-text .ui-icon { - background-image: url(images/ui-icons_cd0a0a_256x240.png); -} - -/* positioning */ -.ui-icon-blank { background-position: 16px 16px; } -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-on { background-position: -96px -144px; } -.ui-icon-radio-off { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, -.ui-corner-top, -.ui-corner-left, -.ui-corner-tl { - border-top-left-radius: 4px; -} -.ui-corner-all, -.ui-corner-top, -.ui-corner-right, -.ui-corner-tr { - border-top-right-radius: 4px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-left, -.ui-corner-bl { - border-bottom-left-radius: 4px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-right, -.ui-corner-br { - border-bottom-right-radius: 4px; -} - -/* Overlays */ -.ui-widget-overlay { - background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; - opacity: .3; - filter: Alpha(Opacity=30); -} -.ui-widget-shadow { - margin: -8px 0 0 -8px; - padding: 8px; - background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; - opacity: .3; - filter: Alpha(Opacity=30); - border-radius: 8px; -} diff --git a/public/assets/css/smoothness/jquery-ui-1.10.3.custom.min.css b/public/assets/css/smoothness/jquery-ui-1.10.3.custom.min.css deleted file mode 100755 index daebf8db..00000000 --- a/public/assets/css/smoothness/jquery-ui-1.10.3.custom.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! jQuery UI - v1.10.3 - 2013-12-11 -* http://jqueryui.com -* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px -* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ - -.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file diff --git a/public/assets/img/apis/server.png b/public/assets/img/apis/server.png deleted file mode 100644 index 22df96b2d6d79b49f7a773d71744da778d33537f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1442 zcmV;T1zq}yP)BFb>he~dmd`XNA6+)7<&&MJ|cl{zy7*5vZry1VZcbck4o2tq%Gm|)8`V9-lax~5+<8-7XaN1E&ucrmAPray0OAB(^jx5@Uie@TIQIEQ zQyQ>>TN-P%T~V~<0zfhG7*Kk0p#iWw095LV?9@^LkOz*EnAZ~4tf~n;2z^g>{|^I> zmlZ9mSNS9tlpq{GHI}kl8UTtZdP2pev+IP;@q!w_Nr^48Q^n~oHv^9AQAzRVj28sJ zeCo+g!IDFO@gxnPpjOvahu47gG~h6?bOu~UYDI5d*QgN{S_`NO^_?6;-~wzjvh*w< zZz%RJb`4=)psXM|O4=K)t%1b+EL2?_ho|bR>o-?lzS1;=HS$;dtG#D_a*N9XiYW^; zzzPD;tEgo`yrUiN`ehtsRpls!lA$J=E6cycubT5MPMH93EC)kCf@-R*49B4m7<&fE zb3eeEjy(W16W;URYvG%>-&l`VrP!v52!Y4zJ-0T6%4=pA(EIHLkO)F47ydrjr=Krx ze*{cBL6?!@(oi~B2LN9BXc$j(V4U7bAMS}XQ$J%xKdZ;P+69m4S znTo>eCq`TGZAq|X=PX2&35{1>mZ3iq8^_NDF9pF&4MZ=12r|i{=$%R01z}hz1_DtZ z7>H{IcHL|SVU6Yl06qgA6DrGloSqxdIa-I_Ab&|J!=7-H=+7b6psOM`4IhB(*AN92 z5oA-TwEDT=TUHh@)PSo|r~U_3@Hsu_@Z^RGcy3??yt=akcofr)E0|U*!G3E%|IzS( z0lDzATOQ@efOnlOYo1F36oPv=4+Fqk(jPHUh0%HbD3BA=vKsty|VXcmJ67 z!e-OJ&{>9>OX79FtH2OYV?KETFUl+q<=8}ytjfUvdV%I`TQ@>)|0q1LZBwf6>Hivb zv^40!ZSDiW=I|L$C8PnL0R~bpZj?y@15{nJON)`cxR9z%%Y?qcQxGkQz^6l*{juS3 z9EbqKK}CEK@_4XK!O6`ut>FYXUa2Lt284jxLi=Jal zY5HkQNBrZ}0yHyCBV(;V$024J$PO}qWm{!|NCzQ`@-2Tw?gOcMj9`?P9LYX_%t|8|_*ui`|6y^?wrE w&r}H)3xGH-!)8J82TeAQZH~au-2VzN07)pwncX#nQ2+n{07*qoM6N<$f&)>YU;qFB diff --git a/public/assets/img/generic-profile-photo-small.png b/public/assets/img/generic-profile-photo-small.png deleted file mode 100755 index 029d3e1a5b1fa51c8f683ba8acdf938ffbcae279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3861 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 XmL53-_<|K`00000NkvXXu0mjfIh~SC diff --git a/public/assets/img/generic-profile-photo.png b/public/assets/img/generic-profile-photo.png deleted file mode 100755 index 2fcfed826194c80cb8a707accf87629cfc4baee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2176 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 B7G?kd diff --git a/public/assets/img/glyphicons-halflings.png b/public/assets/img/glyphicons-halflings.png deleted file mode 100644 index a9969993201f9cee63cf9f49217646347297b643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12799 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 diff --git a/public/assets/img/oauth2.default.logo.png b/public/assets/img/oauth2.default.logo.png deleted file mode 100644 index ee2aab2244a7b686038c1553ed010c7bf57cd226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14587 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 diff --git a/public/assets/img/openstack-logo-full.svg b/public/assets/img/openstack-logo-full.svg deleted file mode 100644 index a2f42a10..00000000 --- a/public/assets/img/openstack-logo-full.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/assets/js/admin/banned-ips.js b/public/assets/js/admin/banned-ips.js deleted file mode 100644 index 1ac91307..00000000 --- a/public/assets/js/admin/banned-ips.js +++ /dev/null @@ -1,42 +0,0 @@ -jQuery(document).ready(function($){ - - $('#server-admin','#main-menu').addClass('active'); - - if($('#ips-table tr').length===1){ - $('#ips-info').show(); - $('#ips-table').hide(); - } - else{ - $('#ips-info').hide(); - $('#ips-table').show(); - } - - $("body").on('click',".revoke-ip",function(event){ - if(confirm("Are you sure that you want to revoke this banned ip?")){ - var url = $(this).attr('href'); - var ip_id = $(this).attr('data-ip-id'); - $.ajax( - { - type: "DELETE", - url: url, - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - //load data... - $('#'+ip_id,'#body-ips').remove(); - - if($('#ips-table tr').length===1){ - $('#ips-info').show(); - $('#ips-table').hide(); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); -}); \ No newline at end of file diff --git a/public/assets/js/admin/edit-group.js b/public/assets/js/admin/edit-group.js deleted file mode 100644 index c4a5f3ce..00000000 --- a/public/assets/js/admin/edit-group.js +++ /dev/null @@ -1,193 +0,0 @@ -// constructor -function GroupMembersCrud(urls, perPage) { - var actions = 'Remove'; - this.urls = urls; - var _this = this; - var templatePage = $('' + - '' + - '' + - '' + - ' ' + actions + '' + - ''); - - var directivesPage = { - 'tr': { - 'user<-context': { - 'td.user-id': 'user.id', - 'td.user-fullname': function(arg){ - return arg.item.first_name+' '+arg.item.last_name; - }, - 'td.user-email': 'user.email', - 'a.delete-item@href': function (arg) { - var id = arg.item.id; - var href = _this.urls.delete; - return href.replace('@id', id); - }, - } - } - }; - - // Chain constructor with call - BasicCrud.call(this, urls, perPage, templatePage, directivesPage, { - 'delete_item.title': 'Are you sure to Remove this User from Group?', - 'delete_item.text': 'This is an non reversible process!', - }); -} - -GroupMembersCrud.prototype = Object.create(BasicCrud.prototype); -GroupMembersCrud.prototype.constructor = GroupMembersCrud; - -GroupMembersCrud.prototype._buildFilters = function () { - var term = encodeURIComponent(this.searchTerm); - return 'filter=first_name=@'+term+',last_name=@'+term+',email=@'+term+',full_name=@'+term; -}; - -GroupMembersCrud.prototype.init = function () { - BasicCrud.prototype.init.call(this); - var _this = this; - jQuery(document).ready(function ($) { - - var users = new Bloodhound({ - datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), - queryTokenizer: Bloodhound.tokenizers.whitespace, - remote: { - url: urls.fetchUsers, - wildcard: '%QUERY%', - prepare: function (query, settings) { - settings.url = urls.fetchUsers+'?filter=first_name=@'+query+',last_name=@'+query+',email=@'+query+',full_name=@'+query; - return settings; - }, - transform: function(input){ - var page = input.data; - return page; - } - } - }); - - $("body").on('click', "#btn-add-user", function (event) { - var newUserId = $('#add-user').val(); - if(newUserId != '') { - $('#add-user').val(''); - $('#add-user').tagsinput('removeAll'); - handlePlaceHolder(); - var url = _this.urls.add.replace('@id', newUserId); - $.ajax( - { - type: "PUT", - url: url, - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout: 60000, - success: function (data, textStatus, jqXHR) { - _this.loadPage(); - - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - - - $('#add-user').tagsinput({ - maxTags: 1, - itemValue: function(item) { - return item.id; - }, - itemText: function(item) { - return item.first_name + ' ' + item.last_name+' ('+item.email+')' ; - }, - freeInput: false, - allowDuplicates: false, - typeaheadjs: [ - { - highlight: true, - minLength: 1 - }, - { - name: 'users', - display: function(item) { - return item.first_name + ' ' + item.last_name+' ('+item.email+')' ; - }, - templates: { - suggestion: function (item) { - return '

' + item.first_name + ' ' + item.last_name +' ('+item.email+')

'; - } - }, - source: users, - limit: 10 - } - ] - }); - - function handlePlaceHolder() - { - if($('#add-user').val()) - { - $('.bootstrap-tagsinput input').attr('placeholder', ''); - } - else - { - $('.bootstrap-tagsinput input').attr('placeholder',$('#add-user').attr('data-placeholder')); - } - } - - $('#add-user').on('itemRemoved', function(event) { - // event.item: contains the item - handlePlaceHolder(); - }); - - $('#add-user').on('itemAdded', function(event) { - // event.item: contains the item - handlePlaceHolder(); - }); - - var form = $('#group-form'); - var validator = form.validate({ - rules: { - "name": {required: true, free_text: true, rangelength: [1, 512]}, - "slug": {required: true, free_text: true, rangelength: [1, 255]}, - } - }); - - form.submit(function( event ) { - var is_valid = validator.valid(); - if (is_valid){ - $('body').ajax_loader(); - validator.resetForm(); - var group = form.serializeForm(); - var href = $(this).attr('action'); - - $.ajax( - { - type: "PUT", - url: href, - data: JSON.stringify(group), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - $('body').ajax_loader('stop'); - swal({ - title: "Success!", - type: "success", - text: "Group info updated successfully!", - }); - - }, - error: function (jqXHR, textStatus, errorThrown) { - $('body').ajax_loader('stop'); - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - }); -}; \ No newline at end of file diff --git a/public/assets/js/admin/edit-user.js b/public/assets/js/admin/edit-user.js deleted file mode 100644 index ddbe011b..00000000 --- a/public/assets/js/admin/edit-user.js +++ /dev/null @@ -1,224 +0,0 @@ -$(document).ready(function() { - // groups - $('body').ajax_loader(); - - var options = {}; - - options.ui = - { - showPopover: false, - showErrors: true, - showProgressBar: true, - showVerdictsInsideProgressBar: true, - }; - - options.rules = - { - activated: { - wordTwoCharacterClasses: true, - wordRepetitions: true - } - }; - - $(':password').pwstrength(options); - - var groups = new Bloodhound({ - datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), - queryTokenizer: Bloodhound.tokenizers.whitespace, - remote: { - url: urls.fetchGroups, - wildcard: '%QUERY%', - prepare: function (query, settings) { - settings.url = urls.fetchGroups+'?page=1&per_page=10&filter[]=name=@'+query+',slug=@'+query+'&filter[]=active==1&order=name,slug'; - return settings; - }, - transform: function(input){ - var page = input.data; - return page; - } - } - }); - - $('#groups').tagsinput({ - itemValue: function(item) { - return item.id; - }, - itemText: function(item) { - return item.name - }, - freeInput: false, - allowDuplicates: false, - typeaheadjs: [ - { - highlight: true, - minLength: 1 - }, - { - name: 'groups', - display: function(item) { - return item.name; - }, - templates: { - suggestion: function (item) { - return '

' + item.name + '

'; - } - }, - source: groups, - limit: 20 - } - ] - }); - - for(var group of current_groups) - { - $('#groups').tagsinput('add', group); - } - - var form = $('#user-form'); - var validator = form.validate({ - rules: { - "first_name" : {required: true}, - "last_name" : {required: true}, - "email" : {required: true, email: true} - } - }); - - //$('#bio').summernote(); - //$('#statement_of_interest').summernote(); - - var simplemdeBio = new SimpleMDE({ element: $("#bio")[0] }); - var simplemdeStatement = new SimpleMDE({ element: $("#statement_of_interest")[0] }); - - $('#birthday').datepicker(); - - $('#country_iso_code').chosen({width: '100%', height: '34px'}); - $("#country_iso_code").val(current_country); - $("#country_iso_code").trigger("chosen:updated"); - - $('#country_iso_code',form).change(function () { - validator.resetForm(); - }); - - $('#language').chosen({width: '100%', height: '34px'}); - $('#language',form).change(function () { - validator.resetForm(); - }); - - $("#language").val(current_language); - $("#language").trigger("chosen:updated"); - - if(current_gender != '') { - $("#gender").val(current_gender); - if(current_gender == 'Specify'){ - $('#gender_specify').removeClass('hide').fadeIn(); - } else { - $('#gender_specify').fadeOut(); - $('#gender_specify').val(''); - } - } - - $('#gender', form).change(function () { - var value = $(this).val(); - if(value == 'Specify'){ - $('#gender_specify').removeClass('hide').fadeIn(); - } else { - $('#gender_specify').fadeOut(); - $('#gender_specify').val(''); - } - }); - - form.submit(function( event ) { - var is_valid = validator.valid(); - if (is_valid){ - $('body').ajax_loader(); - validator.resetForm(); - var user = form.serializeForm(); - - var birthday = user.birthday; - delete user.birthday; - if(typeof birthday != "undefined" && birthday != '') { - user.birthday = moment(birthday).unix(); - } - else - { - user.birthday = ''; - } - - // get values - user.bio = simplemdeBio.value(); - user.statement_of_interest = simplemdeStatement.value(); - - var groups = user.groups; - delete user.groups; - user.groups = []; - if(typeof groups != "undefined" && groups != '') { - user.groups = groups.split(","); - for (var i = 0; i < user.groups.length; i++) { - user.groups[i] = parseInt(user.groups[i], 10); - } - } - - var href = $(this).attr('action'); - - var data = new FormData(); - - data.append('user', JSON.stringify(user)); - - if($('#pic', form)[0].files.length > 0) - data.append('pic', $('#pic', form)[0].files[0]); - - $.ajax( - { - type: "PUT", - url: href, - data: data, - cache: false, - contentType: false, - processData: false, - timeout:60000, - success: function (data, textStatus, jqXHR) { - $('body').ajax_loader('stop'); - swal({ - title: "Success!", - type: "success", - text: "User info updated successfully!", - }); - location.reload(true); - }, - error: function (jqXHR, textStatus, errorThrown) { - $('body').ajax_loader('stop'); - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - - function readURL(input) { - if (input.files && input.files[0]) { - var reader = new FileReader(); - - reader.onload = function(e) { - $('#img-pic').attr('src', e.target.result); - } - reader.readAsDataURL(input.files[0]); - } - } - - $("#pic", form).change(function() { - readURL(this); - }); - - $("#password_container").hide(); - - $("body").on("click", ".change-password-link", function(event){ - $(this).hide(); - $("#password_container").show(); - event.preventDefault(); - return false; - }); - - $('body').ajax_loader('stop'); -}); \ No newline at end of file diff --git a/public/assets/js/admin/groups.js b/public/assets/js/admin/groups.js deleted file mode 100644 index fd32dd36..00000000 --- a/public/assets/js/admin/groups.js +++ /dev/null @@ -1,119 +0,0 @@ -// constructor -function GroupsCrud(urls, perPage) { - var actions = 'Edit' + - ' Delete'; - this.urls = urls; - var _this = this; - var templatePage = $('' + - '' + - '' + - '' + - '' + - ' ' + actions + '' + - ''); - - var directivesPage = { - 'tr': { - 'group<-context': { - 'td.group-identifier': 'group.id', - 'td.group-name': 'group.name', - 'td.group-slug': 'group.slug', - '.group-active-checkbox@value': 'group.id', - '.group-active-checkbox@checked': function (arg) { - return arg.item.active ? 'true' : ''; - }, - '.group-active-checkbox@id': function (arg) { - return 'group-active_' + arg.item.id; - }, - 'a.edit-item@href': function (arg) { - var id = arg.item.id; - var href = _this.urls.edit; - return href.replace('@id', id); - }, - 'a.delete-item@href': function (arg) { - var id = arg.item.id; - var href = _this.urls.delete; - return href.replace('@id', id); - }, - } - } - }; - - // Chain constructor with call - BasicCrud.call(this, urls, perPage, templatePage, directivesPage, { - 'delete_item.title': 'Are you sure to delete this User Group?', - 'delete_item.text': 'This is an non reversible process!', - }); -} - -GroupsCrud.prototype = Object.create(BasicCrud.prototype); -GroupsCrud.prototype.constructor = GroupsCrud; - -GroupsCrud.prototype._buildFilters = function () { - var term = encodeURIComponent(this.searchTerm); - return 'filter=name=@'+term+',slug=@'+term; -}; - -GroupsCrud.prototype.init = function () { - BasicCrud.prototype.init.call(this); - var _this = this; - // default sort - this.orderBy= encodeURI('+name'); - - var add_item_form = $('#form-add-item'); - var add_item_dialog = $("#dialog-form-add-item"); - - var validator_add_item = add_item_form.validate({ - rules: { - "name": {required: true, free_text: true, rangelength: [1, 512]}, - "slug": {required: true, free_text: true, rangelength: [1, 255]}, - } - }); - - add_item_dialog.modal({ - show: false, - backdrop: "static" - }); - - add_item_dialog.on('hidden.bs.modal', function () { - add_item_form.cleanForm(); - validator_add_item.resetForm(); - $('.add-item-button').removeAttr('disabled'); - }) - - $("body").on('click', ".add-item-button", function (event) { - add_item_dialog.modal('show'); - $('.add-item-button').attr('disabled', 'disabled'); - event.preventDefault(); - return false; - }); - - $("body").on('click',"#save-item", function(event){ - var is_valid = add_item_form.valid(); - if (is_valid){ - var url = $(this).attr('href'); - $('#save-item').attr('disabled','disabled'); - var group = add_item_form.serializeForm(); - - $.ajax({ - type: "POST", - url: _this.urls.add, - data: JSON.stringify(group), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - _this.loadPage(); - add_item_dialog.modal('hide'); - $('#save-item').removeAttr('disabled'); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - $('#save-item').removeAttr('disabled'); - } - }); - } - event.preventDefault(); - return false; - }); -}; \ No newline at end of file diff --git a/public/assets/js/admin/server-config.js b/public/assets/js/admin/server-config.js deleted file mode 100644 index d4d584f8..00000000 --- a/public/assets/js/admin/server-config.js +++ /dev/null @@ -1,39 +0,0 @@ -jQuery(document).ready(function($){ - - $('#server-admin','#main-menu').addClass('active'); - - var form_server_config = $("#form-server-configuration"); - - var server_config_validation = form_server_config.validate({ - rules: { - "general-max-failed-login-attempts" : {required: true, number: true }, - "general-max-failed-login-attempts-captcha" : {required: true, number: true }, - "openid-private-association-lifetime" : {required: true, number: true }, - "openid-session-association-lifetime" : {required: true, number: true }, - "openid-nonce-lifetime" : {required: true, number: true }, - "oauth2-auth-code-lifetime" : {required: true, number: true }, - "oauth2-refresh-token-lifetime" : {required: true, number: true }, - "oauth2-access-token-lifetime" : {required: true, number: true }, - "oauth2-id-token-lifetime" : {required: true, number: true }, - "oauth2-id-access-token-revoked-lifetime" : {required: true, number: true }, - "oauth2-id-access-token-void-lifetime" : {required: true, number: true }, - "oauth2-id-refresh-token-revoked-lifetime" : {required: true, number: true }, - "oauth2-id-security-policy-minutes-without-exceptions" : {required: true, number: true }, - "oauth2-id-security-policy-max-bearer-token-disclosure-attempts" : {required: true, number: true }, - "oauth2-id-security-policy-max-invalid-client-exception-attempts" : {required: true, number: true }, - "oauth2-id-security-policy-max-invalid-redeem-auth-code-attempts" : {required: true, number: true }, - "oauth2-id-security-policy-max-invalid-client-credentials-attempts" : {required: true, number: true }, - } - }); - - form_server_config.submit(function( event ) { - var is_valid = form_server_config.valid(); - if (is_valid) - { - server_config_validation.resetForm(); - return true; - } - event.preventDefault(); - return false; - }); -}); diff --git a/public/assets/js/admin/users.js b/public/assets/js/admin/users.js deleted file mode 100644 index cbb801e8..00000000 --- a/public/assets/js/admin/users.js +++ /dev/null @@ -1,238 +0,0 @@ -// constructor -function UsersCrud(urls, perPage) { - var actions = 'Edit' + - ' Delete'; - this.urls = urls; - var _this = this; - var templatePage = $('' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - ' ' + actions + '' + - ''); - - var directivesPage = { - 'tr': { - 'user<-context': { - 'td.user-identifier': 'user.identifier', - 'td.user-fname': 'user.first_name', - 'td.user-lname': 'user.last_name', - 'td.user-email': 'user.email', - 'td.user-spam-type': 'user.spam_type', - 'td.user-last-login': function (arg) { - if (arg.item.last_login_date == null) return 'N/A'; - return moment.unix(arg.item.last_login_date).format(); - }, - '.user-active-checkbox@value': 'user.id', - '.user-active-checkbox@checked': function (arg) { - return arg.item.active ? 'true' : ''; - }, - '.user-active-checkbox@id': function (arg) { - var user_id = arg.item.id; - return 'user-active_' + user_id; - }, - 'a.edit-item@href': function (arg) { - var id = arg.item.id; - var href = _this.urls.edit; - return href.replace('@id', id); - }, - 'a.delete-item@href': function (arg) { - var id = arg.item.id; - var href = _this.urls.delete; - return href.replace('@id', id); - }, - } - } - }; - - // Chain constructor with call - BasicCrud.call(this, urls, perPage, templatePage, directivesPage, { - 'delete_item.title': 'Are you sure to delete this registered User?', - 'delete_item.text': 'This is an non reversible process!', - }); -} - -UsersCrud.prototype = Object.create(BasicCrud.prototype); -UsersCrud.prototype.constructor = UsersCrud; - -UsersCrud.prototype._buildFilters = function () { - var term = encodeURIComponent(this.searchTerm); - return 'filter=first_name=@'+term+',last_name=@'+term+',email=@'+term+',full_name=@'+term; -}; - -UsersCrud.prototype.init = function () { - // Chain parent method - BasicCrud.prototype.init.call(this); - var _this = this; - // default sort - this.orderBy= encodeURI('+email'); - - $("body").on('click', ".user-active-checkbox", function (event) { - var active = $(this).is(':checked'); - var userId = $(this).attr('value'); - var url = active ? _this.urls.unlock : _this.urls.lock; - url = url.replace('@id', userId); - var verb = active ? 'PUT' : 'DELETE'; - - $.ajax( - { - type: verb, - url: url, - contentType: "application/json; charset=utf-8", - success: function (data, textStatus, jqXHR) { - _this.loadPage(); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - }); - - var options = {}; - - options.ui = - { - showPopover: false, - showErrors: true, - showProgressBar: true, - showVerdictsInsideProgressBar: true, - }; - - options.rules = - { - activated: { - wordTwoCharacterClasses: true, - wordRepetitions: true - } - }; - - $(':password').pwstrength(options); - - var groups = new Bloodhound({ - datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), - queryTokenizer: Bloodhound.tokenizers.whitespace, - remote: { - url: _this.urls.fetchGroups, - wildcard: '%QUERY%', - prepare: function (query, settings) { - settings.url = _this.urls.fetchGroups+'?filter[]=name=@'+query+'&filter[]=active==1'; - return settings; - }, - transform: function(input){ - var page = input.data; - return page; - } - } - }); - - $('#groups').tagsinput({ - itemValue: function(item) { - return item.id; - }, - itemText: function(item) { - return item.name - }, - freeInput: false, - allowDuplicates: false, - typeaheadjs: [ - { - highlight: true, - minLength: 1 - }, - { - name: 'groups', - display: function(item) { - return item.name; - }, - templates: { - suggestion: function (item) { - return '

' + item.name + '

'; - } - }, - source: groups, - limit: 10 - } - ] - }); - - var add_item_form = $('#form-add-item'); - var add_item_dialog = $("#dialog-form-add-item"); - - var validator_add_item = add_item_form.validate({ - rules: { - "first_name": {required: true, free_text: true, rangelength: [1, 255]}, - "last_name": {required: true, free_text: true, rangelength: [1, 512]}, - "email": {required: true, email: true}, - password: { - required: true, - minlength: 8 - }, - "password_confirmation": { - minlength: 8, - equalTo: "#password" - }, - } - }); - - add_item_dialog.modal({ - show: false, - backdrop: "static" - }); - - add_item_dialog.on('hidden.bs.modal', function () { - add_item_form.cleanForm(); - validator_add_item.resetForm(); - $('.add-item-button').removeAttr('disabled'); - }) - - $("body").on('click', ".add-item-button", function (event) { - add_item_dialog.modal('show'); - $('.add-item-button').attr('disabled', 'disabled'); - event.preventDefault(); - return false; - }); - - $("body").on('click',"#save-item", function(event){ - var is_valid = add_item_form.valid(); - if (is_valid){ - var url = $(this).attr('href'); - $('#save-item').attr('disabled','disabled'); - var user = add_item_form.serializeForm(); - var groups = user.groups; - delete user.groups; - - if(typeof groups != "undefined" && groups != '') { - user.groups = groups.split(","); - for (var i = 0; i < user.groups.length; i++) { - user.groups[i] = parseInt(user.groups[i], 10); - } - } - - $.ajax({ - type: "POST", - url: _this.urls.add, - data: JSON.stringify(user), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - _this.loadPage(); - add_item_dialog.modal('hide'); - $('#save-item').removeAttr('disabled'); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - $('#save-item').removeAttr('disabled'); - } - }); - } - event.preventDefault(); - return false; - }); - -}; diff --git a/public/assets/js/ajax.utils.js b/public/assets/js/ajax.utils.js deleted file mode 100644 index 595e57f2..00000000 --- a/public/assets/js/ajax.utils.js +++ /dev/null @@ -1,73 +0,0 @@ -function ajaxError(jqXHR, textStatus, errorThrown){ - var HTTP_status = jqXHR.status; - if(HTTP_status != 200){ - response = $.parseJSON(jqXHR.responseText); - if(HTTP_status == 412 ){ - var msg = ''; - for(var property in response.messages) { - msg +='* '+ response.messages[property]+'\n'; - } - displayErrorMessage('Validation error', msg); - return; - } - if(HTTP_status == 404 ){ - var msg = ''; - for(var property in response.messages) { - msg +='* '+response.messages[property]+'\n'; - } - displayErrorMessage('Entity Not Found', msg); - return; - } - displayErrorMessage('You got an error!',response.error); - return; - } - displayErrorMessage('You got an error!','server error'); -} - -function displayErrorMessage(title, message){ - $('#modal_error').remove(); - var modal = $(''); - $('body').append(modal); - modal.modal({show:true}); - - modal.on('hidden.bs.modal', function (e) { - $('.modal-backdrop').remove(); - }) -} - -function displaySuccessMessage(message, $element){ - var element_id = $element.attr('id'); - var $alert = $('.alert-success').filter(function() { - return $(this).attr("for") === element_id; - }); - if($alert.length){ - $('.msg',$alert).html(message || ""); - } - else{ - var $alert = $('').attr('for',element_id); - $('.msg',$alert).html(message || ""); - $alert.insertBefore($element); - } -} - -function displayAlert(msg,after){ - $('.alert-danger').remove(); - var alert = $(''); - alert.insertAfter(after); -} \ No newline at end of file diff --git a/public/assets/js/auth/email-verification.js b/public/assets/js/auth/email-verification.js deleted file mode 100644 index 94e5d4ea..00000000 --- a/public/assets/js/auth/email-verification.js +++ /dev/null @@ -1,33 +0,0 @@ -(function( $ ){ - - $(document).ready(function($){ - - var form = $('#form-verification'); - - var validator = form.validate({ - rules: { - - email: { - required: true - }, - 'g_recaptcha_hidden': {required: true} - }, - messages: { - 'g_recaptcha_hidden': { required: 'Please confirm that you are not a robot.'} - } - }); - - form.submit(function(e){ - var is_valid = $(this).valid(); - if (!is_valid) { - e.preventDefault(); - return false; - } - $('.btn-primary').attr('disabled', 'disabled'); - return true; - }); - - }); - -// End of closure. -}( jQuery )); \ No newline at end of file diff --git a/public/assets/js/auth/registration.js b/public/assets/js/auth/registration.js deleted file mode 100644 index 42e89ffd..00000000 --- a/public/assets/js/auth/registration.js +++ /dev/null @@ -1,72 +0,0 @@ -(function( $ ){ - - $(document).ready(function($){ - - var options = {}; - - options.ui = - { - showPopover: false, - showErrors: true, - showProgressBar: true, - showVerdictsInsideProgressBar: true, - }; - - options.rules = - { - activated: { - wordTwoCharacterClasses: true, - wordRepetitions: true - } - }; - - $(':password').pwstrength(options); - - $('#country_iso_code').chosen({width: '100%', height: '34px'}); - - var form = $('#form-registration'); - - var validator = form.validate({ - rules: { - first_name: { - required: true, - }, - last_name: { - required: true, - }, - "country_iso_code": { - required: true, - }, - password: { - required: true, - minlength: 8 - }, - email: { - required: true - }, - "password_confirmation" : { - minlength: 8, - equalTo : "#password" - }, - 'agree_code_of_conduct': {required: true}, - 'g_recaptcha_hidden': {required: true} - }, - messages: { - 'g_recaptcha_hidden': { required: 'Please confirm that you are not a robot.'} - } - }); - - form.submit(function(e){ - var is_valid = $(this).valid(); - if (!is_valid) { - e.preventDefault(); - return false; - } - $('.btn-primary').attr('disabled', 'disabled'); - return true; - }); - - }); - -// End of closure. -}( jQuery )); \ No newline at end of file diff --git a/public/assets/js/auth/registration_success.js b/public/assets/js/auth/registration_success.js deleted file mode 100644 index e3a28be4..00000000 --- a/public/assets/js/auth/registration_success.js +++ /dev/null @@ -1,14 +0,0 @@ -(function( $ ){ - - $(document).ready(function($){ - - var redirect = $('#redirect_url'); - if(redirect.length > 0){ - var href = $(redirect).attr('href'); - setTimeout(function(){ window.location = href; }, 3000); - } - - }); - -// End of closure. -}( jQuery )); \ No newline at end of file diff --git a/public/assets/js/auth/reset_password.js b/public/assets/js/auth/reset_password.js deleted file mode 100644 index 182cdb65..00000000 --- a/public/assets/js/auth/reset_password.js +++ /dev/null @@ -1,58 +0,0 @@ -(function( $ ){ - - $(document).ready(function($){ - - - var options = {}; - - options.ui = - { - showPopover: false, - showErrors: true, - showProgressBar: true, - showVerdictsInsideProgressBar: true, - }; - - options.rules = - { - activated: { - wordTwoCharacterClasses: true, - wordRepetitions: true - } - }; - - $(':password').pwstrength(options); - - var form = $('#form-password-reset'); - - var validator = form.validate({ - rules: { - password: { - required: true, - minlength: 8 - }, - "password_confirmation" : { - minlength: 8, - equalTo : "#password" - }, - 'g_recaptcha_hidden': {required: true} - }, - messages: { - 'g_recaptcha_hidden': { required: 'Please confirm that you are not a robot.'} - } - }); - - form.submit(function(e){ - var is_valid = $(this).valid(); - if (!is_valid) { - e.preventDefault(); - return false; - } - $('.btn-primary').attr('disabled', 'disabled'); - return true; - }); - - }); - -// End of closure. -}( jQuery )); \ No newline at end of file diff --git a/public/assets/js/auth/send_password_link.js b/public/assets/js/auth/send_password_link.js deleted file mode 100644 index 98c5ff60..00000000 --- a/public/assets/js/auth/send_password_link.js +++ /dev/null @@ -1,41 +0,0 @@ -(function( $ ){ - - $(document).ready(function($){ - - var form = $('#form-send-password-reset-link'); - - var validator = form.validate({ - rules: { - email: { - required: true - }, - 'g_recaptcha_hidden': {required: true} - }, - messages: { - 'g_recaptcha_hidden': { required: 'Please confirm that you are not a robot.'} - } - }); - - form.submit(function(e){ - var is_valid = $(this).valid(); - if (!is_valid) { - e.preventDefault(); - return false; - } - $('.btn-primary').attr('disabled', 'disabled'); - return true; - }); - - $(document).ready(function($){ - - var redirect = $('#redirect_url'); - if(redirect.length > 0){ - var href = $(redirect).attr('href'); - setTimeout(function(){ window.location = href; }, 3000); - } - - }); - }); - -// End of closure. -}( jQuery )); \ No newline at end of file diff --git a/public/assets/js/auth/set_password.js b/public/assets/js/auth/set_password.js deleted file mode 100644 index 15da42bd..00000000 --- a/public/assets/js/auth/set_password.js +++ /dev/null @@ -1,58 +0,0 @@ -(function( $ ){ - - $(document).ready(function($){ - - - var options = {}; - - options.ui = - { - showPopover: false, - showErrors: true, - showProgressBar: true, - showVerdictsInsideProgressBar: true, - }; - - options.rules = - { - activated: { - wordTwoCharacterClasses: true, - wordRepetitions: true - } - }; - - $(':password').pwstrength(options); - - var form = $('#form-password-set'); - - var validator = form.validate({ - rules: { - password: { - required: true, - minlength: 8 - }, - "password_confirmation" : { - minlength: 8, - equalTo : "#password" - }, - 'g_recaptcha_hidden': {required: true} - }, - messages: { - 'g_recaptcha_hidden': { required: 'Please confirm that you are not a robot.'} - } - }); - - form.submit(function(e){ - var is_valid = $(this).valid(); - if (!is_valid) { - e.preventDefault(); - return false; - } - $('.btn-primary').attr('disabled', 'disabled'); - return true; - }); - - }); - -// End of closure. -}( jQuery )); \ No newline at end of file diff --git a/public/assets/js/auth/set_password_success.js b/public/assets/js/auth/set_password_success.js deleted file mode 100644 index 7475c399..00000000 --- a/public/assets/js/auth/set_password_success.js +++ /dev/null @@ -1,21 +0,0 @@ -(function( $ ){ - - $(document).ready(function($){ - - var redirect = $('#redirect_url'); - - if(redirect.length > 0){ - var href = $(redirect).attr('href'); - if(email != '') - href = href +'?email=' + email; - - setTimeout(function(){ window.location = href; }, 3000); - return; - } - - setTimeout(function(){ window.location = '/accounts/user/profile'; }, 3000); - - }); - -// End of closure. -}( jQuery )); \ No newline at end of file diff --git a/public/assets/js/basic-crud.js b/public/assets/js/basic-crud.js deleted file mode 100644 index b73a3965..00000000 --- a/public/assets/js/basic-crud.js +++ /dev/null @@ -1,249 +0,0 @@ -jQuery(document).ready(function ($) { -}); - -// constructor -function BasicCrud(urls, perPage, templatePage, directivesPage, messages) { - // settings - this.urls = urls; - this.perPage = perPage; - this.templatePage = templatePage; - this.directivesPage = directivesPage; - this.maxItemsPerPage = 10; - this.messages = messages; - // state - this.currentPage = null; - this.searchTerm = null; - this.orderBy = null; - this.orderByDir = null; -} - -// methods -BasicCrud.prototype = { - init: function () { - var _this = this; - jQuery(document).ready(function ($) { - - // set current menu item active - $('#server-admin', '#main-menu').addClass('active'); - - $('#btn-do-search-clear').hide(); - - $("body").on('click',".sort-header",function (event) { - $(".sort-header").removeClass("current"); - $(this).addClass('current'); - var dir = '+'; - if($(this).hasClass('asc')){ - $(this).removeClass('asc'); - $(this).addClass('desc'); - dir = '-'; - } - else { - dir = '+'; - $(this).removeClass('desc'); - $(this).addClass('asc'); - } - - var field = $(this).data('field'); - _this.orderBy = encodeURI(dir+field); - _this.loadPage(); - }); - - var currentTermFromDeepLink = $(window).url_fragment('getParam', 'term'); - if (currentTermFromDeepLink != null) { - $('#search-term').val(currentTermFromDeepLink); - $('#btn-do-search-clear').show(); - } - - _this.loadPage(); - - $("body").on('click', ".page-link", function (event) { - _this.currentPage = $(this).attr('data-page'); - _this.loadPage(); - event.preventDefault(); - return false; - }); - - $("body").on('keydown', "#search-term", function (event) { - if (event.keyCode === 13) { - $('#btn-do-search').trigger('click'); - event.preventDefault(); - return false; - } - return true; - }); - - $("body").on('click', "#btn-do-search", function (event) { - _this.currentPage = 1; - _this.searchTerm = $('#search-term').val() - $('#btn-do-search-clear').show(); - _this.loadPage(); - event.preventDefault(); - return false; - }); - - $("body").on('click', "#btn-do-search-clear", function (event) { - $('#search-term').val(''); - _this.searchTerm = ''; - $(this).hide(); - _this.loadPage(); - event.preventDefault(); - return false; - }); - - $("body").on('click', 'a.delete-item', function (event) { - - var url = $(this).attr('href'); - - swal({ - title: _this.messages['delete_item.title'], - text: _this.messages['delete_item.text'], - type: "warning", - showCancelButton: true, - confirmButtonColor: "#DD6B55", - confirmButtonText: "Yes, Delete it!", - }).then( - function (result) { - if (result.value) { - $.ajax( - { - type: "DELETE", - url: url, - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout: 60000, - success: function (data, textStatus, jqXHR) { - _this.loadPage(); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - }); - event.preventDefault(); - return false; - }); - }); - }, - _buildFilters: function () { - - }, - loadPage: function () { - var _this = this; - $('body').ajax_loader(); - var currentPageFromDeepLink = $(window).url_fragment('getParam', 'page'); - var currentTermFromDeepLink = $(window).url_fragment('getParam', 'term'); - - if (this.currentPage == null && currentPageFromDeepLink != null) { - this.currentPage = currentPageFromDeepLink; - } - - if (this.searchTerm == null && currentTermFromDeepLink != null) { - this.searchTerm = currentTermFromDeepLink; - } - - if (this.currentPage == null) - this.currentPage = 1; - - if (this.searchTerm != null) - $(window).url_fragment('setParam', 'term', this.searchTerm); - - $(window).url_fragment('setParam', 'page', this.currentPage); - - window.location.hash = $(window).url_fragment('serialize'); - - var url = this.urls.load + '?page=' + parseInt(this.currentPage) + '&per_page=' + this.perPage; - - if (this.searchTerm != null && this.searchTerm != '') { - url += '&' + this._buildFilters(); - } - - if (this.orderBy != null && this.orderBy != '') { - url += '&order=' + this.orderBy; - } - - $.ajax({ - type: "GET", - url: url, - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout: 60000, - success: function (page, textStatus, jqXHR) { - //load data... - var items = page.data; - if (items.length == 0) { - $('.label-info').show(); - $('#table').hide(); - $('#search-container').hide(); - $('#pager-container').hide(); - $('body').ajax_loader('stop'); - return; - } - - $('.label-info').hide(); - $('#table').show(); - $('#search-container').show(); - $('#pager-container').show(); - - var body = _this.templatePage.render(items, _this.directivesPage); - $('#body-table', '#table').remove(); - $('#table').append('' + body.html() + ''); - - var templatePager = $('
    ' + - '
  • ' + - '
'); - - var maxPages2Show = 20; - var totalPages = parseInt(Math.ceil(page.total / _this.perPage)); - if (maxPages2Show > totalPages) maxPages2Show = totalPages; - var currentPage = page.current_page; - var currentRelativePage = currentPage % maxPages2Show; - if (currentRelativePage == 0) currentRelativePage = maxPages2Show; - var pages = []; - - for (var i = 1; i <= maxPages2Show; i++) { - pages.push({ - nbr: i + (currentPage - currentRelativePage) - }); - } - - var directivesPager = { - 'li': { - 'i<-context': { - '@class': function (arg) { - return arg.item.nbr == page.current_page ? "active" : ""; - }, - 'a': function (arg) { - return arg.item.nbr; - }, - 'a@class': function (arg) { - return "page-link" - }, - 'a@data-page': function (arg) { - return arg.item.nbr; - }, - } - } - }; - var pager = templatePager.render(pages, directivesPager); - - $('#pager', '#pager-container').remove(); - var prev_item = ''; - var next_item = ''; - if (pages.length > 0) { - prev_item = (pages[0].nbr > 1) ? '
  • ' : ''; - next_item = (pages[pages.length - 1].nbr < totalPages) ? '
  • ' : ''; - } - $('#pager-container').append('
      ' + prev_item + pager.html() + next_item + '
    '); - - $('body').ajax_loader('stop'); - - }, - error: function (jqXHR, textStatus, errorThrown) { - $('body').ajax_loader('stop'); - ajaxError(jqXHR, textStatus, errorThrown); - } - }); - } -}; diff --git a/public/assets/js/jquery-ajax-loader.js b/public/assets/js/jquery-ajax-loader.js deleted file mode 100644 index 8cb899ed..00000000 --- a/public/assets/js/jquery-ajax-loader.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright 2014 Openstack Foundation - * 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. - **/ -(function( $ ){ - - var element = null; - var text = 'loading ...'; - var methods = { - init : function(options) { - element = $(this); - - if(element.find('#resultLoading').attr('id') != 'resultLoading'){ - element.append(''); - } - - jQuery('#resultLoading').css({ - 'width':'100%', - 'height':'100%', - 'position':'fixed', - 'z-index':'10000000', - 'top':'0', - 'left':'0', - 'margin':'auto' - }); - - jQuery('#resultLoading .bg').css({ - 'background':'#000000', - 'opacity':'0.7', - 'width':'100%', - 'height':'100%', - 'position':'absolute', - 'top':'0' - }); - - jQuery('#resultLoading>div:first').css({ - 'width': '250px', - 'height':'75px', - 'text-align': 'center', - 'position': 'fixed', - 'top':'0', - 'left':'0', - 'right':'0', - 'bottom':'0', - 'margin':'auto', - 'font-size':'16px', - 'z-index':'10', - 'color':'#ffffff' - - }); - - jQuery('#resultLoading .bg').height('100%'); - jQuery('#resultLoading').fadeIn(500); - element.css('cursor', 'wait'); - }, - stop: function(){ - $('#resultLoading .bg').height('100%'); - $('#resultLoading').fadeOut(1000); - element.css('cursor', 'default'); - } - }; - - $.fn.ajax_loader = function(methodOrOptions) { - if ( methods[methodOrOptions] ) { - return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 )); - } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) { - // Default to "init" - return methods.init.apply( this, arguments ); - } else { - $.error( 'Method ' + method + ' does not exist on jQuery.ajax_loader' ); - } - }; - - //helper functions - -// End of closure. -}( jQuery)); \ No newline at end of file diff --git a/public/assets/js/jquery.cleanform.js b/public/assets/js/jquery.cleanform.js deleted file mode 100644 index af97e796..00000000 --- a/public/assets/js/jquery.cleanform.js +++ /dev/null @@ -1,10 +0,0 @@ -(function( $ ){ - $.fn.cleanForm = function() { - //after serialize clear all! - $('input',this).val(''); - $('select',this).val(''); - $('textarea',this).val(''); - this.find(':checkbox').removeAttr('checked'); - return this; - }; -}( jQuery )); \ No newline at end of file diff --git a/public/assets/js/jquery.serialize.js b/public/assets/js/jquery.serialize.js deleted file mode 100644 index a6b91cec..00000000 --- a/public/assets/js/jquery.serialize.js +++ /dev/null @@ -1,32 +0,0 @@ -(function( $ ){ - $.fn.serializeForm = function() { - var o = {}; - var a = this.serializeArray(); - var $form = $(this); - - $.each(a, function() { - //special case for checkboxes - var $element = $('#'+this.name,$form); - if($element.is(':checkbox')){ - this.value = $element.is(':checked'); - } - if (o[this.name]) { - if (!o[this.name].push) { - o[this.name] = [o[this.name]]; - } - o[this.name].push(this.value || ''); - } else { - o[this.name] = this.value; - } - }); - - //add missing checkboxes (non checked ones) - $('input:checkbox', $form).each(function() { - var id = $(this).attr('id'); - var value = $(this).is(':checked'); - if (!o.hasOwnProperty(id)) - o[id] = value; - }); - return o; - }; -}( jQuery )); \ No newline at end of file diff --git a/public/assets/js/jquery.validate.additional.custom.methods.js b/public/assets/js/jquery.validate.additional.custom.methods.js deleted file mode 100644 index 5147dc42..00000000 --- a/public/assets/js/jquery.validate.additional.custom.methods.js +++ /dev/null @@ -1,108 +0,0 @@ - -var regex_ipv4 = /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i; - -var regex_ipv6 = /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i; - -jQuery.validator.addMethod("ipV4", function(value, element) { - return this.optional(element) || regex_ipv4.test(value); -}, "Please enter a valid IPV4 address"); - -jQuery.validator.addMethod("ipv4V6Set", function(value, element) { - var ips = value.split(','); - for(var ip of ips) - { - var valid = regex_ipv4.test(ip); - if(!valid) - valid = regex_ipv6.test(ip); - if(!valid) return false; - } - return true -}, "Please enter a valid IP (V4/V6) address"); - -jQuery.validator.addMethod("ssl_uri", function(value, element) { - var regex = /^https:\/\/([\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*$/ig; - return this.optional(element) || regex.test(value); -}, "Uri must under https schema."); - - -jQuery.validator.addMethod("scopename", function(value, element) { - var regex = /^[a-zA-Z0-9\-\.\,\:\_\/]+$/ig; - return this.optional(element) || regex.test(value); -}, "Please enter a valid scope name."); - -jQuery.validator.addMethod("free_text", function(value, element) { - return this.optional(element) || /^[a-zA-Z0-9\-_.,()'"\s\:\/]+$/i.test(value); -}, "Letters or punctuation only please"); - -jQuery.validator.addMethod("endpointroute", function(value, element) { - return this.optional(element) || /^\/([\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,{}]*$/ig.test(value); -}, "Please enter a valid endpoint route"); - -jQuery.validator.addMethod("pem_public_key", function(value, element, options) { - if(!options) return true; - var res1 = value.indexOf('-----BEGIN PUBLIC KEY-----'); - var res2 = value.indexOf('-----BEGIN RSA PUBLIC KEY-----'); - var res3 = value.indexOf('-----END PUBLIC KEY-----'); - var res4 = value.indexOf('-----END RSA PUBLIC KEY-----'); - var pck1 = (res1 != -1 && res3 != -1); - var pck8 = (res2 != -1 && res4 != -1); - return pck1 || pck8; -}, "Please enter a valid PEM Public Key format(PCK#8/PCK#1)"); - -jQuery.validator.addMethod("pem_private_key", function(value, element, options) { - if(!options) return true; - var res1 = value.indexOf('-----BEGIN PRIVATE KEY-----'); - var res2 = value.indexOf('-----BEGIN RSA PRIVATE KEY-----'); - var res3 = value.indexOf('-----END PRIVATE KEY-----'); - var res4 = value.indexOf('-----END RSA PRIVATE KEY-----'); - var pck1 = (res1 != -1 && res3 != -1); - var pck8 = (res2 != -1 && res4 != -1); - return pck1 || pck8; -}, "Please enter a valid PEM Private Key format(PCK#8/PCK#1)"); - -jQuery.validator.addMethod("private_key_password_required", function(value, element, options) { - var private_key_pem = $(options.pem_content_id).val(); - return !(private_key_pem.indexOf('ENCRYPTED') != -1 && value == ''); -}, "Please enter a password for Private Key (PCK#8/PCK#1)"); - -$.validator.addMethod("dateUS", function (value, element,options) { - //mm/dd/yyyy - var check = false, - regex = /^\d{1,2}\/\d{1,2}\/\d{4}$/, - adata, gg, mm, aaaa, xdata; - if ( regex.test(value)) { - adata = value.split("/"); - mm = parseInt(adata[0], 10); - gg = parseInt(adata[1], 10); - aaaa = parseInt(adata[2], 10); - xdata = new Date(Date.UTC(aaaa, mm - 1, gg, 12, 0, 0, 0)); - if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth () === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) { - check = true; - } else { - check = false; - } - } else { - check = false; - } - return this.optional(element) || check; -}, "Please enter a valid date."); - -// override jquery validate plugin defaults -$.validator.setDefaults({ - ignore: [], - highlight: function(element) { - $(element).closest('.form-group').addClass('has-error'); - }, - unhighlight: function(element) { - $(element).closest('.form-group').removeClass('has-error'); - }, - errorElement: 'span', - errorClass: 'help-block', - errorPlacement: function(error, element) { - if(element.parent('.input-group').length) { - error.insertAfter(element.parent()); - } else { - error.insertAfter(element); - } - } -}); \ No newline at end of file diff --git a/public/assets/js/login.js b/public/assets/js/login.js deleted file mode 100644 index 0e005a91..00000000 --- a/public/assets/js/login.js +++ /dev/null @@ -1,41 +0,0 @@ -jQuery(document).ready(function($){ - - $('#login_form').submit(function(event){ - if(!navigator.cookieEnabled){ - event.preventDefault(); - checkCookiesEnabled(); - return false; - } - $('.btn-primary').attr('disabled', 'disabled'); - return true; - }); - - $(".toggle-password").click(function() { - - $(this).toggleClass("fa-eye-slash"); - var currentTitle = $(this).attr("title"); - if(currentTitle == "Show Password") - currentTitle = "Hide Password"; - else - currentTitle = "Show Password"; - $(this).attr("title", currentTitle); - var input = $($(this).attr("toggle")); - if (input.attr("type") == "password") { - input.attr("type", "text"); - } else { - input.attr("type", "password"); - } - }); - - checkCookiesEnabled(); -}); - -function checkCookiesEnabled(){ - var cookieEnabled = navigator.cookieEnabled; - - return cookieEnabled || showCookieFail(); -} - -function showCookieFail(){ - $('#cookies-disabled-dialog').show(); -} \ No newline at end of file diff --git a/public/assets/js/oauth2/consent.js b/public/assets/js/oauth2/consent.js deleted file mode 100644 index 695e7402..00000000 --- a/public/assets/js/oauth2/consent.js +++ /dev/null @@ -1,36 +0,0 @@ -jQuery(document).ready(function($){ - - $('.glyphicon-info-sign').popover({html:true,placement:'bottom'}); - - $(':not(#anything)').on('click', function (e) { - $('.glyphicon-info-sign').each(function () { - //the 'is' for buttons that trigger popups - //the 'has' for icons and other elements within a button that triggers a popup - if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) { - $(this).popover('hide'); - return; - } - }); - }); - - $("body").on('click',"#cancel-authorization",function(event){ - var $form = $('#authorization_form'); - $('#trust').attr('value','DenyOnce'); - $form.submit(); - event.preventDefault(); - return false; - }); - - $("body").on('click',"#approve-authorization",function(event){ - var $form = $('#authorization_form'); - $('#trust').attr('value','AllowOnce'); - $form.submit(); - event.preventDefault(); - return false; - }); - - $('#authorization_form').submit(function(){ - $('.btn-consent-action').attr('disabled', 'disabled'); - return true; - }); -}); \ No newline at end of file diff --git a/public/assets/js/oauth2/profile/admin/api-scope-groups.js b/public/assets/js/oauth2/profile/admin/api-scope-groups.js deleted file mode 100644 index aba4672f..00000000 --- a/public/assets/js/oauth2/profile/admin/api-scope-groups.js +++ /dev/null @@ -1,265 +0,0 @@ -function loadGroups(){ - var link = ApiScopeGroupUrls.get; - $.ajax( - { - type: "GET", - url: link, - dataType: "json", - timeout:60000, - success: function (page,textStatus,jqXHR) { - //load data... - var groups = page.data; - - if(groups.length > 0) { - var template = $(' Edit Delete'); - var directives = { - 'tr': { - 'group<-context': { - 'td.name': 'group.name', - '.api-scope-group-active-checkbox@value': 'group.id', - '.api-scope-group-active-checkbox@checked': function (arg) { - return arg.item.active ? 'true' : ''; - }, - '.api-scope-group-active-checkbox@data-group-id': 'group.id', - '.api-scope-group-active-checkbox@id': function (arg) { - var id = arg.item.id; - return 'api-scope-group-active_' + id; - }, - 'a.edit-api-scope-group@href': function (arg) { - var id = arg.item.id; - var href = ApiScopeGroupUrls.edit; - return href.replace('-1', id); - }, - 'a.delete-api-scope-group@href': function (arg) { - var id = arg.item.id; - var href = ApiScopeGroupUrls.delete; - return href.replace('-1', id); - } - } - } - }; - var html = template.render(groups, directives); - $('#body-api-scope-groups').html(html.html()); - $('#info-api-scope-groups').hide() - } - else - { - $('#info-api-scope-groups').show(); - $('#body-api-scope-groups').hide(); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); -} - -$(document).ready(function() { - - $('#server-admin', '#main-menu').addClass('active'); - - //validation rules on new server form - var scope_group_form = $('#form-api-scope-group'); - var dialog_scope_group = $('#dialog-form-api-scope-group'); - - var scope_group_validator = scope_group_form.validate({ - rules: { - "name" : { required: true, free_text:true,rangelength: [1, 255]}, - "users" : { required: true }, - "scopes" : { required: true }, - } - }); - - dialog_scope_group.modal({ - show:false, - backdrop:"static" - }); - - dialog_scope_group.on('hidden.bs.modal', function (e) { - scope_group_form.cleanForm(); - scope_group_validator.resetForm(); - $('#users').tagsinput('removeAll'); - $('#scopes').tagsinput('removeAll'); - }) - - $("body").on('click',".add-api-scope-group",function(event){ - dialog_scope_group.modal('show'); - event.preventDefault(); - return false; - }); - - $("body").on('click',".refresh-groups",function(event){ - loadGroups() - event.preventDefault(); - return false; - }); - - $("body").on('click',".api-scope-group-active-checkbox",function(event){ - var active = $(this).is(':checked'); - var group_id = $(this).attr('data-group-id'); - var url = active? ApiScopeGroupUrls.activate : ApiScopeGroupUrls.deactivate; - url = url.replace('@id',group_id); - var verb = active ? 'PUT':'DELETE'; - $.ajax( - { - type: verb, - url: url, - contentType: "application/json; charset=utf-8", - success: function (data,textStatus,jqXHR) { - //load data... - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - }); - - $("body").on('click',".save-api-scope-group",function(event){ - var is_valid = scope_group_form.valid(); - if (is_valid){ - var api_scope_group = scope_group_form.serializeForm(); - $.ajax({ - type: "POST", - url: ApiScopeGroupUrls.add, - data: JSON.stringify(api_scope_group), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - loadGroups(); - dialog_scope_group.modal('hide'); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - }); - } - event.preventDefault(); - return false; - }); - - $("body").on('click',".delete-api-scope-group",function(event){ - if(confirm("Are you sure?")){ - var href = $(this).attr('href'); - $.ajax( - { - type: "DELETE", - url: href, - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - loadGroups(); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - - // modal controls - - // scopes - - var scopes = new Bloodhound({ - datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), - queryTokenizer: Bloodhound.tokenizers.whitespace, - remote: { - url: ApiScopeGroupUrls.fetchScopes, - wildcard: '%QUERY%', - prepare: function (query, settings) { - settings.url = ApiScopeGroupUrls.fetchScopes+'?filter[]=name=@'+query+'&filter[]=is_assigned_by_groups==1'; - return settings; - }, - transform: function(input){ - var page = input.data; - return page; - } - } - }); - - $('#scopes').tagsinput({ - itemValue: function(item) { - return item.id; - }, - itemText: function(item) { - return item.name - }, - freeInput: false, - allowDuplicates: false, - typeaheadjs: [ - { - highlight: true, - minLength: 1 - }, - { - name: 'scopes', - display: function(item) { - return item.name; - }, - templates: { - suggestion: function (item) { - return '

    ' + item.name + '

    '; - } - }, - source: scopes, - limit: 10 - } - ] - }); - - // users - - var users = new Bloodhound({ - datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), - queryTokenizer: Bloodhound.tokenizers.whitespace, - remote: { - url: ApiScopeGroupUrls.fetchUsers, - wildcard: '%QUERY%', - prepare: function (query, settings) { - settings.url = ApiScopeGroupUrls.fetchUsers+'?filter=first_name=@'+query+',last_name=@'+query+',email=@'+query; - return settings; - }, - transform: function(input){ - var page = input.data; - return page; - } - } - }); - - $('#users').tagsinput({ - itemValue: function(item) { - return item.id; - }, - itemText: function(item) { - return item.first_name + ' ' + item.last_name; - }, - freeInput: false, - allowDuplicates: false, - typeaheadjs: [ - { - highlight: true, - minLength: 1 - }, - { - name: 'users', - display: function(item) { - return item.first_name + ' ' + item.last_name; - }, - templates: { - suggestion: function (item) { - return '

    ' + item.first_name + ' ' + item.last_name + '

    '; - } - }, - source: users, - limit: 10 - } - ] - }); - -}); \ No newline at end of file diff --git a/public/assets/js/oauth2/profile/admin/clients.js b/public/assets/js/oauth2/profile/admin/clients.js deleted file mode 100644 index 9279b71e..00000000 --- a/public/assets/js/oauth2/profile/admin/clients.js +++ /dev/null @@ -1,42 +0,0 @@ -jQuery(document).ready(function($){ - - $('#server-admin','#main-menu').addClass('active'); - - if($('#clients-table tr').length===1){ - $('#clients-info').show(); - $('#clients-table').hide(); - } - else{ - $('#clients-info').hide(); - $('#clients-table').show(); - } - - $("body").on('click',".unlock-client",function(event){ - if(confirm("Are you sure that you want to unlock this OAUTH2 Client?")){ - var url = $(this).attr('href'); - var client_id = $(this).attr('data-client-id'); - $.ajax( - { - type: "DELETE", - url: url, - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - //load data... - $('#'+client_id,'#body-locked-clients').remove(); - - if($('#clients-table tr').length===1){ - $('#clients-info').show(); - $('#clients-table').hide(); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); -}); \ No newline at end of file diff --git a/public/assets/js/oauth2/profile/admin/edit-api-scope-group.js b/public/assets/js/oauth2/profile/admin/edit-api-scope-group.js deleted file mode 100644 index 8602ea64..00000000 --- a/public/assets/js/oauth2/profile/admin/edit-api-scope-group.js +++ /dev/null @@ -1,150 +0,0 @@ -$(document).ready(function() { - - // scopes - - var scopes = new Bloodhound({ - datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), - queryTokenizer: Bloodhound.tokenizers.whitespace, - remote: { - url: ApiScopeGroupUrls.fetchScopes, - wildcard: '%QUERY%', - prepare: function (query, settings) { - settings.url = ApiScopeGroupUrls.fetchScopes+'?filter[]=name=@'+query+'&filter[]=is_assigned_by_groups==1'; - return settings; - }, - transform: function(input){ - var page = input.data; - return page; - } - } - }); - - $('#scopes').tagsinput({ - itemValue: function(item) { - return item.id; - }, - itemText: function(item) { - return item.name - }, - freeInput: false, - allowDuplicates: false, - typeaheadjs: [ - { - highlight: true, - minLength: 1 - }, - { - name: 'scopes', - display: function(item) { - return item.name; - }, - templates: { - suggestion: function (item) { - return '

    ' + item.name + '

    '; - } - }, - source: scopes, - limit: 10 - } - ] - }); - - for(var scope of current_scopes) - { - $('#scopes').tagsinput('add', scope); - } - - // users - - var users = new Bloodhound({ - datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), - queryTokenizer: Bloodhound.tokenizers.whitespace, - remote: { - url: ApiScopeGroupUrls.fetchUsers, - wildcard: '%QUERY%', - prepare: function (query, settings) { - settings.url = ApiScopeGroupUrls.fetchUsers+'?filter=first_name=@'+query+',last_name=@'+query+',email=@'+query; - return settings; - }, - transform: function(input){ - var page = input.data; - return page; - } - } - }); - - $('#users').tagsinput({ - itemValue: function(item) { - return item.id; - }, - itemText: function(item) { - return item.first_name + ' ' + item.last_name; - }, - freeInput: false, - allowDuplicates: false, - typeaheadjs: [ - { - highlight: true, - minLength: 1 - }, - { - name: 'users', - display: function(item) { - return item.first_name + ' ' + item.last_name; - }, - templates: { - suggestion: function (item) { - return '

    ' + item.first_name + ' ' + item.last_name + '

    '; - } - }, - source: users, - limit: 10 - } - ] - }); - - - for(var user of current_users) - { - $('#users').tagsinput('add',user); - } - - var group_form = $('#api-scope-group-form'); - var group_validator = group_form.validate({ - rules: { - "name" : { required: true, free_text:true,rangelength: [1, 255]}, - "users" : { required: true }, - "scopes" : { required: true }, - } - }); - - group_form.submit(function( event ) { - - var is_valid = group_form.valid(); - - if (is_valid){ - group_validator.resetForm(); - var group = group_form.serializeForm(); - var href = $(this).attr('action'); - $.ajax( - { - type: "PUT", - url: href, - data: JSON.stringify(group), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - displaySuccessMessage('Group Saved!.' , group_form); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - -}); \ No newline at end of file diff --git a/public/assets/js/oauth2/profile/admin/edit-api.js b/public/assets/js/oauth2/profile/admin/edit-api.js deleted file mode 100644 index 9af350ef..00000000 --- a/public/assets/js/oauth2/profile/admin/edit-api.js +++ /dev/null @@ -1,460 +0,0 @@ -function loadScopes(){ - $.ajax({ - type: "GET", - url: scopesUrls.get, - contentType: "application/json; charset=utf-8", - timeout:60000, - success: function (page,textStatus,jqXHR) { - var items = page.data; - if(items.length > 0){ - $('#info-scopes').hide(); - $('#table-scopes').show(); - var template = $('' + - '' + - '' + - '' + - '' + - ' ' + - 'Edit ' + - 'Delete' + - ''); - var directives = { - 'tr':{ - 'scope<-context':{ - 'td.name':'scope.name', - //active - '.scope-active-checkbox@value':'scope.id', - '.scope-active-checkbox@checked':function(arg){ - return arg.item.active?'true':''; - }, - '.scope-active-checkbox@id':function(arg){ - var id = arg.item.id; - return 'scope-active_'+id; - }, - '.scope-active-checkbox@data-scope-id':'scope.id', - //default - '.scope-default-checkbox@value':'scope.id', - '.scope-default-checkbox@checked':function(arg){ - return arg.item.default?'true':''; - }, - '.scope-default-checkbox@id':function(arg){ - var id = arg.item.id; - return 'scope-default_'+id; - }, - '.scope-default-checkbox@data-scope-id':'scope.id', - //system - '.scope-system-checkbox@value':'scope.id', - '.scope-system-checkbox@checked':function(arg){ - return arg.item.system?'true':''; - }, - '.scope-system-checkbox@id':function(arg){ - var id = arg.item.id; - return 'scope-system_'+id; - }, - '.scope-system-checkbox@data-scope-id':'scope.id', - //buttons - 'a.edit-scope@href':function(arg){ - var id = arg.item.id; - var href = scopesUrls.edit; - return href.replace('@id',id); - }, - 'a.delete-scope@href':function(arg){ - var id = arg.item.id; - var href = scopesUrls.delete; - return href.replace('@id',id); - } - } - } - }; - var html = template.render(items, directives); - $('#body-scopes').html(html.html()); - } - else{ - $('#info-scopes').show(); - $('#table-scopes').hide(); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - }); -} - -function loadEndpoints(){ - $.ajax({ - type: "GET", - url: endpointUrls.get, - contentType: "application/json; charset=utf-8", - timeout:60000, - success: function (page,textStatus,jqXHR) { - var items = page.data; - if(items.length>0){ - $('#info-endpoints').hide(); - $('#table-endpoints').show(); - var template = $('' + - '' + - '' + - '' + - '' + - ' ' + - 'Edit ' + - 'Delete' + - ''); - var directives = { - 'tr':{ - 'endpoint<-context':{ - 'td.name':'endpoint.name', - 'td.route':'endpoint.route', - 'td.method':'endpoint.http_method', - //active - '.endpoint-active-checkbox@value':'scope.id', - '.endpoint-active-checkbox@checked':function(arg){ - return arg.item.active?'true':''; - }, - '.endpoint-active-checkbox@id':function(arg){ - var id = arg.item.id; - return 'endpoint-active_'+id; - }, - '.endpoint-active-checkbox@data-endpoint-id':'endpoint.id', - //buttons - 'a.edit-endpoint@href':function(arg){ - var id = arg.item.id; - var href = endpointUrls.edit; - return href.replace('@id',id); - }, - 'a.delete-endpoint@href':function(arg){ - var id = arg.item.id; - var href = endpointUrls.delete; - return href.replace('@id',id); - } - } - } - }; - var html = template.render(items, directives); - $('#body-endpoints').html(html.html()); - } - else{ - $('#info-endpoints').show(); - $('#table-endpoints').hide(); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - }); -} - -$(document).ready(function() { - - $('#server-admin','#main-menu').addClass('active'); - - var api_form = $('#api-form'); - var api_validator = api_form.validate({ - rules: { - "name" : {required: true, nowhitespace:true,rangelength: [1, 255]}, - "description": {required: true, free_text:true,rangelength: [1, 512]} - } - }); - - api_form.submit(function( event ) { - var is_valid = api_form.valid(); - if (is_valid){ - api_validator.resetForm(); - var api = api_form.serializeForm(); - var href = $(this).attr('action'); - $.ajax( - { - type: "PUT", - url: href, - data: JSON.stringify(api), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - displaySuccessMessage(editApiMessages.success,api_form); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - - //scopes - - if($('#table-scopes tr').length===1){ - $('#info-scopes').show(); - $('#table-scopes').hide(); - } - - $("body").on('click','.scope-active-checkbox',function(event){ - var id = $(this).attr('data-scope-id'); - var active = $(this).is(':checked'); - - var url = active? scopesUrls.activate : scopesUrls.deactivate; - url = url.replace('@id',id); - var verb = active?'PUT':'DELETE' - - $.ajax( - { - type: verb, - url: url, - contentType: "application/json; charset=utf-8", - success: function (data,textStatus,jqXHR) { - //load data... - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - }); - - $("body").on('click','.scope-default-checkbox',function(event){ - var id = $(this).attr('data-scope-id'); - var is_default = $(this).is(':checked'); - - var scope = { id : id, default:is_default}; - - $.ajax( - { - type: "PUT", - url: scopesUrls.update, - data: JSON.stringify(scope), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - //load data... - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - }); - - $("body").on('click','.scope-system-checkbox',function(event){ - var id = $(this).attr('data-scope-id'); - var is_system = $(this).is(':checked'); - - var scope = { id : id, system:is_system}; - - $.ajax( - { - type: "PUT", - url: scopesUrls.update, - data: JSON.stringify(scope), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - //load data... - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - - }); - - $("body").on('click','.refresh-scopes',function(event){ - loadScopes(); - event.preventDefault(); - return false; - }); - - - var scope_dialog = $('#dialog-form-scope'); - var scope_form = $('#form-scope'); - - var scope_validator = scope_form.validate({ - rules: { - "name" : {required: true, scopename:true,rangelength: [1, 512]}, - "short_description": {required: true, free_text:true,rangelength: [1, 512]}, - "description": {required: true, free_text:true,rangelength: [1, 1024]} - } - }); - - scope_dialog.modal({ - show:false, - backdrop:"static" - }); - - scope_dialog.on('hidden.bs.modal', function () { - scope_form.cleanForm(); - scope_validator.resetForm(); - }) - - $("body").on('click',".add-scope",function(event){ - scope_dialog.modal('show'); - event.preventDefault(); - return false; - }); - - $("body").on('click',".save-scope",function(event){ - var is_valid = scope_form.valid(); - if (is_valid){ - var scope = scope_form.serializeForm(); - scope.api_id = api_id; - $.ajax( - { - type: "POST", - url: scopesUrls.add, - data: JSON.stringify(scope), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - loadScopes(); - scope_dialog.modal('hide'); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - - $("body").on('click',".delete-scope",function(event){ - if(confirm("Are you sure? this will delete all application assigned scopes and all endpoints assigned scopes too.")){ - var url = $(this).attr('href'); - $.ajax( - { - type: "DELETE", - url: url, - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - loadScopes(); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - - //endpoints - - var endpoint_dialog = $('#dialog-form-endpoint'); - var endpoint_form = $('#form-endpoint'); - - if($('#table-endpoints tr').length===1){ - $('#info-endpoints').show(); - $('#table-endpoints').hide(); - } - - $("body").on('click','.endpoint-active-checkbox',function(event){ - var id = $(this).attr('data-endpoint-id'); - var active = $(this).is(':checked'); - var url = active? endpointUrls.activate : endpointUrls.deactivate; - url = url.replace('@id',id); - var verb = active?'PUT':'DELETE'; - $.ajax( - { - type: verb, - url: url, - contentType: "application/json; charset=utf-8", - success: function (data,textStatus,jqXHR) { - //load data... - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - }); - - $("body").on('click','.refresh-endpoints',function(event){ - loadEndpoints(); - event.preventDefault(); - return false; - }); - - var endpoint_validator = endpoint_form.validate({ - rules: { - "name" : {required: true, nowhitespace:true,rangelength: [1, 255]}, - "description":{required: true, free_text:true,rangelength: [1, 1024]}, - "route": {required: true,endpointroute:true,rangelength: [1, 1024]}, - "rate_limit": {required: true, number:true} - } - }); - - endpoint_dialog.modal({ - show:false, - backdrop:"static" - }); - - endpoint_dialog.on('hidden.bs.modal', function () { - endpoint_form.cleanForm(); - endpoint_validator.resetForm(); - }) - - $("body").on('click',".add-endpoint",function(event){ - endpoint_dialog.modal('show'); - event.preventDefault(); - return false; - }); - - $("body").on('click',".save-endpoint",function(event){ - var is_valid = endpoint_form.valid(); - if (is_valid){ - var endpoint = endpoint_form.serializeForm(); - endpoint.api_id = api_id; - $.ajax( - { - type: "POST", - url: endpointUrls.add, - data: JSON.stringify(endpoint), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - loadEndpoints(); - endpoint_dialog.modal('hide'); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - - $("body").on('click',".delete-endpoint",function(event){ - if(confirm("Are you sure? this will delete the selected endpoint.")){ - var url = $(this).attr('href'); - $.ajax( - { - type: "DELETE", - url: url, - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - loadEndpoints(); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); -}); \ No newline at end of file diff --git a/public/assets/js/oauth2/profile/admin/edit-endpoint.js b/public/assets/js/oauth2/profile/admin/edit-endpoint.js deleted file mode 100644 index cf45ab2f..00000000 --- a/public/assets/js/oauth2/profile/admin/edit-endpoint.js +++ /dev/null @@ -1,65 +0,0 @@ -jQuery(document).ready(function($){ - - $('#server-admin','#main-menu').addClass('active'); - - var endpoint_form = $('#endpoint-form'); - - var endpoint_validator = endpoint_form.validate({ - rules: { - "name" : {required: true, nowhitespace:true,rangelength: [1, 255]}, - "description":{required: true, free_text:true,rangelength: [1, 1024]}, - "route": {required: true, endpointroute:true,rangelength: [1, 1024]}, - "rate_limit": {required: true, number:true}, - "http_method": {required: true} - } - }); - - endpoint_form.submit(function( event ) { - var is_valid = endpoint_form.valid(); - if (is_valid){ - endpoint_validator.resetForm(); - var endpoint = endpoint_form.serializeForm(); - var href = $(this).attr('action'); - $.ajax( - { - type: "PUT", - url: href, - data: JSON.stringify(endpoint), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - displaySuccessMessage(editEndpointMessages.success , endpoint_form); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - //scopes associations - $("body").on('click',".scope-checkbox",function(event){ - var add_link = $(this).attr('data-add-link'); - var del_link = $(this).attr('data-remove-link'); - var checked = $(this).is(':checked'); - var url = checked?add_link:del_link; - var verb = checked?'PUT':'DELETE'; - $.ajax( - { - type: verb, - url: url, - contentType: "application/json; charset=utf-8", - timeout:60000, - success: function (data,textStatus,jqXHR) { - //load data... - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - }); -}); \ No newline at end of file diff --git a/public/assets/js/oauth2/profile/admin/edit-resource-server.js b/public/assets/js/oauth2/profile/admin/edit-resource-server.js deleted file mode 100644 index 7b2f975b..00000000 --- a/public/assets/js/oauth2/profile/admin/edit-resource-server.js +++ /dev/null @@ -1,253 +0,0 @@ - -function loadApis(){ - $.ajax({ - type: "GET", - url: ApiUrls.get, - contentType: "application/json; charset=utf-8", - timeout:60000, - success: function (page,textStatus,jqXHR) { - var items = page.data; - if(items.length > 0){ - $('#info-apis').hide(); - $('#table-apis').show(); - var template = $(' Edit Delete'); - var directives = { - 'tr':{ - 'api<-context':{ - 'img@src':function(arg){ - var logo = arg.item.logo; - if(logo == null || logo=='') logo = "/assets/img/apis/server.png"; - return logo; - }, - 'img@alt':'api.name', - 'td.name':'api.name', - '.api-active-checkbox@value':'api.id', - '.api-active-checkbox@checked':function(arg){ - return arg.item.active?'true':''; - }, - '.api-active-checkbox@id':function(arg){ - var id = arg.item.id; - return 'resource-server-api-active_'+id; - }, - '.api-active-checkbox@data-api-id':'api.id', - 'a.edit-api@href':function(arg){ - var id = arg.item.id; - var href = ApiUrls.edit; - return href.replace('-1',id); - }, - 'a.delete-api@href':function(arg){ - var id = arg.item.id; - var href = ApiUrls.delete; - return href.replace('-1',id); - } - } - } - }; - var html = template.render(items, directives); - $('#body-apis').html(html.html()); - } - else{ - $('#info-apis').show(); - $('#table-apis').hide(); - } - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - }); -} - -jQuery(document).ready(function($){ - - $('#server-admin','#main-menu').addClass('active'); - - if($('#table-apis tr').length === 1) - { - $('#info-apis').show(); - $('#table-apis').hide(); - } - - $("body").on('click','.refresh-apis',function(event){ - loadApis(); - event.preventDefault(); - return false; - }); - - var resource_server_form = $('#resource-server-form'); - - var api_form = $('#form-api'); - var api_dialog = $('#dialog-form-api'); - - api_dialog.modal({ - show:false, - backdrop:"static" - }); - - var resource_server_validator = resource_server_form.validate({ - rules: { - "host" : {required: true, nowhitespace:true,rangelength: [1, 512]}, - "friendly_name": {required: true, free_text:true,rangelength: [1, 255]}, - "ips": {required: true, ipv4V6Set: true } - } - }); - - var api_validator = api_form.validate({ - rules: { - "name" : {required: true, nowhitespace:true,rangelength: [1, 255]}, - "description": {required: true, free_text:true,rangelength: [1, 512]} - } - }); - - - $('#ips').tagsinput({ - trimValue: true, - onTagExists: function(item, $tag) { - $tag.hide().fadeIn(); - }, - allowDuplicates: false - }); - - $('#ips').on('beforeItemAdd', function(event) { - var ip = event.item; - var valid = regex_ipv4.test(ip); - if(!valid) - valid = regex_ipv6.test(ip); - if(!valid) - event.cancel = true; - }); - - api_dialog.on('hidden.bs.modal', function () { - api_form.cleanForm(); - api_validator.resetForm(); - }) - - $("body").on('click','.save-api',function(event){ - var is_valid = api_form.valid(); - if (is_valid){ - var api = api_form.serializeForm(); - api.resource_server_id = resource_server_id; - $.ajax({ - type: "POST", - url: ApiUrls.add, - data: JSON.stringify(api), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - loadApis(); - api_dialog.modal('hide'); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - }); - } - event.preventDefault(); - return false; - }); - - resource_server_form.submit(function( event ) { - - var is_valid = resource_server_form.valid(); - - if (is_valid){ - resource_server_validator.resetForm(); - var resource_server = resource_server_form.serializeForm(); - var href = $(this).attr('action'); - $.ajax( - { - type: "PUT", - url: href, - data: JSON.stringify(resource_server), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - displaySuccessMessage(resourceServerMessages.success , resource_server_form); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - - $("body").on('click',".add-api",function(event){ - api_dialog.modal('show'); - event.preventDefault(); - return false; - }); - - $("body").on('click',".api-active-checkbox",function(event){ - var active = $(this).is(':checked'); - var api_id = $(this).attr('data-api-id'); - var url = active? ApiUrls.activate : ApiUrls.deactivate; - url = url.replace('@id',api_id); - var verb = active?'PUT':'DELETE'; - $.ajax( - { - type: verb, - url: url, - contentType: "application/json; charset=utf-8", - timeout:60000, - success: function (data,textStatus,jqXHR) { - //load data... - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - }); - - $("body").on('click',".delete-api",function(event){ - if(confirm("Are you sure? this would delete all related registered endpoints and associated scopes.")){ - var href = $(this).attr('href'); - $.ajax( - { - type: "DELETE", - url: href, - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - loadApis(); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - - $("body").on('click',".regenerate-client-secret",function(event){ - if(confirm("Are you sure? Regenerating client secret would invalidate all current tokens")){ - var link = $(this).attr('href'); - $.ajax( - { - type: "PUT", - url: link, - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - //load data... - $('#client_secret').text(data.client_secret); - //clean token UI - $('#table-access-tokens').remove(); - $('#table-refresh-tokens').remove(); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); -}); \ No newline at end of file diff --git a/public/assets/js/oauth2/profile/admin/edit-scope.js b/public/assets/js/oauth2/profile/admin/edit-scope.js deleted file mode 100644 index 397cfb4f..00000000 --- a/public/assets/js/oauth2/profile/admin/edit-scope.js +++ /dev/null @@ -1,41 +0,0 @@ -$(document).ready(function() { - - $('#server-admin','#main-menu').addClass('active'); - - var scope_form = $('#scope-form'); - - var scope_validator = scope_form.validate({ - rules: { - "name" : {required: true, scopename:true,rangelength: [1, 512]}, - "short_description": {required: true, free_text:true,rangelength: [1, 512]}, - "description": {required: true, free_text:true,rangelength: [1, 1024]} - } - }); - - scope_form.submit(function( event ) { - var is_valid = scope_form.valid(); - if (is_valid){ - scope_validator.resetForm(); - var scope = scope_form.serializeForm(); - var href = $(this).attr('action'); - $.ajax( - { - type: "PUT", - url: href, - data: JSON.stringify(scope), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - displaySuccessMessage(editScopeMessages.success,scope_form); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); -}); diff --git a/public/assets/js/oauth2/profile/admin/resource-servers.js b/public/assets/js/oauth2/profile/admin/resource-servers.js deleted file mode 100644 index 0326f914..00000000 --- a/public/assets/js/oauth2/profile/admin/resource-servers.js +++ /dev/null @@ -1,173 +0,0 @@ -function loadResourceServers(){ - var link = resourceServerUrls.get; - $.ajax( - { - type: "GET", - url: link, - dataType: "json", - timeout:60000, - success: function (page,textStatus,jqXHR) { - //load data... - var items = page.data; - var template = $(' Edit Delete'); - var directives = { - 'tr':{ - 'resource_server<-context':{ - 'td.fname':'resource_server.friendly_name', - 'td.hname':'resource_server.host', - 'td.ips':'resource_server.ips', - '.resource-server-active-checkbox@value':'resource_server.id', - '.resource-server-active-checkbox@checked':function(arg){ - return arg.item.active?'true':''; - }, - '.resource-server-active-checkbox@data-resource-server-id':'resource_server.id', - '.resource-server-active-checkbox@id':function(arg){ - var id = arg.item.id; - return 'resource-server-active_'+id; - }, - 'a.edit-resource-server@href':function(arg){ - var id = arg.item.id; - var href = resourceServerUrls.edit; - return href.replace('-1',id); - }, - 'a.delete-resource-server@href':function(arg){ - var id = arg.item.id; - var href = resourceServerUrls.delete; - return href.replace('-1',id); - } - } - } - }; - var html = template.render(items, directives); - $('#body-resource-servers').html(html.html()); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); -} - -$(document).ready(function() { - - $('#server-admin','#main-menu').addClass('active'); - - //validation rules on new server form - var resource_server_form = $('#form-resource-server'); - var dialog_resource_server = $('#dialog-form-resource-server'); - - var resource_server_validator = resource_server_form.validate({ - rules: { - "host" : {required: true, nowhitespace:true, rangelength: [1, 512]}, - "friendly_name": {required: true, free_text:true, rangelength: [1, 255]}, - "ips": {required: true}, - } - }); - - dialog_resource_server.modal({ - show:false, - backdrop:"static" - }); - - $('#ips').tagsinput({ - trimValue: true, - onTagExists: function(item, $tag) { - $tag.hide().fadeIn(); - }, - allowDuplicates: false - }); - - $('#ips').on('beforeItemAdd', function(event) { - var ip = event.item; - var valid = regex_ipv4.test(ip); - if(!valid) - valid = regex_ipv6.test(ip); - if(!valid) - event.cancel = true; - }); - - dialog_resource_server.on('hidden', function () { - resource_server_form.cleanForm(); - resource_server_validator.resetForm(); - }) - - $("body").on('click',".add-resource-server",function(event){ - dialog_resource_server.modal('show'); - event.preventDefault(); - return false; - }); - - $("body").on('click',".refresh-servers",function(event){ - loadResourceServers() - event.preventDefault(); - return false; - }); - - $("body").on('click',".resource-server-active-checkbox",function(event){ - var active = $(this).is(':checked'); - var resource_server_id = $(this).attr('data-resource-server-id'); - var url = active? resourceServerUrls.activate : resourceServerUrls.deactivate; - url = url.replace('@id',resource_server_id); - var verb = active?'PUT':'DELETE'; - $.ajax( - { - type: verb, - url: url, - contentType: "application/json; charset=utf-8", - success: function (data,textStatus,jqXHR) { - //load data... - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - }); - - $("body").on('click',".save-resource-server",function(event){ - var is_valid = resource_server_form.valid(); - if (is_valid){ - var resource_server = resource_server_form.serializeForm(); - $.ajax({ - type: "POST", - url: resourceServerUrls.add, - data: JSON.stringify(resource_server), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - loadResourceServers(); - dialog_resource_server.modal('hide'); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - }); - } - event.preventDefault(); - return false; - }); - - $("body").on('click',".delete-resource-server",function(event){ - if(confirm("Are you sure? this would delete all related registered apis, endpoints and associated scopes.")){ - var href = $(this).attr('href'); - $.ajax( - { - type: "DELETE", - url: href, - dataType: "json", - timeout:60000, - success: function (data,textStatus,jqXHR) { - loadResourceServers(); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - -}); \ No newline at end of file diff --git a/public/assets/js/oauth2/profile/admin/server-private-keys.js b/public/assets/js/oauth2/profile/admin/server-private-keys.js deleted file mode 100644 index df21e6dd..00000000 --- a/public/assets/js/oauth2/profile/admin/server-private-keys.js +++ /dev/null @@ -1,318 +0,0 @@ -(function( $ ){ - - $(document).ready(function($){ - - var options = {}; - - options.ui = - { - showPopover: false, - showErrors: true, - showProgressBar: true, - showVerdictsInsideProgressBar: true, - }; - - options.rules = - { - activated: { - wordTwoCharacterClasses: true, - wordRepetitions: true - } - }; - - $(':password').pwstrength(options); - - var modal = $('#ModalAddPrivateKey'); - modal.modal({show:false}); - - $('#form-add-private-key .input-daterange').datepicker({ - startDate: "today", - todayBtn: "linked", - clearBtn: true, - todayHighlight: true, - orientation: "bottom right", - autoclose: true - }); - - // private key form - var form = $('#form-add-private-key'); - - var validator = form.validate({ - rules: { - "kid" : { - required: true, - free_text : true, - maxlength:255, - minlength: 5 - }, - "valid_from": { - required: true, - dateUS:true - }, - "valid_to": { - required: true , - dateUS:true - }, - "pem_content" : { pem_private_key : function(element){ - var autogenerate = $("#autogenerate").is(':checked'); - return autogenerate? false: true; - }}, - password: { - private_key_password_required: {pem_content_id: '#pem_content'}, - minlength: 5 - }, - "password-confirmation" : { - minlength: 5, - equalTo : "#password" - }, - "alg" : {required: true} - } - }); - - modal.on('hidden.bs.modal', function () { - form.cleanForm(); - validator.resetForm(); - }) - - $("body").on('click',".add-private-key",function(event){ - modal.modal('show'); - validator.resetForm(); - $(":password").pwstrength("forceUpdate"); - $('#autogenerate').prop('checked', true); - $('#active').prop('checked', true); - $("#pem_container").hide(); - event.preventDefault(); - return false; - }); - - $("body").on('click',"#autogenerate",function(event){ - var autogenerate = $(this).is(':checked'); - if(autogenerate){ - $("#pem_container").hide(); - } - else{ - $("#pem_container").show(); - } - }); - - $("body").on('click',".delete-private-key",function(event){ - if(window.confirm('are you sure?')){ - //delete key - var private_key_id = $(this).attr('data-private-key-id'); - - $.ajax( - { - type: "DELETE", - url: privateKeyUrls.delete.replace('@id', private_key_id), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout: 60000, - success: function (data, textStatus, jqXHR) { - $('#tr_'+private_key_id).fadeOut(300, function() { - $(this).remove(); - if($('#body-private-keys').children('tr').length) - $('.private-keys-empty-message').hide(); - else - $('.private-keys-empty-message').show(); - }); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - } - event.preventDefault(); - return false; - }); - - $("body").on('click',".save-private-key",function(event){ - - if(form.valid()) { - var private_key_data = form.serializeForm(); - private_key_data.type = 'RSA'; - - if(private_key_data.autogenerate) - delete private_key_data.pem_content; - - $.ajax( - { - type: "POST", - url: privateKeyUrls.add, - data: JSON.stringify(private_key_data), - contentType: "application/json; charset=utf-8", - dataType: "json", - timeout: 60000, - success: function (data, textStatus, jqXHR) { - modal.modal('hide'); - form.cleanForm(); - - $('.private-keys-empty-message').hide(); - loadPrivateKeys(); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - - } - event.preventDefault(); - return false; - }); - - $("body").on('click',".private-key-status",function(event){ - - var status_badge = $(this); - var private_key_id = status_badge.attr('data-private-key-id'); - var private_key_data = { id : private_key_id }; - private_key_data.active = status_badge.hasClass('private-key-active') ? false : true; - - $.ajax( - { - type: "PUT", - url: privateKeyUrls.update.replace('@id', private_key_id), - contentType: "application/json; charset=utf-8", - data: JSON.stringify(private_key_data), - dataType: "json", - timeout: 60000, - success: function (data, textStatus, jqXHR) { - loadPrivateKeys(); - }, - error: function (jqXHR, textStatus, errorThrown) { - ajaxError(jqXHR, textStatus, errorThrown); - } - } - ); - - event.preventDefault(); - return false; - }); - - $('#usage').change(function(){ - - var usage = $(this).val(); - - var alg_select = $('#alg'); - - alg_select.empty(); - - var result = []; - - if(usage === 'sig') - { - result = oauth2_supported_algorithms.sig_algorihtms.rsa; - } - else - { - result = oauth2_supported_algorithms.key_management_algorihtms; - } - - $.each(result, function(index, item) { - var key = item === 'none' ? '' : item; - alg_select.append($("