看板初始化提交
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user