Skip to content

Commit dbd8416

Browse files
committed
2 parents 670446c + f60f8bb commit dbd8416

File tree

6 files changed

+53
-26
lines changed

6 files changed

+53
-26
lines changed

src/main/scala/Plugin.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class Plugin extends gitbucket.core.plugin.Plugin {
6565
(context: Context) => Some(Link("snippets", "Snippets", "gist"))
6666
)
6767
override val profileTabs = Seq(
68-
(account: Account, context: Context) => if(account.isGroupAccount) None else Some(Link("snippets", "Snippets", s"gist/${account.userName}/_profile"))
68+
(account: Account, context: Context) => Some(Link("snippets", "Snippets", s"gist/${account.userName}/_profile"))
6969
)
7070
override val assetsMappings = Seq("/gist" -> "/gitbucket/gist/assets")
7171

src/main/scala/gitbucket/gist/controller/GistController.scala

+36-19
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,17 @@ trait GistControllerBase extends ControllerBase {
9292
val files: Seq[(String, JGitUtil.ContentInfo)] = JGitUtil.getFileList(git, "master", ".").map { file =>
9393
(if(isGistFile(file.name)) "" else file.name) -> JGitUtil.getContentInfo(git, file.name, file.id)
9494
}
95-
html.edit(getGist(userName, repoName), files)
95+
html.edit(getGist(userName, repoName), files, None)
9696
}
9797
}
9898
})
9999

100100
post("/gist/_new")(usersOnly {
101-
if(context.loginAccount.isDefined){
102-
val loginAccount = context.loginAccount.get
103-
val files = getFileParameters()
101+
val loginAccount = context.loginAccount.get
102+
val userName = params.getOrElse("userName", loginAccount.userName)
104103

104+
if(isEditable(userName, loginUserGroups)) {
105+
val files = getFileParameters()
105106
if(files.isEmpty){
106107
redirect(s"/gist")
107108

@@ -110,14 +111,14 @@ trait GistControllerBase extends ControllerBase {
110111
val description = params("description")
111112

112113
// Create new repository
113-
val repoName = StringUtil.md5(loginAccount.userName + " " + datetime(new java.util.Date()))
114-
val gitdir = new File(GistRepoDir, loginAccount.userName + "/" + repoName)
114+
val repoName = StringUtil.md5(userName + " " + datetime(new java.util.Date()))
115+
val gitdir = new File(GistRepoDir, userName + "/" + repoName)
115116
gitdir.mkdirs()
116117
JGitUtil.initRepository(gitdir)
117118

118119
// Insert record
119120
registerGist(
120-
loginAccount.userName,
121+
userName,
121122
repoName,
122123
getTitle(files.head._1, repoName),
123124
description,
@@ -129,9 +130,9 @@ trait GistControllerBase extends ControllerBase {
129130
commitFiles(git, loginAccount, "Initial commit", files)
130131
}
131132

132-
redirect(s"/gist/${loginAccount.userName}/${repoName}")
133+
redirect(s"/gist/${userName}/${repoName}")
133134
}
134-
}
135+
} else Unauthorized()
135136
})
136137

137138
post("/gist/:userName/:repoName/edit")(editorOnly {
@@ -166,14 +167,14 @@ trait GistControllerBase extends ControllerBase {
166167
refUpdate.update()
167168
}
168169

169-
redirect(s"/gist/${loginAccount.userName}/${repoName}")
170+
redirect(s"/gist/${userName}/${repoName}")
170171
})
171172

172173
get("/gist/:userName/:repoName/delete")(editorOnly {
173174
val userName = params("userName")
174175
val repoName = params("repoName")
175176

176-
if(isEditable(userName)){
177+
if(isEditable(userName, loginUserGroups)){
177178
deleteGist(userName, repoName)
178179

179180
val gitdir = new File(GistRepoDir, userName + "/" + repoName)
@@ -205,7 +206,7 @@ trait GistControllerBase extends ControllerBase {
205206
gist,
206207
getForkedCount(originUserName, originRepoName),
207208
GistRepositoryURL(gist, baseUrl, context.settings),
208-
isEditable(userName),
209+
isEditable(userName, loginUserGroups),
209210
commits
210211
)
211212
}
@@ -268,12 +269,18 @@ trait GistControllerBase extends ControllerBase {
268269
getUserGists(userName, context.loginAccount.map(_.userName), 0, Limit),
269270
countUserGists(userName, context.loginAccount.map(_.userName))
270271
)
272+
273+
val createSnippet = context.loginAccount.exists { loginAccount =>
274+
loginAccount.userName == userName || getGroupsByUserName(loginAccount.userName).contains(userName)
275+
}
276+
271277
getAccountByUserName(userName).map { account =>
272278
html.profile(
273-
account,
274-
if(account.isGroupAccount) Nil else getGroupsByUserName(userName),
275-
getAccountExtraMailAddresses(userName),
276-
result._1
279+
account = account,
280+
groupNames = if(account.isGroupAccount) Nil else getGroupsByUserName(userName),
281+
extraMailAddresses = getAccountExtraMailAddresses(userName),
282+
gists = result._1,
283+
createSnippet = createSnippet
277284
)
278285
} getOrElse NotFound
279286
}
@@ -283,7 +290,11 @@ trait GistControllerBase extends ControllerBase {
283290
}
284291

285292
get("/gist/_new")(usersOnly {
286-
html.edit(None, Seq(("", JGitUtil.ContentInfo("text", None, None, Some("UTF-8")))))
293+
val userName = params.get("userName")
294+
295+
if(isEditable(userName.getOrElse(context.loginAccount.get.userName), loginUserGroups)){
296+
html.edit(None, Seq(("", JGitUtil.ContentInfo("text", None, None, Some("UTF-8")))), userName)
297+
} else Unauthorized()
287298
})
288299

289300
get("/gist/_add"){
@@ -335,7 +346,7 @@ trait GistControllerBase extends ControllerBase {
335346
getForkedCount(userName, repoName),
336347
GistRepositoryURL(gist, baseUrl, context.settings),
337348
getForkedGists(userName, repoName),
338-
isEditable(userName)
349+
isEditable(userName, loginUserGroups)
339350
)
340351
} getOrElse NotFound
341352
}
@@ -504,7 +515,7 @@ trait GistControllerBase extends ControllerBase {
504515
revision,
505516
getGistFiles(userName, repoName, revision),
506517
getGistComments(userName, repoName),
507-
isEditable(userName)
518+
isEditable(userName, loginUserGroups)
508519
)
509520
}
510521

@@ -527,4 +538,10 @@ trait GistControllerBase extends ControllerBase {
527538
}
528539
}
529540

541+
private def loginUserGroups: Seq[String] = {
542+
context.loginAccount.map { account =>
543+
getGroupsByUserName(account.userName)
544+
}.getOrElse(Nil)
545+
}
546+
530547
}

