Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package com.gitblit;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.text.MessageFormat;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import javax.servlet.ServletContextEvent;
  8. import javax.servlet.ServletContextListener;
  9. import javax.servlet.http.Cookie;
  10. import org.apache.wicket.protocol.http.WebResponse;
  11. import org.eclipse.jgit.errors.RepositoryNotFoundException;
  12. import org.eclipse.jgit.lib.Repository;
  13. import org.eclipse.jgit.lib.StoredConfig;
  14. import org.eclipse.jgit.transport.resolver.FileResolver;
  15. import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import com.gitblit.Constants.AccessRestrictionType;
  19. import com.gitblit.utils.JGitUtils;
  20. import com.gitblit.wicket.models.RepositoryModel;
  21. import com.gitblit.wicket.models.User;
  22. public class GitBlit implements ServletContextListener {
  23. private final static GitBlit gitblit;
  24. private final Logger logger = LoggerFactory.getLogger(GitBlit.class);
  25. private FileResolver<Void> repositoryResolver;
  26. private File repositoriesFolder;
  27. private boolean exportAll;
  28. private ILoginService loginService;
  29. private IStoredSettings storedSettings;
  30. static {
  31. gitblit = new GitBlit();
  32. }
  33. public static GitBlit self() {
  34. return gitblit;
  35. }
  36. private GitBlit() {
  37. }
  38. public IStoredSettings settings() {
  39. return storedSettings;
  40. }
  41. public boolean isDebugMode() {
  42. return storedSettings.getBoolean(Keys.web.debugMode, false);
  43. }
  44. public String getCloneUrl(String repositoryName) {
  45. return storedSettings.getString(Keys.git.cloneUrl, "https://localhost/git/") + repositoryName;
  46. }
  47. public void setLoginService(ILoginService loginService) {
  48. this.loginService = loginService;
  49. }
  50. public User authenticate(String username, char[] password) {
  51. if (loginService == null) {
  52. return null;
  53. }
  54. return loginService.authenticate(username, password);
  55. }
  56. public User authenticate(Cookie[] cookies) {
  57. if (loginService == null) {
  58. return null;
  59. }
  60. if (cookies != null && cookies.length > 0) {
  61. for (Cookie cookie : cookies) {
  62. if (cookie.getName().equals(Constants.NAME)) {
  63. String value = cookie.getValue();
  64. return loginService.authenticate(value.toCharArray());
  65. }
  66. }
  67. }
  68. return null;
  69. }
  70. public void setCookie(WebResponse response, User user) {
  71. Cookie userCookie = new Cookie(Constants.NAME, user.getCookie());
  72. userCookie.setMaxAge(Integer.MAX_VALUE);
  73. userCookie.setPath("/");
  74. response.addCookie(userCookie);
  75. }
  76. public User getUser(String username) {
  77. User user = loginService.getUserModel(username);
  78. return user;
  79. }
  80. public void editUserModel(User user, boolean isCreate) throws GitBlitException {
  81. if (!loginService.updateUserModel(user)) {
  82. throw new GitBlitException(isCreate ? "Failed to add user!" : "Failed to update user!");
  83. }
  84. }
  85. public List<String> getRepositoryList() {
  86. return JGitUtils.getRepositoryList(repositoriesFolder, exportAll, storedSettings.getBoolean(Keys.git.nestedRepositories, true));
  87. }
  88. public Repository getRepository(String repositoryName) {
  89. Repository r = null;
  90. try {
  91. r = repositoryResolver.open(null, repositoryName);
  92. } catch (RepositoryNotFoundException e) {
  93. r = null;
  94. logger.error("GitBlit.getRepository(String) failed to find repository " + repositoryName);
  95. } catch (ServiceNotEnabledException e) {
  96. r = null;
  97. e.printStackTrace();
  98. }
  99. return r;
  100. }
  101. public List<RepositoryModel> getRepositoryModels(User user) {
  102. List<String> list = getRepositoryList();
  103. List<RepositoryModel> repositories = new ArrayList<RepositoryModel>();
  104. for (String repo : list) {
  105. RepositoryModel model = getRepositoryModel(user, repo);
  106. if (model != null) {
  107. repositories.add(model);
  108. }
  109. }
  110. return repositories;
  111. }
  112. public RepositoryModel getRepositoryModel(User user, String repositoryName) {
  113. RepositoryModel model = getRepositoryModel(repositoryName);
  114. if (model.accessRestriction.atLeast(AccessRestrictionType.VIEW)) {
  115. if (user != null && user.canView(model)) {
  116. return model;
  117. }
  118. return null;
  119. } else {
  120. return model;
  121. }
  122. }
  123. public RepositoryModel getRepositoryModel(String repositoryName) {
  124. Repository r = getRepository(repositoryName);
  125. RepositoryModel model = new RepositoryModel();
  126. model.name = repositoryName;
  127. model.hasCommits = JGitUtils.hasCommits(r);
  128. model.lastChange = JGitUtils.getLastChange(r);
  129. StoredConfig config = JGitUtils.readConfig(r);
  130. if (config != null) {
  131. model.description = config.getString("gitblit", null, "description");
  132. model.owner = config.getString("gitblit", null, "owner");
  133. model.useTickets = config.getBoolean("gitblit", "useTickets", false);
  134. model.useDocs = config.getBoolean("gitblit", "useDocs", false);
  135. model.accessRestriction = AccessRestrictionType.fromString(config.getString("gitblit", null, "accessRestriction"));
  136. model.showRemoteBranches = config.getBoolean("gitblit", "showRemoteBranches", false);
  137. }
  138. r.close();
  139. return model;
  140. }
  141. public void editRepositoryModel(RepositoryModel repository, boolean isCreate) throws GitBlitException {
  142. Repository r = null;
  143. if (isCreate) {
  144. if (new File(repositoriesFolder, repository.name).exists()) {
  145. throw new GitBlitException(MessageFormat.format("Can not create repository {0} because it already exists.", repository.name));
  146. }
  147. // create repository
  148. logger.info("create repository " + repository.name);
  149. r = JGitUtils.createRepository(repositoriesFolder, repository.name, true);
  150. } else {
  151. // load repository
  152. logger.info("edit repository " + repository.name);
  153. try {
  154. r = repositoryResolver.open(null, repository.name);
  155. } catch (RepositoryNotFoundException e) {
  156. logger.error("Repository not found", e);
  157. } catch (ServiceNotEnabledException e) {
  158. logger.error("Service not enabled", e);
  159. }
  160. }
  161. // update settings
  162. StoredConfig config = JGitUtils.readConfig(r);
  163. config.setString("gitblit", null, "description", repository.description);
  164. config.setString("gitblit", null, "owner", repository.owner);
  165. config.setBoolean("gitblit", null, "useTickets", repository.useTickets);
  166. config.setBoolean("gitblit", null, "useDocs", repository.useDocs);
  167. config.setString("gitblit", null, "accessRestriction", repository.accessRestriction.toString());
  168. config.setBoolean("gitblit", null, "showRemoteBranches", repository.showRemoteBranches);
  169. try {
  170. config.save();
  171. } catch (IOException e) {
  172. logger.error("Failed to save repository config!", e);
  173. }
  174. r.close();
  175. }
  176. public void configureContext(IStoredSettings settings) {
  177. logger.info("Configure GitBlit from " + settings.toString());
  178. this.storedSettings = settings;
  179. repositoriesFolder = new File(settings.getString(Keys.git.repositoriesFolder, "repos"));
  180. exportAll = settings.getBoolean(Keys.git.exportAll, true);
  181. repositoryResolver = new FileResolver<Void>(repositoriesFolder, exportAll);
  182. }
  183. @Override
  184. public void contextInitialized(ServletContextEvent contextEvent) {
  185. if (storedSettings == null) {
  186. WebXmlSettings webxmlSettings = new WebXmlSettings(contextEvent.getServletContext());
  187. configureContext(webxmlSettings);
  188. }
  189. }
  190. @Override
  191. public void contextDestroyed(ServletContextEvent contextEvent) {
  192. logger.info("GitBlit context destroyed by servlet container.");
  193. }
  194. }