diff options
Diffstat (limited to 'src/main/java/com/gitblit/git/GitblitReceivePackFactory.java')
-rw-r--r-- | src/main/java/com/gitblit/git/GitblitReceivePackFactory.java | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java b/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java index 77a3df63..b9eb8a62 100644 --- a/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java +++ b/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java @@ -30,11 +30,11 @@ import com.gitblit.GitBlit; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; import com.gitblit.utils.HttpUtils; +import com.gitblit.utils.StringUtils; /** - * The receive pack factory creates a receive pack which accepts pushes from - * clients. - * + * The receive pack factory creates the receive pack which processes pushes. + * * @author James Moger * * @param <X> the connection type @@ -42,62 +42,59 @@ import com.gitblit.utils.HttpUtils; public class GitblitReceivePackFactory<X> implements ReceivePackFactory<X> { protected final Logger logger = LoggerFactory.getLogger(GitblitReceivePackFactory.class); - + @Override public ReceivePack create(X req, Repository db) throws ServiceNotEnabledException, ServiceNotAuthorizedException { - final ReceivePack rp = new ReceivePack(db); UserModel user = UserModel.ANONYMOUS; String repositoryName = ""; String origin = ""; String gitblitUrl = ""; + String repositoryUrl = ""; int timeout = 0; - + if (req instanceof HttpServletRequest) { - // http/https request may or may not be authenticated + // http/https request may or may not be authenticated HttpServletRequest request = (HttpServletRequest) req; repositoryName = request.getAttribute("gitblitRepositoryName").toString(); origin = request.getRemoteHost(); gitblitUrl = HttpUtils.getGitblitURL(request); + repositoryUrl = request.getRequestURI(); // determine pushing user String username = request.getRemoteUser(); - if (username != null && !"".equals(username)) { - user = GitBlit.self().getUserModel(username); - if (user == null) { - // anonymous push, create a temporary usermodel - user = new UserModel(username); + if (!StringUtils.isEmpty(username)) { + UserModel u = GitBlit.self().getUserModel(username); + if (u != null) { + user = u; } } } else if (req instanceof GitDaemonClient) { - // git daemon request is alway anonymous + // git daemon request is always anonymous GitDaemonClient client = (GitDaemonClient) req; repositoryName = client.getRepositoryName(); origin = client.getRemoteAddress().getHostAddress(); + // set timeout from Git daemon timeout = client.getDaemon().getTimeout(); } - // set pushing user identity for reflog - rp.setRefLogIdent(new PersonIdent(user.username, user.username + "@" + origin)); - rp.setTimeout(timeout); - - // set advanced ref permissions - RepositoryModel repository = GitBlit.self().getRepositoryModel(repositoryName); - rp.setAllowCreates(user.canCreateRef(repository)); - rp.setAllowDeletes(user.canDeleteRef(repository)); - rp.setAllowNonFastForwards(user.canRewindRef(repository)); + // TODO make this a setting + boolean allowAnonymousPushes = true; + if (!allowAnonymousPushes && UserModel.ANONYMOUS.equals(user)) { + // prohibit anonymous pushes + throw new ServiceNotEnabledException(); + } - // setup the receive hook - ReceiveHook hook = new ReceiveHook(); - hook.user = user; - hook.repository = repository; - hook.gitblitUrl = gitblitUrl; + final RepositoryModel repository = GitBlit.self().getRepositoryModel(repositoryName); - rp.setPreReceiveHook(hook); - rp.setPostReceiveHook(hook); + final GitblitReceivePack rp = new GitblitReceivePack(db, repository, user); + rp.setGitblitUrl(gitblitUrl); + rp.setRepositoryUrl(repositoryUrl); + rp.setRefLogIdent(new PersonIdent(user.username, user.username + "@" + origin)); + rp.setTimeout(timeout); return rp; } -} +}
\ No newline at end of file |