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.

GitblitManager.java 36KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287
  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.manager;
  17. import java.io.BufferedReader;
  18. import java.io.File;
  19. import java.io.FileInputStream;
  20. import java.io.IOException;
  21. import java.io.InputStream;
  22. import java.io.InputStreamReader;
  23. import java.lang.reflect.Type;
  24. import java.text.MessageFormat;
  25. import java.util.ArrayList;
  26. import java.util.Collection;
  27. import java.util.Date;
  28. import java.util.List;
  29. import java.util.Locale;
  30. import java.util.Map;
  31. import java.util.TimeZone;
  32. import javax.servlet.http.HttpServletRequest;
  33. import javax.servlet.http.HttpServletResponse;
  34. import org.eclipse.jgit.api.CloneCommand;
  35. import org.eclipse.jgit.api.FetchCommand;
  36. import org.eclipse.jgit.api.Git;
  37. import org.eclipse.jgit.lib.Ref;
  38. import org.eclipse.jgit.lib.Repository;
  39. import org.eclipse.jgit.transport.RefSpec;
  40. import org.slf4j.Logger;
  41. import org.slf4j.LoggerFactory;
  42. import ro.fortsoft.pf4j.PluginState;
  43. import ro.fortsoft.pf4j.PluginWrapper;
  44. import ro.fortsoft.pf4j.Version;
  45. import com.gitblit.Constants;
  46. import com.gitblit.Constants.AccessPermission;
  47. import com.gitblit.Constants.FederationRequest;
  48. import com.gitblit.Constants.FederationToken;
  49. import com.gitblit.GitBlitException;
  50. import com.gitblit.IStoredSettings;
  51. import com.gitblit.models.FederationModel;
  52. import com.gitblit.models.FederationProposal;
  53. import com.gitblit.models.FederationSet;
  54. import com.gitblit.models.ForkModel;
  55. import com.gitblit.models.GitClientApplication;
  56. import com.gitblit.models.Mailing;
  57. import com.gitblit.models.Metric;
  58. import com.gitblit.models.PluginRegistry.InstallState;
  59. import com.gitblit.models.PluginRegistry.PluginRegistration;
  60. import com.gitblit.models.PluginRegistry.PluginRelease;
  61. import com.gitblit.models.ProjectModel;
  62. import com.gitblit.models.RegistrantAccessPermission;
  63. import com.gitblit.models.RepositoryModel;
  64. import com.gitblit.models.SearchResult;
  65. import com.gitblit.models.ServerSettings;
  66. import com.gitblit.models.ServerStatus;
  67. import com.gitblit.models.SettingModel;
  68. import com.gitblit.models.TeamModel;
  69. import com.gitblit.models.UserModel;
  70. import com.gitblit.tickets.ITicketService;
  71. import com.gitblit.transport.ssh.IPublicKeyManager;
  72. import com.gitblit.transport.ssh.SshKey;
  73. import com.gitblit.utils.ArrayUtils;
  74. import com.gitblit.utils.JsonUtils;
  75. import com.gitblit.utils.ObjectCache;
  76. import com.gitblit.utils.StringUtils;
  77. import com.google.gson.Gson;
  78. import com.google.gson.JsonIOException;
  79. import com.google.gson.JsonSyntaxException;
  80. import com.google.gson.reflect.TypeToken;
  81. import com.google.inject.Inject;
  82. import com.google.inject.Injector;
  83. import com.google.inject.Singleton;
  84. import com.google.inject.Provider;
  85. /**
  86. * GitblitManager is an aggregate interface delegate. It implements all the manager
  87. * interfaces and delegates most methods calls to the proper manager implementation.
  88. * It's primary purpose is to provide complete management control to the git
  89. * upload and receive pack functions.
  90. *
  91. * GitblitManager also implements several integration methods when it is required
  92. * to manipulate several manages for one operation.
  93. *
  94. * @author James Moger
  95. *
  96. */
  97. @Singleton
  98. public class GitblitManager implements IGitblit {
  99. protected final Logger logger = LoggerFactory.getLogger(getClass());
  100. protected final ObjectCache<Collection<GitClientApplication>> clientApplications = new ObjectCache<Collection<GitClientApplication>>();
  101. protected final Provider<IPublicKeyManager> publicKeyManagerProvider;
  102. protected final Provider<ITicketService> ticketServiceProvider;
  103. protected final IStoredSettings settings;
  104. protected final IRuntimeManager runtimeManager;
  105. protected final IPluginManager pluginManager;
  106. protected final INotificationManager notificationManager;
  107. protected final IUserManager userManager;
  108. protected final IAuthenticationManager authenticationManager;
  109. protected final IRepositoryManager repositoryManager;
  110. protected final IProjectManager projectManager;
  111. protected final IFederationManager federationManager;
  112. @Inject
  113. public GitblitManager(
  114. Provider<IPublicKeyManager> publicKeyManagerProvider,
  115. Provider<ITicketService> ticketServiceProvider,
  116. IRuntimeManager runtimeManager,
  117. IPluginManager pluginManager,
  118. INotificationManager notificationManager,
  119. IUserManager userManager,
  120. IAuthenticationManager authenticationManager,
  121. IRepositoryManager repositoryManager,
  122. IProjectManager projectManager,
  123. IFederationManager federationManager) {
  124. this.publicKeyManagerProvider = publicKeyManagerProvider;
  125. this.ticketServiceProvider = ticketServiceProvider;
  126. this.settings = runtimeManager.getSettings();
  127. this.runtimeManager = runtimeManager;
  128. this.pluginManager = pluginManager;
  129. this.notificationManager = notificationManager;
  130. this.userManager = userManager;
  131. this.authenticationManager = authenticationManager;
  132. this.repositoryManager = repositoryManager;
  133. this.projectManager = projectManager;
  134. this.federationManager = federationManager;
  135. }
  136. @Override
  137. public GitblitManager start() {
  138. loadSettingModels(runtimeManager.getSettingsModel());
  139. return this;
  140. }
  141. @Override
  142. public GitblitManager stop() {
  143. return this;
  144. }
  145. /*
  146. * IGITBLIT
  147. */
  148. /**
  149. * Creates a personal fork of the specified repository. The clone is view
  150. * restricted by default and the owner of the source repository is given
  151. * access to the clone.
  152. *
  153. * @param repository
  154. * @param user
  155. * @return the repository model of the fork, if successful
  156. * @throws GitBlitException
  157. */
  158. @Override
  159. public RepositoryModel fork(RepositoryModel repository, UserModel user) throws GitBlitException {
  160. String cloneName = MessageFormat.format("{0}/{1}.git", user.getPersonalPath(), StringUtils.stripDotGit(StringUtils.getLastPathElement(repository.name)));
  161. String fromUrl = MessageFormat.format("file://{0}/{1}", repositoryManager.getRepositoriesFolder().getAbsolutePath(), repository.name);
  162. // clone the repository
  163. try {
  164. Repository canonical = getRepository(repository.name);
  165. File folder = new File(repositoryManager.getRepositoriesFolder(), cloneName);
  166. CloneCommand clone = new CloneCommand();
  167. clone.setBare(true);
  168. // fetch branches with exclusions
  169. Collection<Ref> branches = canonical.getRefDatabase().getRefs(Constants.R_HEADS).values();
  170. List<String> branchesToClone = new ArrayList<String>();
  171. for (Ref branch : branches) {
  172. String name = branch.getName();
  173. if (name.startsWith(Constants.R_TICKET)) {
  174. // exclude ticket branches
  175. continue;
  176. }
  177. branchesToClone.add(name);
  178. }
  179. clone.setBranchesToClone(branchesToClone);
  180. clone.setURI(fromUrl);
  181. clone.setDirectory(folder);
  182. Git git = clone.call();
  183. // fetch tags
  184. FetchCommand fetch = git.fetch();
  185. fetch.setRefSpecs(new RefSpec("+refs/tags/*:refs/tags/*"));
  186. fetch.call();
  187. git.getRepository().close();
  188. } catch (Exception e) {
  189. throw new GitBlitException(e);
  190. }
  191. // create a Gitblit repository model for the clone
  192. RepositoryModel cloneModel = repository.cloneAs(cloneName);
  193. // owner has REWIND/RW+ permissions
  194. cloneModel.addOwner(user.username);
  195. repositoryManager.updateRepositoryModel(cloneName, cloneModel, false);
  196. // add the owner of the source repository to the clone's access list
  197. if (!ArrayUtils.isEmpty(repository.owners)) {
  198. for (String owner : repository.owners) {
  199. UserModel originOwner = userManager.getUserModel(owner);
  200. if (originOwner != null && !originOwner.canClone(cloneModel)) {
  201. // origin owner can't yet clone fork, grant explicit clone access
  202. originOwner.setRepositoryPermission(cloneName, AccessPermission.CLONE);
  203. reviseUser(originOwner.username, originOwner);
  204. }
  205. }
  206. }
  207. // grant origin's user list clone permission to fork
  208. List<String> users = repositoryManager.getRepositoryUsers(repository);
  209. List<UserModel> cloneUsers = new ArrayList<UserModel>();
  210. for (String name : users) {
  211. if (!name.equalsIgnoreCase(user.username)) {
  212. UserModel cloneUser = userManager.getUserModel(name);
  213. if (cloneUser.canClone(repository) && !cloneUser.canClone(cloneModel)) {
  214. // origin user can't yet clone fork, grant explicit clone access
  215. cloneUser.setRepositoryPermission(cloneName, AccessPermission.CLONE);
  216. }
  217. cloneUsers.add(cloneUser);
  218. }
  219. }
  220. userManager.updateUserModels(cloneUsers);
  221. // grant origin's team list clone permission to fork
  222. List<String> teams = repositoryManager.getRepositoryTeams(repository);
  223. List<TeamModel> cloneTeams = new ArrayList<TeamModel>();
  224. for (String name : teams) {
  225. TeamModel cloneTeam = userManager.getTeamModel(name);
  226. if (cloneTeam.canClone(repository) && !cloneTeam.canClone(cloneModel)) {
  227. // origin team can't yet clone fork, grant explicit clone access
  228. cloneTeam.setRepositoryPermission(cloneName, AccessPermission.CLONE);
  229. }
  230. cloneTeams.add(cloneTeam);
  231. }
  232. userManager.updateTeamModels(cloneTeams);
  233. // add this clone to the cached model
  234. repositoryManager.addToCachedRepositoryList(cloneModel);
  235. return cloneModel;
  236. }
  237. /**
  238. * Adds a TeamModel object.
  239. *
  240. * @param team
  241. */
  242. @Override
  243. public void addTeam(TeamModel team) throws GitBlitException {
  244. if (!userManager.updateTeamModel(team)) {
  245. throw new GitBlitException("Failed to add team!");
  246. }
  247. }
  248. /**
  249. * Updates the TeamModel object for the specified name.
  250. *
  251. * @param teamname
  252. * @param team
  253. */
  254. @Override
  255. public void reviseTeam(String teamname, TeamModel team) throws GitBlitException {
  256. if (!teamname.equalsIgnoreCase(team.name)) {
  257. if (userManager.getTeamModel(team.name) != null) {
  258. throw new GitBlitException(MessageFormat.format(
  259. "Failed to rename ''{0}'' because ''{1}'' already exists.", teamname,
  260. team.name));
  261. }
  262. }
  263. if (!userManager.updateTeamModel(teamname, team)) {
  264. throw new GitBlitException("Failed to update team!");
  265. }
  266. }
  267. /**
  268. * Adds a user object.
  269. *
  270. * @param user
  271. * @throws GitBlitException
  272. */
  273. @Override
  274. public void addUser(UserModel user) throws GitBlitException {
  275. if (!userManager.updateUserModel(user)) {
  276. throw new GitBlitException("Failed to add user!");
  277. }
  278. }
  279. /**
  280. * Updates a user object keyed by username. This method allows
  281. * for renaming a user.
  282. *
  283. * @param username
  284. * @param user
  285. * @throws GitBlitException
  286. */
  287. @Override
  288. public void reviseUser(String username, UserModel user) throws GitBlitException {
  289. if (!username.equalsIgnoreCase(user.username)) {
  290. if (userManager.getUserModel(user.username) != null) {
  291. throw new GitBlitException(MessageFormat.format(
  292. "Failed to rename ''{0}'' because ''{1}'' already exists.", username,
  293. user.username));
  294. }
  295. // rename repositories and owner fields for all repositories
  296. for (RepositoryModel model : repositoryManager.getRepositoryModels(user)) {
  297. if (model.isUsersPersonalRepository(username)) {
  298. // personal repository
  299. model.addOwner(user.username);
  300. String oldRepositoryName = model.name;
  301. model.name = user.getPersonalPath() + model.name.substring(model.projectPath.length());
  302. model.projectPath = user.getPersonalPath();
  303. repositoryManager.updateRepositoryModel(oldRepositoryName, model, false);
  304. } else if (model.isOwner(username)) {
  305. // common/shared repo
  306. model.addOwner(user.username);
  307. repositoryManager.updateRepositoryModel(model.name, model, false);
  308. }
  309. }
  310. // rename the user's ssh public keystore
  311. getPublicKeyManager().renameUser(username, user.username);
  312. }
  313. if (!userManager.updateUserModel(username, user)) {
  314. throw new GitBlitException("Failed to update user!");
  315. }
  316. }
  317. /**
  318. * Returns the list of custom client applications to be used for the
  319. * repository url panel;
  320. *
  321. * @return a collection of client applications
  322. */
  323. @Override
  324. public Collection<GitClientApplication> getClientApplications() {
  325. // prefer user definitions, if they exist
  326. File userDefs = new File(runtimeManager.getBaseFolder(), "clientapps.json");
  327. if (userDefs.exists()) {
  328. Date lastModified = new Date(userDefs.lastModified());
  329. if (clientApplications.hasCurrent("user", lastModified)) {
  330. return clientApplications.getObject("user");
  331. } else {
  332. // (re)load user definitions
  333. try {
  334. InputStream is = new FileInputStream(userDefs);
  335. Collection<GitClientApplication> clients = readClientApplications(is);
  336. is.close();
  337. if (clients != null) {
  338. clientApplications.updateObject("user", lastModified, clients);
  339. return clients;
  340. }
  341. } catch (IOException e) {
  342. logger.error("Failed to deserialize " + userDefs.getAbsolutePath(), e);
  343. }
  344. }
  345. }
  346. // no user definitions, use system definitions
  347. if (!clientApplications.hasCurrent("system", new Date(0))) {
  348. try {
  349. InputStream is = GitblitManager.class.getResourceAsStream("/clientapps.json");
  350. Collection<GitClientApplication> clients = readClientApplications(is);
  351. is.close();
  352. if (clients != null) {
  353. clientApplications.updateObject("system", new Date(0), clients);
  354. }
  355. } catch (IOException e) {
  356. logger.error("Failed to deserialize clientapps.json resource!", e);
  357. }
  358. }
  359. return clientApplications.getObject("system");
  360. }
  361. private Collection<GitClientApplication> readClientApplications(InputStream is) {
  362. try {
  363. Type type = new TypeToken<Collection<GitClientApplication>>() {
  364. }.getType();
  365. InputStreamReader reader = new InputStreamReader(is);
  366. Gson gson = JsonUtils.gson();
  367. Collection<GitClientApplication> links = gson.fromJson(reader, type);
  368. return links;
  369. } catch (JsonIOException e) {
  370. logger.error("Error deserializing client applications!", e);
  371. } catch (JsonSyntaxException e) {
  372. logger.error("Error deserializing client applications!", e);
  373. }
  374. return null;
  375. }
  376. /**
  377. * Parse the properties file and aggregate all the comments by the setting
  378. * key. A setting model tracks the current value, the default value, the
  379. * description of the setting and and directives about the setting.
  380. *
  381. * @return Map<String, SettingModel>
  382. */
  383. private void loadSettingModels(ServerSettings settingsModel) {
  384. try {
  385. // Read bundled Gitblit properties to extract setting descriptions.
  386. // This copy is pristine and only used for populating the setting
  387. // models map.
  388. InputStream is = GitblitManager.class.getResourceAsStream("/reference.properties");
  389. BufferedReader propertiesReader = new BufferedReader(new InputStreamReader(is));
  390. StringBuilder description = new StringBuilder();
  391. SettingModel setting = new SettingModel();
  392. String line = null;
  393. while ((line = propertiesReader.readLine()) != null) {
  394. if (line.length() == 0) {
  395. description.setLength(0);
  396. setting = new SettingModel();
  397. } else {
  398. if (line.charAt(0) == '#') {
  399. if (line.length() > 1) {
  400. String text = line.substring(1).trim();
  401. if (SettingModel.CASE_SENSITIVE.equals(text)) {
  402. setting.caseSensitive = true;
  403. } else if (SettingModel.RESTART_REQUIRED.equals(text)) {
  404. setting.restartRequired = true;
  405. } else if (SettingModel.SPACE_DELIMITED.equals(text)) {
  406. setting.spaceDelimited = true;
  407. } else if (text.startsWith(SettingModel.SINCE)) {
  408. try {
  409. setting.since = text.split(" ")[1];
  410. } catch (Exception e) {
  411. setting.since = text;
  412. }
  413. } else {
  414. description.append(text);
  415. description.append('\n');
  416. }
  417. }
  418. } else {
  419. String[] kvp = line.split("=", 2);
  420. String key = kvp[0].trim();
  421. setting.name = key;
  422. setting.defaultValue = kvp[1].trim();
  423. setting.currentValue = setting.defaultValue;
  424. setting.description = description.toString().trim();
  425. settingsModel.add(setting);
  426. description.setLength(0);
  427. setting = new SettingModel();
  428. }
  429. }
  430. }
  431. propertiesReader.close();
  432. } catch (NullPointerException e) {
  433. logger.error("Failed to find resource copy of gitblit.properties");
  434. } catch (IOException e) {
  435. logger.error("Failed to load resource copy of gitblit.properties");
  436. }
  437. }
  438. @Override
  439. public ITicketService getTicketService() {
  440. return ticketServiceProvider.get();
  441. }
  442. @Override
  443. public IPublicKeyManager getPublicKeyManager() {
  444. return publicKeyManagerProvider.get();
  445. }
  446. /*
  447. * ISTOREDSETTINGS
  448. *
  449. * these methods are necessary for (nearly) seamless Groovy hook operation
  450. * after the massive refactor.
  451. */
  452. public boolean getBoolean(String key, boolean defaultValue) {
  453. return runtimeManager.getSettings().getBoolean(key, defaultValue);
  454. }
  455. public String getString(String key, String defaultValue) {
  456. return runtimeManager.getSettings().getString(key, defaultValue);
  457. }
  458. public int getInteger(String key, int defaultValue) {
  459. return runtimeManager.getSettings().getInteger(key, defaultValue);
  460. }
  461. public List<String> getStrings(String key) {
  462. return runtimeManager.getSettings().getStrings(key);
  463. }
  464. /*
  465. * RUNTIME MANAGER
  466. */
  467. @Override
  468. public File getBaseFolder() {
  469. return runtimeManager.getBaseFolder();
  470. }
  471. @Override
  472. public void setBaseFolder(File folder) {
  473. runtimeManager.setBaseFolder(folder);
  474. }
  475. @Override
  476. public Date getBootDate() {
  477. return runtimeManager.getBootDate();
  478. }
  479. @Override
  480. public ServerSettings getSettingsModel() {
  481. return runtimeManager.getSettingsModel();
  482. }
  483. @Override
  484. public TimeZone getTimezone() {
  485. return runtimeManager.getTimezone();
  486. }
  487. @Override
  488. public Locale getLocale() {
  489. return runtimeManager.getLocale();
  490. }
  491. @Override
  492. public boolean isDebugMode() {
  493. return runtimeManager.isDebugMode();
  494. }
  495. @Override
  496. public File getFileOrFolder(String key, String defaultFileOrFolder) {
  497. return runtimeManager.getFileOrFolder(key, defaultFileOrFolder);
  498. }
  499. @Override
  500. public File getFileOrFolder(String fileOrFolder) {
  501. return runtimeManager.getFileOrFolder(fileOrFolder);
  502. }
  503. @Override
  504. public IStoredSettings getSettings() {
  505. return runtimeManager.getSettings();
  506. }
  507. @Override
  508. public boolean updateSettings(Map<String, String> updatedSettings) {
  509. return runtimeManager.updateSettings(updatedSettings);
  510. }
  511. @Override
  512. public ServerStatus getStatus() {
  513. return runtimeManager.getStatus();
  514. }
  515. @Override
  516. public Injector getInjector() {
  517. return runtimeManager.getInjector();
  518. }
  519. /*
  520. * NOTIFICATION MANAGER
  521. */
  522. @Override
  523. public boolean isSendingMail() {
  524. return notificationManager.isSendingMail();
  525. }
  526. @Override
  527. public void sendMailToAdministrators(String subject, String message) {
  528. notificationManager.sendMailToAdministrators(subject, message);
  529. }
  530. @Override
  531. public void sendMail(String subject, String message, Collection<String> toAddresses) {
  532. notificationManager.sendMail(subject, message, toAddresses);
  533. }
  534. @Override
  535. public void sendHtmlMail(String subject, String message, Collection<String> toAddresses) {
  536. notificationManager.sendHtmlMail(subject, message, toAddresses);
  537. }
  538. @Override
  539. public void send(Mailing mail) {
  540. notificationManager.send(mail);
  541. }
  542. /*
  543. * SESSION MANAGER
  544. */
  545. @Override
  546. public UserModel authenticate(String username, char[] password) {
  547. return authenticationManager.authenticate(username, password);
  548. }
  549. @Override
  550. public UserModel authenticate(HttpServletRequest httpRequest) {
  551. UserModel user = authenticationManager.authenticate(httpRequest, false);
  552. if (user == null) {
  553. user = federationManager.authenticate(httpRequest);
  554. }
  555. return user;
  556. }
  557. @Override
  558. public UserModel authenticate(String username, SshKey key) {
  559. return authenticationManager.authenticate(username, key);
  560. }
  561. @Override
  562. public UserModel authenticate(HttpServletRequest httpRequest, boolean requiresCertificate) {
  563. UserModel user = authenticationManager.authenticate(httpRequest, requiresCertificate);
  564. if (user == null) {
  565. user = federationManager.authenticate(httpRequest);
  566. }
  567. return user;
  568. }
  569. @Override
  570. public String getCookie(HttpServletRequest request) {
  571. return authenticationManager.getCookie(request);
  572. }
  573. @Override
  574. public void setCookie(HttpServletResponse response, UserModel user) {
  575. authenticationManager.setCookie(response, user);
  576. }
  577. @Override
  578. public void logout(HttpServletResponse response, UserModel user) {
  579. authenticationManager.logout(response, user);
  580. }
  581. @Override
  582. public boolean supportsCredentialChanges(UserModel user) {
  583. return authenticationManager.supportsCredentialChanges(user);
  584. }
  585. @Override
  586. public boolean supportsDisplayNameChanges(UserModel user) {
  587. return authenticationManager.supportsDisplayNameChanges(user);
  588. }
  589. @Override
  590. public boolean supportsEmailAddressChanges(UserModel user) {
  591. return authenticationManager.supportsEmailAddressChanges(user);
  592. }
  593. @Override
  594. public boolean supportsTeamMembershipChanges(UserModel user) {
  595. return authenticationManager.supportsTeamMembershipChanges(user);
  596. }
  597. @Override
  598. public boolean supportsTeamMembershipChanges(TeamModel team) {
  599. return authenticationManager.supportsTeamMembershipChanges(team);
  600. }
  601. /*
  602. * USER MANAGER
  603. */
  604. @Override
  605. public void setup(IRuntimeManager runtimeManager) {
  606. }
  607. @Override
  608. public boolean isInternalAccount(String username) {
  609. return userManager.isInternalAccount(username);
  610. }
  611. @Override
  612. public List<String> getAllUsernames() {
  613. return userManager.getAllUsernames();
  614. }
  615. @Override
  616. public List<UserModel> getAllUsers() {
  617. return userManager.getAllUsers();
  618. }
  619. @Override
  620. public UserModel getUserModel(String username) {
  621. return userManager.getUserModel(username);
  622. }
  623. @Override
  624. public List<TeamModel> getAllTeams() {
  625. return userManager.getAllTeams();
  626. }
  627. @Override
  628. public TeamModel getTeamModel(String teamname) {
  629. return userManager.getTeamModel(teamname);
  630. }
  631. @Override
  632. public String getCookie(UserModel model) {
  633. return userManager.getCookie(model);
  634. }
  635. @Override
  636. public UserModel getUserModel(char[] cookie) {
  637. return userManager.getUserModel(cookie);
  638. }
  639. @Override
  640. public boolean updateUserModel(UserModel model) {
  641. return userManager.updateUserModel(model);
  642. }
  643. @Override
  644. public boolean updateUserModels(Collection<UserModel> models) {
  645. return userManager.updateUserModels(models);
  646. }
  647. @Override
  648. public boolean updateUserModel(String username, UserModel model) {
  649. return userManager.updateUserModel(username, model);
  650. }
  651. @Override
  652. public boolean deleteUser(String username) {
  653. // delegate to deleteUserModel() to delete public ssh keys
  654. UserModel user = userManager.getUserModel(username);
  655. return deleteUserModel(user);
  656. }
  657. /**
  658. * Delete the user and all associated public ssh keys.
  659. */
  660. @Override
  661. public boolean deleteUserModel(UserModel model) {
  662. boolean success = userManager.deleteUserModel(model);
  663. if (success) {
  664. getPublicKeyManager().removeAllKeys(model.username);
  665. }
  666. return success;
  667. }
  668. @Override
  669. public List<String> getAllTeamNames() {
  670. return userManager.getAllTeamNames();
  671. }
  672. @Override
  673. public List<String> getTeamNamesForRepositoryRole(String role) {
  674. return userManager.getTeamNamesForRepositoryRole(role);
  675. }
  676. @Override
  677. public boolean updateTeamModel(TeamModel model) {
  678. return userManager.updateTeamModel(model);
  679. }
  680. @Override
  681. public boolean updateTeamModels(Collection<TeamModel> models) {
  682. return userManager.updateTeamModels(models);
  683. }
  684. @Override
  685. public boolean updateTeamModel(String teamname, TeamModel model) {
  686. return userManager.updateTeamModel(teamname, model);
  687. }
  688. @Override
  689. public boolean deleteTeamModel(TeamModel model) {
  690. return userManager.deleteTeamModel(model);
  691. }
  692. @Override
  693. public List<String> getUsernamesForRepositoryRole(String role) {
  694. return userManager.getUsernamesForRepositoryRole(role);
  695. }
  696. @Override
  697. public boolean renameRepositoryRole(String oldRole, String newRole) {
  698. return userManager.renameRepositoryRole(oldRole, newRole);
  699. }
  700. @Override
  701. public boolean deleteRepositoryRole(String role) {
  702. return userManager.deleteRepositoryRole(role);
  703. }
  704. @Override
  705. public boolean deleteTeam(String teamname) {
  706. return userManager.deleteTeam(teamname);
  707. }
  708. /*
  709. * REPOSITORY MANAGER
  710. */
  711. @Override
  712. public Date getLastActivityDate() {
  713. return repositoryManager.getLastActivityDate();
  714. }
  715. @Override
  716. public File getRepositoriesFolder() {
  717. return repositoryManager.getRepositoriesFolder();
  718. }
  719. @Override
  720. public File getHooksFolder() {
  721. return repositoryManager.getHooksFolder();
  722. }
  723. @Override
  724. public File getGrapesFolder() {
  725. return repositoryManager.getGrapesFolder();
  726. }
  727. @Override
  728. public List<RegistrantAccessPermission> getUserAccessPermissions(UserModel user) {
  729. return repositoryManager.getUserAccessPermissions(user);
  730. }
  731. @Override
  732. public List<RegistrantAccessPermission> getUserAccessPermissions(RepositoryModel repository) {
  733. return repositoryManager.getUserAccessPermissions(repository);
  734. }
  735. @Override
  736. public boolean setUserAccessPermissions(RepositoryModel repository, Collection<RegistrantAccessPermission> permissions) {
  737. return repositoryManager.setUserAccessPermissions(repository, permissions);
  738. }
  739. @Override
  740. public List<String> getRepositoryUsers(RepositoryModel repository) {
  741. return repositoryManager.getRepositoryUsers(repository);
  742. }
  743. @Override
  744. public List<RegistrantAccessPermission> getTeamAccessPermissions(RepositoryModel repository) {
  745. return repositoryManager.getTeamAccessPermissions(repository);
  746. }
  747. @Override
  748. public boolean setTeamAccessPermissions(RepositoryModel repository, Collection<RegistrantAccessPermission> permissions) {
  749. return repositoryManager.setTeamAccessPermissions(repository, permissions);
  750. }
  751. @Override
  752. public List<String> getRepositoryTeams(RepositoryModel repository) {
  753. return repositoryManager.getRepositoryTeams(repository);
  754. }
  755. @Override
  756. public void addToCachedRepositoryList(RepositoryModel model) {
  757. repositoryManager.addToCachedRepositoryList(model);
  758. }
  759. @Override
  760. public void resetRepositoryListCache() {
  761. repositoryManager.resetRepositoryListCache();
  762. }
  763. @Override
  764. public void resetRepositoryCache(String repositoryName) {
  765. repositoryManager.resetRepositoryCache(repositoryName);
  766. }
  767. @Override
  768. public List<String> getRepositoryList() {
  769. return repositoryManager.getRepositoryList();
  770. }
  771. @Override
  772. public Repository getRepository(String repositoryName) {
  773. return repositoryManager.getRepository(repositoryName);
  774. }
  775. @Override
  776. public Repository getRepository(String repositoryName, boolean logError) {
  777. return repositoryManager.getRepository(repositoryName, logError);
  778. }
  779. @Override
  780. public List<RepositoryModel> getRepositoryModels(UserModel user) {
  781. return repositoryManager.getRepositoryModels(user);
  782. }
  783. @Override
  784. public RepositoryModel getRepositoryModel(UserModel user, String repositoryName) {
  785. return repositoryManager.getRepositoryModel(repositoryName);
  786. }
  787. @Override
  788. public RepositoryModel getRepositoryModel(String repositoryName) {
  789. return repositoryManager.getRepositoryModel(repositoryName);
  790. }
  791. @Override
  792. public long getStarCount(RepositoryModel repository) {
  793. return repositoryManager.getStarCount(repository);
  794. }
  795. @Override
  796. public boolean hasRepository(String repositoryName) {
  797. return repositoryManager.hasRepository(repositoryName);
  798. }
  799. @Override
  800. public boolean hasRepository(String repositoryName, boolean caseSensitiveCheck) {
  801. return repositoryManager.hasRepository(repositoryName, caseSensitiveCheck);
  802. }
  803. @Override
  804. public boolean hasFork(String username, String origin) {
  805. return repositoryManager.hasFork(username, origin);
  806. }
  807. @Override
  808. public String getFork(String username, String origin) {
  809. return repositoryManager.getFork(username, origin);
  810. }
  811. @Override
  812. public ForkModel getForkNetwork(String repository) {
  813. return repositoryManager.getForkNetwork(repository);
  814. }
  815. @Override
  816. public long updateLastChangeFields(Repository r, RepositoryModel model) {
  817. return repositoryManager.updateLastChangeFields(r, model);
  818. }
  819. @Override
  820. public List<Metric> getRepositoryDefaultMetrics(RepositoryModel model, Repository repository) {
  821. return repositoryManager.getRepositoryDefaultMetrics(model, repository);
  822. }
  823. /**
  824. * Detect renames and reindex as appropriate.
  825. */
  826. @Override
  827. public void updateRepositoryModel(String repositoryName, RepositoryModel repository,
  828. boolean isCreate) throws GitBlitException {
  829. RepositoryModel oldModel = null;
  830. boolean isRename = !isCreate && !repositoryName.equalsIgnoreCase(repository.name);
  831. if (isRename) {
  832. oldModel = repositoryManager.getRepositoryModel(repositoryName);
  833. }
  834. repositoryManager.updateRepositoryModel(repositoryName, repository, isCreate);
  835. if (isRename && ticketServiceProvider.get() != null) {
  836. ticketServiceProvider.get().rename(oldModel, repository);
  837. }
  838. }
  839. @Override
  840. public void updateConfiguration(Repository r, RepositoryModel repository) {
  841. repositoryManager.updateConfiguration(r, repository);
  842. }
  843. @Override
  844. public boolean canDelete(RepositoryModel model) {
  845. return repositoryManager.canDelete(model);
  846. }
  847. /**
  848. * Delete the repository and all associated tickets.
  849. */
  850. @Override
  851. public boolean deleteRepositoryModel(RepositoryModel model) {
  852. boolean success = repositoryManager.deleteRepositoryModel(model);
  853. if (success && ticketServiceProvider.get() != null) {
  854. ticketServiceProvider.get().deleteAll(model);
  855. }
  856. return success;
  857. }
  858. @Override
  859. public boolean deleteRepository(String repositoryName) {
  860. // delegate to deleteRepositoryModel() to destroy indexed tickets
  861. RepositoryModel repository = repositoryManager.getRepositoryModel(repositoryName);
  862. return deleteRepositoryModel(repository);
  863. }
  864. @Override
  865. public List<String> getAllScripts() {
  866. return repositoryManager.getAllScripts();
  867. }
  868. @Override
  869. public List<String> getPreReceiveScriptsInherited(RepositoryModel repository) {
  870. return repositoryManager.getPreReceiveScriptsInherited(repository);
  871. }
  872. @Override
  873. public List<String> getPreReceiveScriptsUnused(RepositoryModel repository) {
  874. return repositoryManager.getPreReceiveScriptsUnused(repository);
  875. }
  876. @Override
  877. public List<String> getPostReceiveScriptsInherited(RepositoryModel repository) {
  878. return repositoryManager.getPostReceiveScriptsInherited(repository);
  879. }
  880. @Override
  881. public List<String> getPostReceiveScriptsUnused(RepositoryModel repository) {
  882. return repositoryManager.getPostReceiveScriptsUnused(repository);
  883. }
  884. @Override
  885. public List<SearchResult> search(String query, int page, int pageSize, List<String> repositories) {
  886. return repositoryManager.search(query, page, pageSize, repositories);
  887. }
  888. @Override
  889. public boolean isCollectingGarbage() {
  890. return repositoryManager.isCollectingGarbage();
  891. }
  892. @Override
  893. public boolean isCollectingGarbage(String repositoryName) {
  894. return repositoryManager.isCollectingGarbage(repositoryName);
  895. }
  896. /*
  897. * PROJECT MANAGER
  898. */
  899. @Override
  900. public List<ProjectModel> getProjectModels(UserModel user, boolean includeUsers) {
  901. return projectManager.getProjectModels(user, includeUsers);
  902. }
  903. @Override
  904. public ProjectModel getProjectModel(String name, UserModel user) {
  905. return projectManager.getProjectModel(name, user);
  906. }
  907. @Override
  908. public ProjectModel getProjectModel(String name) {
  909. return projectManager.getProjectModel(name);
  910. }
  911. @Override
  912. public List<ProjectModel> getProjectModels(List<RepositoryModel> repositoryModels, boolean includeUsers) {
  913. return projectManager.getProjectModels(repositoryModels, includeUsers);
  914. }
  915. /*
  916. * FEDERATION MANAGER
  917. */
  918. @Override
  919. public File getProposalsFolder() {
  920. return federationManager.getProposalsFolder();
  921. }
  922. @Override
  923. public boolean canFederate() {
  924. return federationManager.canFederate();
  925. }
  926. @Override
  927. public UserModel getFederationUser() {
  928. return federationManager.getFederationUser();
  929. }
  930. @Override
  931. public List<FederationModel> getFederationRegistrations() {
  932. return federationManager.getFederationRegistrations();
  933. }
  934. @Override
  935. public FederationModel getFederationRegistration(String url, String name) {
  936. return federationManager.getFederationRegistration(url, name);
  937. }
  938. @Override
  939. public List<FederationSet> getFederationSets(String gitblitUrl) {
  940. return federationManager.getFederationSets(gitblitUrl);
  941. }
  942. @Override
  943. public List<String> getFederationTokens() {
  944. return federationManager.getFederationTokens();
  945. }
  946. @Override
  947. public String getFederationToken(FederationToken type) {
  948. return federationManager.getFederationToken(type);
  949. }
  950. @Override
  951. public String getFederationToken(String value) {
  952. return federationManager.getFederationToken(value);
  953. }
  954. @Override
  955. public boolean validateFederationRequest(FederationRequest req, String token) {
  956. return federationManager.validateFederationRequest(req, token);
  957. }
  958. @Override
  959. public boolean acknowledgeFederationStatus(String identification, FederationModel registration) {
  960. return federationManager.acknowledgeFederationStatus(identification, registration);
  961. }
  962. @Override
  963. public List<FederationModel> getFederationResultRegistrations() {
  964. return federationManager.getFederationResultRegistrations();
  965. }
  966. @Override
  967. public boolean submitFederationProposal(FederationProposal proposal, String gitblitUrl) {
  968. return federationManager.submitFederationProposal(proposal, gitblitUrl);
  969. }
  970. @Override
  971. public List<FederationProposal> getPendingFederationProposals() {
  972. return federationManager.getPendingFederationProposals();
  973. }
  974. @Override
  975. public Map<String, RepositoryModel> getRepositories(String gitblitUrl, String token) {
  976. return federationManager.getRepositories(gitblitUrl, token);
  977. }
  978. @Override
  979. public FederationProposal createFederationProposal(String gitblitUrl, String token) {
  980. return federationManager.createFederationProposal(gitblitUrl, token);
  981. }
  982. @Override
  983. public FederationProposal getPendingFederationProposal(String token) {
  984. return federationManager.getPendingFederationProposal(token);
  985. }
  986. @Override
  987. public boolean deletePendingFederationProposal(FederationProposal proposal) {
  988. return federationManager.deletePendingFederationProposal(proposal);
  989. }
  990. @Override
  991. public void closeAll() {
  992. repositoryManager.closeAll();
  993. }
  994. @Override
  995. public void close(String repository) {
  996. repositoryManager.close(repository);
  997. }
  998. @Override
  999. public boolean isIdle(Repository repository) {
  1000. return repositoryManager.isIdle(repository);
  1001. }
  1002. /*
  1003. * PLUGIN MANAGER
  1004. */
  1005. @Override
  1006. public Version getSystemVersion() {
  1007. return pluginManager.getSystemVersion();
  1008. }
  1009. @Override
  1010. public void startPlugins() {
  1011. pluginManager.startPlugins();
  1012. }
  1013. @Override
  1014. public void stopPlugins() {
  1015. pluginManager.stopPlugins();
  1016. }
  1017. @Override
  1018. public List<PluginWrapper> getPlugins() {
  1019. return pluginManager.getPlugins();
  1020. }
  1021. @Override
  1022. public PluginWrapper getPlugin(String pluginId) {
  1023. return pluginManager.getPlugin(pluginId);
  1024. }
  1025. @Override
  1026. public List<Class<?>> getExtensionClasses(String pluginId) {
  1027. return pluginManager.getExtensionClasses(pluginId);
  1028. }
  1029. @Override
  1030. public <T> List<T> getExtensions(Class<T> clazz) {
  1031. return pluginManager.getExtensions(clazz);
  1032. }
  1033. @Override
  1034. public PluginWrapper whichPlugin(Class<?> clazz) {
  1035. return pluginManager.whichPlugin(clazz);
  1036. }
  1037. @Override
  1038. public PluginState startPlugin(String pluginId) {
  1039. return pluginManager.startPlugin(pluginId);
  1040. }
  1041. @Override
  1042. public PluginState stopPlugin(String pluginId) {
  1043. return pluginManager.stopPlugin(pluginId);
  1044. }
  1045. @Override
  1046. public boolean disablePlugin(String pluginId) {
  1047. return pluginManager.disablePlugin(pluginId);
  1048. }
  1049. @Override
  1050. public boolean enablePlugin(String pluginId) {
  1051. return pluginManager.enablePlugin(pluginId);
  1052. }
  1053. @Override
  1054. public boolean uninstallPlugin(String pluginId) {
  1055. return pluginManager.uninstallPlugin(pluginId);
  1056. }
  1057. @Override
  1058. public boolean refreshRegistry(boolean verifyChecksum) {
  1059. return pluginManager.refreshRegistry(verifyChecksum);
  1060. }
  1061. @Override
  1062. public boolean installPlugin(String url, boolean verifyChecksum) throws IOException {
  1063. return pluginManager.installPlugin(url, verifyChecksum);
  1064. }
  1065. @Override
  1066. public boolean upgradePlugin(String pluginId, String url, boolean verifyChecksum) throws IOException {
  1067. return pluginManager.upgradePlugin(pluginId, url, verifyChecksum);
  1068. }
  1069. @Override
  1070. public List<PluginRegistration> getRegisteredPlugins() {
  1071. return pluginManager.getRegisteredPlugins();
  1072. }
  1073. @Override
  1074. public List<PluginRegistration> getRegisteredPlugins(InstallState state) {
  1075. return pluginManager.getRegisteredPlugins(state);
  1076. }
  1077. @Override
  1078. public PluginRegistration lookupPlugin(String pluginId) {
  1079. return pluginManager.lookupPlugin(pluginId);
  1080. }
  1081. @Override
  1082. public PluginRelease lookupRelease(String pluginId, String version) {
  1083. return pluginManager.lookupRelease(pluginId, version);
  1084. }
  1085. }