Paul Martin
2016-04-16 eecaad8b8e2c447429c31a01d49260ddd6b4ee03
src/main/java/com/gitblit/manager/GitblitManager.java
@@ -21,6 +21,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.lang.reflect.Type;
import java.text.MessageFormat;
import java.util.ArrayList;
@@ -51,11 +52,14 @@
import com.gitblit.Constants.AccessPermission;
import com.gitblit.Constants.FederationRequest;
import com.gitblit.Constants.FederationToken;
import com.gitblit.Constants.Role;
import com.gitblit.GitBlitException;
import com.gitblit.IStoredSettings;
import com.gitblit.extensions.RepositoryLifeCycleListener;
import com.gitblit.models.FederationModel;
import com.gitblit.models.FederationProposal;
import com.gitblit.models.FederationSet;
import com.gitblit.models.FilestoreModel;
import com.gitblit.models.ForkModel;
import com.gitblit.models.GitClientApplication;
import com.gitblit.models.Mailing;
@@ -79,12 +83,14 @@
import com.gitblit.utils.JsonUtils;
import com.gitblit.utils.ObjectCache;
import com.gitblit.utils.StringUtils;
import com.gitblit.utils.XssFilter;
import com.google.gson.Gson;
import com.google.gson.JsonIOException;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Provider;
import com.google.inject.Singleton;
/**
@@ -106,6 +112,10 @@
   protected final ObjectCache<Collection<GitClientApplication>> clientApplications = new ObjectCache<Collection<GitClientApplication>>();
   protected final Provider<IPublicKeyManager> publicKeyManagerProvider;
   protected final Provider<ITicketService> ticketServiceProvider;
   protected final IStoredSettings settings;
   protected final IRuntimeManager runtimeManager;
@@ -118,25 +128,30 @@
   protected final IAuthenticationManager authenticationManager;
   protected final IPublicKeyManager publicKeyManager;
   protected final IRepositoryManager repositoryManager;
   protected final IProjectManager projectManager;
   protected final IFederationManager federationManager;
   protected final IFilestoreManager filestoreManager;
   @Inject
   public GitblitManager(
         Provider<IPublicKeyManager> publicKeyManagerProvider,
         Provider<ITicketService> ticketServiceProvider,
         IRuntimeManager runtimeManager,
         IPluginManager pluginManager,
         INotificationManager notificationManager,
         IUserManager userManager,
         IAuthenticationManager authenticationManager,
         IPublicKeyManager publicKeyManager,
         IRepositoryManager repositoryManager,
         IProjectManager projectManager,
         IFederationManager federationManager) {
         IFederationManager federationManager,
         IFilestoreManager filestoreManager) {
      this.publicKeyManagerProvider = publicKeyManagerProvider;
      this.ticketServiceProvider = ticketServiceProvider;
      this.settings = runtimeManager.getSettings();
      this.runtimeManager = runtimeManager;
@@ -144,10 +159,10 @@
      this.notificationManager = notificationManager;
      this.userManager = userManager;
      this.authenticationManager = authenticationManager;
      this.publicKeyManager = publicKeyManager;
      this.repositoryManager = repositoryManager;
      this.projectManager = projectManager;
      this.federationManager = federationManager;
      this.filestoreManager = filestoreManager;
   }
   @Override
@@ -217,6 +232,13 @@
      RepositoryModel cloneModel = repository.cloneAs(cloneName);
      // owner has REWIND/RW+ permissions
      cloneModel.addOwner(user.username);
      // ensure initial access restriction of the fork
      // is not lower than the source repository  (issue-495/ticket-167)
      if (repository.accessRestriction.exceeds(cloneModel.accessRestriction)) {
         cloneModel.accessRestriction = repository.accessRestriction;
      }
      repositoryManager.updateRepositoryModel(cloneName, cloneModel, false);
      // add the owner of the source repository to the clone's access list
@@ -261,6 +283,16 @@
      // add this clone to the cached model
      repositoryManager.addToCachedRepositoryList(cloneModel);
      if (pluginManager != null) {
         for (RepositoryLifeCycleListener listener : pluginManager.getExtensions(RepositoryLifeCycleListener.class)) {
            try {
               listener.onFork(repository, cloneModel);
            } catch (Throwable t) {
               logger.error(String.format("failed to call plugin onFork %s", repository.name), t);
            }
         }
      }
      return cloneModel;
   }
@@ -425,7 +457,7 @@
         // Read bundled Gitblit properties to extract setting descriptions.
         // This copy is pristine and only used for populating the setting
         // models map.
         InputStream is = GitblitManager.class.getResourceAsStream("/reference.properties");
         InputStream is = GitblitManager.class.getResourceAsStream("/defaults.properties");
         BufferedReader propertiesReader = new BufferedReader(new InputStreamReader(is));
         StringBuilder description = new StringBuilder();
         SettingModel setting = new SettingModel();
@@ -470,24 +502,20 @@
         }
         propertiesReader.close();
      } catch (NullPointerException e) {
         logger.error("Failed to find resource copy of gitblit.properties");
         logger.error("Failed to find classpath resource 'defaults.properties'");
      } catch (IOException e) {
         logger.error("Failed to load resource copy of gitblit.properties");
         logger.error("Failed to load classpath resource 'defaults.properties'");
      }
   }
   /**
    * Throws an exception if trying to get a ticket service.
    *
    */
   @Override
   public ITicketService getTicketService() {
      throw new RuntimeException("This class does not have a ticket service!");
      return ticketServiceProvider.get();
   }
   @Override
   public IPublicKeyManager getPublicKeyManager() {
      return publicKeyManager;
      return publicKeyManagerProvider.get();
   }
   /*
@@ -582,6 +610,11 @@
      return runtimeManager.getInjector();
   }
   @Override
   public XssFilter getXssFilter() {
      return runtimeManager.getXssFilter();
   }
   /*
    * NOTIFICATION MANAGER
    */
