All Downloads are FREE. Search and download functionalities are using the official Maven repository.

omniauth.Omniauth.scala Maven / Gradle / Ivy

package omniauth

/*
 * Copyright 2010-2011 Matthew Henderson
 *
 * 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 omniauth.lib._
import dispatch.classic._
import oauth._
import net.liftweb.http._
import net.liftweb.sitemap.{Menu, Loc}
import Loc._
import net.liftweb.common._
import org.apache.http.client.utils.URLEncodedUtils
import org.apache.http.message.BasicNameValuePair

object Omniauth extends Omniauth

trait Omniauth  {
  val logger = Logger("omniauth.Omniauth")

 /**
  * If in GAE, add dependency to net.databinder:dispatch-gae and override this.
  *  {{{
  *      if (Props.inGAE) { new dispatch.gae.Http } else { new Http } 
  *  }}}
  */
  val http = Http
  var TwitterHost = :/("api.twitter.com").secure
  val twitterOauthRequest = TwitterHost / "oauth"

  var successRedirect = "/"
  var failureRedirect = "/"
  var providers:List[OmniauthProvider] = List[OmniauthProvider]()
  var siteAuthBaseUrl = "http://0.0.0.0:8080/"

  private object curRequestToken extends SessionVar[Box[Token]](Empty)
  def currentRequestToken: Box[Token] = curRequestToken.is
  def setRequestToken(tok:Token){
    curRequestToken(Full(tok))
  }

  private object curAccessToken extends SessionVar[Box[Token]](Empty)
  
  def currentAccessToken: Box[Token] = curAccessToken.is
  
  def setAccessToken(tok:Token){ curAccessToken(Full(tok)) }

  private object authInfo extends SessionVar[Box[AuthInfo]](Empty)
  
  def currentAuth: Box[AuthInfo] = authInfo.is
  
  def setAuthInfo(ai:AuthInfo){authInfo(Full(ai))}

  def clearCurrentAuth = authInfo(Empty)

  private object returnUrlInfo extends SessionVar[Box[String]](Empty)
  def returnTo:Box[String] = returnUrlInfo
  def setReturnTo(url:String):Unit = returnUrlInfo(Full(url))
  def clearReturnTo = returnUrlInfo(Empty)

  private def providerListFromProperties():List[OmniauthProvider] = {
    List(getProviderFromProperties(FacebookProvider.providerName, FacebookProvider.providerPropertyKey, FacebookProvider.providerPropertySecret),
    getProviderFromProperties(GithubProvider.providerName, GithubProvider.providerPropertyKey, GithubProvider.providerPropertySecret),
    getProviderFromProperties(TwitterProvider.providerName, TwitterProvider.providerPropertyKey, TwitterProvider.providerPropertySecret),
    getProviderFromProperties(MSLiveProvider.providerName, MSLiveProvider.providerPropertyKey, MSLiveProvider.providerPropertySecret),
    getProviderFromProperties(DropboxProvider.providerName, DropboxProvider.providerPropertyKey, DropboxProvider.providerPropertySecret),
    getProviderFromProperties(KuaipanProvider.providerName, KuaipanProvider.providerPropertyKey, KuaipanProvider.providerPropertySecret),
    getProviderFromProperties(GoogleProvider.providerName, GoogleProvider.providerPropertyKey, GoogleProvider.providerPropertySecret),
    getProviderFromProperties(LinkedinProvider.providerName, LinkedinProvider.providerPropertyKey, LinkedinProvider.providerPropertySecret),
    getProviderFromProperties(InstagramProvider.providerName, InstagramProvider.providerPropertyKey,
    InstagramProvider.providerPropertySecret),
    getProviderFromProperties(VKProvider.providerName, VKProvider.providerPropertyKey, VKProvider.providerPropertySecret)
    ).flatten(a => a)
  }

  private def getProviderFromProperties(providerName:String, providerKey:String, providerSecret:String):Box[OmniauthProvider] = {
     Properties.get(providerKey) match {
      case Full(pk) => Properties.get(providerSecret) match {
        case Full(ps) => {
          providerName match {
            case TwitterProvider.providerName => Full(new TwitterProvider(pk, ps))
            case FacebookProvider.providerName => Full(new FacebookProvider(pk, ps))
            case GithubProvider.providerName => Full(new GithubProvider(pk, ps))
            case MSLiveProvider.providerName => Full(new MSLiveProvider(pk, ps))
            case DropboxProvider.providerName => Full(new DropboxProvider(pk, ps))
            case KuaipanProvider.providerName => Full(new KuaipanProvider(pk, ps))
            case GoogleProvider.providerName => Full(new GoogleProvider(pk, ps))
            case LinkedinProvider.providerName => Full(new LinkedinProvider(pk, ps))
            case InstagramProvider.providerName => Full(new InstagramProvider(pk, ps))
            case VKProvider.providerName => Full(new VKProvider(pk, ps))
            case _ => {
              logger.warn("no provider found for "+providerName)
              Empty
            }
          }
        }
        case Empty => logger.warn("getProviderFromProperties: empty secret"); Empty
        case Failure(_,_,_) => logger.warn("getProviderFromProperties: fail secret"); Empty
      }
      case Empty => logger.info("getProviderFromProperties:" + providerKey + " empty key"); Empty
      case Failure(_,_,_) => logger.warn("getProviderFromProperties: fail key"); Empty
    }
  }

  private def commonInit = {
    
    ResourceServer.allow({
    	case "img" ::  img  => true
    })       
    
    siteAuthBaseUrl = Properties.get("omniauth.baseurl") openOr "http://0.0.0.0:8080/"
    successRedirect = Properties.get("omniauth.successurl") openOr "/"
    failureRedirect = Properties.get("omniauth.failureurl") openOr "/"

    LiftRules.addToPackages("omniauth")

    //Omniauth request rewrites
    LiftRules.statelessRewrite.prepend {
      case RewriteRequest(ParsePath(List("auth", providerName, "signin"), _, _, _), _, _) =>
        RewriteResponse("omniauth"::"signin" :: Nil, Map("provider" -> providerName))
    }
    LiftRules.statelessRewrite.prepend {
      case RewriteRequest(ParsePath(List("auth", providerName, "callback"), _, _, _), _, _) =>
        RewriteResponse("omniauth"::"callback":: Nil, Map("provider" -> providerName))
    }
  }

  def init = {
    providers = providerListFromProperties()
    if(providers.size > 0)
      logger.info("Configured "+providers.size+" providers: "+providers.map(_.providerName))
    else
      logger.warn("No providers were configured for Omniauth!")
    commonInit
  }

  def initWithProviders(newProviders:List[OmniauthProvider]) = {
    providers = newProviders
    commonInit
  }

  def callbackMenuLoc: Box[Menu] =
    Full(Menu(Loc("AuthCallback", List("omniauth","callback"), "AuthCallback", Hidden)))

  def signinMenuLoc: Box[Menu] =
    Full(Menu(Loc("AuthSignin", List("omniauth", "signin"), "AuthSignin", Hidden)))

  lazy val sitemap: List[Menu] =
    List(callbackMenuLoc, signinMenuLoc).flatten(a => a)

  def validateToken(provider:String, token:AuthToken): Boolean = {
    Omniauth.providers.foreach(p => {
      if(p.providerName.equalsIgnoreCase(provider)){
        return p.validateToken(token)
      }
    })
    false
  }

  def tokenToId(provider:String, token:AuthToken): Box[String] = {
    Omniauth.providers.foreach(p => {
      if(p.providerName.equalsIgnoreCase(provider)){
        return p.tokenToId(token)
      }
    })
    Empty
  }

  def map2ee(values: Map[String, Any]) = java.util.Arrays asList (
    values.toSeq map { case (k, v) => new BasicNameValuePair(k, v.toString) } toArray : _*
  )
  def q_str (values: Map[String, Any]) = URLEncodedUtils.format(map2ee(values), Request.factoryCharset)
}

case class AuthInfo(provider:String,
                    uid:String,
                    name:String,
                    token:AuthToken,
                    secret:Option[String] = None,
                    nickName:Option[String] = None,
                    email:Option[String] = None,
                    firstName:Option[String]=None,
                    lastName:Option[String]=None,
                    extraData:Option[Map[String, Any]]=None)




© 2015 - 2025 Weber Informatics LLC | Privacy Policy