diff --git a/app/Global.scala b/app/Global.scala index 95de18d..d73b59e 100644 --- a/app/Global.scala +++ b/app/Global.scala @@ -1,12 +1,14 @@ import com.softwaremill.macwire.{ Macwire, Wired } import com.yetu.oauth2provider.utils.{ Config, CorsFilter } -import play.api.mvc.EssentialAction +import play.api.mvc.{ Result, RequestHeader, EssentialAction } import com.yetu.common.YetuCommonGlobalSettings import com.yetu.oauth2provider.registry._ +import scala.concurrent.Future object Global extends YetuCommonGlobalSettings with Macwire { + private val diRegistry: Wired = { if (Config.persist) { wiredInModule(PersistentControllerRegistry) @@ -22,4 +24,3 @@ object Global extends YetuCommonGlobalSettings with Macwire { override def doFilter(action: EssentialAction) = CorsFilter(action) } - diff --git a/app/assets/stylesheets/normal_permissions.css b/app/assets/stylesheets/normal_permissions.css new file mode 100644 index 0000000..b622b47 --- /dev/null +++ b/app/assets/stylesheets/normal_permissions.css @@ -0,0 +1,22 @@ +.page-header { + margin-bottom: 15px; +} + +.requestedPermissions { + max-height: 184px; + height: 184px; + display: block; + overflow-x: hidden; + overflow-y: auto; + margin-bottom: 15px; +} + +.termsInfo { + margin-bottom: 15px; +} + +.permissions__cancel { + text-align: right; + width: 100%; + display: block; +} \ No newline at end of file diff --git a/app/com/yetu/oauth2provider/controllers/OAuth2Auth.scala b/app/com/yetu/oauth2provider/controllers/OAuth2Auth.scala index 58866b0..418bae3 100644 --- a/app/com/yetu/oauth2provider/controllers/OAuth2Auth.scala +++ b/app/com/yetu/oauth2provider/controllers/OAuth2Auth.scala @@ -6,7 +6,7 @@ import com.yetu.oauth2provider.models.{ Permission, Permissions } import com.yetu.oauth2provider.oauth2.handlers import com.yetu.oauth2provider.oauth2.models.{ AuthorizedClient, ClientPermission, OAuth2Client, YetuUser } import com.yetu.oauth2provider.oauth2.services.{ AuthorizeErrorHandler, AuthorizeService } -import com.yetu.oauth2provider.services.data.iface.{ IClientService, IPermissionService } +import com.yetu.oauth2provider.services.data.interface.{ IClientService, IPermissionService } import com.yetu.oauth2provider.utils.Config import play.api.mvc._ import securesocial.core.RuntimeEnvironment @@ -88,7 +88,7 @@ class OAuth2Auth(authorizationHandler: handlers.AuthorizationHandler, if (client.coreYetuClient) { authorizeService.handlePermittedApps(client, authorizeRequest, request.user) } else { - authorizeService.handleClientPermissions(client, authorizeRequest, request.user) + authorizeService.handleClientPermissions(request, env, client, authorizeRequest, request.user) } } @@ -101,13 +101,11 @@ class OAuth2Auth(authorizationHandler: handlers.AuthorizationHandler, val clientOption = clientService.findClient(formData.client_id) clientOption match { - case None => { - BadRequest(s"There is a problem with clientId=[${formData.client_id}]. It does not exist in our system") - } + case None => BadRequest(s"There is a problem with clientId=[${formData.client_id}]. It does not exist in our system") case Some(client) => { val clientPermission = ClientPermission(client.clientId, client.scopes) permissionService.savePermission(request.user.email.get, clientPermission) - authorizeService.handlePermittedApp(client, Some(formData.redirect_uri), formData.state, None, request.user, clientPermission.scopes) + authorizeService.handlePermittedApp(client, formData.redirect_uri, formData.state, None, request.user, clientPermission.scopes) } } } diff --git a/app/com/yetu/oauth2provider/controllers/OAuth2ResourceServer.scala b/app/com/yetu/oauth2provider/controllers/OAuth2ResourceServer.scala index 8efcf21..0d51fe5 100644 --- a/app/com/yetu/oauth2provider/controllers/OAuth2ResourceServer.scala +++ b/app/com/yetu/oauth2provider/controllers/OAuth2ResourceServer.scala @@ -5,7 +5,7 @@ import com.yetu.oauth2provider.models.{ DataListWrapper, DataUpdateRequest } import com.yetu.oauth2provider.models.HouseholdModel.householdFormat import com.yetu.oauth2provider.oauth2.handlers.AuthorizationHandler import com.yetu.oauth2provider.oauth2.services.ScopeService -import com.yetu.oauth2provider.services.data.iface.{ IPersonService, IPublicKeyService } +import com.yetu.oauth2provider.services.data.interface.{ IPersonService, IPublicKeyService } import com.yetu.oauth2provider.signature.models.YetuPublicKey import com.yetu.oauth2provider.utils.Config import play.api.Logger diff --git a/app/com/yetu/oauth2provider/controllers/OAuth2TrustedServer.scala b/app/com/yetu/oauth2provider/controllers/OAuth2TrustedServer.scala index 1501e9d..d0d24c2 100644 --- a/app/com/yetu/oauth2provider/controllers/OAuth2TrustedServer.scala +++ b/app/com/yetu/oauth2provider/controllers/OAuth2TrustedServer.scala @@ -1,7 +1,7 @@ package com.yetu.oauth2provider package controllers -import com.yetu.oauth2provider.services.data.iface.IPersonService +import com.yetu.oauth2provider.services.data.interface.IPersonService import play.api.libs.json.{ Json, JsValue } import play.api.mvc.{ Result, Action } import com.yetu.oauth2provider.oauth2.services.ScopeService diff --git a/app/com/yetu/oauth2provider/controllers/authentication/LoginPage.scala b/app/com/yetu/oauth2provider/controllers/authentication/LoginPage.scala index d216473..0076d24 100644 --- a/app/com/yetu/oauth2provider/controllers/authentication/LoginPage.scala +++ b/app/com/yetu/oauth2provider/controllers/authentication/LoginPage.scala @@ -1,7 +1,7 @@ package com.yetu.oauth2provider.controllers.authentication import com.yetu.oauth2provider.oauth2.models.YetuUser -import com.yetu.oauth2provider.services.data.iface.IAuthCodeAccessTokenService +import com.yetu.oauth2provider.services.data.interface.IAuthCodeAccessTokenService import com.yetu.oauth2provider.utils.StringUtils import play.api.mvc._ import securesocial.controllers.BaseLoginPage diff --git a/app/com/yetu/oauth2provider/controllers/authentication/ProviderController.scala b/app/com/yetu/oauth2provider/controllers/authentication/ProviderController.scala index c056705..6f39607 100644 --- a/app/com/yetu/oauth2provider/controllers/authentication/ProviderController.scala +++ b/app/com/yetu/oauth2provider/controllers/authentication/ProviderController.scala @@ -1,7 +1,7 @@ package com.yetu.oauth2provider.controllers.authentication import com.yetu.oauth2provider.oauth2.models.YetuUser -import com.yetu.oauth2provider.services.data.iface.IPersonService +import com.yetu.oauth2provider.services.data.interface.IPersonService import com.yetu.oauth2provider.utils.Config.SessionStatusCookie import play.api.i18n.Messages import play.api.mvc.{ Action, AnyContent, Cookie, Session } diff --git a/app/com/yetu/oauth2provider/controllers/authentication/SignatureAuthenticationProvider.scala b/app/com/yetu/oauth2provider/controllers/authentication/SignatureAuthenticationProvider.scala index d418899..4e46a97 100644 --- a/app/com/yetu/oauth2provider/controllers/authentication/SignatureAuthenticationProvider.scala +++ b/app/com/yetu/oauth2provider/controllers/authentication/SignatureAuthenticationProvider.scala @@ -6,7 +6,7 @@ import java.util.Date import com.yetu.oauth2provider.signature.SignatureHelper import com.yetu.oauth2provider.signature.models.{ SignatureSyntaxException, SignatureException, SignedRequestHeaders, YetuPublicKey } -import com.yetu.oauth2provider.services.data.iface.{ IPublicKeyService, IPersonService } +import com.yetu.oauth2provider.services.data.interface.{ IPublicKeyService, IPersonService } import com.yetu.oauth2provider.signature.services.SignatureService import com.yetu.oauth2provider.utils.DateUtility import net.adamcin.httpsig.api.{ Authorization, _ } diff --git a/app/com/yetu/oauth2provider/oauth2/handlers/AuthorizationHandler.scala b/app/com/yetu/oauth2provider/oauth2/handlers/AuthorizationHandler.scala index b191114..d28b479 100644 --- a/app/com/yetu/oauth2provider/oauth2/handlers/AuthorizationHandler.scala +++ b/app/com/yetu/oauth2provider/oauth2/handlers/AuthorizationHandler.scala @@ -4,7 +4,7 @@ import java.util.Date import scalaoauth2.provider.AuthInfo import com.yetu.oauth2provider.oauth2.models.YetuUser -import com.yetu.oauth2provider.services.data.iface.{ IAuthCodeAccessTokenService, IClientService, IPersonService } +import com.yetu.oauth2provider.services.data.interface.{ IAuthCodeAccessTokenService, IClientService, IPersonService } import com.yetu.oauth2provider.utils.{ Config, JsonWebTokenGenerator, BearerTokenGenerator } import play.api.Logger import securesocial.core.providers.utils.PasswordHasher diff --git a/app/com/yetu/oauth2provider/oauth2/models/AuthorizeRequest.scala b/app/com/yetu/oauth2provider/oauth2/models/AuthorizeRequest.scala index 6441b52..185ccf3 100644 --- a/app/com/yetu/oauth2provider/oauth2/models/AuthorizeRequest.scala +++ b/app/com/yetu/oauth2provider/oauth2/models/AuthorizeRequest.scala @@ -12,7 +12,7 @@ case class AuthorizeRequest(headers: Map[String, Seq[String]], params: Map[Strin def state: String = requireParam(AuthorizeParameters.STATE) - def redirectUri: Option[String] = param(AuthorizeParameters.REDIRECT_URI) + def redirectUri: String = requireParam(AuthorizeParameters.REDIRECT_URI) def scope: Option[String] = param(AuthorizeParameters.SCOPE) } \ No newline at end of file diff --git a/app/com/yetu/oauth2provider/oauth2/services/AuthorizeService.scala b/app/com/yetu/oauth2provider/oauth2/services/AuthorizeService.scala index 92f4d1f..3da7b48 100644 --- a/app/com/yetu/oauth2provider/oauth2/services/AuthorizeService.scala +++ b/app/com/yetu/oauth2provider/oauth2/services/AuthorizeService.scala @@ -4,18 +4,20 @@ package services import java.net.URLDecoder -import scalaoauth2.provider.AuthInfo -import com.yetu.oauth2provider.services.data.iface.{ IPermissionService, IPersonService, IAuthCodeAccessTokenService, IClientService } +import com.yetu.oauth2provider.models.Permission +import com.yetu.oauth2provider.oauth2.OAuth2Protocol._ +import com.yetu.oauth2provider.oauth2.errors.InvalidState +import com.yetu.oauth2provider.oauth2.models._ +import com.yetu.oauth2provider.services.data.interface.{ IAuthCodeAccessTokenService, IClientService, IPermissionService, IPersonService } import com.yetu.oauth2provider.utils.Config.SessionStatusCookie -import play.api.mvc.{ Cookie, Controller, Result } +import com.yetu.oauth2provider.utils.{ BearerTokenGenerator, Config, NamedLogger } +import play.api.mvc.{ Controller, Cookie, RequestHeader, Result } +import securesocial.core.RuntimeEnvironment import securesocial.core.authenticator.CookieAuthenticator + import scala.concurrent.Future import scalaoauth2.provider -import scalaoauth2.provider._ -import OAuth2Protocol._ -import com.yetu.oauth2provider.oauth2.models._ -import errors.InvalidState -import com.yetu.oauth2provider.utils.{ NamedLogger, Config, BearerTokenGenerator } +import scalaoauth2.provider.{ AuthInfo, _ } class AuthorizeErrorHandler(clientService: IClientService, personService: IPersonService, @@ -42,37 +44,39 @@ class AuthorizeErrorHandler(clientService: IClientService, throw new InvalidState(s"invalid state parameter. State length is not correct.") } - val client = clientService.findClient(request.clientId).getOrElse(throw new InvalidClient(s"client_id '${request.clientId}' does not exist")) + val client = clientService + .findClient(request.clientId) + .getOrElse(throw new InvalidClient(s"client_id '${request.clientId}' does not exist")) - val validScopes: List[String] = if (client.coreYetuClient) { - client.scopes.getOrElse(List.empty) - } else { - scopeService.getScopeFromPermission(permissionService.findPermission(user.identityId.userId, client.clientId)) - } - val requestScopeString = request.scope.getOrElse(Config.SCOPE_ID) + val validScopes: List[String] = client.scopes.getOrElse(List.empty) - val requestScopes: List[String] = requestScopeString.split(' ').toList + if (!client.coreYetuClient) { + scopeService.getScopeFromPermission( + permissionService.findPermission(user.identityId.userId, client.clientId)) + } - requestScopes.foreach { requestScope => - if (!validScopes.contains(requestScope)) { - throw new InvalidScope(s"invalid scope: $requestScope") + request.scope.foreach { scope => + scope.split(' ').toList.foreach { requestScope => + if (!validScopes.contains(requestScope)) { + throw new InvalidScope(s"invalid scope: $requestScope") + } } } val validRedirectUrls = client.redirectURIs - - //If there is no redirect url in the request then we fetch the first url from LDAP as a default one - val redirectUrl = URLDecoder.decode(request.redirectUri.getOrElse(validRedirectUrls.head), "UTF-8") + val redirectUrl = URLDecoder.decode(request.redirectUri, "UTF-8") if (!validRedirectUrls.contains(redirectUrl)) { - logger.warn(s"clientID:[${client.clientId}] request redirect url is NOT VALID! [$redirectUrl]. Only allowed ones are : $validRedirectUrls}") + + logger.warn(s"clientID:[${client.clientId}] request redirect url is NOT VALID! " + + s"[$redirectUrl]. Only allowed ones are : $validRedirectUrls}") + if (Config.redirectURICheckingEnabled) { throw new RedirectUriMismatch(s"invalid redirect url.") } } val authorizedClient = AuthorizedClient(client, request, redirectUrl) - Right(authorizedClient) } catch { @@ -101,7 +105,12 @@ class AuthorizeService(authAccessService: IAuthCodeAccessTokenService, scopeService: ScopeService, permissionService: IPermissionService) extends Controller { - def handlePermittedApp(client: OAuth2Client, redirectUri: Option[String], state: String, scopeFromRequest: Option[String], user: YetuUser, userDefinedScopes: Option[List[String]] = None) = { + def handlePermittedApp(client: OAuth2Client, + redirectUri: String, + state: String, + scopeFromRequest: Option[String], + user: YetuUser, + userDefinedScopes: Option[List[String]]) = { val auth_code = BearerTokenGenerator.generateToken(Config.OAuth2.authTokenLength) val queryString: Map[String, Seq[String]] = Map( @@ -109,24 +118,13 @@ class AuthorizeService(authAccessService: IAuthCodeAccessTokenService, AuthorizeParameters.STATE -> Seq(state) ) - /* - Get the scope the user has defined when granting permissions; - if the user did not set any (because of core yetu app), get the scope of the request if it exists; - fallback to default scope of a certain client; - fallback to the most basic ID scope - */ - val scope = scopeService.getFirstScope(userDefinedScopes). - getOrElse(scopeFromRequest. - getOrElse(scopeService.getFirstScope(client.scopes). - getOrElse(Config.SCOPE_ID))) - - val redirectUrl = redirectUri.getOrElse(client.redirectURIs.head) + val scope = if (userDefinedScopes.isDefined) userDefinedScopes.map(_.mkString(" ")) else scopeFromRequest authAccessService.saveAuthCode( auth_code, - new AuthInfo[YetuUser](user, Some(client.clientId), Some(scope), Some(redirectUrl))) + new AuthInfo[YetuUser](user, Some(client.clientId), scope, Some(redirectUri))) - Redirect(redirectUrl, queryString).withCookies(getAdditionalSessionStateCookie(user.userId)) + Redirect(redirectUri, queryString).withCookies(getAdditionalSessionStateCookie(user.userId)) } def getAdditionalSessionStateCookie(userId: String): Cookie = { @@ -138,7 +136,8 @@ class AuthorizeService(authAccessService: IAuthCodeAccessTokenService, userUUID, if (CookieAuthenticator.makeTransient) CookieAuthenticator.Transient - else Some(CookieAuthenticator.absoluteTimeoutInSeconds), + else + Some(CookieAuthenticator.absoluteTimeoutInSeconds), SessionStatusCookie.cookiePath, SessionStatusCookie.cookieDomain, secure = SessionStatusCookie.cookieSecure, @@ -146,18 +145,46 @@ class AuthorizeService(authAccessService: IAuthCodeAccessTokenService, ) } - def handlePermittedApps(client: OAuth2Client, authorizeRequest: AuthorizeRequest, user: YetuUser, userDefinedScopes: Option[List[String]] = None): Result = { - handlePermittedApp(client, authorizeRequest.redirectUri, authorizeRequest.state, authorizeRequest.scope, user, userDefinedScopes) + def handlePermittedApps(client: OAuth2Client, + authorizeRequest: AuthorizeRequest, + user: YetuUser, + userDefinedScopes: Option[List[String]] = None): Result = { + + handlePermittedApp( + client, + authorizeRequest.redirectUri, + authorizeRequest.state, + authorizeRequest.scope, + user, + userDefinedScopes) } - def handleClientPermissions(client: OAuth2Client, authorizeRequest: AuthorizeRequest, user: YetuUser): Result = { + def handleClientPermissions(request: RequestHeader, + env: RuntimeEnvironment[YetuUser], + client: OAuth2Client, + authorizeRequest: AuthorizeRequest, + user: YetuUser): Result = { + val clientPermission: Option[ClientPermission] = permissionService.findPermission(user.identityId.userId, client.clientId) clientPermission match { case None => - //TODO: This should be implemented - //Ok(com.yetu.oauth2provider.views.html.permissions(permissionsForm, client.clientName, Some(client.clientId), authorizeRequest.redirectUri, Some(authorizeRequest.state))) - Ok("OK") - case Some(permission) => handlePermittedApps(client, authorizeRequest, user, userDefinedScopes = permission.scopes) + + Ok(com.yetu.oauth2provider.views.html.permissions( + Permission.permissionsForm, + client.clientName, + client.clientId, + client.scopes.getOrElse(List.empty[String]), + authorizeRequest.redirectUri, + Some(authorizeRequest.state))(request, env)) + + case Some(permission) => + /* + * TODO: + * here we can consider the scope from the url, if the scope on the url is not included + * in the client.scopes means that the application is trying to ask for more permissions then + * the one that is allowed to it.. this is the incremental permission process + */ + handlePermittedApps(client, authorizeRequest, user, userDefinedScopes = permission.scopes) } } diff --git a/app/com/yetu/oauth2provider/oauth2/services/ImplicitGrantFlowService.scala b/app/com/yetu/oauth2provider/oauth2/services/ImplicitGrantFlowService.scala index 97711aa..88753f6 100644 --- a/app/com/yetu/oauth2provider/oauth2/services/ImplicitGrantFlowService.scala +++ b/app/com/yetu/oauth2provider/oauth2/services/ImplicitGrantFlowService.scala @@ -1,7 +1,7 @@ package com.yetu.oauth2provider.oauth2.services import com.yetu.oauth2provider.oauth2.models.{ ImplicitFlowSyntaxException, ImplicitFlowException, YetuUser } -import com.yetu.oauth2provider.services.data.iface.IPersonService +import com.yetu.oauth2provider.services.data.interface.IPersonService import play.api.Logger import scala.concurrent.Future diff --git a/app/com/yetu/oauth2provider/registry/ServicesRegistry.scala b/app/com/yetu/oauth2provider/registry/ServicesRegistry.scala index 81c9fe0..d609726 100644 --- a/app/com/yetu/oauth2provider/registry/ServicesRegistry.scala +++ b/app/com/yetu/oauth2provider/registry/ServicesRegistry.scala @@ -10,12 +10,14 @@ import com.yetu.oauth2provider.oauth2.OAuth2TokenEndpoint import com.yetu.oauth2provider.oauth2.handlers.AuthorizationHandler import com.yetu.oauth2provider.oauth2.models.YetuUser import com.yetu.oauth2provider.oauth2.services._ -import com.yetu.oauth2provider.services.data.{ MemoryUserService, _ } -import com.yetu.oauth2provider.services.data.iface._ +import com.yetu.oauth2provider.services.data.interface._ +import com.yetu.oauth2provider.services.data.ldap._ +import com.yetu.oauth2provider.services.data.memory._ +import com.yetu.oauth2provider.services.data.riak.{ RiakAuthCodeAccessTokens, RiakAuthenticatorStore, RiakMailTokenService } import com.yetu.oauth2provider.signature.services.SignatureService import com.yetu.oauth2provider.utils.Config.RiakSettings import com.yetu.oauth2provider.utils.JsonWebTokenGenerator -import securesocial.core.authenticator.{ HttpHeaderAuthenticator, AuthenticatorStore } +import securesocial.core.authenticator.{ AuthenticatorStore, HttpHeaderAuthenticator } import securesocial.core.providers.utils.PasswordHasher import securesocial.core.services.{ CacheService, UserService } @@ -47,7 +49,10 @@ trait PersistentDataServices { lazy val dao: LdapDAO = wire[LdapDAO] lazy val clientService: IClientService = wire[LdapClientService] - lazy val permissionService: IPermissionService = wire[LdapPermissionService] + + //TODO: change this after LDAP is not in use anymore to use the new API. + //TODO: LDAP permission service is actually broken, do not use. + lazy val permissionService: IPermissionService = wire[MemoryPermissionService] lazy val publicKeyService: IPublicKeyService = new LdapPublicKeyService(new LdapPersonService(dao)) diff --git a/app/com/yetu/oauth2provider/services/data/api/APIClientService.scala b/app/com/yetu/oauth2provider/services/data/api/APIClientService.scala new file mode 100644 index 0000000..56ba033 --- /dev/null +++ b/app/com/yetu/oauth2provider/services/data/api/APIClientService.scala @@ -0,0 +1,24 @@ +package com.yetu.oauth2provider.services.data.api + +import com.yetu.oauth2provider.oauth2.models.OAuth2Client +import com.yetu.oauth2provider.services.data.interface.IClientService + +class APIClientService() extends IClientService { + + def saveClient(client: OAuth2Client, ignoreEntryAlreadyExists: Boolean): Unit = { + + } + + def findClient(clientId: String): Option[OAuth2Client] = { + None + } + + def deleteClient(client: OAuth2Client) = { + + } + + def deleteClient(clientId: String) = { + + } + +} diff --git a/app/com/yetu/oauth2provider/services/data/iface/IPermissionService.scala b/app/com/yetu/oauth2provider/services/data/iface/IPermissionService.scala deleted file mode 100644 index 3c33eef..0000000 --- a/app/com/yetu/oauth2provider/services/data/iface/IPermissionService.scala +++ /dev/null @@ -1,13 +0,0 @@ -package com.yetu.oauth2provider.services.data.iface - -import com.yetu.oauth2provider.oauth2.models.ClientPermission - -trait IPermissionService { - - def savePermission(email: String, clientPermission: ClientPermission, ignoreEntryAlreadyExists: Boolean = false): Unit - - def deletePermission(email: String, clientId: String) - - def findPermission(userId: String, clientId: String): Option[ClientPermission] - -} diff --git a/app/com/yetu/oauth2provider/services/data/iface/IAuthCodeAccessTokenService.scala b/app/com/yetu/oauth2provider/services/data/interface/IAuthCodeAccessTokenService.scala similarity index 88% rename from app/com/yetu/oauth2provider/services/data/iface/IAuthCodeAccessTokenService.scala rename to app/com/yetu/oauth2provider/services/data/interface/IAuthCodeAccessTokenService.scala index 2364425..db08394 100644 --- a/app/com/yetu/oauth2provider/services/data/iface/IAuthCodeAccessTokenService.scala +++ b/app/com/yetu/oauth2provider/services/data/interface/IAuthCodeAccessTokenService.scala @@ -1,4 +1,4 @@ -package com.yetu.oauth2provider.services.data.iface +package com.yetu.oauth2provider.services.data.interface import com.yetu.oauth2provider.oauth2.models.YetuUser @@ -18,11 +18,13 @@ trait IAuthCodeAccessTokenService { val saveAuthInfoToken = authInfo.clientId.map( clientId => saveAuthInfoToAccessToken(authInfo.user.identityId.userId + clientId, accessToken)) - for { + val result = for { token <- saveToken info <- saveAuthInfo - client <- saveAuthInfoToken.getOrElse(Future.successful()) + client <- saveAuthInfoToken.getOrElse(Future.successful(Unit)) } yield client + + result.map(_ => Unit) } def saveAuthCode(code: String, authInfo: AuthInfo[YetuUser]): Future[Unit] diff --git a/app/com/yetu/oauth2provider/services/data/iface/IClientService.scala b/app/com/yetu/oauth2provider/services/data/interface/IClientService.scala similarity index 64% rename from app/com/yetu/oauth2provider/services/data/iface/IClientService.scala rename to app/com/yetu/oauth2provider/services/data/interface/IClientService.scala index ed9e6d8..f440582 100644 --- a/app/com/yetu/oauth2provider/services/data/iface/IClientService.scala +++ b/app/com/yetu/oauth2provider/services/data/interface/IClientService.scala @@ -1,9 +1,9 @@ package com.yetu.oauth2provider package services package data -package iface +package interface -import com.yetu.oauth2provider.oauth2.models.{ OAuth2Client, ClientPermission } +import com.yetu.oauth2provider.oauth2.models.OAuth2Client trait IClientService { def saveClient(client: OAuth2Client, ignoreEntryAlreadyExists: Boolean = false): Unit @@ -13,7 +13,4 @@ trait IClientService { def deleteClient(client: OAuth2Client) def deleteClient(clientId: String) - - def deleteAllClients(): Unit //do nothing, can be overridden for tests. - } diff --git a/app/com/yetu/oauth2provider/services/data/iface/IMailTokenService.scala b/app/com/yetu/oauth2provider/services/data/interface/IMailTokenService.scala similarity index 90% rename from app/com/yetu/oauth2provider/services/data/iface/IMailTokenService.scala rename to app/com/yetu/oauth2provider/services/data/interface/IMailTokenService.scala index 95e18fb..df4cfc4 100644 --- a/app/com/yetu/oauth2provider/services/data/iface/IMailTokenService.scala +++ b/app/com/yetu/oauth2provider/services/data/interface/IMailTokenService.scala @@ -1,4 +1,4 @@ -package com.yetu.oauth2provider.services.data.iface +package com.yetu.oauth2provider.services.data.interface import securesocial.core.providers.MailToken diff --git a/app/com/yetu/oauth2provider/services/data/interface/IPermissionService.scala b/app/com/yetu/oauth2provider/services/data/interface/IPermissionService.scala new file mode 100644 index 0000000..9b1e492 --- /dev/null +++ b/app/com/yetu/oauth2provider/services/data/interface/IPermissionService.scala @@ -0,0 +1,13 @@ +package com.yetu.oauth2provider.services.data.interface + +import com.yetu.oauth2provider.oauth2.models.ClientPermission + +trait IPermissionService { + + def savePermission(uuid: String, clientPermission: ClientPermission) + + def deletePermission(uuid: String, clientId: String) + + def findPermission(userId: String, clientId: String): Option[ClientPermission] + +} diff --git a/app/com/yetu/oauth2provider/services/data/iface/IPersonService.scala b/app/com/yetu/oauth2provider/services/data/interface/IPersonService.scala similarity index 63% rename from app/com/yetu/oauth2provider/services/data/iface/IPersonService.scala rename to app/com/yetu/oauth2provider/services/data/interface/IPersonService.scala index 4addf15..9128cf9 100644 --- a/app/com/yetu/oauth2provider/services/data/iface/IPersonService.scala +++ b/app/com/yetu/oauth2provider/services/data/interface/IPersonService.scala @@ -1,15 +1,11 @@ package com.yetu.oauth2provider package services package data -package iface +package interface -import com.yetu.oauth2provider.oauth2.models.{ IdentityId, YetuUser, ClientPermission } import com.yetu.oauth2provider.models.DataUpdateRequest +import com.yetu.oauth2provider.oauth2.models.YetuUser import play.api.mvc.Result -import securesocial.core.{ PasswordInfo, BasicProfile } -import securesocial.core.services.SaveMode - -import scala.concurrent.Future trait IPersonService extends ISecureSocialUserService { diff --git a/app/com/yetu/oauth2provider/services/data/iface/IPublicKeyService.scala b/app/com/yetu/oauth2provider/services/data/interface/IPublicKeyService.scala similarity index 90% rename from app/com/yetu/oauth2provider/services/data/iface/IPublicKeyService.scala rename to app/com/yetu/oauth2provider/services/data/interface/IPublicKeyService.scala index fd9f594..95602c9 100644 --- a/app/com/yetu/oauth2provider/services/data/iface/IPublicKeyService.scala +++ b/app/com/yetu/oauth2provider/services/data/interface/IPublicKeyService.scala @@ -1,4 +1,4 @@ -package com.yetu.oauth2provider.services.data.iface +package com.yetu.oauth2provider.services.data.interface import com.yetu.oauth2provider.signature.models.YetuPublicKey diff --git a/app/com/yetu/oauth2provider/services/data/iface/ISecureSocialUserService.scala b/app/com/yetu/oauth2provider/services/data/interface/ISecureSocialUserService.scala similarity index 97% rename from app/com/yetu/oauth2provider/services/data/iface/ISecureSocialUserService.scala rename to app/com/yetu/oauth2provider/services/data/interface/ISecureSocialUserService.scala index 4d9c6e2..921dd65 100644 --- a/app/com/yetu/oauth2provider/services/data/iface/ISecureSocialUserService.scala +++ b/app/com/yetu/oauth2provider/services/data/interface/ISecureSocialUserService.scala @@ -1,4 +1,4 @@ -package com.yetu.oauth2provider.services.data.iface +package com.yetu.oauth2provider.services.data.interface import com.yetu.oauth2provider.oauth2.models.{ IdentityId, YetuUser, ClientPermission } import com.yetu.oauth2provider.models.DataUpdateRequest diff --git a/app/com/yetu/oauth2provider/services/data/LdapClientService.scala b/app/com/yetu/oauth2provider/services/data/ldap/LdapClientService.scala similarity index 74% rename from app/com/yetu/oauth2provider/services/data/LdapClientService.scala rename to app/com/yetu/oauth2provider/services/data/ldap/LdapClientService.scala index 4dc609b..9e0a3cb 100644 --- a/app/com/yetu/oauth2provider/services/data/LdapClientService.scala +++ b/app/com/yetu/oauth2provider/services/data/ldap/LdapClientService.scala @@ -1,27 +1,16 @@ -package com.yetu.oauth2provider -package services -package data +package com.yetu.oauth2provider.services.data.ldap -import com.unboundid.ldap.sdk.Attribute -import com.unboundid.ldap.sdk.Entry -import com.unboundid.ldap.sdk.SearchResultEntry -import play.api.Logger +import com.unboundid.ldap.sdk.{ Attribute, Entry, SearchResultEntry } import com.yetu.oauth2provider.data.ldap.LdapDAO import com.yetu.oauth2provider.data.ldap.models.Client -import com.yetu.oauth2provider.services.data.iface.IClientService - import com.yetu.oauth2provider.oauth2.models.OAuth2Client +import com.yetu.oauth2provider.services.data.interface.IClientService class LdapClientService(dao: LdapDAO) extends IClientService { - /** - * - * - * @param client - * @param ignoreEntryAlreadyExists - */ def saveClient(client: OAuth2Client, ignoreEntryAlreadyExists: Boolean): Unit = { - var entry = new Entry(Client.getDN(client.clientId)) + + val entry = new Entry(Client.getDN(client.clientId)) entry.addAttribute(Client.getObjectClass()) entry.addAttribute(new Attribute(Client.CLIENT_ID, client.clientId)) entry.addAttribute(new Attribute(Client.CLIENT_SECRET, client.clientSecret)) @@ -68,10 +57,4 @@ class LdapClientService(dao: LdapDAO) extends IClientService { dao.deleteEntry(Client.getDN(clientId)) } - def deleteAllClients() = { - Logger.warn("delete All Clients was executed. This method should only execute during testing. Do your tests use the real ldap?") - println("delete All Clients was executed. This method should only execute during testing. Do your tests use the real ldap?") - //do nothing, can be overridden for tests. - } - } diff --git a/app/com/yetu/oauth2provider/services/data/LdapPermissionService.scala b/app/com/yetu/oauth2provider/services/data/ldap/LdapPermissionService.scala similarity index 61% rename from app/com/yetu/oauth2provider/services/data/LdapPermissionService.scala rename to app/com/yetu/oauth2provider/services/data/ldap/LdapPermissionService.scala index 7b2d6db..a435fb6 100644 --- a/app/com/yetu/oauth2provider/services/data/LdapPermissionService.scala +++ b/app/com/yetu/oauth2provider/services/data/ldap/LdapPermissionService.scala @@ -1,15 +1,10 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.ldap -import com.unboundid.ldap.sdk.{ Attribute, Entry, Modification, ModificationType, SearchResultEntry } +import com.unboundid.ldap.sdk.{ Attribute, Entry, SearchResultEntry } import com.yetu.oauth2provider.data.ldap.LdapDAO -import com.yetu.oauth2provider.data.ldap.models.{ Client, People, ClientPermission => LdapClientPermission } -import com.yetu.oauth2provider.oauth2.models.{ ClientPermission, IdentityId, YetuUser } -import com.yetu.oauth2provider.services.data.iface.{ IPermissionService, IPersonService } -import com.yetu.oauth2provider.utils.{ DateUtility, LDAPUtils, StringUtils, UUIDGenerator } -import play.api.Logger -import play.api.mvc.Result -import play.api.mvc.Results._ -import securesocial.core.{ PasswordInfo, _ } +import com.yetu.oauth2provider.data.ldap.models.{ Client, ClientPermission => LdapClientPermission } +import com.yetu.oauth2provider.oauth2.models.ClientPermission +import com.yetu.oauth2provider.services.data.interface.IPermissionService class LdapPermissionService(dao: LdapDAO) extends IPermissionService { @@ -24,11 +19,11 @@ class LdapPermissionService(dao: LdapDAO) extends IPermissionService { } } - def savePermission(email: String, clientPermission: ClientPermission, ignoreEntryAlreadyExists: Boolean = false): Unit = { + def savePermission(email: String, clientPermission: ClientPermission): Unit = { //ou=permissions does not exist it will give error so first create that if is not val permissionTree = new Entry(LdapClientPermission.getDN(email)) permissionTree.addAttribute(LdapClientPermission.getObjectClass()) - dao.persist(permissionTree, true) + dao.persist(permissionTree, ignoreEntryAlreadyExists = true) val entry = new Entry(LdapClientPermission.getClientDN(clientPermission.clientId, email)) entry.addAttribute(LdapClientPermission.getClientObjectClass()) @@ -37,7 +32,7 @@ class LdapPermissionService(dao: LdapDAO) extends IPermissionService { entry.addAttribute(new Attribute("scope", scope)) } - dao.persist(entry, ignoreEntryAlreadyExists) + dao.persist(entry, ignoreEntryAlreadyExists = true) } def deletePermission(email: String, clientId: String) = { diff --git a/app/com/yetu/oauth2provider/services/data/LdapPersonService.scala b/app/com/yetu/oauth2provider/services/data/ldap/LdapPersonService.scala similarity index 97% rename from app/com/yetu/oauth2provider/services/data/LdapPersonService.scala rename to app/com/yetu/oauth2provider/services/data/ldap/LdapPersonService.scala index 7b70655..b260ed1 100644 --- a/app/com/yetu/oauth2provider/services/data/LdapPersonService.scala +++ b/app/com/yetu/oauth2provider/services/data/ldap/LdapPersonService.scala @@ -1,25 +1,19 @@ -package com.yetu.oauth2provider -package services -package data - -import java.util.Date +package com.yetu.oauth2provider.services.data.ldap import com.unboundid.ldap.sdk.{ Attribute, Entry, Modification, ModificationType, SearchResultEntry } import com.yetu.oauth2provider.data.ldap.LdapDAO -import com.yetu.oauth2provider.data.ldap.models.{ People, ClientPermission => LdapClientPermission } +import com.yetu.oauth2provider.data.ldap.models.{ ClientPermission => LdapClientPermission, People } import com.yetu.oauth2provider.models.DataUpdateRequest import com.yetu.oauth2provider.oauth2.models._ -import com.yetu.oauth2provider.services.data.iface.IPersonService +import com.yetu.oauth2provider.services.data.interface.IPersonService import com.yetu.oauth2provider.signature.models.YetuPublicKey import com.yetu.oauth2provider.utils._ import com.yetu.oauth2resource.model.ContactInfo -import org.joda.time.DateTime -import play.api.Logger import play.api.mvc.Result import play.api.mvc.Results._ import securesocial.controllers.UserAgreement -import securesocial.core.{ PasswordInfo, _ } import securesocial.core.services.SaveMode +import securesocial.core.{ PasswordInfo, _ } import scala.concurrent.Future import scala.util.Try diff --git a/app/com/yetu/oauth2provider/services/data/LdapPublicKeyService.scala b/app/com/yetu/oauth2provider/services/data/ldap/LdapPublicKeyService.scala similarity index 85% rename from app/com/yetu/oauth2provider/services/data/LdapPublicKeyService.scala rename to app/com/yetu/oauth2provider/services/data/ldap/LdapPublicKeyService.scala index 67e5743..dd1b7f4 100644 --- a/app/com/yetu/oauth2provider/services/data/LdapPublicKeyService.scala +++ b/app/com/yetu/oauth2provider/services/data/ldap/LdapPublicKeyService.scala @@ -1,6 +1,6 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.ldap -import com.yetu.oauth2provider.services.data.iface.IPublicKeyService +import com.yetu.oauth2provider.services.data.interface.IPublicKeyService import com.yetu.oauth2provider.signature.models.YetuPublicKey import play.api.Logger @@ -8,7 +8,7 @@ import scala.concurrent.Future class LdapPublicKeyService(personService: LdapPersonService) extends IPublicKeyService { - lazy val logger = Logger("com.yetu.oauth2provider.services.data.LdapPublicKeyService ") + lazy val logger = Logger("com.yetu.oauth2provider.services.data.ldap.LdapPublicKeyService ") override def storeKey(userId: String, key: YetuPublicKey): Unit = { personService.modifyUserPublicKey(userId, key) diff --git a/app/com/yetu/oauth2provider/services/data/LdapUserService.scala b/app/com/yetu/oauth2provider/services/data/ldap/LdapUserService.scala similarity index 87% rename from app/com/yetu/oauth2provider/services/data/LdapUserService.scala rename to app/com/yetu/oauth2provider/services/data/ldap/LdapUserService.scala index fb1f75f..fe61562 100644 --- a/app/com/yetu/oauth2provider/services/data/LdapUserService.scala +++ b/app/com/yetu/oauth2provider/services/data/ldap/LdapUserService.scala @@ -1,8 +1,8 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.ldap import com.yetu.oauth2provider.data.ldap.LdapDAO import com.yetu.oauth2provider.oauth2.models.YetuUser -import com.yetu.oauth2provider.services.data.iface.IMailTokenService +import com.yetu.oauth2provider.services.data.interface.IMailTokenService import securesocial.core.providers.MailToken import securesocial.core.services.UserService diff --git a/app/com/yetu/oauth2provider/services/data/MemoryAuthCodeAccessTokens.scala b/app/com/yetu/oauth2provider/services/data/memory/MemoryAuthCodeAccessTokens.scala similarity index 89% rename from app/com/yetu/oauth2provider/services/data/MemoryAuthCodeAccessTokens.scala rename to app/com/yetu/oauth2provider/services/data/memory/MemoryAuthCodeAccessTokens.scala index 7c317bf..34681ae 100644 --- a/app/com/yetu/oauth2provider/services/data/MemoryAuthCodeAccessTokens.scala +++ b/app/com/yetu/oauth2provider/services/data/memory/MemoryAuthCodeAccessTokens.scala @@ -1,9 +1,9 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.memory import com.yetu.oauth2provider.oauth2.models.YetuUser import scalaoauth2.provider.AuthInfo -import com.yetu.oauth2provider.services.data.iface.IAuthCodeAccessTokenService +import com.yetu.oauth2provider.services.data.interface.IAuthCodeAccessTokenService import play.api.Logger import scala.concurrent.Future @@ -15,7 +15,7 @@ import scalaoauth2.provider.AccessToken class MemoryAuthCodeAccessTokens extends IAuthCodeAccessTokenService { val logger = Logger(this.getClass) - import com.yetu.oauth2provider.services.data.MemoryAuthCodeAccessTokens._ + import com.yetu.oauth2provider.services.data.memory.MemoryAuthCodeAccessTokens._ def saveAccessToken(token: String, accessToken: AccessToken) = { logger.debug(s"saveAuthCode token=$token accessToken=$accessToken") @@ -37,7 +37,7 @@ class MemoryAuthCodeAccessTokens extends IAuthCodeAccessTokenService { Future.successful(accessTokens += (key -> accessToken)) } - def findAuthInfoByAuthCode(code: String) = { + def findAuthInfoByAuthCode(code: String): Future[Option[AuthInfo[YetuUser]]] = { val info = authCodes.get(code) logger.debug(s"findAuthInfoByAuthCode code: $code result=$info") Future.successful(info) diff --git a/app/com/yetu/oauth2provider/services/data/MemoryClientService.scala b/app/com/yetu/oauth2provider/services/data/memory/MemoryClientService.scala similarity index 60% rename from app/com/yetu/oauth2provider/services/data/MemoryClientService.scala rename to app/com/yetu/oauth2provider/services/data/memory/MemoryClientService.scala index 3487109..ad47fca 100644 --- a/app/com/yetu/oauth2provider/services/data/MemoryClientService.scala +++ b/app/com/yetu/oauth2provider/services/data/memory/MemoryClientService.scala @@ -1,8 +1,7 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.memory -import com.yetu.oauth2provider.oauth2.models.{ ClientPermission, OAuth2Client } -import com.yetu.oauth2provider.services.data.iface.IClientService -import play.api.Logger +import com.yetu.oauth2provider.oauth2.models.OAuth2Client +import com.yetu.oauth2provider.services.data.interface.IClientService class MemoryClientService extends IClientService { @@ -13,15 +12,9 @@ class MemoryClientService extends IClientService { } override def findClient(clientId: String): Option[OAuth2Client] = { - clients.get(clientId) } - override def deleteAllClients(): Unit = { - Logger.warn("delete All Clients was executed") - clients = Map[String, OAuth2Client]() - } - override def deleteClient(client: OAuth2Client) = clients -= client.clientId override def deleteClient(clientId: String) = clients -= clientId @@ -29,6 +22,5 @@ class MemoryClientService extends IClientService { } object MemoryClientService { - var clients = Map[String, OAuth2Client]() } diff --git a/app/com/yetu/oauth2provider/services/data/MemoryMailTokenService.scala b/app/com/yetu/oauth2provider/services/data/memory/MemoryMailTokenService.scala similarity index 91% rename from app/com/yetu/oauth2provider/services/data/MemoryMailTokenService.scala rename to app/com/yetu/oauth2provider/services/data/memory/MemoryMailTokenService.scala index 551f582..9e072b8 100644 --- a/app/com/yetu/oauth2provider/services/data/MemoryMailTokenService.scala +++ b/app/com/yetu/oauth2provider/services/data/memory/MemoryMailTokenService.scala @@ -1,6 +1,6 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.memory -import com.yetu.oauth2provider.services.data.iface.IMailTokenService +import com.yetu.oauth2provider.services.data.interface.IMailTokenService import play.api.Logger import securesocial.core.providers.MailToken diff --git a/app/com/yetu/oauth2provider/services/data/MemoryPermissionService.scala b/app/com/yetu/oauth2provider/services/data/memory/MemoryPermissionService.scala similarity index 68% rename from app/com/yetu/oauth2provider/services/data/MemoryPermissionService.scala rename to app/com/yetu/oauth2provider/services/data/memory/MemoryPermissionService.scala index c6741fd..899fb17 100644 --- a/app/com/yetu/oauth2provider/services/data/MemoryPermissionService.scala +++ b/app/com/yetu/oauth2provider/services/data/memory/MemoryPermissionService.scala @@ -1,22 +1,26 @@ -package com.yetu.oauth2provider.services.data - -import com.yetu.oauth2provider.oauth2.models.{ YetuUser, ClientPermission } -import com.yetu.oauth2provider.services.data.iface.IPermissionService +package com.yetu.oauth2provider.services.data.memory +import com.yetu.oauth2provider.oauth2.models.ClientPermission +import com.yetu.oauth2provider.services.data.interface.IPermissionService import play.api.Logger +object MemoryPermissionService { + + var permissions = Map[EmailClient, ClientPermission]() +} + class MemoryPermissionService extends IPermissionService { - val logger = Logger(this.getClass()) + val logger = Logger(this.getClass) import MemoryPermissionService.permissions - override def savePermission(email: String, clientPermission: ClientPermission, ignoreEntryAlreadyExists: Boolean): Unit = { + override def savePermission(email: String, clientPermission: ClientPermission): Unit = { logger.debug(s"save permission $email -> ${clientPermission.clientId}") permissions += EmailClient(email, clientPermission.clientId) -> clientPermission } override def deletePermission(email: String, clientId: String): Unit = { - logger.debug(s"delete permission $email -> ${clientId}") + logger.debug(s"delete permission $email -> $clientId") permissions -= EmailClient(email, clientId) } @@ -31,9 +35,4 @@ class MemoryPermissionService extends IPermissionService { } } -case class EmailClient(email: String, clientId: String) - -object MemoryPermissionService { - - var permissions = Map[EmailClient, ClientPermission]() -} +case class EmailClient(email: String, clientId: String) \ No newline at end of file diff --git a/app/com/yetu/oauth2provider/services/data/MemoryPersonService.scala b/app/com/yetu/oauth2provider/services/data/memory/MemoryPersonService.scala similarity index 74% rename from app/com/yetu/oauth2provider/services/data/MemoryPersonService.scala rename to app/com/yetu/oauth2provider/services/data/memory/MemoryPersonService.scala index e863582..df92184 100644 --- a/app/com/yetu/oauth2provider/services/data/MemoryPersonService.scala +++ b/app/com/yetu/oauth2provider/services/data/memory/MemoryPersonService.scala @@ -1,10 +1,10 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.memory import java.util.Date import com.yetu.oauth2provider.models.DataUpdateRequest import com.yetu.oauth2provider.oauth2.models.{ YetuUser, YetuUserHelper } -import com.yetu.oauth2provider.services.data.iface.IPersonService +import com.yetu.oauth2provider.services.data.interface.IPersonService import com.yetu.oauth2provider.utils.UUIDGenerator import play.api.Logger import play.api.mvc.Result @@ -13,16 +13,11 @@ import securesocial.core.providers.UsernamePasswordProvider import securesocial.core.services.SaveMode import securesocial.core.{ BasicProfile, PasswordInfo } -import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future -/** - * TODO: implement user service properly! - * Method signatures are not consistent and should be refactored. - */ class MemoryPersonService extends IPersonService { - import com.yetu.oauth2provider.services.data.MemoryPersonService.users + import com.yetu.oauth2provider.services.data.memory.MemoryPersonService.users val logger = Logger("com.yetu.oauth2provider.services.memory.MemoryPersonService") @@ -69,7 +64,6 @@ class MemoryPersonService extends IPersonService { } case _ => logger.warn("not saving as signUp; ignoring request.") - // val testUser = YetuUser(IdentityId("test@test.test222", "userpass"), "5d64e6dc-aaaa-4e91-b463-d15qweq25daf95","firstname", "lastname", "firstname lastname as fullname", Some("test@test.test222"), None, AuthenticationMethod("userPassword"), None, None, Some(PasswordInfo("bcrypt", "$2a$10$qHwUqmHA7.24IZFNL90ke.mvjXwznoBh1pGR8D5r1TJ1tf9vttLji", None))) findYetuUser(user.userId).get } userToReturn @@ -83,12 +77,6 @@ class MemoryPersonService extends IPersonService { } def link(current: YetuUser, to: BasicProfile): Future[YetuUser] = { - // if (current.identities.exists(i => i.providerId == to.providerId && i.userId == to.userId)) { - // Future.successful(current) - // } else { - // val added = to :: current.identities - // val updatedUser = current.copy(identities = added) - // users = users + ((current.main.providerId, current.main.userId) -> updatedUser) Future.successful(current) } diff --git a/app/com/yetu/oauth2provider/services/data/MemoryPublicKeyService.scala b/app/com/yetu/oauth2provider/services/data/memory/MemoryPublicKeyService.scala similarity index 84% rename from app/com/yetu/oauth2provider/services/data/MemoryPublicKeyService.scala rename to app/com/yetu/oauth2provider/services/data/memory/MemoryPublicKeyService.scala index 142b329..402ae2c 100644 --- a/app/com/yetu/oauth2provider/services/data/MemoryPublicKeyService.scala +++ b/app/com/yetu/oauth2provider/services/data/memory/MemoryPublicKeyService.scala @@ -1,6 +1,6 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.memory -import com.yetu.oauth2provider.services.data.iface.IPublicKeyService +import com.yetu.oauth2provider.services.data.interface.IPublicKeyService import com.yetu.oauth2provider.signature.models.YetuPublicKey import play.api.Logger @@ -9,7 +9,7 @@ import scala.concurrent.Future class MemoryPublicKeyService extends IPublicKeyService { import MemoryPublicKeyService.keys - lazy val logger = Logger("com.yetu.oauth2provider.services.data.MemoryPublicKeyService ") + lazy val logger = Logger("com.yetu.oauth2provider.services.data.memory.MemoryPublicKeyService ") override def storeKey(userId: String, key: YetuPublicKey): Unit = { keys += userId -> key diff --git a/app/com/yetu/oauth2provider/services/data/MemoryUserService.scala b/app/com/yetu/oauth2provider/services/data/memory/MemoryUserService.scala similarity index 85% rename from app/com/yetu/oauth2provider/services/data/MemoryUserService.scala rename to app/com/yetu/oauth2provider/services/data/memory/MemoryUserService.scala index b7696ad..b10ab63 100644 --- a/app/com/yetu/oauth2provider/services/data/MemoryUserService.scala +++ b/app/com/yetu/oauth2provider/services/data/memory/MemoryUserService.scala @@ -1,7 +1,7 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.memory import com.yetu.oauth2provider.oauth2.models.YetuUser -import com.yetu.oauth2provider.services.data.iface.IMailTokenService +import com.yetu.oauth2provider.services.data.interface.IMailTokenService import securesocial.core.providers.MailToken import securesocial.core.services.UserService diff --git a/app/com/yetu/oauth2provider/services/data/RiakAuthCodeAccessTokens.scala b/app/com/yetu/oauth2provider/services/data/riak/RiakAuthCodeAccessTokens.scala similarity index 92% rename from app/com/yetu/oauth2provider/services/data/RiakAuthCodeAccessTokens.scala rename to app/com/yetu/oauth2provider/services/data/riak/RiakAuthCodeAccessTokens.scala index e54d35c..39e9980 100644 --- a/app/com/yetu/oauth2provider/services/data/RiakAuthCodeAccessTokens.scala +++ b/app/com/yetu/oauth2provider/services/data/riak/RiakAuthCodeAccessTokens.scala @@ -1,16 +1,14 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.riak import com.yetu.oauth2provider.data.riak.RiakConnection import com.yetu.oauth2provider.oauth2.models.YetuUser +import com.yetu.oauth2provider.services.data.interface.IAuthCodeAccessTokenService import com.yetu.oauth2provider.utils.NamedLogger -import scalaoauth2.provider.AuthInfo -import com.yetu.oauth2provider.services.data.iface.IAuthCodeAccessTokenService -import play.api.Logger -import play.api.libs.json._ import play.api.libs.functional.syntax._ +import play.api.libs.json._ import scala.concurrent.Future -import scalaoauth2.provider.AccessToken +import scalaoauth2.provider.{ AccessToken, AuthInfo } /** * riak implementation for authorization codes and access tokens given to OAuth2 clients such as the homescreen diff --git a/app/com/yetu/oauth2provider/services/data/RiakAuthenticatorStore.scala b/app/com/yetu/oauth2provider/services/data/riak/RiakAuthenticatorStore.scala similarity index 97% rename from app/com/yetu/oauth2provider/services/data/RiakAuthenticatorStore.scala rename to app/com/yetu/oauth2provider/services/data/riak/RiakAuthenticatorStore.scala index 8fa9a48..bb6b398 100644 --- a/app/com/yetu/oauth2provider/services/data/RiakAuthenticatorStore.scala +++ b/app/com/yetu/oauth2provider/services/data/riak/RiakAuthenticatorStore.scala @@ -1,4 +1,4 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.riak import com.yetu.oauth2provider.data.riak.RiakConnection import com.yetu.oauth2provider.oauth2.models.YetuUser diff --git a/app/com/yetu/oauth2provider/services/data/RiakMailTokenService.scala b/app/com/yetu/oauth2provider/services/data/riak/RiakMailTokenService.scala similarity index 93% rename from app/com/yetu/oauth2provider/services/data/RiakMailTokenService.scala rename to app/com/yetu/oauth2provider/services/data/riak/RiakMailTokenService.scala index 6aa0264..a0b4f70 100644 --- a/app/com/yetu/oauth2provider/services/data/RiakMailTokenService.scala +++ b/app/com/yetu/oauth2provider/services/data/riak/RiakMailTokenService.scala @@ -1,7 +1,7 @@ -package com.yetu.oauth2provider.services.data +package com.yetu.oauth2provider.services.data.riak import com.yetu.oauth2provider.data.riak.RiakConnection -import com.yetu.oauth2provider.services.data.iface.IMailTokenService +import com.yetu.oauth2provider.services.data.interface.IMailTokenService import com.yetu.oauth2provider.utils.NamedLogger import play.api.libs.json.Json import securesocial.controllers.{ RegistrationInfo, UserAgreement } diff --git a/app/com/yetu/oauth2provider/signature/services/SignatureService.scala b/app/com/yetu/oauth2provider/signature/services/SignatureService.scala index 2b810bb..fb31302 100644 --- a/app/com/yetu/oauth2provider/signature/services/SignatureService.scala +++ b/app/com/yetu/oauth2provider/signature/services/SignatureService.scala @@ -1,7 +1,7 @@ package com.yetu.oauth2provider.signature.services import com.yetu.oauth2provider.oauth2.models.YetuUser -import com.yetu.oauth2provider.services.data.iface.{ IPersonService, IPublicKeyService } +import com.yetu.oauth2provider.services.data.interface.{ IPersonService, IPublicKeyService } import com.yetu.oauth2provider.signature.SignatureHelper import com.yetu.oauth2provider.signature.models.{ SignatureSyntaxException, SignatureException, YetuPublicKey, SignedRequestHeaders } import com.yetu.oauth2provider.utils.{ Config, DateUtility } diff --git a/app/com/yetu/oauth2provider/utils/CorsFilter.scala b/app/com/yetu/oauth2provider/utils/CorsFilter.scala index 0c1dcee..41c62e5 100644 --- a/app/com/yetu/oauth2provider/utils/CorsFilter.scala +++ b/app/com/yetu/oauth2provider/utils/CorsFilter.scala @@ -1,7 +1,7 @@ package com.yetu.oauth2provider package utils -import com.yetu.oauth2resource.filters.{ AllowAllCorsFilter, WhiteListCorsFilter } +import com.yetu.oauth2resource.filters.WhiteListCorsFilter /** * adds required CORS headers to chosen whiteListCORSUrls. @@ -12,7 +12,4 @@ object CorsFilter extends WhiteListCorsFilter { val whiteListCORSUrls = List("/oauth2/access_token", "/oauth2/info", "/oauth2/access_token_implicit") -} - -//object CorsFilter extends AllowAllCorsFilter - +} \ No newline at end of file diff --git a/app/com/yetu/oauth2provider/views/permissions.scala.html b/app/com/yetu/oauth2provider/views/permissions.scala.html index a1a5488..a50011e 100644 --- a/app/com/yetu/oauth2provider/views/permissions.scala.html +++ b/app/com/yetu/oauth2provider/views/permissions.scala.html @@ -1,21 +1,22 @@ -@(permissionsForm: Form[com.yetu.oauth2provider.models.Permissions], appName: String,client_id: Option[String], redirect_uri: Option[String], state: Option[String])(implicit request: RequestHeader, lang: Lang, env: securesocial.core.RuntimeEnvironment[_]) -@import com.yetu.oauth2provider.services._ -@import com.yetu.oauth2provider._ +@(permissionsForm: Form[com.yetu.oauth2provider.models.Permissions], appName: String, client_id: String, scopes: List[String], redirect_uri: String, state: Option[String])(implicit request: RequestHeader, env: securesocial.core.RuntimeEnvironment[_]) @import helper._ - @import securesocial.core.IdentityProvider + @implicitFieldConstructor = @{ FieldConstructor(com.yetu.oauth2provider.views.html.yetuAuthentication.inputFieldConstructor.f) } -@views.html.yetuAuthentication.main(Messages("securesocial.permission.title")) { +@com.yetu.oauth2provider.views.html.yetuAuthentication.main(Messages("securesocial.permission.title")) { + +
@@ -25,17 +26,14 @@

This app would like to:

@helper.form(action = com.yetu.oauth2provider.controllers.routes.OAuth2Auth.permissionsPost) { - + + @Messages("securesocial.permission.cancel") +
- - @Messages("securesocial.permission.cancel") +
} -} - - - - +} \ No newline at end of file diff --git a/test/com/yetu/oauth2provider/base/BaseMethods.scala b/test/com/yetu/oauth2provider/base/BaseMethods.scala index 8d03713..4409e98 100644 --- a/test/com/yetu/oauth2provider/base/BaseMethods.scala +++ b/test/com/yetu/oauth2provider/base/BaseMethods.scala @@ -1,7 +1,7 @@ package com.yetu.oauth2provider.base import com.yetu.oauth2provider.oauth2.models.YetuUser -import com.yetu.oauth2provider.services.data.iface.IAuthCodeAccessTokenService +import com.yetu.oauth2provider.services.data.interface.IAuthCodeAccessTokenService import com.yetu.oauth2provider.utils.Config import play.api.Logger diff --git a/test/com/yetu/oauth2provider/base/DataServiceBaseSpec.scala b/test/com/yetu/oauth2provider/base/DataServiceBaseSpec.scala index 6f08e7f..6b8e530 100644 --- a/test/com/yetu/oauth2provider/base/DataServiceBaseSpec.scala +++ b/test/com/yetu/oauth2provider/base/DataServiceBaseSpec.scala @@ -1,6 +1,6 @@ package com.yetu.oauth2provider.base -import com.yetu.oauth2provider.services.data.iface.{ IClientService, IPersonService, IPublicKeyService } +import com.yetu.oauth2provider.services.data.interface.{ IPermissionService, IClientService, IPersonService, IPublicKeyService } import org.scalatest.BeforeAndAfterEach import org.scalatestplus.play.{ OneAppPerSuite, PlaySpec } @@ -14,6 +14,8 @@ abstract class DataServiceBaseSpec extends PlaySpec def publicKeyService: IPublicKeyService + def permissionService: IPermissionService + def clientService: IClientService def databaseImplementationName: String diff --git a/test/com/yetu/oauth2provider/base/DefaultTestVariables.scala b/test/com/yetu/oauth2provider/base/DefaultTestVariables.scala index d22d30b..547c11f 100644 --- a/test/com/yetu/oauth2provider/base/DefaultTestVariables.scala +++ b/test/com/yetu/oauth2provider/base/DefaultTestVariables.scala @@ -6,7 +6,7 @@ import com.yetu.oauth2provider.models.DataUpdateRequest import org.joda.time.DateTime import securesocial.core.providers.MailToken import scalaoauth2.provider.AuthInfo -import com.yetu.oauth2provider.oauth2.models.{ IdentityId, YetuUser } +import com.yetu.oauth2provider.oauth2.models.{ OAuth2Client, ClientPermission, IdentityId, YetuUser } import com.yetu.oauth2provider.utils.Config import com.yetu.oauth2provider.utils.Config._ import play.api.libs.json.Json @@ -30,12 +30,19 @@ trait DefaultTestVariables { val testUserPassword = "1234" val testAuthCode = "FDdrVgoQo2" + val testClientName = "testClientName" val testClientId = "testClientId" + val testClientSecret = "testClientSecret" + val testRedirectUri = "http://redirectUrl" + val testGrantTypes = List("token", "authorization_code") val scopeOption = Some(SCOPE_BASIC) val testAccessToken: AccessToken = new AccessToken("bMqOIj86jKZVbo_kvJMG", Some("REFRESH"), scopeOption, Some(1234532L), new Date(System.currentTimeMillis())) val testUserInfo: AuthInfo[YetuUser] = new AuthInfo[YetuUser](testUser, Some(testClientId), scopeOption, None) val testUserInfoWithScopeId: AuthInfo[YetuUser] = new AuthInfo[YetuUser](testUser, Some(testClientId), Some(Config.SCOPE_ID), None) + val testClient = OAuth2Client(testClientId, testClientSecret, List(testRedirectUri), Some(testGrantTypes), Some(List(SCOPE_BASIC)), testClientName, coreYetuClient = false) + val testPermission = ClientPermission(testClientId, Some(List("scope1"))) + val testMailToken: MailToken = new MailToken("mail-token-uuid", testUser.email.get, DateTime.now(), DateTime.now(), true) val loginUrlWithUserPass = "/authenticate/userpass" diff --git a/test/com/yetu/oauth2provider/browser/BaseBrowserSpec.scala b/test/com/yetu/oauth2provider/browser/BaseBrowserSpec.scala index 567b90d..38515b8 100644 --- a/test/com/yetu/oauth2provider/browser/BaseBrowserSpec.scala +++ b/test/com/yetu/oauth2provider/browser/BaseBrowserSpec.scala @@ -3,7 +3,7 @@ package com.yetu.oauth2provider.browser import com.yetu.oauth2provider.base.{ TestGlobal, BaseMethods } import com.yetu.oauth2provider.oauth2.models.YetuUser import com.yetu.oauth2provider.registry.TestRegistry -import com.yetu.oauth2provider.services.data.{ MemoryPersonService, MemoryMailTokenService } +import com.yetu.oauth2provider.services.data.memory.{ MemoryMailTokenService, MemoryPersonService } import org.scalatest.BeforeAndAfterEach import org.scalatestplus.play._ import play.api.test.FakeApplication diff --git a/test/com/yetu/oauth2provider/oauth2/AccessTokenRetriever.scala b/test/com/yetu/oauth2provider/oauth2/AccessTokenRetriever.scala index ccfeb97..b0506c0 100644 --- a/test/com/yetu/oauth2provider/oauth2/AccessTokenRetriever.scala +++ b/test/com/yetu/oauth2provider/oauth2/AccessTokenRetriever.scala @@ -47,7 +47,7 @@ trait AccessTokenRetriever extends DefaultTestVariables with TestRegistry with R //Persist permissions val clientPermission = ClientPermission(clientId, Some(scopes)) permissionService.deletePermission(testUser.userId, clientPermission.clientId) - permissionService.savePermission(testUser.userId, clientPermission, true) + permissionService.savePermission(testUser.userId, clientPermission) (client, userPassParameters) } diff --git a/test/com/yetu/oauth2provider/services/data/PermissionsServiceSpec.scala b/test/com/yetu/oauth2provider/services/data/PermissionsServiceSpec.scala index c4af176..6a9b9e0 100644 --- a/test/com/yetu/oauth2provider/services/data/PermissionsServiceSpec.scala +++ b/test/com/yetu/oauth2provider/services/data/PermissionsServiceSpec.scala @@ -1,21 +1,38 @@ package com.yetu.oauth2provider.services.data import com.yetu.oauth2provider.base.DataServiceBaseSpec -import com.yetu.oauth2provider.registry.{ TestRegistry, IntegrationTestRegistry } +import com.yetu.oauth2provider.registry.{ IntegrationTestRegistry, TestRegistry } -//TODO: implement permissions correctly and make sure this test leaves no traces behind. +//TODO: fix this test after getting rid of LDAP abstract class BasePermissionsServiceSpec extends DataServiceBaseSpec { + + def permissionToUserLink: String = { + testUser.uid + } + + override def beforeEach() { + permissionService.deletePermission(permissionToUserLink, testClientId) + personService.deleteUser(permissionToUserLink) + clientService.deleteClient(testClientId) + permissionService.deletePermission(permissionToUserLink, testClientId) + } + + override def afterEach() { + permissionService.deletePermission(permissionToUserLink, testClientId) + personService.deleteUser(permissionToUserLink) + clientService.deleteClient(testClientId) + permissionService.deletePermission(permissionToUserLink, testClientId) + } + + //TODO: fix this test after getting rid of LDAP // s"The [$databaseImplementationName] Permission Service" must { - // val clientPermission = ClientPermission("123456", Some(List("scope1"))) // "delete, store and retrieve a permissions " in { - // personService.deleteUser(testUser.userId) - // permissionService.deletePermission(testUser.userId, clientPermission.clientId) - // personService.save(testUser.toBasicProfile, SaveMode.SignUp) - // permissionService.savePermission(testUser.userId, clientPermission, true) - // val retrieved = permissionService.findPermission(testUser.userId, clientPermission.clientId) - // retrieved.get mustEqual clientPermission - // permissionService.deletePermission(testUser.userId, clientPermission.clientId) - // personService.deleteUser(testUser.userId) + // + // clientService.saveClient(testClient) + // personService.addNewUser(testUser) + // permissionService.savePermission(permissionToUserLink, testPermission) + // val retrieved = permissionService.findPermission(permissionToUserLink, testPermission.clientId) + // retrieved.get mustEqual testPermission // } // } } diff --git a/test/com/yetu/oauth2provider/services/data/UserContactDataServiceSpec.scala b/test/com/yetu/oauth2provider/services/data/UserContactDataServiceSpec.scala index de3fea6..39755fd 100644 --- a/test/com/yetu/oauth2provider/services/data/UserContactDataServiceSpec.scala +++ b/test/com/yetu/oauth2provider/services/data/UserContactDataServiceSpec.scala @@ -3,7 +3,7 @@ package com.yetu.oauth2provider.services.data import com.yetu.oauth2provider.base.DataServiceBaseSpec import com.yetu.oauth2provider.models.DataUpdateRequest import com.yetu.oauth2provider.registry.{ TestRegistry, IntegrationTestRegistry } -import com.yetu.oauth2provider.services.data.iface.IPersonService +import com.yetu.oauth2provider.services.data.interface.IPersonService import play.api.libs.json.Json import securesocial.core.services.SaveMode diff --git a/test/com/yetu/oauth2provider/services/data/UserServiceSpec.scala b/test/com/yetu/oauth2provider/services/data/UserServiceSpec.scala index 64ab82f..1230175 100644 --- a/test/com/yetu/oauth2provider/services/data/UserServiceSpec.scala +++ b/test/com/yetu/oauth2provider/services/data/UserServiceSpec.scala @@ -2,7 +2,7 @@ package com.yetu.oauth2provider.services.data import com.yetu.oauth2provider.base.DataServiceBaseSpec import com.yetu.oauth2provider.registry.{ TestRegistry, IntegrationTestRegistry } -import com.yetu.oauth2provider.services.data.iface.IPersonService +import com.yetu.oauth2provider.services.data.interface.IPersonService import com.yetu.oauth2provider.utils.DateUtility._ import org.joda.time.DateTime import securesocial.core.PasswordInfo