@@ -616,8 +649,8 @@
    */
   @Override
   public UserModel authenticate(String username, char[] password) {
      return authenticationManager.authenticate(username, password);
   public UserModel authenticate(String username, char[] password, String remoteIP) {
      return authenticationManager.authenticate(username, password, remoteIP);
   }
   @Override
@@ -635,6 +668,11 @@
   }
   @Override
   public UserModel authenticate(String username) {
      return authenticationManager.authenticate(username);
   }
   @Override
   public UserModel authenticate(HttpServletRequest httpRequest, boolean requiresCertificate) {
      UserModel user = authenticationManager.authenticate(httpRequest, requiresCertificate);
      if (user == null) {
@@ -649,13 +687,25 @@
   }
   @Override
   @Deprecated
   public void setCookie(HttpServletResponse response, UserModel user) {
      authenticationManager.setCookie(response, user);
   }
   @Override
   public void setCookie(HttpServletRequest request, HttpServletResponse response, UserModel user) {
      authenticationManager.setCookie(request, response, user);
   }
   @Override
   @Deprecated
   public void logout(HttpServletResponse response, UserModel user) {
      authenticationManager.logout(response, user);
   }
   @Override
   public void logout(HttpServletRequest request, HttpServletResponse response, UserModel user) {
      authenticationManager.logout(request, response, user);
   }
   @Override
@@ -683,6 +733,16 @@
      return authenticationManager.supportsTeamMembershipChanges(team);
   }
   @Override
   public boolean supportsRoleChanges(UserModel user, Role role) {
      return authenticationManager.supportsRoleChanges(user, role);
   }
   @Override
   public boolean supportsRoleChanges(TeamModel team, Role role) {
      return authenticationManager.supportsRoleChanges(team, role);
   }
   /*
    * USER MANAGER
    */
@@ -704,11 +764,6 @@
   @Override
   public List<UserModel> getAllUsers() {
      return userManager.getAllUsers();
   }
   @Override
   public boolean deleteUser(String username) {
      return userManager.deleteUser(username);
   }
   @Override
@@ -752,8 +807,22 @@
   }
   @Override
   public boolean deleteUser(String username) {
      // delegate to deleteUserModel() to delete public ssh keys
      UserModel user = userManager.getUserModel(username);
      return deleteUserModel(user);
   }
   /**
    * Delete the user and all associated public ssh keys.
    */
   @Override
   public boolean deleteUserModel(UserModel model) {
      return userManager.deleteUserModel(model);
      boolean success = userManager.deleteUserModel(model);
      if (success) {
         getPublicKeyManager().removeAllKeys(model.username);
      }
      return success;
   }
   @Override
