You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GitBlit.java 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. /*
  2. * Copyright 2013 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit;
  17. import java.text.MessageFormat;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import javax.inject.Singleton;
  21. import javax.servlet.http.HttpServletRequest;
  22. import com.gitblit.Constants.AccessPermission;
  23. import com.gitblit.manager.GitblitManager;
  24. import com.gitblit.manager.IAuthenticationManager;
  25. import com.gitblit.manager.IFederationManager;
  26. import com.gitblit.manager.IGitblit;
  27. import com.gitblit.manager.INotificationManager;
  28. import com.gitblit.manager.IPluginManager;
  29. import com.gitblit.manager.IProjectManager;
  30. import com.gitblit.manager.IRepositoryManager;
  31. import com.gitblit.manager.IRuntimeManager;
  32. import com.gitblit.manager.IUserManager;
  33. import com.gitblit.manager.ServicesManager;
  34. import com.gitblit.models.RepositoryModel;
  35. import com.gitblit.models.RepositoryUrl;
  36. import com.gitblit.models.UserModel;
  37. import com.gitblit.tickets.BranchTicketService;
  38. import com.gitblit.tickets.FileTicketService;
  39. import com.gitblit.tickets.ITicketService;
  40. import com.gitblit.tickets.NullTicketService;
  41. import com.gitblit.tickets.RedisTicketService;
  42. import com.gitblit.transport.ssh.IPublicKeyManager;
  43. import com.gitblit.utils.StringUtils;
  44. import dagger.Module;
  45. import dagger.ObjectGraph;
  46. import dagger.Provides;
  47. /**
  48. * GitBlit is the aggregate manager for the Gitblit webapp. It provides all
  49. * management functions and also manages some long-running services.
  50. *
  51. * @author James Moger
  52. *
  53. */
  54. public class GitBlit extends GitblitManager {
  55. private final ObjectGraph injector;
  56. private final ServicesManager servicesManager;
  57. private ITicketService ticketService;
  58. public GitBlit(
  59. IRuntimeManager runtimeManager,
  60. IPluginManager pluginManager,
  61. INotificationManager notificationManager,
  62. IUserManager userManager,
  63. IAuthenticationManager authenticationManager,
  64. IPublicKeyManager publicKeyManager,
  65. IRepositoryManager repositoryManager,
  66. IProjectManager projectManager,
  67. IFederationManager federationManager) {
  68. super(runtimeManager,
  69. pluginManager,
  70. notificationManager,
  71. userManager,
  72. authenticationManager,
  73. publicKeyManager,
  74. repositoryManager,
  75. projectManager,
  76. federationManager);
  77. this.injector = ObjectGraph.create(getModules());
  78. this.servicesManager = new ServicesManager(this);
  79. }
  80. @Override
  81. public GitBlit start() {
  82. super.start();
  83. logger.info("Starting services manager...");
  84. servicesManager.start();
  85. configureTicketService();
  86. return this;
  87. }
  88. @Override
  89. public GitBlit stop() {
  90. super.stop();
  91. servicesManager.stop();
  92. ticketService.stop();
  93. return this;
  94. }
  95. @Override
  96. public boolean isServingRepositories() {
  97. return servicesManager.isServingRepositories();
  98. }
  99. protected Object [] getModules() {
  100. return new Object [] { new GitBlitModule()};
  101. }
  102. /**
  103. * Returns a list of repository URLs and the user access permission.
  104. *
  105. * @param request
  106. * @param user
  107. * @param repository
  108. * @return a list of repository urls
  109. */
  110. @Override
  111. public List<RepositoryUrl> getRepositoryUrls(HttpServletRequest request, UserModel user, RepositoryModel repository) {
  112. if (user == null) {
  113. user = UserModel.ANONYMOUS;
  114. }
  115. String username = StringUtils.encodeUsername(UserModel.ANONYMOUS.equals(user) ? "" : user.username);
  116. List<RepositoryUrl> list = new ArrayList<RepositoryUrl>();
  117. // http/https url
  118. if (settings.getBoolean(Keys.git.enableGitServlet, true)) {
  119. AccessPermission permission = user.getRepositoryPermission(repository).permission;
  120. if (permission.exceeds(AccessPermission.NONE)) {
  121. list.add(new RepositoryUrl(getRepositoryUrl(request, username, repository), permission));
  122. }
  123. }
  124. // ssh daemon url
  125. String sshDaemonUrl = servicesManager.getSshDaemonUrl(request, user, repository);
  126. if (!StringUtils.isEmpty(sshDaemonUrl)) {
  127. AccessPermission permission = user.getRepositoryPermission(repository).permission;
  128. if (permission.exceeds(AccessPermission.NONE)) {
  129. list.add(new RepositoryUrl(sshDaemonUrl, permission));
  130. }
  131. }
  132. // git daemon url
  133. String gitDaemonUrl = servicesManager.getGitDaemonUrl(request, user, repository);
  134. if (!StringUtils.isEmpty(gitDaemonUrl)) {
  135. AccessPermission permission = servicesManager.getGitDaemonAccessPermission(user, repository);
  136. if (permission.exceeds(AccessPermission.NONE)) {
  137. list.add(new RepositoryUrl(gitDaemonUrl, permission));
  138. }
  139. }
  140. // add all other urls
  141. // {0} = repository
  142. // {1} = username
  143. for (String url : settings.getStrings(Keys.web.otherUrls)) {
  144. if (url.contains("{1}")) {
  145. // external url requires username, only add url IF we have one
  146. if (!StringUtils.isEmpty(username)) {
  147. list.add(new RepositoryUrl(MessageFormat.format(url, repository.name, username), null));
  148. }
  149. } else {
  150. // external url does not require username
  151. list.add(new RepositoryUrl(MessageFormat.format(url, repository.name), null));
  152. }
  153. }
  154. return list;
  155. }
  156. /**
  157. * Detect renames and reindex as appropriate.
  158. */
  159. @Override
  160. public void updateRepositoryModel(String repositoryName, RepositoryModel repository,
  161. boolean isCreate) throws GitBlitException {
  162. RepositoryModel oldModel = null;
  163. boolean isRename = !isCreate && !repositoryName.equalsIgnoreCase(repository.name);
  164. if (isRename) {
  165. oldModel = repositoryManager.getRepositoryModel(repositoryName);
  166. }
  167. super.updateRepositoryModel(repositoryName, repository, isCreate);
  168. if (isRename && ticketService != null) {
  169. ticketService.rename(oldModel, repository);
  170. }
  171. }
  172. /**
  173. * Delete the user and all associated public ssh keys.
  174. */
  175. @Override
  176. public boolean deleteUser(String username) {
  177. UserModel user = userManager.getUserModel(username);
  178. return deleteUserModel(user);
  179. }
  180. @Override
  181. public boolean deleteUserModel(UserModel model) {
  182. boolean success = userManager.deleteUserModel(model);
  183. if (success) {
  184. getPublicKeyManager().removeAllKeys(model.username);
  185. }
  186. return success;
  187. }
  188. /**
  189. * Delete the repository and all associated tickets.
  190. */
  191. @Override
  192. public boolean deleteRepository(String repositoryName) {
  193. RepositoryModel repository = repositoryManager.getRepositoryModel(repositoryName);
  194. return deleteRepositoryModel(repository);
  195. }
  196. @Override
  197. public boolean deleteRepositoryModel(RepositoryModel model) {
  198. boolean success = repositoryManager.deleteRepositoryModel(model);
  199. if (success && ticketService != null) {
  200. return ticketService.deleteAll(model);
  201. }
  202. return success;
  203. }
  204. /**
  205. * Returns the configured ticket service.
  206. *
  207. * @return a ticket service
  208. */
  209. @Override
  210. public ITicketService getTicketService() {
  211. return ticketService;
  212. }
  213. protected void configureTicketService() {
  214. String clazz = settings.getString(Keys.tickets.service, NullTicketService.class.getName());
  215. if (StringUtils.isEmpty(clazz)) {
  216. clazz = NullTicketService.class.getName();
  217. }
  218. try {
  219. Class<? extends ITicketService> serviceClass = (Class<? extends ITicketService>) Class.forName(clazz);
  220. ticketService = injector.get(serviceClass).start();
  221. if (ticketService instanceof NullTicketService) {
  222. logger.warn("No ticket service configured.");
  223. } else if (ticketService.isReady()) {
  224. logger.info("{} is ready.", ticketService);
  225. } else {
  226. logger.warn("{} is disabled.", ticketService);
  227. }
  228. } catch (Exception e) {
  229. logger.error("failed to create ticket service " + clazz, e);
  230. ticketService = injector.get(NullTicketService.class).start();
  231. }
  232. }
  233. /**
  234. * A nested Dagger graph is used for constructor dependency injection of
  235. * complex classes.
  236. *
  237. * @author James Moger
  238. *
  239. */
  240. @Module(
  241. library = true,
  242. injects = {
  243. IStoredSettings.class,
  244. // core managers
  245. IRuntimeManager.class,
  246. INotificationManager.class,
  247. IUserManager.class,
  248. IAuthenticationManager.class,
  249. IRepositoryManager.class,
  250. IProjectManager.class,
  251. IFederationManager.class,
  252. // the monolithic manager
  253. IGitblit.class,
  254. // ticket services
  255. NullTicketService.class,
  256. FileTicketService.class,
  257. BranchTicketService.class,
  258. RedisTicketService.class
  259. }
  260. )
  261. class GitBlitModule {
  262. @Provides @Singleton IStoredSettings provideSettings() {
  263. return settings;
  264. }
  265. @Provides @Singleton IRuntimeManager provideRuntimeManager() {
  266. return runtimeManager;
  267. }
  268. @Provides @Singleton INotificationManager provideNotificationManager() {
  269. return notificationManager;
  270. }
  271. @Provides @Singleton IUserManager provideUserManager() {
  272. return userManager;
  273. }
  274. @Provides @Singleton IAuthenticationManager provideAuthenticationManager() {
  275. return authenticationManager;
  276. }
  277. @Provides @Singleton IRepositoryManager provideRepositoryManager() {
  278. return repositoryManager;
  279. }
  280. @Provides @Singleton IProjectManager provideProjectManager() {
  281. return projectManager;
  282. }
  283. @Provides @Singleton IFederationManager provideFederationManager() {
  284. return federationManager;
  285. }
  286. @Provides @Singleton IGitblit provideGitblit() {
  287. return GitBlit.this;
  288. }
  289. @Provides @Singleton NullTicketService provideNullTicketService() {
  290. return new NullTicketService(
  291. runtimeManager,
  292. notificationManager,
  293. userManager,
  294. repositoryManager);
  295. }
  296. @Provides @Singleton FileTicketService provideFileTicketService() {
  297. return new FileTicketService(
  298. runtimeManager,
  299. notificationManager,
  300. userManager,
  301. repositoryManager);
  302. }
  303. @Provides @Singleton BranchTicketService provideBranchTicketService() {
  304. return new BranchTicketService(
  305. runtimeManager,
  306. notificationManager,
  307. userManager,
  308. repositoryManager);
  309. }
  310. @Provides @Singleton RedisTicketService provideRedisTicketService() {
  311. return new RedisTicketService(
  312. runtimeManager,
  313. notificationManager,
  314. userManager,
  315. repositoryManager);
  316. }
  317. }
  318. }