diff options
Diffstat (limited to 'docs')
-rw-r--r-- | docs/api-json-rpc.markdown | 610 | ||||
-rw-r--r-- | docs/automatic-actions.markdown | 9 | ||||
-rw-r--r-- | docs/ldap-authentication.markdown | 85 | ||||
-rw-r--r-- | docs/reverse-proxy-authentication.markdown | 5 | ||||
-rw-r--r-- | docs/windows-iis-installation.markdown | 46 |
5 files changed, 741 insertions, 14 deletions
diff --git a/docs/api-json-rpc.markdown b/docs/api-json-rpc.markdown index c06943bb..9f4240dc 100644 --- a/docs/api-json-rpc.markdown +++ b/docs/api-json-rpc.markdown @@ -93,17 +93,72 @@ Procedures ### createProject - Purpose: **Create a new project** -- Parameters: **name** (string) +- Parameters: + - **name** (string, required) - Result on success: **true** - Result on failure: **false** +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "createProject", + "id": 1797076613, + "params": { + "name": "PHP client" + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1797076613, + "result": true +} +``` + ### getProjectById - Purpose: **Get project information** -- Parameters: **project_id** (integer) +- Parameters: + - **project_id** (integer, required) - Result on success: **project properties** - Result on failure: **null** +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "getProjectById", + "id": 226760253, + "params": { + "project_id": 1 + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 226760253, + "result": { + "id": "1", + "name": "API test", + "is_active": "1", + "token": "", + "last_modified": "1410263246", + "is_public": "0" + } +} +``` + ### getProjectByName - Purpose: **Get project information** @@ -111,6 +166,36 @@ Procedures - Result on success: **project properties** - Result on failure: **null** +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "getProjectByName", + "id": 1620253806, + "params": { + "name": "Test" + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1620253806, + "result": { + "id": "1", + "name": "Test", + "is_active": "1", + "token": "", + "last_modified": "0", + "is_public": "0" + } +} +``` + ### getAllProjects - Purpose: **Get all available projects** @@ -118,20 +203,233 @@ Procedures - Result on success: **List of projects** - Result on failure: **false** +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "getAllProjects", + "id": 134982303 +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 134982303, + "result": [ + { + "id": "2", + "name": "PHP client", + "is_active": "1", + "token": "", + "last_modified": "0", + "is_public": "0" + }, + { + "id": "1", + "name": "Test", + "is_active": "1", + "token": "", + "last_modified": "0", + "is_public": "0" + } + ] +} +``` + ### updateProject - Purpose: **Update a project** -- Parameters: Key/value pair composed of the **id** (integer), **name** (string), **is_active** (integer, optional) +- Parameters: + - **id** (integer, required) + - **name** (string, required) + - **is_active** (integer, optional) + - **token** (string, optional) + - **is_public** (integer, optional) - Result on success: **true** - Result on failure: **false** +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "updateProject", + "id": 1853996288, + "params": { + "id": 1, + "name": "PHP client update" + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1853996288, + "result": true +} +``` + ### removeProject - Purpose: **Remove a project** -- Parameters: **project_id** (integer) +- Parameters: + **project_id** (integer, required) +- Result on success: **true** +- Result on failure: **false** + +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "removeProject", + "id": 46285125, + "params": { + "project_id": "2" + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 46285125, + "result": true +} +``` + +### enableProject + +- Purpose: **Enable a project** +- Parameters: + - **project_id** (integer, required) +- Result on success: **true** +- Result on failure: **false** + +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "enableProject", + "id": 1775494839, + "params": [ + "1" + ] +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1775494839, + "result": true +} +``` + +### disableProject + +- Purpose: **Disable a project** +- Parameters: + - **project_id** (integer, required) - Result on success: **true** - Result on failure: **false** +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "disableProject", + "id": 1734202312, + "params": [ + "1" + ] +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1734202312, + "result": true +} +``` + +### enableProjectPublicAccess + +- Purpose: **Enable public access for a given project** +- Parameters: + - **project_id** (integer, required) +- Result on success: **true** +- Result on failure: **false** + +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "enableProjectPublicAccess", + "id": 103792571, + "params": [ + "1" + ] +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 103792571, + "result": true +} +``` + +### disableProjectPublicAccess + +- Purpose: **Disable public access for a given project** +- Parameters: + - **project_id** (integer, required) +- Result on success: **true** +- Result on failure: **false** + +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "disableProjectPublicAccess", + "id": 942472945, + "params": [ + "1" + ] +} +``` + +Response example: + +```json + + "jsonrpc": "2.0", + "id": 942472945, + "result": true +} +``` @@ -211,54 +509,344 @@ Procedures ### createTask - Purpose: **Create a new task** -- Parameters: Key/value pair composed of the **title** (string), **description** (string, optional), **color_id** (string), **project_id** (integer), **column_id** (integer), **owner_id** (integer, optional), **score** (integer, optional), **date_due** (integer, optional), **category_id** (integer, optional) +- Parameters: + - **title** (string, required) + - **project_id** (integer, required) + - **color_id** (string, optional) + - **column_id** (integer, optional) + - **description** (string, optional) + - **owner_id** (integer, optional) + - **creator_id** (integer, optional) + - **score** (integer, optional) + - **date_due**: ISO8601 format (string, optional) + - **category_id** (integer, optional) - Result on success: **true** - Result on failure: **false** +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "createTask", + "id": 1176509098, + "params": { + "owner_id": 1, + "creator_id": 0, + "date_due": "", + "description": "", + "category_id": 0, + "score": 0, + "title": "Test", + "project_id": 1, + "color_id": "green", + "column_id": 2 + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1176509098, + "result": true +} +``` + ### getTask - Purpose: **Get task information** -- Parameters: **task_id** (integer) +- Parameters: + - **task_id** (integer, required) - Result on success: **task properties** - Result on failure: **null** +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "getTask", + "id": 700738119, + "params": { + "task_id": 1 + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 700738119, + "result": { + "id": "1", + "title": "Task #1", + "description": "", + "date_creation": "1409963206", + "color_id": "blue", + "project_id": "1", + "column_id": "2", + "owner_id": "1", + "position": "1", + "is_active": "1", + "date_completed": null, + "score": "0", + "date_due": "0", + "category_id": "0", + "creator_id": "0", + "date_modification": "1409963206" + } +} +``` + ### getAllTasks - Purpose: **Get all available tasks** -- Parameters: **project_id** (integer) +- Parameters: + - **project_id** (integer, required) + - **status**: List of status id, the value 1 for active tasks and 0 for inactive (list, required) - Result on success: **List of tasks** - Result on failure: **false** +Request example to fetch all tasks on the board: + +```json +{ + "jsonrpc": "2.0", + "method": "getAllTasks", + "id": 133280317, + "params": { + "project_id": 1, + "status": [ + 1 + ] + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 133280317, + "result": [ + { + "id": "1", + "title": "Task #1", + "description": "", + "date_creation": "1409961789", + "color_id": "blue", + "project_id": "1", + "column_id": "2", + "owner_id": "1", + "position": "1", + "is_active": "1", + "date_completed": null, + "score": "0", + "date_due": "0", + "category_id": "0", + "creator_id": "0", + "date_modification": "1409961789" + }, + { + "id": "2", + "title": "Test", + "description": "", + "date_creation": "1409962115", + "color_id": "green", + "project_id": "1", + "column_id": "2", + "owner_id": "1", + "position": "2", + "is_active": "1", + "date_completed": null, + "score": "0", + "date_due": "0", + "category_id": "0", + "creator_id": "0", + "date_modification": "1409962115" + }, + ... + ] +} +``` + ### updateTask - Purpose: **Update a task** -- Parameters: Key/value pair composed of the **id** (integer), **title** (string), **description** (string, optional), **color_id** (string), **project_id** (integer), **column_id** (integer), **owner_id** (integer, optional), **score** (integer, optional), **date_due** (integer, optional), **category_id** (integer, optional) +- Parameters: + - **id** (integer, required) + - **title** (string, optional) + - **color_id** (string, optional) + - **project_id** (integer, optional) + - **column_id** (integer, optional) + - **description** (string, optional) + - **owner_id** (integer, optional) + - **creator_id** (integer, optional) + - **score** (integer, optional) + - **date_due**: ISO8601 format (string, optional) + - **category_id** (integer, optional) - Result on success: **true** - Result on failure: **false** +Request example to change the task color: + +```json +{ + "jsonrpc": "2.0", + "method": "updateTask", + "id": 1406803059, + "params": { + "id": 1, + "color_id": "blue" + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1406803059, + "result": true +} +``` + ### openTask - Purpose: **Set a task to the status open** -- Parameters: **task_id** (integer) +- Parameters: + - **task_id** (integer, required) - Result on success: **true** - Result on failure: **false** +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "openTask", + "id": 1888531925, + "params": { + "task_id": 1 + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1888531925, + "result": true +} +``` + ### closeTask - Purpose: **Set a task to the status close** -- Parameters: **task_id** (integer) +- Parameters: + - **task_id** (integer, required) - Result on success: **true** - Result on failure: **false** +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "closeTask", + "id": 1654396960, + "params": { + "task_id": 1 + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1654396960, + "result": true +} +``` + ### removeTask - Purpose: **Remove a task** -- Parameters: **task_id** (integer) +- Parameters: + - **task_id** (integer, required) +- Result on success: **true** +- Result on failure: **false** + +Request example: + +```json +{ + "jsonrpc": "2.0", + "method": "removeTask", + "id": 1423501287, + "params": { + "task_id": 1 + } +} +``` + +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 1423501287, + "result": true +} +``` + +### moveTaskPosition + +- Purpose: **Move a task to another column or another position** +- Parameters: + - **project_id** (integer, required) + - **task_id** (integer, required) + - **column_id** (integer, required) + - **position** (integer, required) - Result on success: **true** - Result on failure: **false** +Request example: +```json +{ + "jsonrpc": "2.0", + "method": "moveTaskPosition", + "id": 117211800, + "params": { + "project_id": 1, + "task_id": 1, + "column_id": 2, + "position": 1 + } +} +``` +Response example: + +```json +{ + "jsonrpc": "2.0", + "id": 117211800, + "result": true +} +``` ### createUser diff --git a/docs/automatic-actions.markdown b/docs/automatic-actions.markdown index e903e0b1..6d46b053 100644 --- a/docs/automatic-actions.markdown +++ b/docs/automatic-actions.markdown @@ -33,6 +33,7 @@ List of available actions - Assign the task to a specific user - Assign the task to the person who does the action - Duplicate the task to another project +- Move the task to another project - Assign a color to a specific user - Assign automatically a color based on a category - Assign automatically a category based on a color @@ -68,6 +69,14 @@ Let's say we have two projects "Customer orders" and "Production", once the orde - Choose the action: **Duplicate the task to another project** - Define the action parameters: **Column = Validated** and **Project = Production** +### When a task is moved to the last column, move the exact same task to another project + +Let's say we have two projects "Ideas" and "Development", once the idea is validated, swap it to the "Development" project. + +- Choose the event: **Move a task to another column** +- Choose the action: **Move the task to another project** +- Define the action parameters: **Column = Validated** and **Project = Development** + ### I want to assign automatically a color to the user Bob - Choose the event: **Task creation** diff --git a/docs/ldap-authentication.markdown b/docs/ldap-authentication.markdown index 989ee24d..0c4a5720 100644 --- a/docs/ldap-authentication.markdown +++ b/docs/ldap-authentication.markdown @@ -46,10 +46,14 @@ define('LDAP_PORT', 389); // By default, require certificate to be verified for ldaps:// style URL. Set to false to skip the verification. define('LDAP_SSL_VERIFY', true); -// LDAP username to connect with. NULL for anonymous bind (by default). +// LDAP bind type: "anonymous", "user" (use the given user/password from the form) and "proxy" (a specific user to browse the LDAP directory) +define('LDAP_BIND_TYPE', 'anonymous'); + +// LDAP username to connect with. null for anonymous bind (by default). +// Or for user bind type, you can use a pattern like that %s@kanboard.local define('LDAP_USERNAME', null); -// LDAP password to connect with. NULL for anonymous bind (by default). +// LDAP password to connect with. null for anonymous bind (by default). define('LDAP_PASSWORD', null); // LDAP account base, i.e. root of all user account @@ -68,9 +72,58 @@ define('LDAP_ACCOUNT_FULLNAME', 'displayname'); define('LDAP_ACCOUNT_EMAIL', 'mail'); ``` +### LDAP bind type + +There is 3 possible ways to browse the LDAP directory: + +#### Anonymous browsing + +```php +define('LDAP_BIND_TYPE', 'anonymous'); +define('LDAP_USERNAME', null); +define('LDAP_PASSWORD', null); +``` + +This is the default value but some LDAP servers don't allow that. + +#### Proxy user + +A specific user is used to browse the LDAP directory. +By example, Novell eDirectory use that method. + +```php +define('LDAP_BIND_TYPE', 'proxy'); +define('LDAP_USERNAME', 'my proxy user'); +define('LDAP_PASSWORD', 'my proxy password'); +``` + +#### User credentials + +This method use the credentials provided by the end-user. +By example, Microsoft Active Directory doesn't allow anonymous browsing by default and if you don't want to use a proxy user you can use this method. + +```php +define('LDAP_BIND_TYPE', 'user'); +define('LDAP_USERNAME', '%s@mydomain.local'); +define('LDAP_PASSWORD', null); +``` + +Here, the `LDAP_USERNAME` is use to define a replacement pattern: + +```php +define('LDAP_USERNAME', '%s@mydomain.local'); + +// Another way to do the same: + +define('LDAP_USERNAME', 'MYDOMAIN\\%s'); +``` + ### Example for Microsoft Active Directory Let's say we have a domain `KANBOARD` (kanboard.local) and the primary controller is `myserver.kanboard.local`. +Microsoft Active Directory doesn't allow anonymous binding by default. + +First example with a proxy user: ```php <?php @@ -78,7 +131,8 @@ Let's say we have a domain `KANBOARD` (kanboard.local) and the primary controlle // Enable LDAP authentication (false by default) define('LDAP_AUTH', true); -// Set credentials for be allow to browse the LDAP directory +// Credentials to be allowed to browse the LDAP directory +define('LDAP_BIND_TYPE', 'proxy'); define('LDAP_USERNAME', 'administrator@kanboard.local'); define('LDAP_PASSWORD', 'my super secret password'); @@ -92,10 +146,35 @@ define('LDAP_ACCOUNT_FULLNAME', 'displayname'); define('LDAP_ACCOUNT_EMAIL', 'mail'); ``` +Another way with no proxy user: + +```php +<?php + +// Enable LDAP authentication (false by default) +define('LDAP_AUTH', true); + +// Credentials to be allowed to browse the LDAP directory +define('LDAP_BIND_TYPE', 'user'); +define('LDAP_USERNAME', '%s@kanboard.local'); // or 'KANBOARD\\%s' +define('LDAP_PASSWORD', null); + +// LDAP server hostname +define('LDAP_SERVER', 'myserver.kanboard.local'); + +// LDAP properties +define('LDAP_ACCOUNT_BASE', 'CN=Users,DC=kanboard,DC=local'); +define('LDAP_USER_PATTERN', '(&(objectClass=user)(sAMAccountName=%s))'); +define('LDAP_ACCOUNT_FULLNAME', 'displayname'); +define('LDAP_ACCOUNT_EMAIL', 'mail'); +``` + ### Example for OpenLDAP Here, our LDAP server is `myserver.example.com` and all users are stored in the hierarchy `ou=People,dc=example,dc=com`. +For this example with use the anonymous binding. + ```php <?php diff --git a/docs/reverse-proxy-authentication.markdown b/docs/reverse-proxy-authentication.markdown index c3243208..446adcb8 100644 --- a/docs/reverse-proxy-authentication.markdown +++ b/docs/reverse-proxy-authentication.markdown @@ -42,4 +42,9 @@ define('REVERSE_PROXY_USER_HEADER', 'REMOTE_USER'); // you should want to have a bootstrap admin user. define('REVERSE_PROXY_DEFAULT_ADMIN', 'myadmin'); +// The default domain to assume for the email address. +// In case the username is not an email address, it +// will be updated automatically as USER@mydomain.com +define('REVERSE_PROXY_DEFAULT_DOMAIN', 'mydomain.com'); + ``` diff --git a/docs/windows-iis-installation.markdown b/docs/windows-iis-installation.markdown new file mode 100644 index 00000000..f49c3c54 --- /dev/null +++ b/docs/windows-iis-installation.markdown @@ -0,0 +1,46 @@ +How to install Kanboard on Windows Server? +========================================== + +Windows 2008/2012 with IIS +--------------------------- + +### PHP installation + +- Install IIS on your server (Add new role and don't forget to enable CGI/FastCGI) +- Install PHP by following the official documentation: + - [Microsoft IIS 5.1 and IIS 6.0](http://php.net/manual/en/install.windows.iis6.php) + - [Microsoft IIS 7.0 and later](http://php.net/manual/en/install.windows.iis7.php) + - [PHP for Windows is available here](http://windows.php.net/download/) + +After the installation check if PHP runs correctly: + +Go the IIS document root `C:\inetpub\wwwroot` and create a file `phpinfo.php`: + +```php +<?php + +phpinfo(); + +?> +``` + +Open a browser at `http://localhost/phpinfo.php` and you should see the current PHP settings. +If you got an error 500, something is not correctly done in your installation. + +Notes: + +- If you use PHP < 5.4, you have to enable the short tags in your php.ini +- Don't forget to enable the required php extensions: `pdo_sqlite` and `mbstring` +- If you got an error about "the library MSVCP110.dll is missing", you probably need to download the Visual C++ Redistributable for Visual Studio from the Microsoft website. + +### Kanboard installation + +- Download the zip file +- Uncompress the archive in `C:\inetpub\wwwroot\kanboard` by example +- Make sure the directory `data` is writable by the IIS user +- You are done, open your web browser to use Kanboard + +### Tested configuration + +- Windows 2008 R2 Standard Edition / IIS 7.5 / PHP 5.5.16 +- Windows 2012 Standard Edition / IIS 8.5 / PHP 5.3.29 |