看板初始化提交

This commit is contained in:
zephyr
2026-06-01 21:23:12 -07:00
commit 54a842f4ab
2104 changed files with 241695 additions and 0 deletions
+128
View File
@@ -0,0 +1,128 @@
<?php
namespace Kanboard\ServiceProvider;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Kanboard\Action\TaskAssignCategorySwimlaneChange;
use Kanboard\Action\TaskAssignColorOnDueDate;
use Kanboard\Action\TaskAssignColorOnStartDate;
use Kanboard\Action\TaskAssignColorPriority;
use Kanboard\Action\TaskAssignDueDateOnCreation;
use Kanboard\Action\TaskMoveColumnClosed;
use Kanboard\Action\TaskMoveColumnNotMovedPeriod;
use Kanboard\Action\TaskMoveColumnOnDueDate;
use Kanboard\Core\Action\ActionManager;
use Kanboard\Action\CommentCreation;
use Kanboard\Action\CommentCreationMoveTaskColumn;
use Kanboard\Action\TaskAssignCategoryColor;
use Kanboard\Action\TaskAssignCategoryLabel;
use Kanboard\Action\TaskAssignCategoryLink;
use Kanboard\Action\TaskAssignColorCategory;
use Kanboard\Action\TaskAssignColorColumn;
use Kanboard\Action\TaskAssignColorLink;
use Kanboard\Action\TaskAssignColorUser;
use Kanboard\Action\TaskAssignCreator;
use Kanboard\Action\TaskAssignCurrentUser;
use Kanboard\Action\TaskAssignCurrentUserColumn;
use Kanboard\Action\TaskAssignSpecificUser;
use Kanboard\Action\TaskAssignUser;
use Kanboard\Action\TaskAssignUserSwimlaneChange;
use Kanboard\Action\TaskClose;
use Kanboard\Action\TaskCloseColumn;
use Kanboard\Action\TaskCreation;
use Kanboard\Action\TaskDuplicateAnotherProject;
use Kanboard\Action\TaskEmail;
use Kanboard\Action\TaskEmailNoActivity;
use Kanboard\Action\TaskMoveAnotherProject;
use Kanboard\Action\TaskMoveColumnAssigned;
use Kanboard\Action\TaskMoveSwimlaneAssigned;
use Kanboard\Action\TaskMoveColumnCategoryChange;
use Kanboard\Action\TaskMoveColumnUnAssigned;
use Kanboard\Action\TaskMoveSwimlaneCategoryChange;
use Kanboard\Action\TaskOpen;
use Kanboard\Action\TaskUpdateStartDate;
use Kanboard\Action\TaskUpdateStartDateOnMoveColumn;
use Kanboard\Action\TaskCloseNoActivity;
use Kanboard\Action\TaskCloseNoActivityColumn;
use Kanboard\Action\TaskCloseNotMovedColumn;
use Kanboard\Action\TaskAssignColorSwimlane;
use Kanboard\Action\TaskAssignPrioritySwimlane;
use Kanboard\Action\SubtaskTimerMoveTaskColumn;
use Kanboard\Action\StopSubtaskTimerMoveTaskColumn;
use Kanboard\Action\TaskMoveColumnOnStartDate;
use Kanboard\Action\TaskAssignDueDateOnMoveColumn;
use Kanboard\Action\TaskAssignToUserOnCreationInColumn;
use Kanboard\Action\TaskAssignCurrentUserColumnIfNoUserAlreadySet;
/**
* Action Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class ActionProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['actionManager'] = new ActionManager($container);
$container['actionManager']->register(new CommentCreation($container));
$container['actionManager']->register(new CommentCreationMoveTaskColumn($container));
$container['actionManager']->register(new TaskAssignCategorySwimlaneChange($container));
$container['actionManager']->register(new TaskAssignCategoryColor($container));
$container['actionManager']->register(new TaskAssignCategoryLabel($container));
$container['actionManager']->register(new TaskAssignCategoryLink($container));
$container['actionManager']->register(new TaskAssignColorCategory($container));
$container['actionManager']->register(new TaskAssignColorColumn($container));
$container['actionManager']->register(new TaskAssignColorLink($container));
$container['actionManager']->register(new TaskAssignColorUser($container));
$container['actionManager']->register(new TaskAssignColorPriority($container));
$container['actionManager']->register(new TaskAssignCreator($container));
$container['actionManager']->register(new TaskAssignCurrentUser($container));
$container['actionManager']->register(new TaskAssignCurrentUserColumn($container));
$container['actionManager']->register(new TaskAssignSpecificUser($container));
$container['actionManager']->register(new TaskAssignUser($container));
$container['actionManager']->register(new TaskAssignUserSwimlaneChange($container));
$container['actionManager']->register(new TaskClose($container));
$container['actionManager']->register(new TaskCloseColumn($container));
$container['actionManager']->register(new TaskCloseNoActivity($container));
$container['actionManager']->register(new TaskCloseNoActivityColumn($container));
$container['actionManager']->register(new TaskCloseNotMovedColumn($container));
$container['actionManager']->register(new TaskCreation($container));
$container['actionManager']->register(new TaskDuplicateAnotherProject($container));
$container['actionManager']->register(new TaskEmail($container));
$container['actionManager']->register(new TaskEmailNoActivity($container));
$container['actionManager']->register(new TaskMoveAnotherProject($container));
$container['actionManager']->register(new TaskMoveColumnAssigned($container));
$container['actionManager']->register(new TaskMoveSwimlaneAssigned($container));
$container['actionManager']->register(new TaskMoveColumnCategoryChange($container));
$container['actionManager']->register(new TaskMoveColumnClosed($container));
$container['actionManager']->register(new TaskMoveColumnNotMovedPeriod($container));
$container['actionManager']->register(new TaskMoveColumnOnDueDate($container));
$container['actionManager']->register(new TaskMoveColumnUnAssigned($container));
$container['actionManager']->register(new TaskMoveSwimlaneCategoryChange($container));
$container['actionManager']->register(new TaskOpen($container));
$container['actionManager']->register(new TaskUpdateStartDate($container));
$container['actionManager']->register(new TaskUpdateStartDateOnMoveColumn($container));
$container['actionManager']->register(new TaskAssignDueDateOnCreation($container));
$container['actionManager']->register(new TaskAssignColorSwimlane($container));
$container['actionManager']->register(new TaskAssignPrioritySwimlane($container));
$container['actionManager']->register(new TaskAssignColorOnDueDate($container));
$container['actionManager']->register(new SubtaskTimerMoveTaskColumn($container));
$container['actionManager']->register(new StopSubtaskTimerMoveTaskColumn($container));
$container['actionManager']->register(new TaskMoveColumnOnStartDate($container));
$container['actionManager']->register(new TaskAssignColorOnStartDate($container));
$container['actionManager']->register(new TaskAssignDueDateOnMoveColumn($container));
$container['actionManager']->register(new TaskAssignToUserOnCreationInColumn($container));
$container['actionManager']->register(new TaskAssignCurrentUserColumnIfNoUserAlreadySet($container));
return $container;
}
}
+89
View File
@@ -0,0 +1,89 @@
<?php
namespace Kanboard\ServiceProvider;
use JsonRPC\Server;
use Kanboard\Api\Procedure\ActionProcedure;
use Kanboard\Api\Procedure\AppProcedure;
use Kanboard\Api\Procedure\BoardProcedure;
use Kanboard\Api\Procedure\CategoryProcedure;
use Kanboard\Api\Procedure\ColumnProcedure;
use Kanboard\Api\Procedure\CommentProcedure;
use Kanboard\Api\Procedure\ProjectFileProcedure;
use Kanboard\Api\Procedure\ProjectMetadataProcedure;
use Kanboard\Api\Procedure\TagProcedure;
use Kanboard\Api\Procedure\TaskExternalLinkProcedure;
use Kanboard\Api\Procedure\TaskFileProcedure;
use Kanboard\Api\Procedure\GroupProcedure;
use Kanboard\Api\Procedure\GroupMemberProcedure;
use Kanboard\Api\Procedure\LinkProcedure;
use Kanboard\Api\Procedure\MeProcedure;
use Kanboard\Api\Middleware\AuthenticationMiddleware;
use Kanboard\Api\Procedure\ProjectProcedure;
use Kanboard\Api\Procedure\ProjectPermissionProcedure;
use Kanboard\Api\Procedure\SubtaskProcedure;
use Kanboard\Api\Procedure\SubtaskTimeTrackingProcedure;
use Kanboard\Api\Procedure\SwimlaneProcedure;
use Kanboard\Api\Procedure\TaskMetadataProcedure;
use Kanboard\Api\Procedure\TaskProcedure;
use Kanboard\Api\Procedure\TaskLinkProcedure;
use Kanboard\Api\Procedure\TaskTagProcedure;
use Kanboard\Api\Procedure\UserProcedure;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class ApiProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class ApiProvider implements ServiceProviderInterface
{
/**
* Registers services on the given container.
*
* @param Container $container
* @return Container
*/
public function register(Container $container)
{
$server = new Server();
$server->setAuthenticationHeader(API_AUTHENTICATION_HEADER);
$server->getMiddlewareHandler()
->withMiddleware(new AuthenticationMiddleware($container))
;
$server->getProcedureHandler()
->withObject(new MeProcedure($container))
->withObject(new ActionProcedure($container))
->withObject(new AppProcedure($container))
->withObject(new BoardProcedure($container))
->withObject(new ColumnProcedure($container))
->withObject(new CategoryProcedure($container))
->withObject(new CommentProcedure($container))
->withObject(new TaskFileProcedure($container))
->withObject(new ProjectFileProcedure($container))
->withObject(new LinkProcedure($container))
->withObject(new ProjectProcedure($container))
->withObject(new ProjectPermissionProcedure($container))
->withObject(new ProjectMetadataProcedure($container))
->withObject(new SubtaskProcedure($container))
->withObject(new SubtaskTimeTrackingProcedure($container))
->withObject(new SwimlaneProcedure($container))
->withObject(new TaskProcedure($container))
->withObject(new TaskLinkProcedure($container))
->withObject(new TaskExternalLinkProcedure($container))
->withObject(new TaskMetadataProcedure($container))
->withObject(new TaskTagProcedure($container))
->withObject(new UserProcedure($container))
->withObject(new GroupProcedure($container))
->withObject(new GroupMemberProcedure($container))
->withObject(new TagProcedure($container))
->withBeforeMethod('beforeProcedure')
;
$container['api'] = $server;
return $container;
}
}
@@ -0,0 +1,239 @@
<?php
namespace Kanboard\ServiceProvider;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Kanboard\Core\Security\AuthenticationManager;
use Kanboard\Core\Security\AccessMap;
use Kanboard\Core\Security\Authorization;
use Kanboard\Core\Security\Role;
use Kanboard\Auth\ApiAccessTokenAuth;
use Kanboard\Auth\RememberMeAuth;
use Kanboard\Auth\DatabaseAuth;
use Kanboard\Auth\LdapAuth;
use Kanboard\Auth\TotpAuth;
use Kanboard\Auth\ReverseProxyAuth;
/**
* Authentication Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class AuthenticationProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['authenticationManager'] = new AuthenticationManager($container);
$container['authenticationManager']->register(new TotpAuth($container));
if (REMEMBER_ME_AUTH) {
$container['authenticationManager']->register(new RememberMeAuth($container));
}
$container['authenticationManager']->register(new DatabaseAuth($container));
if (REVERSE_PROXY_AUTH && ! empty(TRUSTED_PROXY_NETWORKS)) {
$container['authenticationManager']->register(new ReverseProxyAuth($container));
}
$container['authenticationManager']->register(new ApiAccessTokenAuth($container));
if (LDAP_AUTH) {
$container['authenticationManager']->register(new LdapAuth($container));
}
$container['projectAccessMap'] = $this->getProjectAccessMap();
$container['applicationAccessMap'] = $this->getApplicationAccessMap();
$container['apiAccessMap'] = $this->getApiAccessMap();
$container['apiProjectAccessMap'] = $this->getApiProjectAccessMap();
$container['projectAuthorization'] = new Authorization($container['projectAccessMap']);
$container['applicationAuthorization'] = new Authorization($container['applicationAccessMap']);
$container['apiAuthorization'] = new Authorization($container['apiAccessMap']);
$container['apiProjectAuthorization'] = new Authorization($container['apiProjectAccessMap']);
return $container;
}
/**
* Get ACL for projects
*
* @access public
* @return AccessMap
*/
public function getProjectAccessMap()
{
$acl = new AccessMap;
$acl->setDefaultRole(Role::PROJECT_VIEWER);
$acl->setRoleHierarchy(Role::PROJECT_MANAGER, array(Role::PROJECT_MEMBER, Role::PROJECT_VIEWER));
$acl->setRoleHierarchy(Role::PROJECT_MEMBER, array(Role::PROJECT_VIEWER));
$acl->add('ActionController', '*', Role::PROJECT_MANAGER);
$acl->add('ProjectActionDuplicationController', '*', Role::PROJECT_MANAGER);
$acl->add('ActionCreationController', '*', Role::PROJECT_MANAGER);
$acl->add('AnalyticController', '*', Role::PROJECT_MANAGER);
$acl->add('BoardAjaxController', 'save', Role::PROJECT_MEMBER);
$acl->add('BoardPopoverController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskPopoverController', '*', Role::PROJECT_MEMBER);
$acl->add('CalendarController', 'save', Role::PROJECT_MEMBER);
$acl->add('CategoryController', '*', Role::PROJECT_MANAGER);
$acl->add('ColumnController', '*', Role::PROJECT_MANAGER);
$acl->add('ColumnMoveRestrictionController', '*', Role::PROJECT_MANAGER);
$acl->add('ColumnRestrictionController', '*', Role::PROJECT_MANAGER);
$acl->add('CommentController', array('create', 'save', 'edit', 'update', 'confirm', 'remove'), Role::PROJECT_MEMBER);
$acl->add('CommentListController', array('save'), Role::PROJECT_MEMBER);
$acl->add('CommentMailController', '*', Role::PROJECT_MEMBER);
$acl->add('CustomFilterController', '*', Role::PROJECT_MEMBER);
$acl->add('ExportController', '*', Role::PROJECT_MANAGER);
$acl->add('ExternalTaskCreationController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskFileController', array('screenshot', 'create', 'save', 'remove', 'confirm'), Role::PROJECT_MEMBER);
$acl->add('ProjectViewController', array('share', 'updateSharing', 'integrations', 'updateIntegrations', 'notifications', 'updateNotifications', 'duplicate', 'doDuplication', 'importTasks', 'doTasksImport'), Role::PROJECT_MANAGER);
$acl->add('ProjectPermissionController', '*', Role::PROJECT_MANAGER);
$acl->add('ProjectEditController', '*', Role::PROJECT_MANAGER);
$acl->add('ProjectPredefinedContentController', '*', Role::PROJECT_MANAGER);
$acl->add('ProjectRoleController', '*', Role::PROJECT_MANAGER);
$acl->add('ProjectRoleRestrictionController', '*', Role::PROJECT_MANAGER);
$acl->add('PredefinedTaskDescriptionController', '*', Role::PROJECT_MANAGER);
$acl->add('ProjectFileController', '*', Role::PROJECT_MEMBER);
$acl->add('ProjectUserOverviewController', '*', Role::PROJECT_MANAGER);
$acl->add('ProjectStatusController', '*', Role::PROJECT_MANAGER);
$acl->add('ProjectTagController', '*', Role::PROJECT_MANAGER);
$acl->add('SubtaskController', '*', Role::PROJECT_MEMBER);
$acl->add('SubtaskConverterController', '*', Role::PROJECT_MEMBER);
$acl->add('SubtaskRestrictionController', '*', Role::PROJECT_MEMBER);
$acl->add('SubtaskStatusController', '*', Role::PROJECT_MEMBER);
$acl->add('SwimlaneController', '*', Role::PROJECT_MANAGER);
$acl->add('TaskSuppressionController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskCreationController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskBulkController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskBulkMoveColumnController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskBulkChangePropertyController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskDuplicationController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskRecurrenceController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskImportController', '*', Role::PROJECT_MANAGER);
$acl->add('TaskInternalLinkController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskExternalLinkController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskModificationController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskMovePositionController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskReorderController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskStatusController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskMailController', '*', Role::PROJECT_MEMBER);
$acl->add('UserAjaxController', array('mention'), Role::PROJECT_MEMBER);
return $acl;
}
/**
* Get ACL for the application
*
* @access public
* @return AccessMap
*/
public function getApplicationAccessMap()
{
$acl = new AccessMap;
$acl->setDefaultRole(Role::APP_USER);
$acl->setRoleHierarchy(Role::APP_ADMIN, array(Role::APP_MANAGER, Role::APP_USER, Role::APP_PUBLIC));
$acl->setRoleHierarchy(Role::APP_MANAGER, array(Role::APP_USER, Role::APP_PUBLIC));
$acl->setRoleHierarchy(Role::APP_USER, array(Role::APP_PUBLIC));
$acl->add('AuthController', array('login', 'check'), Role::APP_PUBLIC);
$acl->add('CaptchaController', '*', Role::APP_PUBLIC);
$acl->add('PasswordResetController', '*', Role::APP_PUBLIC);
$acl->add('TaskViewController', 'readonly', Role::APP_PUBLIC);
$acl->add('BoardViewController', 'readonly', Role::APP_PUBLIC);
$acl->add('ICalendarController', '*', Role::APP_PUBLIC);
$acl->add('FeedController', '*', Role::APP_PUBLIC);
$acl->add('AvatarFileController', array('show', 'image'), Role::APP_PUBLIC);
$acl->add('UserInviteController', array('signup', 'register'), Role::APP_PUBLIC);
$acl->add('CronjobController', array('run'), Role::APP_PUBLIC);
$acl->add('ConfigController', '*', Role::APP_ADMIN);
$acl->add('TagController', '*', Role::APP_ADMIN);
$acl->add('PluginController', '*', Role::APP_ADMIN);
$acl->add('CurrencyController', '*', Role::APP_ADMIN);
$acl->add('GroupListController', '*', Role::APP_ADMIN);
$acl->add('GroupCreationController', '*', Role::APP_ADMIN);
$acl->add('GroupModificationController', '*', Role::APP_ADMIN);
$acl->add('LinkController', '*', Role::APP_ADMIN);
$acl->add('ProjectCreationController', 'create', Role::APP_MANAGER);
$acl->add('ProjectUserOverviewController', '*', Role::APP_MANAGER);
$acl->add('TwoFactorController', 'disable', Role::APP_ADMIN);
$acl->add('UserImportController', '*', Role::APP_ADMIN);
$acl->add('UserCreationController', '*', Role::APP_ADMIN);
$acl->add('UserListController', '*', Role::APP_ADMIN);
$acl->add('UserStatusController', '*', Role::APP_ADMIN);
$acl->add('UserCredentialController', array('changeAuthentication', 'saveAuthentication', 'unlock'), Role::APP_ADMIN);
$acl->add('UserInviteController', array('show', 'save'), Role::APP_ADMIN);
return $acl;
}
/**
* Get ACL for the API
*
* @access public
* @return AccessMap
*/
public function getApiAccessMap()
{
$acl = new AccessMap;
$acl->setDefaultRole(Role::APP_USER);
$acl->setRoleHierarchy(Role::APP_ADMIN, array(Role::APP_MANAGER, Role::APP_USER, Role::APP_PUBLIC));
$acl->setRoleHierarchy(Role::APP_MANAGER, array(Role::APP_USER, Role::APP_PUBLIC));
$acl->add('UserProcedure', '*', Role::APP_ADMIN);
$acl->add('GroupMemberProcedure', '*', Role::APP_ADMIN);
$acl->add('GroupProcedure', '*', Role::APP_ADMIN);
$acl->add('LinkProcedure', '*', Role::APP_ADMIN);
$acl->add('TaskProcedure', array('getOverdueTasks'), Role::APP_ADMIN);
$acl->add('ProjectProcedure', array('getAllProjects'), Role::APP_ADMIN);
$acl->add('ProjectProcedure', array('createProject'), Role::APP_MANAGER);
return $acl;
}
/**
* Get ACL for the API
*
* @access public
* @return AccessMap
*/
public function getApiProjectAccessMap()
{
$acl = new AccessMap;
$acl->setDefaultRole(Role::PROJECT_VIEWER);
$acl->setRoleHierarchy(Role::PROJECT_MANAGER, array(Role::PROJECT_MEMBER, Role::PROJECT_VIEWER));
$acl->setRoleHierarchy(Role::PROJECT_MEMBER, array(Role::PROJECT_VIEWER));
$acl->add('ActionProcedure', array('removeAction', 'getActions', 'createAction'), Role::PROJECT_MANAGER);
$acl->add('CategoryProcedure', array('removeCategory', 'createCategory', 'updateCategory'), Role::PROJECT_MANAGER);
$acl->add('ColumnProcedure', array('updateColumn', 'addColumn', 'removeColumn', 'changeColumnPosition'), Role::PROJECT_MANAGER);
$acl->add('CommentProcedure', array('removeComment', 'createComment', 'updateComment'), Role::PROJECT_MEMBER);
$acl->add('ProjectPermissionProcedure', array('addProjectUser', 'addProjectGroup', 'removeProjectUser', 'removeProjectGroup', 'changeProjectUserRole', 'changeProjectGroupRole'), Role::PROJECT_MANAGER);
$acl->add('ProjectProcedure', array('updateProject', 'removeProject', 'enableProject', 'disableProject', 'enableProjectPublicAccess', 'disableProjectPublicAccess'), Role::PROJECT_MANAGER);
$acl->add('SubtaskProcedure', array('removeSubtask', 'createSubtask', 'updateSubtask'), Role::PROJECT_MEMBER);
$acl->add('SubtaskTimeTrackingProcedure', array('setSubtaskStartTime', 'setSubtaskEndTime'), Role::PROJECT_MEMBER);
$acl->add('SwimlaneProcedure', array('addSwimlane', 'updateSwimlane', 'removeSwimlane', 'disableSwimlane', 'enableSwimlane', 'changeSwimlanePosition'), Role::PROJECT_MANAGER);
$acl->add('ProjectFileProcedure', array('createProjectFile', 'removeProjectFile', 'removeAllProjectFiles'), Role::PROJECT_MEMBER);
$acl->add('TaskFileProcedure', array('createTaskFile', 'removeTaskFile', 'removeAllTaskFiles'), Role::PROJECT_MEMBER);
$acl->add('TaskLinkProcedure', array('createTaskLink', 'updateTaskLink', 'removeTaskLink'), Role::PROJECT_MEMBER);
$acl->add('TaskExternalLinkProcedure', array('createExternalTaskLink', 'updateExternalTaskLink', 'removeExternalTaskLink'), Role::PROJECT_MEMBER);
$acl->add('TaskProcedure', array('openTask', 'closeTask', 'removeTask', 'moveTaskPosition', 'moveTaskToProject', 'duplicateTaskToProject', 'createTask', 'updateTask'), Role::PROJECT_MEMBER);
$acl->add('TaskTagProcedure', array('setTaskTags'), Role::PROJECT_MEMBER);
$acl->add('TagProcedure', array('createTag', 'updateTag', 'removeTag'), Role::PROJECT_MEMBER);
$acl->add('ProjectMetaDataProcedure', array('saveProjectMetadata', 'removeProjectMetadata'), Role::PROJECT_MEMBER);
$acl->add('TaskMetadataProcedure', array('saveTaskMetadata', 'removeTaskMetadata'), Role::PROJECT_MEMBER);
return $acl;
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
namespace Kanboard\ServiceProvider;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Kanboard\Core\User\Avatar\AvatarManager;
use Kanboard\User\Avatar\AvatarFileProvider;
use Kanboard\User\Avatar\LetterAvatarProvider;
/**
* Avatar Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class AvatarProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['avatarManager'] = new AvatarManager;
$container['avatarManager']->register(new LetterAvatarProvider($container));
$container['avatarManager']->register(new AvatarFileProvider($container));
return $container;
}
}
+76
View File
@@ -0,0 +1,76 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Core\Cache\MemoryCache;
use Kanboard\Decorator\ColumnMoveRestrictionCacheDecorator;
use Kanboard\Decorator\ColumnRestrictionCacheDecorator;
use Kanboard\Decorator\MetadataCacheDecorator;
use Kanboard\Decorator\ProjectRoleRestrictionCacheDecorator;
use Kanboard\Decorator\UserCacheDecorator;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Cache Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class CacheProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['memoryCache'] = function () {
return new MemoryCache();
};
$container['cacheDriver'] = $container['memoryCache'];
$container['userCacheDecorator'] = function ($c) {
return new UserCacheDecorator(
$c['memoryCache'],
$c['userModel']
);
};
$container['userMetadataCacheDecorator'] = function ($c) {
return new MetadataCacheDecorator(
$c['cacheDriver'],
$c['userMetadataModel'],
'user.metadata.',
$c['userSession']->getId()
);
};
$container['columnMoveRestrictionCacheDecorator'] = function ($c) {
return new ColumnMoveRestrictionCacheDecorator(
$c['memoryCache'],
$c['columnMoveRestrictionModel']
);
};
$container['columnRestrictionCacheDecorator'] = function ($c) {
return new ColumnRestrictionCacheDecorator(
$c['memoryCache'],
$c['columnRestrictionModel']
);
};
$container['projectRoleRestrictionCacheDecorator'] = function ($c) {
return new ProjectRoleRestrictionCacheDecorator(
$c['memoryCache'],
$c['projectRoleRestrictionModel']
);
};
return $container;
}
}
+195
View File
@@ -0,0 +1,195 @@
<?php
namespace Kanboard\ServiceProvider;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Kanboard\Core\Paginator;
use Kanboard\Core\Http\OAuth2;
use Kanboard\Core\Tool;
use Kanboard\Core\Http\Client as HttpClient;
/**
* Class ClassProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class ClassProvider implements ServiceProviderInterface
{
private $classes = array(
'Analytic' => array(
'TaskDistributionAnalytic',
'UserDistributionAnalytic',
'EstimatedTimeComparisonAnalytic',
'AverageLeadCycleTimeAnalytic',
'AverageTimeSpentColumnAnalytic',
'EstimatedActualColumnAnalytic',
),
'Model' => array(
'ActionModel',
'ActionParameterModel',
'AvatarFileModel',
'BoardModel',
'CaptchaModel',
'CategoryModel',
'ColorModel',
'ColumnModel',
'ColumnRestrictionModel',
'ColumnMoveRestrictionModel',
'CommentModel',
'ConfigModel',
'CurrencyModel',
'CustomFilterModel',
'GroupModel',
'GroupMemberModel',
'InviteModel',
'LanguageModel',
'LastLoginModel',
'LinkModel',
'NotificationModel',
'PasswordResetModel',
'PredefinedTaskDescriptionModel',
'ProjectModel',
'ProjectFileModel',
'ProjectActivityModel',
'ProjectDuplicationModel',
'ProjectDailyColumnStatsModel',
'ProjectDailyStatsModel',
'ProjectPermissionModel',
'ProjectNotificationModel',
'ProjectMetadataModel',
'ProjectGroupRoleModel',
'ProjectRoleModel',
'ProjectRoleRestrictionModel',
'ProjectTaskDuplicationModel',
'ProjectTaskPriorityModel',
'ProjectUserRoleModel',
'RememberMeSessionModel',
'SubtaskModel',
'SubtaskPositionModel',
'SubtaskStatusModel',
'SubtaskTaskConversionModel',
'SubtaskTimeTrackingModel',
'SwimlaneModel',
'TagDuplicationModel',
'TagModel',
'TaskModel',
'TaskAnalyticModel',
'TaskCreationModel',
'TaskDuplicationModel',
'TaskProjectDuplicationModel',
'TaskProjectMoveModel',
'TaskRecurrenceModel',
'TaskExternalLinkModel',
'TaskFinderModel',
'TaskFileModel',
'TaskLinkModel',
'TaskModificationModel',
'TaskPositionModel',
'TaskReorderModel',
'TaskStatusModel',
'TaskTagModel',
'TaskMetadataModel',
'ThemeModel',
'TimezoneModel',
'TransitionModel',
'UserModel',
'UserLockingModel',
'UserNotificationModel',
'UserNotificationFilterModel',
'UserUnreadNotificationModel',
'UserMetadataModel',
),
'Validator' => array(
'ActionValidator',
'AuthValidator',
'CategoryValidator',
'ColumnMoveRestrictionValidator',
'ColumnRestrictionValidator',
'ColumnValidator',
'CommentValidator',
'ConfigValidator',
'CurrencyValidator',
'CustomFilterValidator',
'ExternalLinkValidator',
'GroupValidator',
'LinkValidator',
'PasswordResetValidator',
'ProjectValidator',
'ProjectRoleValidator',
'SubtaskValidator',
'SwimlaneValidator',
'TagValidator',
'TaskLinkValidator',
'TaskValidator',
'UserValidator',
'PredefinedTaskDescriptionValidator',
),
'Import' => array(
'UserImport',
),
'Export' => array(
'SubtaskExport',
'TaskExport',
'TransitionExport',
),
'Pagination' => array(
'DashboardPagination',
'ProjectPagination',
'SubtaskPagination',
'TaskPagination',
'UserPagination',
),
'Core' => array(
'DateParser',
'Lexer',
),
'Core\Event' => array(
'EventManager',
),
'Core\Http' => array(
'Request',
'Response',
'RememberMeCookie',
),
'Core\Plugin' => array(
'Hook',
),
'Core\Security' => array(
'Token',
'Role',
),
'Core\User' => array(
'GroupSync',
'UserSync',
'UserSession',
'UserProfile',
)
);
public function register(Container $container)
{
Tool::buildDIC($container, $this->classes);
$container['paginator'] = $container->factory(function ($c) {
return new Paginator($c);
});
$container['oauth'] = $container->factory(function ($c) {
return new OAuth2($c);
});
$container['httpClient'] = function ($c) {
return new HttpClient($c);
};
$container['cspRules'] = array(
'default-src' => "'self'",
'style-src' => "'self' 'unsafe-inline'",
'img-src' => '* data:',
);
return $container;
}
}
+78
View File
@@ -0,0 +1,78 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Console\CronjobCommand;
use Kanboard\Console\DatabaseMigrationCommand;
use Kanboard\Console\DatabaseVersionCommand;
use Kanboard\Console\JobCommand;
use Kanboard\Console\LocaleComparatorCommand;
use Kanboard\Console\LocaleSyncCommand;
use Kanboard\Console\PluginInstallCommand;
use Kanboard\Console\PluginUninstallCommand;
use Kanboard\Console\PluginUpgradeCommand;
use Kanboard\Console\ProjectActivityArchiveCommand;
use Kanboard\Console\ProjectArchiveCommand;
use Kanboard\Console\ProjectDailyColumnStatsExportCommand;
use Kanboard\Console\ProjectDailyStatsCalculationCommand;
use Kanboard\Console\ResetPasswordCommand;
use Kanboard\Console\ResetTwoFactorCommand;
use Kanboard\Console\SubtaskExportCommand;
use Kanboard\Console\TaskExportCommand;
use Kanboard\Console\TaskOverdueNotificationCommand;
use Kanboard\Console\TaskTriggerCommand;
use Kanboard\Console\TransitionExportCommand;
use Kanboard\Console\VersionCommand;
use Kanboard\Console\WorkerCommand;
use Kanboard\Console\CssCommand;
use Kanboard\Console\JsCommand;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Symfony\Component\Console\Application;
/**
* Class CommandProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class CommandProvider implements ServiceProviderInterface
{
/**
* Registers services on the given container.
*
* @param Container $container
* @return Container
*/
public function register(Container $container)
{
$application = new Application('Kanboard', APP_VERSION);
$application->add(new TaskOverdueNotificationCommand($container));
$application->add(new SubtaskExportCommand($container));
$application->add(new TaskExportCommand($container));
$application->add(new ProjectArchiveCommand($container));
$application->add(new ProjectActivityArchiveCommand($container));
$application->add(new ProjectDailyStatsCalculationCommand($container));
$application->add(new ProjectDailyColumnStatsExportCommand($container));
$application->add(new TransitionExportCommand($container));
$application->add(new LocaleSyncCommand($container));
$application->add(new LocaleComparatorCommand($container));
$application->add(new TaskTriggerCommand($container));
$application->add(new CronjobCommand($container));
$application->add(new WorkerCommand($container));
$application->add(new JobCommand($container));
$application->add(new ResetPasswordCommand($container));
$application->add(new ResetTwoFactorCommand($container));
$application->add(new PluginUpgradeCommand($container));
$application->add(new PluginInstallCommand($container));
$application->add(new PluginUninstallCommand($container));
$application->add(new DatabaseMigrationCommand($container));
$application->add(new DatabaseVersionCommand($container));
$application->add(new VersionCommand($container));
$application->add(new CssCommand($container));
$application->add(new JsCommand($container));
$container['cli'] = $application;
return $container;
}
}
+196
View File
@@ -0,0 +1,196 @@
<?php
namespace Kanboard\ServiceProvider;
use LogicException;
use RuntimeException;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use PicoDb\Database;
/**
* Class DatabaseProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class DatabaseProvider implements ServiceProviderInterface
{
/**
* Register provider
*
* @access public
* @param Container $container
* @return Container
*/
public function register(Container $container)
{
$container['db'] = $this->getInstance();
if (DB_RUN_MIGRATIONS) {
self::runMigrations($container['db']);
}
if (DEBUG) {
$container['db']->getStatementHandler()
->withLogging()
->withStopWatch()
;
}
return $container;
}
/**
* Setup the database driver
*
* @access public
* @return \PicoDb\Database
*/
public function getInstance()
{
switch (DB_DRIVER) {
case 'sqlite':
$db = $this->getSqliteInstance();
break;
case 'mysql':
$db = $this->getMysqlInstance();
break;
case 'postgres':
$db = $this->getPostgresInstance();
break;
case 'dblib':
$db = $this->getMssqlInstance();
break;
case 'mssql':
$db = $this->getMssqlInstance();
break;
case 'odbc':
$db = $this->getMssqlInstance();
break;
default:
throw new LogicException('Database driver not supported');
}
return $db;
}
/**
* Get current database version
*
* @static
* @access public
* @param Database $db
* @return int
*/
public static function getSchemaVersion(Database $db)
{
return $db->getDriver()->getSchemaVersion();
}
/**
* Execute database migrations
*
* @static
* @access public
* @throws RuntimeException
* @param Database $db
* @return bool
*/
public static function runMigrations(Database $db)
{
if (! $db->schema()->check(\Schema\VERSION)) {
$messages = $db->getLogMessages();
throw new RuntimeException('Unable to run SQL migrations: '.implode(', ', $messages).' (You may have to fix it manually)');
}
return true;
}
/**
* Setup the Sqlite database driver
*
* @access private
* @return \PicoDb\Database
*/
private function getSqliteInstance()
{
require_once __DIR__.'/../Schema/Sqlite.php';
return new Database([
'driver' => 'sqlite',
'filename' => DB_FILENAME,
'wal_mode' => DB_WAL_MODE,
]);
}
/**
* Setup the Mysql database driver
*
* @access private
* @return \PicoDb\Database
*/
private function getMysqlInstance()
{
require_once __DIR__.'/../Schema/Mysql.php';
return new Database(array(
'driver' => 'mysql',
'hostname' => DB_HOSTNAME,
'username' => DB_USERNAME,
'password' => DB_PASSWORD,
'database' => DB_NAME,
'charset' => 'utf8mb4',
'port' => DB_PORT,
'ssl_key' => DB_SSL_KEY,
'ssl_ca' => DB_SSL_CA,
'ssl_cert' => DB_SSL_CERT,
'verify_server_cert' => DB_VERIFY_SERVER_CERT,
'timeout' => DB_TIMEOUT,
));
}
/**
* Setup the Postgres database driver
*
* @access private
* @return \PicoDb\Database
*/
private function getPostgresInstance()
{
require_once __DIR__.'/../Schema/Postgres.php';
return new Database(array(
'driver' => 'postgres',
'hostname' => DB_HOSTNAME,
'username' => DB_USERNAME,
'password' => DB_PASSWORD,
'database' => DB_NAME,
'port' => DB_PORT,
'timeout' => DB_TIMEOUT,
));
}
/**
* Setup the MSSQL database driver
*
* @access private
* @return \PicoDb\Database
*/
private function getMssqlInstance()
{
require_once __DIR__.'/../Schema/Mssql.php';
return new Database(array(
'driver' => DB_DRIVER,
'hostname' => DB_HOSTNAME,
'username' => DB_USERNAME,
'password' => DB_PASSWORD,
'database' => DB_NAME,
'port' => DB_PORT,
'odbc-dsn' => DB_ODBC_DSN,
'timeout' => DB_TIMEOUT,
'appname' => 'Kanboard',
));
}
}
@@ -0,0 +1,42 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Subscriber\LdapUserPhotoSubscriber;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Kanboard\Subscriber\AuthSubscriber;
use Kanboard\Subscriber\BootstrapSubscriber;
use Kanboard\Subscriber\NotificationSubscriber;
use Kanboard\Subscriber\ProjectDailySummarySubscriber;
use Kanboard\Subscriber\ProjectModificationDateSubscriber;
use Kanboard\Subscriber\TransitionSubscriber;
use Kanboard\Subscriber\RecurringTaskSubscriber;
/**
* Class EventDispatcherProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class EventDispatcherProvider implements ServiceProviderInterface
{
public function register(Container $container)
{
$container['dispatcher'] = new EventDispatcher;
$container['dispatcher']->addSubscriber(new BootstrapSubscriber($container));
$container['dispatcher']->addSubscriber(new AuthSubscriber($container));
$container['dispatcher']->addSubscriber(new ProjectDailySummarySubscriber($container));
$container['dispatcher']->addSubscriber(new ProjectModificationDateSubscriber($container));
$container['dispatcher']->addSubscriber(new NotificationSubscriber($container));
$container['dispatcher']->addSubscriber(new TransitionSubscriber($container));
$container['dispatcher']->addSubscriber(new RecurringTaskSubscriber($container));
if (LDAP_AUTH && LDAP_USER_ATTRIBUTE_PHOTO !== '') {
$container['dispatcher']->addSubscriber(new LdapUserPhotoSubscriber($container));
}
return $container;
}
}
@@ -0,0 +1,36 @@
<?php
namespace Kanboard\ServiceProvider;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Kanboard\Core\ExternalLink\ExternalLinkManager;
use Kanboard\ExternalLink\WebLinkProvider;
use Kanboard\ExternalLink\AttachmentLinkProvider;
use Kanboard\ExternalLink\FileLinkProvider;
/**
* External Link Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class ExternalLinkProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['externalLinkManager'] = new ExternalLinkManager($container);
$container['externalLinkManager']->register(new WebLinkProvider($container));
$container['externalLinkManager']->register(new AttachmentLinkProvider($container));
$container['externalLinkManager']->register(new FileLinkProvider($container));
return $container;
}
}
@@ -0,0 +1,29 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Core\ExternalTask\ExternalTaskManager;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class ExternalTaskProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class ExternalTaskProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['externalTaskManager'] = new ExternalTaskManager();
return $container;
}
}
+231
View File
@@ -0,0 +1,231 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Core\Filter\LexerBuilder;
use Kanboard\Core\Filter\QueryBuilder;
use Kanboard\Filter\ProjectActivityCreationDateFilter;
use Kanboard\Filter\ProjectActivityCreatorFilter;
use Kanboard\Filter\ProjectActivityProjectNameFilter;
use Kanboard\Filter\ProjectActivityTaskStatusFilter;
use Kanboard\Filter\ProjectActivityTaskTitleFilter;
use Kanboard\Filter\TaskAssigneeFilter;
use Kanboard\Filter\TaskCategoryFilter;
use Kanboard\Filter\TaskColorFilter;
use Kanboard\Filter\TaskColumnFilter;
use Kanboard\Filter\TaskCommentFilter;
use Kanboard\Filter\TaskCompletionDateFilter;
use Kanboard\Filter\TaskCompletionDateRangeFilter;
use Kanboard\Filter\TaskCreationDateFilter;
use Kanboard\Filter\TaskCreationDateRangeFilter;
use Kanboard\Filter\TaskCreatorFilter;
use Kanboard\Filter\TaskDescriptionFilter;
use Kanboard\Filter\TaskDueDateFilter;
use Kanboard\Filter\TaskStartDateFilter;
use Kanboard\Filter\TaskIdFilter;
use Kanboard\Filter\TaskLinkFilter;
use Kanboard\Filter\TaskModificationDateFilter;
use Kanboard\Filter\TaskModificationDateRangeFilter;
use Kanboard\Filter\TaskMovedDateFilter;
use Kanboard\Filter\TaskMovedDateRangeFilter;
use Kanboard\Filter\TaskPriorityFilter;
use Kanboard\Filter\TaskProjectFilter;
use Kanboard\Filter\TaskReferenceFilter;
use Kanboard\Filter\TaskScoreFilter;
use Kanboard\Filter\TaskStatusFilter;
use Kanboard\Filter\TaskSubtaskAssigneeFilter;
use Kanboard\Filter\TaskSwimlaneFilter;
use Kanboard\Filter\TaskTagFilter;
use Kanboard\Filter\TaskTitleFilter;
use Kanboard\Model\ProjectModel;
use Kanboard\Model\ProjectGroupRoleModel;
use Kanboard\Model\ProjectUserRoleModel;
use Kanboard\Model\UserModel;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Filter Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class FilterProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$this->createUserFilter($container);
$this->createProjectFilter($container);
$this->createTaskFilter($container);
return $container;
}
public function createUserFilter(Container $container)
{
$container['userQuery'] = $container->factory(function ($c) {
$builder = new QueryBuilder();
$builder->withQuery($c['db']->table(UserModel::TABLE));
return $builder;
});
return $container;
}
public function createProjectFilter(Container $container)
{
$container['projectGroupRoleQuery'] = $container->factory(function ($c) {
$builder = new QueryBuilder();
$builder->withQuery($c['db']->table(ProjectGroupRoleModel::TABLE));
return $builder;
});
$container['projectUserRoleQuery'] = $container->factory(function ($c) {
$builder = new QueryBuilder();
$builder->withQuery($c['db']->table(ProjectUserRoleModel::TABLE));
return $builder;
});
$container['projectQuery'] = $container->factory(function ($c) {
$builder = new QueryBuilder();
$builder->withQuery($c['db']->table(ProjectModel::TABLE));
return $builder;
});
$container['projectActivityLexer'] = $container->factory(function ($c) {
$builder = new LexerBuilder();
$builder
->withQuery($c['projectActivityModel']->getQuery())
->withFilter(new ProjectActivityTaskTitleFilter(), true)
->withFilter(new ProjectActivityTaskStatusFilter())
->withFilter(new ProjectActivityProjectNameFilter())
->withFilter(
ProjectActivityCreationDateFilter::getInstance()
->setDateParser($c['dateParser'])
)
->withFilter(
ProjectActivityCreatorFilter::getInstance()
->setCurrentUserId($c['userSession']->getId())
)
;
return $builder;
});
$container['projectActivityQuery'] = $container->factory(function ($c) {
$builder = new QueryBuilder();
$builder->withQuery($c['projectActivityModel']->getQuery());
return $builder;
});
return $container;
}
public function createTaskFilter(Container $container)
{
$container['taskQuery'] = $container->factory(function ($c) {
$builder = new QueryBuilder();
$builder->withQuery($c['taskFinderModel']->getExtendedQuery());
return $builder;
});
$container['taskLexer'] = $container->factory(function ($c) {
$builder = new LexerBuilder();
$builder
->withQuery($c['taskFinderModel']->getExtendedQuery())
->withFilter(
TaskAssigneeFilter::getInstance()
->setCurrentUserId($c['userSession']->getId())
)
->withFilter(new TaskCategoryFilter())
->withFilter(
TaskColorFilter::getInstance()
->setColorModel($c['colorModel'])
)
->withFilter(new TaskPriorityFilter())
->withFilter(new TaskColumnFilter())
->withFilter(
TaskCommentFilter::getInstance()
->setDatabase($c['db'])
)
->withFilter(
TaskCreationDateFilter::getInstance()
->setDateParser($c['dateParser'])
)
->withFilter(
TaskCreationDateRangeFilter::getInstance()
->setDateParser($c['dateParser'])
)
->withFilter(
TaskCreatorFilter::getInstance()
->setCurrentUserId($c['userSession']->getId())
)
->withFilter(new TaskDescriptionFilter())
->withFilter(
TaskDueDateFilter::getInstance()
->setDateParser($c['dateParser'])
)
->withFilter(
TaskStartDateFilter::getInstance()
->setDateParser($c['dateParser'])
)
->withFilter(
TaskCompletionDateFilter::getInstance()
->setDateparser($c['dateParser'])
)
->withFilter(
TaskCompletionDateRangeFilter::getInstance()
->setDateparser($c['dateParser'])
)
->withFilter(new TaskIdFilter())
->withFilter(
TaskLinkFilter::getInstance()
->setDatabase($c['db'])
)
->withFilter(
TaskModificationDateFilter::getInstance()
->setDateParser($c['dateParser'])
)
->withFilter(
TaskModificationDateRangeFilter::getInstance()
->setDateParser($c['dateParser'])
)
->withFilter(
TaskMovedDateFilter::getInstance()
->setDateParser($c['dateParser'])
)
->withFilter(
TaskMovedDateRangeFilter::getInstance()
->setDateParser($c['dateParser'])
)
->withFilter(new TaskProjectFilter())
->withFilter(new TaskReferenceFilter())
->withFilter(new TaskScoreFilter())
->withFilter(new TaskStatusFilter())
->withFilter(
TaskSubtaskAssigneeFilter::getInstance()
->setCurrentUserId($c['userSession']->getId())
->setDatabase($c['db'])
)
->withFilter(new TaskSwimlaneFilter())
->withFilter(
TaskTagFilter::getInstance()
->setDatabase($c['db'])
)
->withFilter(new TaskTitleFilter(), true)
;
return $builder;
});
return $container;
}
}
+53
View File
@@ -0,0 +1,53 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Core\Tool;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class FormatterProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class FormatterProvider implements ServiceProviderInterface
{
protected $formatters = array(
'Formatter' => array(
'BoardColumnFormatter',
'BoardFormatter',
'BoardSwimlaneFormatter',
'BoardTaskFormatter',
'GroupAutoCompleteFormatter',
'ProjectActivityEventFormatter',
'ProjectApiFormatter',
'ProjectsApiFormatter',
'SubtaskListFormatter',
'SubtaskTimeTrackingCalendarFormatter',
'TaskApiFormatter',
'TasksApiFormatter',
'TaskAutoCompleteFormatter',
'TaskICalFormatter',
'TaskListFormatter',
'TaskListSubtaskFormatter',
'TaskListSubtaskAssigneeFormatter',
'TaskSuggestMenuFormatter',
'UserAutoCompleteFormatter',
'UserMentionFormatter',
)
);
/**
* Registers services on the given container.
*
* @param Container $container
* @return Container
*/
public function register(Container $container)
{
Tool::buildFactories($container, $this->formatters);
return $container;
}
}
+40
View File
@@ -0,0 +1,40 @@
<?php
namespace Kanboard\ServiceProvider;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Kanboard\Core\Group\GroupManager;
use Kanboard\Group\DatabaseBackendGroupProvider;
use Kanboard\Group\LdapBackendGroupProvider;
/**
* Group Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class GroupProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['groupManager'] = new GroupManager();
if (DB_GROUP_PROVIDER) {
$container['groupManager']->register(new DatabaseBackendGroupProvider($container));
}
if (LDAP_AUTH && LDAP_GROUP_PROVIDER) {
$container['groupManager']->register(new LdapBackendGroupProvider($container));
}
return $container;
}
}
+47
View File
@@ -0,0 +1,47 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Core\Helper;
use Kanboard\Core\Template;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class HelperProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class HelperProvider implements ServiceProviderInterface
{
public function register(Container $container)
{
$container['helper'] = new Helper($container);
$container['helper']->register('app', '\Kanboard\Helper\AppHelper');
$container['helper']->register('asset', '\Kanboard\Helper\AssetHelper');
$container['helper']->register('board', '\Kanboard\Helper\BoardHelper');
$container['helper']->register('comment', '\Kanboard\Helper\CommentHelper');
$container['helper']->register('dt', '\Kanboard\Helper\DateHelper');
$container['helper']->register('file', '\Kanboard\Helper\FileHelper');
$container['helper']->register('form', '\Kanboard\Helper\FormHelper');
$container['helper']->register('hook', '\Kanboard\Helper\HookHelper');
$container['helper']->register('layout', '\Kanboard\Helper\LayoutHelper');
$container['helper']->register('model', '\Kanboard\Helper\ModelHelper');
$container['helper']->register('subtask', '\Kanboard\Helper\SubtaskHelper');
$container['helper']->register('task', '\Kanboard\Helper\TaskHelper');
$container['helper']->register('text', '\Kanboard\Helper\TextHelper');
$container['helper']->register('url', '\Kanboard\Helper\UrlHelper');
$container['helper']->register('user', '\Kanboard\Helper\UserHelper');
$container['helper']->register('avatar', '\Kanboard\Helper\AvatarHelper');
$container['helper']->register('projectRole', '\Kanboard\Helper\ProjectRoleHelper');
$container['helper']->register('projectHeader', '\Kanboard\Helper\ProjectHeaderHelper');
$container['helper']->register('projectActivity', '\Kanboard\Helper\ProjectActivityHelper');
$container['helper']->register('mail', '\Kanboard\Helper\MailHelper');
$container['helper']->register('modal', '\Kanboard\Helper\ModalHelper');
$container['template'] = new Template($container['helper']);
return $container;
}
}
+72
View File
@@ -0,0 +1,72 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Job\CommentEventJob;
use Kanboard\Job\NotificationJob;
use Kanboard\Job\ProjectFileEventJob;
use Kanboard\Job\ProjectMetricJob;
use Kanboard\Job\SubtaskEventJob;
use Kanboard\Job\TaskEventJob;
use Kanboard\Job\TaskFileEventJob;
use Kanboard\Job\TaskLinkEventJob;
use Kanboard\Job\UserMentionJob;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class JobProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class JobProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['commentEventJob'] = $container->factory(function ($c) {
return new CommentEventJob($c);
});
$container['subtaskEventJob'] = $container->factory(function ($c) {
return new SubtaskEventJob($c);
});
$container['taskEventJob'] = $container->factory(function ($c) {
return new TaskEventJob($c);
});
$container['taskFileEventJob'] = $container->factory(function ($c) {
return new TaskFileEventJob($c);
});
$container['taskLinkEventJob'] = $container->factory(function ($c) {
return new TaskLinkEventJob($c);
});
$container['projectFileEventJob'] = $container->factory(function ($c) {
return new ProjectFileEventJob($c);
});
$container['notificationJob'] = $container->factory(function ($c) {
return new NotificationJob($c);
});
$container['projectMetricJob'] = $container->factory(function ($c) {
return new ProjectMetricJob($c);
});
$container['userMentionJob'] = $container->factory(function ($c) {
return new UserMentionJob($c);
});
return $container;
}
}
+57
View File
@@ -0,0 +1,57 @@
<?php
namespace Kanboard\ServiceProvider;
use Psr\Log\LogLevel;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Kanboard\Core\Log\Logger;
use Kanboard\Core\Log\Stderr;
use Kanboard\Core\Log\Stdout;
use Kanboard\Core\Log\Syslog;
use Kanboard\Core\Log\File;
use Kanboard\Core\Log\System;
/**
* Class LoggingProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class LoggingProvider implements ServiceProviderInterface
{
public function register(Container $container)
{
$logger = new Logger();
$driver = null;
switch (LOG_DRIVER) {
case 'syslog':
$driver = new Syslog('kanboard');
break;
case 'stdout':
$driver = new Stdout();
break;
case 'stderr':
$driver = new Stderr();
break;
case 'file':
$driver = new File(LOG_FILE);
break;
case 'system':
$driver = new System();
break;
}
if ($driver !== null) {
if (! DEBUG) {
$driver->setLevel(LogLevel::INFO);
}
$logger->setLogger($driver);
}
$container['logger'] = $logger;
return $container;
}
}
+34
View File
@@ -0,0 +1,34 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Core\Mail\Client as EmailClient;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Mail Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class MailProvider implements ServiceProviderInterface
{
/**
* Registers services on the given container.
*
* @param Container $container
*/
public function register(Container $container)
{
$container['emailClient'] = function ($container) {
$mailer = new EmailClient($container);
$mailer->setTransport('smtp', '\Kanboard\Core\Mail\Transport\Smtp');
$mailer->setTransport('sendmail', '\Kanboard\Core\Mail\Transport\Sendmail');
$mailer->setTransport('mail', '\Kanboard\Core\Mail\Transport\Mail');
return $mailer;
};
return $container;
}
}
@@ -0,0 +1,45 @@
<?php
namespace Kanboard\ServiceProvider;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Kanboard\Model\UserNotificationTypeModel;
use Kanboard\Model\ProjectNotificationTypeModel;
use Kanboard\Notification\MailNotification as MailNotification;
use Kanboard\Notification\WebNotification as WebNotification;
/**
* Notification Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class NotificationProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['userNotificationTypeModel'] = function ($container) {
$type = new UserNotificationTypeModel($container);
$type->setType(MailNotification::TYPE, t('Email'), '\Kanboard\Notification\MailNotification');
$type->setType(WebNotification::TYPE, t('Web'), '\Kanboard\Notification\WebNotification');
return $type;
};
$container['projectNotificationTypeModel'] = function ($container) {
$type = new ProjectNotificationTypeModel($container);
$type->setType('webhook', 'Webhook', '\Kanboard\Notification\WebhookNotification', true);
$type->setType('activity_stream', 'ActivityStream', '\Kanboard\Notification\ActivityStreamNotification', true);
return $type;
};
return $container;
}
}
@@ -0,0 +1,51 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Core\ObjectStorage\FileStorage;
use LogicException;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class ObjectStorageProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class ObjectStorageProvider implements ServiceProviderInterface
{
public function register(Container $container)
{
$container['objectStorage'] = function () {
if (file_exists(FILES_DIR)) {
if (! is_writable(FILES_DIR)) {
$stat = stat(FILES_DIR);
throw new LogicException(sprintf(
'The folder to store uploaded files is not writeable by your webserver user (file=%s; mode=%o; uid=%d; gid=%d)',
FILES_DIR,
$stat['mode'],
$stat['uid'],
$stat['gid']
));
}
} elseif (! @mkdir(FILES_DIR)) {
$folder = dirname(FILES_DIR);
$stat = stat($folder);
throw new LogicException(sprintf(
'Unable to create folder to store uploaded files, check the permissions of the parent directory (file=%s; mode=%o; uid=%d; gid=%d)',
$folder,
$stat['mode'],
$stat['uid'],
$stat['gid']
));
}
return new FileStorage(FILES_DIR);
};
return $container;
}
}
+31
View File
@@ -0,0 +1,31 @@
<?php
namespace Kanboard\ServiceProvider;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Kanboard\Core\Plugin\Loader;
/**
* Plugin Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class PluginProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['pluginLoader'] = new Loader($container);
$container['pluginLoader']->scan();
return $container;
}
}
+29
View File
@@ -0,0 +1,29 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Core\Queue\QueueManager;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class QueueProvider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class QueueProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['queueManager'] = new QueueManager($container);
return $container;
}
}
+285
View File
@@ -0,0 +1,285 @@
<?php
namespace Kanboard\ServiceProvider;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Kanboard\Core\Http\Route;
use Kanboard\Core\Http\Router;
/**
* Route Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class RouteProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['router'] = new Router($container);
$container['route'] = new Route($container);
if (ENABLE_URL_REWRITE) {
$container['route']->enable();
// Dashboard
$container['route']->addRoute('dashboard', 'DashboardController', 'show');
$container['route']->addRoute('dashboard/:user_id', 'DashboardController', 'show');
$container['route']->addRoute('dashboard/:user_id/projects', 'DashboardController', 'projects');
$container['route']->addRoute('dashboard/:user_id/tasks', 'DashboardController', 'tasks');
$container['route']->addRoute('dashboard/:user_id/subtasks', 'DashboardController', 'subtasks');
$container['route']->addRoute('dashboard/:user_id/activity', 'DashboardController', 'activity');
$container['route']->addRoute('dashboard/:user_id/notifications', 'DashboardController', 'notifications');
$container['route']->addRoute('my-activity', 'ActivityController', 'user');
// Search routes
$container['route']->addRoute('search', 'SearchController', 'index');
$container['route']->addRoute('search/activity', 'SearchController', 'activity');
// ProjectCreation routes
$container['route']->addRoute('project/create', 'ProjectCreationController', 'create');
$container['route']->addRoute('project/create/personal', 'ProjectCreationController', 'createPrivate');
// Project routes
$container['route']->addRoute('projects', 'ProjectListController', 'show');
$container['route']->addRoute('project/:project_id', 'ProjectViewController', 'show');
$container['route']->addRoute('p/:project_id', 'ProjectViewController', 'show');
$container['route']->addRoute('project/:project_id/customer-filters', 'CustomFilterController', 'index');
$container['route']->addRoute('project/:project_id/customer-filters/create', 'CustomFilterController', 'create');
$container['route']->addRoute('project/:project_id/share', 'ProjectViewController', 'share');
$container['route']->addRoute('project/:project_id/notifications', 'ProjectViewController', 'notifications');
$container['route']->addRoute('project/:project_id/integrations', 'ProjectViewController', 'integrations');
$container['route']->addRoute('project/:project_id/duplicate', 'ProjectViewController', 'duplicate');
$container['route']->addRoute('project/:project_id/permissions', 'ProjectPermissionController', 'index');
$container['route']->addRoute('project/:project_id/activity', 'ActivityController', 'project');
$container['route']->addRoute('project/:project_id/tags', 'ProjectTagController', 'index');
$container['route']->addRoute('project/:project_id/task/create', 'TaskCreationController', 'show');
$container['route']->addRoute('project/:project_id/predefined-contents', 'ProjectPredefinedContentController', 'show');
$container['route']->addRoute('project/:project_id/predefined-contents/create', 'PredefinedTaskDescriptionController', 'create');
$container['route']->addRoute('project/:project_id/predefined-contents/save', 'PredefinedTaskDescriptionController', 'save');
$container['route']->addRoute('project/:project_id/predefined-contents/edit/:id', 'PredefinedTaskDescriptionController', 'edit');
$container['route']->addRoute('project/:project_id/predefined-contents/remove/:id', 'PredefinedTaskDescriptionController', 'confirm');
$container['route']->addRoute('project/:project_id/custom-roles', 'ProjectRoleController', 'show');
$container['route']->addRoute('project/:project_id/import/tasks', 'ProjectViewController', 'importTasks');
$container['route']->addRoute('project/:project_id/enable', 'ProjectStatusController', 'confirmEnable');
$container['route']->addRoute('project/:project_id/disable', 'ProjectStatusController', 'confirmDisable');
$container['route']->addRoute('project/:project_id/remove', 'ProjectStatusController', 'confirmRemove');
$container['route']->addRoute('project/:project_id/file/:file_id/thumbnail/:etag', 'FileViewerController', 'thumbnail');
$container['route']->addRoute('project/:project_id/file/:file_id/image/:etag', 'FileViewerController', 'image');
$container['route']->addRoute('project/:project_id/file/:file_id/download/:etag', 'FileViewerController', 'download');
$container['route']->addRoute('project/:project_id/file/:file_id/show/:etag', 'FileViewerController', 'show');
$container['route']->addRoute('project/:project_id/file/:file_id/remove', 'ProjectFileController', 'confirm');
$container['route']->addRoute('project/:project_id/file/:file_id/view', 'FileViewerController', 'browser');
// Project Overview
$container['route']->addRoute('project/:project_id/overview', 'ProjectOverviewController', 'show');
$container['route']->addRoute('project/:project_id/overview/:search', 'ProjectOverviewController', 'show');
// ProjectEdit routes
$container['route']->addRoute('project/:project_id/edit', 'ProjectEditController', 'show');
// ProjectUser routes
$container['route']->addRoute('projects/managers/:user_id', 'ProjectUserOverviewController', 'managers');
$container['route']->addRoute('projects/members/:user_id', 'ProjectUserOverviewController', 'members');
$container['route']->addRoute('projects/tasks/:user_id/opens', 'ProjectUserOverviewController', 'opens');
$container['route']->addRoute('projects/tasks/:user_id/closed', 'ProjectUserOverviewController', 'closed');
$container['route']->addRoute('projects/managers', 'ProjectUserOverviewController', 'managers');
// Action routes
$container['route']->addRoute('project/:project_id/actions', 'ActionController', 'index');
$container['route']->addRoute('project/:project_id/action/:action_id/confirm', 'ActionController', 'confirm');
$container['route']->addRoute('project/:project_id/action/:action_id/remove', 'ActionController', 'remove');
$container['route']->addRoute('project/:project_id/action/create', 'ActionCreationController', 'create');
$container['route']->addRoute('project/:project_id/action/event', 'ActionCreationController', 'event');
$container['route']->addRoute('project/:project_id/action/params', 'ActionCreationController', 'params');
$container['route']->addRoute('project/:project_id/action/save', 'ActionCreationController', 'save');
// Column routes
$container['route']->addRoute('project/:project_id/columns', 'ColumnController', 'index');
// Swimlane routes
$container['route']->addRoute('project/:project_id/swimlanes', 'SwimlaneController', 'index');
// Category routes
$container['route']->addRoute('project/:project_id/categories', 'CategoryController', 'index');
// Import routes
$container['route']->addRoute('project/:project_id/import', 'TaskImportController', 'show');
// Task routes
$container['route']->addRoute('task/:task_id', 'TaskViewController', 'show');
$container['route']->addRoute('t/:task_id', 'TaskViewController', 'show');
$container['route']->addRoute('public/task/:task_id/:token', 'TaskViewController', 'readonly');
$container['route']->addRoute('task/:task_id/activity', 'ActivityController', 'task');
$container['route']->addRoute('task/:task_id/transitions', 'TaskViewController', 'transitions');
$container['route']->addRoute('task/:task_id/analytics', 'TaskViewController', 'analytics');
$container['route']->addRoute('task/:task_id/time-tracking', 'TaskViewController', 'timetracking');
$container['route']->addRoute('task/:task_id/position/show', 'TaskMovePositionController', 'show');
$container['route']->addRoute('task/:task_id/position/save', 'TaskMovePositionController', 'save');
$container['route']->addRoute('task/:task_id/edit', 'TaskModificationController', 'edit');
$container['route']->addRoute('task/:task_id/update', 'TaskModificationController', 'update');
$container['route']->addRoute('task/:task_id/assign-to-me/:csrf_token', 'TaskModificationController', 'assignToMe');
$container['route']->addRoute('task/:task_id/start/:csrf_token', 'TaskModificationController', 'start');
$container['route']->addRoute('task/:task_id/assign-to-me/redirect/:redirect/:csrf_token', 'TaskModificationController', 'assignToMe');
$container['route']->addRoute('task/:task_id/start/redirect/:redirect/:csrf_token', 'TaskModificationController', 'start');
$container['route']->addRoute('task/:task_id/close', 'TaskStatusController', 'close');
$container['route']->addRoute('task/:task_id/open', 'TaskStatusController', 'open');
$container['route']->addRoute('task/:task_id/email/create', 'TaskMailController', 'create');
$container['route']->addRoute('task/:task_id/email/send', 'TaskMailController', 'send');
$container['route']->addRoute('task/:task_id/duplicate', 'TaskDuplicationController', 'duplicate');
$container['route']->addRoute('task/:task_id/move-to-project/:project_id', 'TaskDuplicationController', 'move');
$container['route']->addRoute('task/:task_id/copy-to-project/:project_id', 'TaskDuplicationController', 'copy');
$container['route']->addRoute('task/:task_id/screenshot', 'TaskPopoverController', 'screenshot');
$container['route']->addRoute('task/:task_id/file/screenshot', 'TaskFileController', 'screenshot');
$container['route']->addRoute('task/:task_id/file/create', 'TaskFileController', 'create');
$container['route']->addRoute('task/:task_id/file/save', 'TaskFileController', 'save');
$container['route']->addRoute('task/:task_id/file/:file_id/remove', 'TaskFileController', 'remove');
$container['route']->addRoute('task/:task_id/file/:file_id/confirm', 'TaskFileController', 'confirm');
$container['route']->addRoute('task/:task_id/file/:file_id/view', 'FileViewerController', 'browser');
$container['route']->addRoute('task/:task_id/file/:file_id/thumbnail/:etag', 'FileViewerController', 'thumbnail');
$container['route']->addRoute('task/:task_id/file/:file_id/image/:etag', 'FileViewerController', 'image');
$container['route']->addRoute('task/:task_id/file/:file_id/download/:etag', 'FileViewerController', 'download');
$container['route']->addRoute('task/:task_id/file/:file_id/show/:etag', 'FileViewerController', 'show');
$container['route']->addRoute('task/:task_id/external-link/find', 'TaskExternalLinkController', 'find');
$container['route']->addRoute('task/:task_id/external-link/create', 'TaskExternalLinkController', 'create');
$container['route']->addRoute('task/:task_id/external-link/save', 'TaskExternalLinkController', 'save');
$container['route']->addRoute('task/:task_id/internal-link/create', 'TaskInternalLinkController', 'create');
$container['route']->addRoute('task/:task_id/internal-link/save', 'TaskInternalLinkController', 'save');
$container['route']->addRoute('task/:task_id/comment/create', 'CommentController', 'create');
$container['route']->addRoute('task/:task_id/comment/save', 'CommentController', 'save');
$container['route']->addRoute('task/:task_id/comment/:comment_id/edit', 'CommentController', 'edit');
$container['route']->addRoute('task/:task_id/comment/:comment_id/update', 'CommentController', 'update');
$container['route']->addRoute('task/:task_id/comment/:comment_id/confirm', 'CommentController', 'confirm');
$container['route']->addRoute('task/:task_id/comment/:comment_id/remove/:csrf_token', 'CommentController', 'remove');
$container['route']->addRoute('task/:task_id/subtask/create', 'SubtaskController', 'create');
$container['route']->addRoute('task/:task_id/subtask/save', 'SubtaskController', 'save');
$container['route']->addRoute('task/:task_id/recurrence/edit', 'TaskRecurrenceController', 'edit');
$container['route']->addRoute('task/:task_id/remove', 'TaskSuppressionController', 'confirm');
$container['route']->addRoute('task/:task_id/remove/redirect/:redirect', 'TaskSuppressionController', 'confirm');
// Exports
$container['route']->addRoute('export/tasks/:project_id', 'ExportController', 'tasks');
$container['route']->addRoute('export/subtasks/:project_id', 'ExportController', 'subtasks');
$container['route']->addRoute('export/transitions/:project_id', 'ExportController', 'transitions');
$container['route']->addRoute('export/summary/:project_id', 'ExportController', 'summary');
// Analytics routes
$container['route']->addRoute('analytics/tasks/:project_id', 'AnalyticController', 'taskDistribution');
$container['route']->addRoute('analytics/users/:project_id', 'AnalyticController', 'userDistribution');
$container['route']->addRoute('analytics/cfd/:project_id', 'AnalyticController', 'cfd');
$container['route']->addRoute('analytics/burndown/:project_id', 'AnalyticController', 'burndown');
$container['route']->addRoute('analytics/average-time-column/:project_id', 'AnalyticController', 'averageTimeByColumn');
$container['route']->addRoute('analytics/lead-cycle-time/:project_id', 'AnalyticController', 'leadAndCycleTime');
$container['route']->addRoute('analytics/estimated-spent-time/:project_id', 'AnalyticController', 'compareHours');
// Board routes
$container['route']->addRoute('board/:project_id', 'BoardViewController', 'show');
$container['route']->addRoute('board/:project_id/search/:search', 'BoardViewController', 'show');
$container['route']->addRoute('board/:project_id/task/create/swimlane/:swimlane_id/column/:column_id', 'TaskCreationController', 'show');
$container['route']->addRoute('board/:project_id/task/bulk/create/swimlane/:swimlane_id/column/:column_id', 'TaskBulkController', 'show');
$container['route']->addRoute('board/:project_id/close-tasks/swimlane/:swimlane_id/column/:column_id', 'BoardPopoverController', 'confirmCloseColumnTasks');
$container['route']->addRoute('board/tooltip/:task_id/tasklinks', 'BoardTooltipController', 'tasklinks');
$container['route']->addRoute('board/tooltip/:task_id/externallinks', 'BoardTooltipController', 'externallinks');
$container['route']->addRoute('board/tooltip/:task_id/subtasks', 'BoardTooltipController', 'subtasks');
$container['route']->addRoute('board/tooltip/:task_id/attachments', 'BoardTooltipController', 'attachments');
$container['route']->addRoute('board/tooltip/:task_id/description', 'BoardTooltipController', 'description');
$container['route']->addRoute('board/tooltip/:task_id/recurrence', 'BoardTooltipController', 'recurrence');
$container['route']->addRoute('board/tooltip/:project_id/swimlane/:swimlane_id', 'BoardTooltipController', 'swimlane');
$container['route']->addRoute('b/:project_id', 'BoardViewController', 'show');
$container['route']->addRoute('public/board/:token', 'BoardViewController', 'readonly');
// Listing routes
$container['route']->addRoute('list/:project_id', 'TaskListController', 'show');
$container['route']->addRoute('list/:project_id/search/:search', 'TaskListController', 'show');
$container['route']->addRoute('l/:project_id', 'TaskListController', 'show');
// Feed routes
$container['route']->addRoute('feed/project/:token', 'FeedController', 'project');
$container['route']->addRoute('feed/user/:token', 'FeedController', 'user');
// Ical routes
$container['route']->addRoute('ical/project/:token', 'ICalendarController', 'project');
$container['route']->addRoute('ical/user/:token', 'ICalendarController', 'user');
// Users
$container['route']->addRoute('users', 'UserListController', 'show');
$container['route']->addRoute('user/profile/:user_id', 'UserViewController', 'profile');
$container['route']->addRoute('user/show/:user_id', 'UserViewController', 'show');
$container['route']->addRoute('user/show/:user_id/timesheet', 'UserViewController', 'timesheet');
$container['route']->addRoute('user/show/:user_id/last-logins', 'UserViewController', 'lastLogin');
$container['route']->addRoute('user/show/:user_id/sessions', 'UserViewController', 'sessions');
$container['route']->addRoute('user/show/:user_id/password-reset-history', 'UserViewController', 'password');
$container['route']->addRoute('user/:user_id/edit', 'UserModificationController', 'show');
$container['route']->addRoute('user/:user_id/password', 'UserCredentialController', 'changePassword');
$container['route']->addRoute('user/:user_id/share', 'UserViewController', 'share');
$container['route']->addRoute('user/:user_id/notifications', 'UserViewController', 'notifications');
$container['route']->addRoute('user/:user_id/accounts', 'UserViewController', 'external');
$container['route']->addRoute('user/:user_id/integrations', 'UserViewController', 'integrations');
$container['route']->addRoute('user/:user_id/authentication', 'UserCredentialController', 'changeAuthentication');
$container['route']->addRoute('user/:user_id/2fa', 'TwoFactorController', 'index');
$container['route']->addRoute('user/:user_id/avatar', 'AvatarFileController', 'show');
$container['route']->addRoute('user/:user_id/api', 'UserApiAccessController', 'show');
$container['route']->addRoute('user/:user_id/notifications/web', 'WebNotificationController', 'show');
$container['route']->addRoute('user/:user_id/notifications/web/flush/:csrf_token', 'WebNotificationController', 'flush');
$container['route']->addRoute('user/:user_id/notifications/web/remove/:notification_id/:csrf_token', 'WebNotificationController', 'remove');
$container['route']->addRoute('invite/signup/:token', 'UserInviteController', 'signup');
// Groups
$container['route']->addRoute('groups', 'GroupListController', 'index');
$container['route']->addRoute('group/:group_id/members', 'GroupListController', 'users');
// Config
$container['route']->addRoute('settings', 'ConfigController', 'index');
$container['route']->addRoute('settings/application', 'ConfigController', 'application');
$container['route']->addRoute('settings/email', 'ConfigController', 'email');
$container['route']->addRoute('settings/project', 'ConfigController', 'project');
$container['route']->addRoute('settings/project', 'ConfigController', 'project');
$container['route']->addRoute('settings/board', 'ConfigController', 'board');
$container['route']->addRoute('settings/integrations', 'ConfigController', 'integrations');
$container['route']->addRoute('settings/webhook', 'ConfigController', 'webhook');
$container['route']->addRoute('settings/api', 'ConfigController', 'api');
$container['route']->addRoute('settings/links', 'LinkController', 'index');
$container['route']->addRoute('settings/currencies', 'CurrencyController', 'show');
$container['route']->addRoute('settings/currencies/create', 'CurrencyController', 'create');
$container['route']->addRoute('settings/currencies/change', 'CurrencyController', 'change');
$container['route']->addRoute('settings/tags', 'TagController', 'index');
$container['route']->addRoute('settings/links/labels', 'LinkController', 'show');
$container['route']->addRoute('settings/links/labels/create', 'LinkController', 'create');
$container['route']->addRoute('settings/links/labels/edit/:link_id', 'LinkController', 'edit');
$container['route']->addRoute('settings/links/labels/update/:link_id', 'LinkController', 'update');
$container['route']->addRoute('settings/links/labels/confirm/:link_id', 'LinkController', 'confirm');
$container['route']->addRoute('settings/links/labels/remove/:link_id/:csrf_token', 'LinkController', 'remove');
// Plugins
$container['route']->addRoute('extensions', 'PluginController', 'show');
$container['route']->addRoute('extensions/directory', 'PluginController', 'directory');
// Doc
$container['route']->addRoute('documentation/:file', 'DocumentationController', 'show');
$container['route']->addRoute('documentation', 'DocumentationController', 'show');
// Auth routes
$container['route']->addRoute('login', 'AuthController', 'login');
$container['route']->addRoute('login/check', 'AuthController', 'check');
$container['route']->addRoute('logout', 'AuthController', 'logout');
// PasswordReset
$container['route']->addRoute('forgot-password', 'PasswordResetController', 'create');
$container['route']->addRoute('forgot-password/change/:token', 'PasswordResetController', 'change');
// Cronjob
$container['route']->addRoute('cronjob', 'CronjobController', 'run');
}
return $container;
}
}
+37
View File
@@ -0,0 +1,37 @@
<?php
namespace Kanboard\ServiceProvider;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Kanboard\Core\Session\SessionManager;
use Kanboard\Core\Session\FlashMessage;
/**
* Session Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class SessionProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['sessionManager'] = function ($c) {
return new SessionManager($c);
};
$container['flash'] = function ($c) {
return new FlashMessage($c);
};
return $container;
}
}
+35
View File
@@ -0,0 +1,35 @@
<?php
namespace Kanboard\ServiceProvider;
use Kanboard\Core\User\UserManager;
use Kanboard\User\DatabaseBackendUserProvider;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* User Provider
*
* @package Kanboard\ServiceProvider
* @author Frederic Guillot
*/
class UserProvider implements ServiceProviderInterface
{
/**
* Register providers
*
* @access public
* @param \Pimple\Container $container
* @return \Pimple\Container
*/
public function register(Container $container)
{
$container['userManager'] = new UserManager();
if (DB_USER_PROVIDER) {
$container['userManager']->register(new DatabaseBackendUserProvider($container));
}
return $container;
}
}