@@ -895,6 +964,11 @@
   }
   @Override
   public List<RepositoryModel> getRepositoryModels() {
      return repositoryManager.getRepositoryModels();
   }
   @Override
   public List<RepositoryModel> getRepositoryModels(UserModel user) {
      return repositoryManager.getRepositoryModels(user);
   }
@@ -949,10 +1023,23 @@
      return repositoryManager.getRepositoryDefaultMetrics(model, repository);
   }
   /**
    * Detect renames and reindex as appropriate.
    */
   @Override
   public void updateRepositoryModel(String repositoryName, RepositoryModel repository,
         boolean isCreate) throws GitBlitException {
      RepositoryModel oldModel = null;
      boolean isRename = !isCreate && !repositoryName.equalsIgnoreCase(repository.name);
      if (isRename) {
         oldModel = repositoryManager.getRepositoryModel(repositoryName);
      }
      repositoryManager.updateRepositoryModel(repositoryName, repository, isCreate);
      if (isRename && ticketServiceProvider.get() != null) {
         ticketServiceProvider.get().rename(oldModel, repository);
      }
   }
   @Override
@@ -965,14 +1052,23 @@
      return repositoryManager.canDelete(model);
   }
   /**
    * Delete the repository and all associated tickets.
    */
   @Override
   public boolean deleteRepositoryModel(RepositoryModel model) {
      return repositoryManager.deleteRepositoryModel(model);
      boolean success = repositoryManager.deleteRepositoryModel(model);
      if (success && ticketServiceProvider.get() != null) {
         ticketServiceProvider.get().deleteAll(model);
      }
      return success;
   }
   @Override
   public boolean deleteRepository(String repositoryName) {
      return repositoryManager.deleteRepository(repositoryName);
      // delegate to deleteRepositoryModel() to destroy indexed tickets
      RepositoryModel repository = repositoryManager.getRepositoryModel(repositoryName);
      return deleteRepositoryModel(repository);
   }
   @Override
@@ -1149,6 +1245,70 @@
   }
   /*
    * FILE STORAGE MANAGER
    */
   @Override
   public boolean isValidOid(String oid) {
      return filestoreManager.isValidOid(oid);
   }
   @Override
   public FilestoreModel.Status addObject(String oid, long size, UserModel user, RepositoryModel repo) {
      return filestoreManager.addObject(oid, size, user, repo);
   }
   @Override
   public FilestoreModel getObject(String oid, UserModel user, RepositoryModel repo) {
      return filestoreManager.getObject(oid, user, repo);
   };
   @Override
   public FilestoreModel.Status uploadBlob(String oid, long size, UserModel user, RepositoryModel repo, InputStream streamIn ) {
      return filestoreManager.uploadBlob(oid, size, user, repo, streamIn);
   }
   @Override
   public FilestoreModel.Status downloadBlob(String oid, UserModel user, RepositoryModel repo, OutputStream streamOut ) {
      return filestoreManager.downloadBlob(oid, user, repo, streamOut);
   }
   @Override
   public List<FilestoreModel> getAllObjects(List<RepositoryModel> viewableRepositories) {
      return filestoreManager.getAllObjects(viewableRepositories);
   }
   @Override
   public File getStorageFolder() {
      return filestoreManager.getStorageFolder();
   }
   @Override
   public File getStoragePath(String oid) {
      return filestoreManager.getStoragePath(oid);
   }
   @Override
   public long getMaxUploadSize() {
      return filestoreManager.getMaxUploadSize();
   };
   @Override
   public void clearFilestoreCache() {
      filestoreManager.clearFilestoreCache();
   };
   @Override
   public long getFilestoreUsedByteCount() {
      return filestoreManager.getFilestoreUsedByteCount();
   };
   @Override
   public long getFilestoreAvailableByteCount() {
      return filestoreManager.getFilestoreAvailableByteCount();
   };
   /*
    * PLUGIN MANAGER
    */
@@ -1251,4 +1411,5 @@
   public PluginRelease lookupRelease(String pluginId, String version) {
      return pluginManager.lookupRelease(pluginId, version);
   }
}