From cc526f952908c53809fa87865f5c205aa00d08ea Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Tue, 22 Jun 2010 22:52:05 +0200 Subject: [PATCH] Added akka.conf values as defaults and removed lift dependency --- .../src/main/scala/AkkaCometServlet.scala | 26 +++++- akka-http/src/main/scala/Security.scala | 90 +++++++++++++++++-- .../src/main/scala/EmbeddedAppServer.scala | 6 -- project/build/AkkaProject.scala | 2 - 4 files changed, 107 insertions(+), 17 deletions(-) diff --git a/akka-http/src/main/scala/AkkaCometServlet.scala b/akka-http/src/main/scala/AkkaCometServlet.scala index b020c473f6..c5a6fb3fba 100644 --- a/akka-http/src/main/scala/AkkaCometServlet.scala +++ b/akka-http/src/main/scala/AkkaCometServlet.scala @@ -7,7 +7,7 @@ package se.scalablesolutions.akka.comet import se.scalablesolutions.akka.util.Logging import java.util.{List => JList} -import javax.servlet.ServletConfig +import javax.servlet.{ServletConfig,ServletContext} import javax.servlet.http.{HttpServletRequest, HttpServletResponse} import com.sun.jersey.spi.container.servlet.ServletContainer @@ -43,14 +43,32 @@ class AtmosphereRestServlet extends ServletContainer with AtmosphereServletProce * Used by the Akka Kernel to bootstrap REST and Comet. */ class AkkaServlet extends AtmosphereServlet with Logging { + import se.scalablesolutions.akka.config.Config.{config => c} + addInitParameter(AtmosphereServlet.DISABLE_ONSTATE_EVENT,"true") addInitParameter(AtmosphereServlet.BROADCASTER_CLASS,classOf[AkkaBroadcaster].getName) + addInitParameter("com.sun.jersey.config.property.packages",c.getList("akka.rest.resource_packages").mkString(";")) + addInitParameter("com.sun.jersey.spi.container.ResourceFilters",c.getList("akka.rest.filters").mkString(",")) - lazy val servlet = createRestServlet - - protected def createRestServlet : AtmosphereRestServlet = new AtmosphereRestServlet { + val servlet = new AtmosphereRestServlet { override def getInitParameter(key : String) = AkkaServlet.this.getInitParameter(key) + override def getInitParameterNames() = AkkaServlet.this.getInitParameterNames() } + + override def getInitParameter(key : String) = Option(super.getInitParameter(key)).getOrElse(initParams.get(key)) + + override def getInitParameterNames() = { + val names = new java.util.Vector[String]() + + val i = initParams.keySet.iterator + while(i.hasNext) names.add(i.next.toString) + + val e = super.getInitParameterNames + while(e.hasMoreElements) names.add(e.nextElement.toString) + + names.elements + } + /** * We override this to avoid Atmosphere looking for it's atmosphere.xml file * Instead we specify what semantics we want in code. diff --git a/akka-http/src/main/scala/Security.scala b/akka-http/src/main/scala/Security.scala index 284d82d98e..bbc6242bfc 100644 --- a/akka-http/src/main/scala/Security.scala +++ b/akka-http/src/main/scala/Security.scala @@ -37,10 +37,6 @@ import javax.annotation.security.{DenyAll, PermitAll, RolesAllowed} import java.security.Principal import java.util.concurrent.TimeUnit -import net.liftweb.util.{SecurityHelpers, StringHelpers, IoHelpers} - -object Enc extends SecurityHelpers with StringHelpers with IoHelpers - case object OK /** @@ -249,7 +245,7 @@ trait BasicAuthenticationActor extends AuthenticationActor[BasicCredentials] { * rest-part of the akka config */ trait DigestAuthenticationActor extends AuthenticationActor[DigestCredentials] with Logging { - import Enc._ + import LiftUtils._ private object InvalidateNonces @@ -483,3 +479,87 @@ trait SpnegoAuthenticationActor extends AuthenticationActor[SpnegoCredentials] w } } + +/* +* Copyright 2006-2010 WorldWide Conferencing, LLC +* +* 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. +*/ +object LiftUtils { + import java.security.{MessageDigest,SecureRandom} + val random = new SecureRandom() + + def md5(in: Array[Byte]): Array[Byte] = (MessageDigest.getInstance("MD5")).digest(in) + + /** + * Create a random string of a given size + * @param size size of the string to create. Must be a positive or nul integer + * @return the generated string + */ + def randomString(size: Int): String = { + def addChar(pos: Int, lastRand: Int, sb: StringBuilder): StringBuilder = { + if (pos >= size) sb + else { + val randNum = if ((pos % 6) == 0) random.nextInt else lastRand + sb.append((randNum & 0x1f) match { + case n if n < 26 => ('A' + n).toChar + case n => ('0' + (n - 26)).toChar + }) + addChar(pos + 1, randNum >> 5, sb) + } + } + addChar(0, 0, new StringBuilder(size)).toString + } + +/** encode a Byte array as hexadecimal characters */ + def hexEncode(in: Array[Byte]): String = { + val sb = new StringBuilder + val len = in.length + def addDigit(in: Array[Byte], pos: Int, len: Int, sb: StringBuilder) { + if (pos < len) { + val b: Int = in(pos) + val msb = (b & 0xf0) >> 4 + val lsb = (b & 0x0f) + sb.append((if (msb < 10) ('0' + msb).asInstanceOf[Char] else ('a' + (msb - 10)).asInstanceOf[Char])) + sb.append((if (lsb < 10) ('0' + lsb).asInstanceOf[Char] else ('a' + (lsb - 10)).asInstanceOf[Char])) + addDigit(in, pos + 1, len, sb) + } + } + addDigit(in, 0, len, sb) + sb.toString + } + + + /** + * Splits a string of the form <name1=value1, name2=value2, ... > and unquotes the quoted values. + * The result is a Map[String, String] + */ + def splitNameValuePairs(props: String): Map[String, String] = { + /** + * If str is surrounded by quotes it return the content between the quotes + */ + def unquote(str: String) = { + if ((str ne null) && str.length >= 2 && str.charAt(0) == '\"' && str.charAt(str.length - 1) == '\"') + str.substring(1, str.length - 1) + else + str + } + + val list = props.split(",").toList.map(in => { + val pair = in match { case null => Nil case s => s.split("=").toList.map(_.trim).filter(_.length > 0) } + (pair(0), unquote(pair(1))) + }) + val map: Map[String, String] = Map.empty + (map /: list)((m, next) => m + (next)) + } +} diff --git a/akka-kernel/src/main/scala/EmbeddedAppServer.scala b/akka-kernel/src/main/scala/EmbeddedAppServer.scala index 8d9982c7e2..8f5495b5c1 100644 --- a/akka-kernel/src/main/scala/EmbeddedAppServer.scala +++ b/akka-kernel/src/main/scala/EmbeddedAppServer.scala @@ -61,12 +61,6 @@ trait EmbeddedAppServer extends Bootable with Logging { "org.atmosphere.container.GrizzlyCometSupport") adapter.addInitParameter("com.sun.jersey.config.property.resourceConfigClass", "com.sun.jersey.api.core.PackagesResourceConfig") - adapter.addInitParameter("com.sun.jersey.config.property.packages", - config.getList("akka.rest.resource_packages").mkString(";") - ) - adapter.addInitParameter("com.sun.jersey.spi.container.ResourceFilters", - config.getList("akka.rest.filters").mkString(",") - ) if (HOME.isDefined) adapter.addRootFolder(HOME.get + "/deploy/root") log.info("REST service root path [%s] and context path [%s]", adapter.getRootFolders, adapter.getContextPath) diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index 5f1f2d1264..cb5eefc23f 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -224,8 +224,6 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { val atmo_jbossweb = "org.atmosphere" % "atmosphere-compat-jbossweb" % ATMO_VERSION % "compile" val commons_logging = "commons-logging" % "commons-logging" % "1.1.1" % "compile" val annotation = "javax.annotation" % "jsr250-api" % "1.0" % "compile" - val lift_common = "net.liftweb" % "lift-common" % LIFT_VERSION % "compile" - val lift_util = "net.liftweb" % "lift-util" % LIFT_VERSION % "compile" // testing val scalatest = "org.scalatest" % "scalatest" % SCALATEST_VERSION % "test"