Show private repository activities in dashboard if has access
This commit is contained in:
		
							parent
							
								
									a742ee543e
								
							
						
					
					
						commit
						914ffa496f
					
				|  | @ -60,6 +60,9 @@ func UpdateAccessWithSession(sess *xorm.Session, access *Access) error { | ||||||
| // HasAccess returns true if someone can read or write to given repository.
 | // HasAccess returns true if someone can read or write to given repository.
 | ||||||
| // The repoName should be in format <username>/<reponame>.
 | // The repoName should be in format <username>/<reponame>.
 | ||||||
| func HasAccess(uname, repoName string, mode int) (bool, error) { | func HasAccess(uname, repoName string, mode int) (bool, error) { | ||||||
|  | 	if len(repoName) == 0 { | ||||||
|  | 		return false, nil | ||||||
|  | 	} | ||||||
| 	access := &Access{ | 	access := &Access{ | ||||||
| 		UserName: strings.ToLower(uname), | 		UserName: strings.ToLower(uname), | ||||||
| 		RepoName: strings.ToLower(repoName), | 		RepoName: strings.ToLower(repoName), | ||||||
|  |  | ||||||
|  | @ -198,8 +198,8 @@ func TransferRepoAction(user, newUser *User, repo *Repository) (err error) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetFeeds returns action list of given user in given context.
 | // GetFeeds returns action list of given user in given context.
 | ||||||
| func GetFeeds(userid, offset int64, isProfile bool) ([]Action, error) { | func GetFeeds(userid, offset int64, isProfile bool) ([]*Action, error) { | ||||||
| 	actions := make([]Action, 0, 20) | 	actions := make([]*Action, 0, 20) | ||||||
| 	sess := orm.Limit(20, int(offset)).Desc("id").Where("user_id=?", userid) | 	sess := orm.Limit(20, int(offset)).Desc("id").Where("user_id=?", userid) | ||||||
| 	if isProfile { | 	if isProfile { | ||||||
| 		sess.Where("is_private=?", false).And("act_user_id=?", userid) | 		sess.Where("is_private=?", false).And("act_user_id=?", userid) | ||||||
|  |  | ||||||
|  | @ -50,7 +50,7 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | ||||||
| 
 | 
 | ||||||
| 		// Collaborators who have write access can be seen as owners.
 | 		// Collaborators who have write access can be seen as owners.
 | ||||||
| 		if ctx.IsSigned { | 		if ctx.IsSigned { | ||||||
| 			ctx.Repo.IsOwner, err = models.HasAccess(ctx.User.Name, repoName, models.AU_WRITABLE) | 			ctx.Repo.IsOwner, err = models.HasAccess(ctx.User.Name, userName+"/"+repoName, models.AU_WRITABLE) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				ctx.Handle(500, "RepoAssignment(HasAccess)", err) | 				ctx.Handle(500, "RepoAssignment(HasAccess)", err) | ||||||
| 				return | 				return | ||||||
|  | @ -100,7 +100,7 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// Check access.
 | 		// Check access.
 | ||||||
| 		if repo.IsPrivate { | 		if repo.IsPrivate && !ctx.Repo.IsOwner { | ||||||
| 			if ctx.User == nil { | 			if ctx.User == nil { | ||||||
| 				ctx.Handle(404, "RepoAssignment(HasAccess)", nil) | 				ctx.Handle(404, "RepoAssignment(HasAccess)", nil) | ||||||
| 				return | 				return | ||||||
|  |  | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | // Copyright 2014 The Gogs Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a MIT-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | package workers | ||||||
|  | 
 | ||||||
|  | // Work represents a background work interface of any kind.
 | ||||||
|  | type Work interface { | ||||||
|  | 	Do() error | ||||||
|  | } | ||||||
|  | @ -178,10 +178,20 @@ func CreateIssuePost(ctx *middleware.Context, params martini.Params, form auth.C | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	act := &models.Action{ | ||||||
|  | 		ActUserId:    ctx.User.Id, | ||||||
|  | 		ActUserName:  ctx.User.Name, | ||||||
|  | 		ActEmail:     ctx.User.Email, | ||||||
|  | 		OpType:       models.OP_CREATE_ISSUE, | ||||||
|  | 		Content:      fmt.Sprintf("%d|%s", issue.Index, issue.Name), | ||||||
|  | 		RepoId:       ctx.Repo.Repository.Id, | ||||||
|  | 		RepoUserName: ctx.Repo.Owner.Name, | ||||||
|  | 		RepoName:     ctx.Repo.Repository.Name, | ||||||
|  | 		RefName:      ctx.Repo.BranchName, | ||||||
|  | 		IsPrivate:    ctx.Repo.Repository.IsPrivate, | ||||||
|  | 	} | ||||||
| 	// Notify watchers.
 | 	// Notify watchers.
 | ||||||
| 	if err := models.NotifyWatchers(&models.Action{ActUserId: ctx.User.Id, ActUserName: ctx.User.Name, ActEmail: ctx.User.Email, | 	if err := models.NotifyWatchers(act); err != nil { | ||||||
| 		OpType: models.OP_CREATE_ISSUE, Content: fmt.Sprintf("%d|%s", issue.Index, issue.Name), |  | ||||||
| 		RepoId: ctx.Repo.Repository.Id, RepoName: ctx.Repo.Repository.Name, RefName: ""}); err != nil { |  | ||||||
| 		ctx.Handle(500, "issue.CreateIssue(NotifyWatchers)", err) | 		ctx.Handle(500, "issue.CreateIssue(NotifyWatchers)", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -27,11 +27,23 @@ func Dashboard(ctx *middleware.Context) { | ||||||
| 	} | 	} | ||||||
| 	ctx.Data["MyRepos"] = repos | 	ctx.Data["MyRepos"] = repos | ||||||
| 
 | 
 | ||||||
| 	feeds, err := models.GetFeeds(ctx.User.Id, 0, false) | 	actions, err := models.GetFeeds(ctx.User.Id, 0, false) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.Handle(500, "user.Dashboard", err) | 		ctx.Handle(500, "user.Dashboard", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	feeds := make([]*models.Action, 0, len(actions)) | ||||||
|  | 	for _, act := range actions { | ||||||
|  | 		if act.IsPrivate { | ||||||
|  | 			if has, _ := models.HasAccess(ctx.User.Name, act.RepoUserName+"/"+act.RepoName, | ||||||
|  | 				models.AU_READABLE); !has { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		feeds = append(feeds, act) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	ctx.Data["Feeds"] = feeds | 	ctx.Data["Feeds"] = feeds | ||||||
| 	ctx.HTML(200, "user/dashboard") | 	ctx.HTML(200, "user/dashboard") | ||||||
| } | } | ||||||
|  | @ -39,7 +51,6 @@ func Dashboard(ctx *middleware.Context) { | ||||||
| func Profile(ctx *middleware.Context, params martini.Params) { | func Profile(ctx *middleware.Context, params martini.Params) { | ||||||
| 	ctx.Data["Title"] = "Profile" | 	ctx.Data["Title"] = "Profile" | ||||||
| 
 | 
 | ||||||
| 	// TODO: Need to check view self or others.
 |  | ||||||
| 	user, err := models.GetUserByName(params["username"]) | 	user, err := models.GetUserByName(params["username"]) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.Handle(500, "user.Profile", err) | 		ctx.Handle(500, "user.Profile", err) | ||||||
|  | @ -95,12 +106,19 @@ func Feeds(ctx *middleware.Context, form auth.FeedsForm) { | ||||||
| 	actions, err := models.GetFeeds(form.UserId, form.Page*20, false) | 	actions, err := models.GetFeeds(form.UserId, form.Page*20, false) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.JSON(500, err) | 		ctx.JSON(500, err) | ||||||
|  | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	feeds := make([]string, len(actions)) | 	feeds := make([]string, 0, len(actions)) | ||||||
| 	for i := range actions { | 	for _, act := range actions { | ||||||
| 		feeds[i] = fmt.Sprintf(TPL_FEED, base.ActionIcon(actions[i].OpType), | 		if act.IsPrivate { | ||||||
| 			base.TimeSince(actions[i].Created), base.ActionDesc(actions[i])) | 			if has, _ := models.HasAccess(ctx.User.Name, act.RepoUserName+"/"+act.RepoName, | ||||||
|  | 				models.AU_READABLE); !has { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		feeds = append(feeds, fmt.Sprintf(TPL_FEED, base.ActionIcon(act.OpType), | ||||||
|  | 			base.TimeSince(act.Created), base.ActionDesc(act))) | ||||||
| 	} | 	} | ||||||
| 	ctx.JSON(200, &feeds) | 	ctx.JSON(200, &feeds) | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue