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

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