mirror of
				https://github.com/gitbucket/gitbucket.git
				synced 2025-10-31 18:46:28 +01:00 
			
		
		
		
	Add option to keep session in the local dev mode (#3205)
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -4,6 +4,7 @@ | ||||
| .ensime_cache | ||||
| .DS_Store | ||||
| .java-version | ||||
| .tmp | ||||
|  | ||||
| # sbt specific | ||||
| dist/* | ||||
|   | ||||
| @@ -90,7 +90,6 @@ scalacOptions := Seq( | ||||
|   "-Wconf:cat=unused&src=twirl/.*:s,cat=unused&src=scala/gitbucket/core/model/[^/]+\\.scala:s" | ||||
| ) | ||||
| compile / javacOptions ++= Seq("-target", "8", "-source", "8") | ||||
| Jetty / javaOptions += "-Dlogback.configurationFile=/logback-dev.xml" | ||||
|  | ||||
| // Test settings | ||||
| //testOptions in Test += Tests.Argument("-l", "ExternalDBTest") | ||||
| @@ -286,7 +285,9 @@ Test / testOptions ++= { | ||||
| } | ||||
|  | ||||
| Jetty / javaOptions ++= Seq( | ||||
|   "-Dlogback.configurationFile=/logback-dev.xml", | ||||
|   "-Xdebug", | ||||
|   "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000", | ||||
|   "-Dorg.eclipse.jetty.annotations.AnnotationParser.LEVEL=OFF" | ||||
|   "-Dorg.eclipse.jetty.annotations.AnnotationParser.LEVEL=OFF", | ||||
|   //"-Ddev-features=keep-session" | ||||
| ) | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| package gitbucket.core.controller | ||||
|  | ||||
| import java.io.{File, FileInputStream} | ||||
|  | ||||
| import java.io.{File, FileInputStream, FileOutputStream} | ||||
| import gitbucket.core.api.{ApiError, JsonFormat} | ||||
| import gitbucket.core.model.Account | ||||
| import gitbucket.core.service.{AccountService, RepositoryService, SystemSettingsService} | ||||
| @@ -14,9 +13,9 @@ import org.scalatra._ | ||||
| import org.scalatra.i18n._ | ||||
| import org.scalatra.json._ | ||||
| import org.scalatra.forms._ | ||||
|  | ||||
| import javax.servlet.http.{HttpServletRequest, HttpServletResponse} | ||||
| import javax.servlet.{FilterChain, ServletRequest, ServletResponse} | ||||
|  | ||||
| import is.tagomor.woothee.Classifier | ||||
|  | ||||
| import scala.util.Try | ||||
| @@ -29,6 +28,9 @@ import org.eclipse.jgit.treewalk._ | ||||
| import org.apache.commons.io.IOUtils | ||||
| import org.slf4j.LoggerFactory | ||||
| import org.json4s.Formats | ||||
| import org.json4s.jackson.Serialization | ||||
|  | ||||
| import java.nio.charset.StandardCharsets | ||||
|  | ||||
| /** | ||||
|  * Provides generic features for controller implementations. | ||||
| @@ -93,8 +95,16 @@ abstract class ControllerBase | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private def LoginAccount: Option[Account] = | ||||
|     request.getAs[Account](Keys.Session.LoginAccount).orElse(session.getAs[Account](Keys.Session.LoginAccount)) | ||||
|   private def LoginAccount: Option[Account] = { | ||||
|     request | ||||
|       .getAs[Account](Keys.Session.LoginAccount) | ||||
|       .orElse(session.getAs[Account](Keys.Session.LoginAccount)) | ||||
|       .orElse { | ||||
|         if (isDevFeatureEnabled(DevFeatures.KeepSession)) { | ||||
|           getLoginAccountFromLocalFile() | ||||
|         } else None | ||||
|       } | ||||
|   } | ||||
|  | ||||
|   def ajaxGet(path: String)(action: => Any): Route = | ||||
|     super.get(path) { | ||||
| @@ -277,6 +287,47 @@ abstract class ControllerBase | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   protected object DevFeatures { | ||||
|     val KeepSession = "keep-session" | ||||
|   } | ||||
|  | ||||
|   private val loginAccountFile = new File(".tmp/login_account.json") | ||||
|  | ||||
|   protected def isDevFeatureEnabled(feature: String): Boolean = { | ||||
|     Option(System.getProperty("dev-features")).getOrElse("").split(",").map(_.trim).contains(feature) | ||||
|   } | ||||
|  | ||||
|   protected def getLoginAccountFromLocalFile(): Option[Account] = { | ||||
|     if (isDevFeatureEnabled(DevFeatures.KeepSession)) { | ||||
|       if (loginAccountFile.exists()) { | ||||
|         Using.resource(new FileInputStream(loginAccountFile)) { in => | ||||
|           val json = IOUtils.toString(in, StandardCharsets.UTF_8) | ||||
|           val account = parse(json).extract[Account] | ||||
|           session.setAttribute(Keys.Session.LoginAccount, account) | ||||
|           Some(parse(json).extract[Account]) | ||||
|         } | ||||
|       } else None | ||||
|  | ||||
|     } else None | ||||
|   } | ||||
|  | ||||
|   protected def saveLoginAccountToLocalFile(account: Account): Unit = { | ||||
|     if (isDevFeatureEnabled(DevFeatures.KeepSession)) { | ||||
|       if (!loginAccountFile.getParentFile.exists()) { | ||||
|         loginAccountFile.getParentFile.mkdirs() | ||||
|       } | ||||
|       Using.resource(new FileOutputStream(loginAccountFile)) { in => | ||||
|         in.write(Serialization.write(account).getBytes(StandardCharsets.UTF_8)) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   protected def deleteLoginAccountFromLocalFile(): Unit = { | ||||
|     if (isDevFeatureEnabled(DevFeatures.KeepSession)) { | ||||
|       loginAccountFile.delete() | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -156,6 +156,9 @@ trait IndexControllerBase extends ControllerBase { | ||||
|  | ||||
|   get("/signout") { | ||||
|     session.invalidate | ||||
|     if (isDevFeatureEnabled(DevFeatures.KeepSession)) { | ||||
|       deleteLoginAccountFromLocalFile() | ||||
|     } | ||||
|     redirect("/") | ||||
|   } | ||||
|  | ||||
| @@ -178,6 +181,9 @@ trait IndexControllerBase extends ControllerBase { | ||||
|    */ | ||||
|   private def signin(account: Account, redirectUrl: String = "/") = { | ||||
|     session.setAttribute(Keys.Session.LoginAccount, account) | ||||
|     if (isDevFeatureEnabled(DevFeatures.KeepSession)) { | ||||
|       saveLoginAccountToLocalFile(account) | ||||
|     } | ||||
|     updateLastLoginDate(account.userName) | ||||
|  | ||||
|     if (LDAPUtil.isDummyMailAddress(account)) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user