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 38KB

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