src/main/scala/gitbucket/gist/util/GistAuthenticator.scala

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
package gitbucket.gist.util
22

33
import gitbucket.core.controller.ControllerBase
4+
import gitbucket.core.service.AccountService
45
import gitbucket.core.util.SyntaxSugars._
56
import gitbucket.core.util.Implicits._
67

78
/**
89
* Allows only editor of the accessed snippet.
910
*/
10-
trait GistEditorAuthenticator { self: ControllerBase =>
11+
trait GistEditorAuthenticator { self: ControllerBase with AccountService =>
1112
protected def editorOnly(action: => Any) = { authenticate(action) }
1213
protected def editorOnly[T](action: T => Any) = (form: T) => { authenticate(action(form)) }
1314

1415
private def authenticate(action: => Any) = {
1516
{
1617
defining(request.paths){ paths =>
1718
if(context.loginAccount.map { loginAccount =>
18-
loginAccount.isAdmin || loginAccount.userName == paths(1)
19+
loginAccount.isAdmin || loginAccount.userName == paths(1) || getGroupsByUserName(loginAccount.userName).contains(paths(1))
1920
}.getOrElse(false)){
2021
action
2122
} else {

src/main/scala/gitbucket/gist/util/GistUtils.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import org.eclipse.jgit.lib.{FileMode, Constants, ObjectId}
1212

1313
object GistUtils {
1414

15-
def isEditable(userName: String)(implicit context: Context): Boolean = {
15+
def isEditable(userName: String, groupNames: Seq[String])(implicit context: Context): Boolean = {
1616
context.loginAccount.map { loginAccount =>
17-
loginAccount.isAdmin || loginAccount.userName == userName
17+
loginAccount.isAdmin || loginAccount.userName == userName || groupNames.contains(userName)
1818
}.getOrElse(false)
1919
}
2020

src/main/twirl/gitbucket/gist/edit.scala.html

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
@(gist: Option[gitbucket.gist.model.Gist],
2-
files: Seq[(String, gitbucket.core.util.JGitUtil.ContentInfo)])(implicit context: gitbucket.core.controller.Context)
2+
files: Seq[(String, gitbucket.core.util.JGitUtil.ContentInfo)],
3+
userName: Option[String])(implicit context: gitbucket.core.controller.Context)
34
@import gitbucket.gist.model.Mode
45
@import gitbucket.core.view.helpers
56
@gitbucket.core.html.main("Snippets"){
@@ -62,6 +63,9 @@ <h1 style="margin: 0px;">New snippet</h1>
6263
}
6364
</div>
6465
</div>
66+
@userName.map { userName =>
67+
<input type="hidden" id="userName" name="userName" value="@userName"/>
68+
}
6569
<input type="hidden" id="count" name="count" value="@files.size"/>
6670
</form>
6771
</div>

src/main/twirl/gitbucket/gist/profile.scala.html

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
@(account: gitbucket.core.model.Account, groupNames: List[String], extraMailAddresses: List[String],
2-
gists: Seq[gitbucket.gist.model.Gist])(implicit context: gitbucket.core.controller.Context)
2+
gists: Seq[gitbucket.gist.model.Gist], createSnippet: Boolean)(implicit context: gitbucket.core.controller.Context)
33
@import gitbucket.gist.model.Mode
44
@gitbucket.core.account.html.main(account, groupNames, "snippets", extraMailAddresses){
5+
@if(createSnippet){
6+
<div class="pull-right">
7+
<a href="@context.path/gist/[email protected]" class="btn btn-success">Create snippet</a>
8+
</div>
9+
}
510
@if(gists.isEmpty){
611
No snippets
712
} else {

0 commit comments

Comments
 (0)