選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

GitblitManager.java 38KB

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