summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/api-json-rpc.markdown610
-rw-r--r--docs/automatic-actions.markdown9
-rw-r--r--docs/ldap-authentication.markdown85
-rw-r--r--docs/reverse-proxy-authentication.markdown5
-rw-r--r--docs/windows-iis-installation.markdown46
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