2019-11-14 14:37:34 +00:00
|
|
|
<?php
|
|
|
|
|
2022-05-17 08:52:56 +00:00
|
|
|
namespace Mail2Deck;
|
|
|
|
|
2022-05-26 21:07:44 +00:00
|
|
|
class DeckClass {
|
2022-02-04 12:57:16 +00:00
|
|
|
private $responseCode;
|
|
|
|
|
2025-01-16 12:12:47 +00:00
|
|
|
private function apiCall($request, $endpoint, $data = null, $attachment = false, $userapi = false){
|
2019-11-14 14:37:34 +00:00
|
|
|
$curl = curl_init();
|
2022-05-26 21:07:44 +00:00
|
|
|
if($data && !$attachment) {
|
2022-02-03 13:05:17 +00:00
|
|
|
$endpoint .= '?' . http_build_query($data);
|
|
|
|
}
|
|
|
|
curl_setopt_array($curl, array(
|
2021-12-31 18:50:59 +00:00
|
|
|
CURLOPT_URL => $endpoint,
|
|
|
|
CURLOPT_RETURNTRANSFER => true,
|
2025-01-16 12:12:47 +00:00
|
|
|
CURLOPT_HTTPGET => true,
|
2022-02-03 13:05:17 +00:00
|
|
|
CURLOPT_ENCODING => '',
|
|
|
|
CURLOPT_MAXREDIRS => 10,
|
2025-01-16 12:12:47 +00:00
|
|
|
CURLOPT_TIMEOUT => 30,
|
2022-02-03 13:05:17 +00:00
|
|
|
CURLOPT_FOLLOWLOCATION => true,
|
|
|
|
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
|
|
|
CURLOPT_CUSTOMREQUEST => $request,
|
|
|
|
CURLOPT_HTTPHEADER => array(
|
|
|
|
'Authorization: Basic ' . base64_encode(NC_USER . ':' . NC_PASSWORD),
|
|
|
|
'OCS-APIRequest: true',
|
|
|
|
),
|
|
|
|
));
|
2019-11-14 14:37:34 +00:00
|
|
|
|
2025-01-16 12:12:47 +00:00
|
|
|
if ($request === 'POST') {
|
|
|
|
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
|
|
|
|
curl_setopt($curl, CURLOPT_HTTPHEADER, array_merge(
|
|
|
|
array(
|
|
|
|
'Accept: application/json',
|
|
|
|
'OCS-APIRequest: true',
|
|
|
|
'Content-Type: application/json',
|
|
|
|
'Authorization: Basic ' . base64_encode(NC_USER . ':' . NC_PASSWORD),
|
|
|
|
)
|
|
|
|
));
|
|
|
|
}
|
2022-02-04 08:46:44 +00:00
|
|
|
|
2019-11-14 14:37:34 +00:00
|
|
|
$response = curl_exec($curl);
|
|
|
|
$err = curl_error($curl);
|
2025-01-16 12:12:47 +00:00
|
|
|
if($userapi) return simplexml_load_string($response);
|
2022-02-04 12:57:16 +00:00
|
|
|
$this->responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
2019-11-14 14:37:34 +00:00
|
|
|
|
|
|
|
curl_close($curl);
|
2022-05-26 21:07:44 +00:00
|
|
|
if($err) echo "cURL Error #:" . $err;
|
2019-11-14 14:37:34 +00:00
|
|
|
|
|
|
|
return json_decode($response);
|
|
|
|
}
|
|
|
|
|
2022-05-26 21:07:44 +00:00
|
|
|
public function getParameters($params, $boardFromMail = null) {// get the board and the stack
|
|
|
|
if(!$boardFromMail) // if board is not set within the email address, look for board into email subject
|
|
|
|
if(preg_match('/b-"([^"]+)"/', $params, $m) || preg_match("/b-'([^']+)'/", $params, $m)) {
|
|
|
|
$boardFromMail = $m[1];
|
|
|
|
$params = str_replace($m[0], '', $params);
|
2025-01-16 12:12:47 +00:00
|
|
|
}else{
|
|
|
|
$boardFromMail = NC_DEFAULT_BOARD;
|
|
|
|
}
|
2022-05-26 21:07:44 +00:00
|
|
|
if(preg_match('/s-"([^"]+)"/', $params, $m) || preg_match("/s-'([^']+)'/", $params, $m)) {
|
2019-11-14 14:37:34 +00:00
|
|
|
$stackFromMail = $m[1];
|
2022-02-03 13:05:17 +00:00
|
|
|
$params = str_replace($m[0], '', $params);
|
2019-11-14 14:37:34 +00:00
|
|
|
}
|
2022-05-26 21:07:44 +00:00
|
|
|
if(preg_match('/u-"([^"]+)"/', $params, $m) || preg_match("/u-'([^']+)'/", $params, $m)) {
|
2022-04-28 18:45:43 +00:00
|
|
|
$userFromMail = $m[1];
|
|
|
|
$params = str_replace($m[0], '', $params);
|
|
|
|
}
|
2022-05-26 21:21:05 +00:00
|
|
|
if(preg_match('/d-"([^"]+)"/', $params, $m) || preg_match("/d-'([^']+)'/", $params, $m)) {
|
|
|
|
$duedateFromMail = $m[1];
|
|
|
|
$params = str_replace($m[0], '', $params);
|
|
|
|
}
|
2019-11-14 14:37:34 +00:00
|
|
|
|
2022-02-03 13:05:17 +00:00
|
|
|
$boards = $this->apiCall("GET", NC_SERVER . "/index.php/apps/deck/api/v1.0/boards");
|
2022-04-13 10:31:54 +00:00
|
|
|
$boardId = $boardName = null;
|
2022-05-26 21:07:44 +00:00
|
|
|
foreach($boards as $board) {
|
|
|
|
if(strtolower($board->title) == strtolower($boardFromMail)) {
|
|
|
|
if(!$this->checkBotPermissions($board)) {
|
2022-02-08 11:34:16 +00:00
|
|
|
return false;
|
|
|
|
}
|
2019-11-14 14:37:34 +00:00
|
|
|
$boardId = $board->id;
|
2022-02-04 12:57:16 +00:00
|
|
|
$boardName = $board->title;
|
2022-02-10 14:24:29 +00:00
|
|
|
break;
|
2019-11-14 14:37:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-26 21:07:44 +00:00
|
|
|
if($boardId) {
|
2022-02-03 13:05:17 +00:00
|
|
|
$stacks = $this->apiCall("GET", NC_SERVER . "/index.php/apps/deck/api/v1.0/boards/$boardId/stacks");
|
2022-05-26 21:07:44 +00:00
|
|
|
foreach($stacks as $key => $stack)
|
|
|
|
if(strtolower($stack->title) == strtolower($stackFromMail)) {
|
2022-02-10 14:24:29 +00:00
|
|
|
$stackId = $stack->id;
|
|
|
|
break;
|
|
|
|
}
|
2022-05-26 21:07:44 +00:00
|
|
|
if($key == array_key_last($stacks) && !isset($stackId)) $stackId = $stacks[0]->id;
|
2022-02-08 11:34:16 +00:00
|
|
|
} else {
|
|
|
|
return false;
|
2019-11-14 14:37:34 +00:00
|
|
|
}
|
|
|
|
|
2022-05-19 08:47:30 +00:00
|
|
|
$boardStack = new \stdClass();
|
2022-02-03 13:05:17 +00:00
|
|
|
$boardStack->board = $boardId;
|
|
|
|
$boardStack->stack = $stackId;
|
|
|
|
$boardStack->newTitle = $params;
|
2022-02-04 12:57:16 +00:00
|
|
|
$boardStack->boardTitle = $boardName;
|
2022-05-26 21:01:58 +00:00
|
|
|
$boardStack->userId = strtolower($userFromMail);
|
2022-05-26 21:21:05 +00:00
|
|
|
$boardStack->dueDate = $duedateFromMail;
|
2019-11-14 14:37:34 +00:00
|
|
|
|
|
|
|
|
2022-02-03 13:05:17 +00:00
|
|
|
return $boardStack;
|
2019-11-14 14:37:34 +00:00
|
|
|
}
|
|
|
|
|
2025-01-16 12:12:47 +00:00
|
|
|
//Add a new card
|
2022-05-26 21:07:44 +00:00
|
|
|
public function addCard($data, $user, $board = null) {
|
2022-02-04 14:41:37 +00:00
|
|
|
$params = $this->getParameters($data->title, $board);
|
2022-05-26 21:07:44 +00:00
|
|
|
if($params) {
|
2022-02-08 11:34:16 +00:00
|
|
|
$data->title = $params->newTitle;
|
2022-05-26 21:21:05 +00:00
|
|
|
$data->duedate = $params->dueDate;
|
2022-02-08 11:34:16 +00:00
|
|
|
$card = $this->apiCall("POST", NC_SERVER . "/index.php/apps/deck/api/v1.0/boards/{$params->board}/stacks/{$params->stack}/cards", $data);
|
|
|
|
$card->board = $params->board;
|
|
|
|
$card->stack = $params->stack;
|
2022-04-28 18:45:43 +00:00
|
|
|
|
2022-05-26 21:07:44 +00:00
|
|
|
if($this->responseCode == 200) {
|
2025-01-16 12:12:47 +00:00
|
|
|
if(ASSIGN_SENDER || $user) $this->assignUser($card, $user);
|
2022-05-26 21:07:44 +00:00
|
|
|
if($data->attachments) $this->addAttachments($card, $data->attachments);
|
2022-02-08 11:34:16 +00:00
|
|
|
$card->boardTitle = $params->boardTitle;
|
2025-01-16 12:12:47 +00:00
|
|
|
}
|
|
|
|
else {
|
2022-02-08 11:34:16 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return $card;
|
|
|
|
}
|
|
|
|
return false;
|
2022-02-03 13:05:17 +00:00
|
|
|
}
|
2019-11-14 14:37:34 +00:00
|
|
|
|
2025-01-16 12:12:47 +00:00
|
|
|
//Add a new attachment
|
2022-05-26 21:07:44 +00:00
|
|
|
private function addAttachments($card, $attachments) {
|
2022-02-03 13:05:17 +00:00
|
|
|
$fullPath = getcwd() . "/attachments/"; //get full path to attachments directory
|
|
|
|
for ($i = 0; $i < count($attachments); $i++) {
|
|
|
|
$file = $fullPath . $attachments[$i];
|
2019-11-14 14:37:34 +00:00
|
|
|
$data = array(
|
2022-05-19 08:47:30 +00:00
|
|
|
'file' => new \CURLFile($file)
|
2022-02-03 13:05:17 +00:00
|
|
|
);
|
|
|
|
$this->apiCall("POST", NC_SERVER . "/index.php/apps/deck/api/v1.0/boards/{$card->board}/stacks/{$card->stack}/cards/{$card->id}/attachments?type=file", $data, true);
|
|
|
|
unlink($file);
|
2019-11-14 14:37:34 +00:00
|
|
|
}
|
|
|
|
}
|
2022-02-04 08:46:44 +00:00
|
|
|
|
2025-01-16 12:12:47 +00:00
|
|
|
//Assign a user to the card
|
2022-02-04 08:46:44 +00:00
|
|
|
public function assignUser($card, $mailUser)
|
|
|
|
{
|
2025-01-16 12:12:47 +00:00
|
|
|
$adminUser = urlencode(NC_USER);
|
|
|
|
$adminPassword = urlencode(NC_PASSWORD);
|
|
|
|
|
|
|
|
$url = "http://{$adminUser}:{$adminPassword}@" . NC_HOST;
|
|
|
|
$allUsers= $this->apiCall("GET",$url."/ocs/v1.php/cloud/users", null, false, true); //nextcloud user list
|
2022-02-04 08:46:44 +00:00
|
|
|
|
2025-01-16 12:12:47 +00:00
|
|
|
foreach ($allUsers->data->users->element as $userId) {
|
|
|
|
$userDetails = $this->apiCall("GET",$url."/ocs/v1.php/cloud/users/{$userId}",null, false, true);//search in the nextcloud user list
|
|
|
|
if (isset($userDetails->data->email[0]) && $userDetails->data->email[0] == $mailUser) {
|
|
|
|
$this->apiCall("PUT", NC_SERVER . "/index.php/apps/deck/api/v1.0/boards/{$card->board}/stacks/{$card->stack}/cards/{$card->id}/assignUser", ['userId' => (string)$userId]);
|
2022-02-04 08:46:44 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-02-08 11:34:16 +00:00
|
|
|
|
2022-05-26 21:07:44 +00:00
|
|
|
private function checkBotPermissions($board) {
|
|
|
|
foreach($board->acl as $acl)
|
|
|
|
if($acl->participant->uid == NC_USER && $acl->permissionEdit)
|
2022-02-08 11:34:16 +00:00
|
|
|
return true;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
2025-01-16 12:12:47 +00:00
|
|
|
|
|
|
|
//Identify the card by email subject
|
|
|
|
public function findCardBySubject($subject) {
|
|
|
|
$boards = $this->apiCall("GET", NC_SERVER . "/index.php/apps/deck/api/v1.0/boards");
|
|
|
|
$cleanSubject = preg_replace("/\s[b|s|u]-'.*?'/", '', $subject);
|
|
|
|
foreach ($boards as $board) {
|
|
|
|
$stacks = $this->apiCall("GET", NC_SERVER . "/index.php/apps/deck/api/v1.0/boards/{$board->id}/stacks");
|
|
|
|
foreach ($stacks as $stack) {
|
|
|
|
foreach ($stack->cards as $card) {
|
|
|
|
if (strtolower(trim($card->title)) == strtolower(trim($cleanSubject))) {
|
|
|
|
return [
|
|
|
|
'cardId' => $card->id,
|
|
|
|
'boardId' => $board->id
|
|
|
|
];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Add new comment
|
|
|
|
public function addCommentToCard($result, $comment) {
|
|
|
|
$cardId = $result['cardId'];
|
|
|
|
$boardId = $result['boardId'];
|
|
|
|
|
|
|
|
$url = NC_SERVER . "/ocs/v2.php/apps/deck/api/v1.0/cards/{$cardId}/comments";
|
|
|
|
$data = [
|
|
|
|
'comment' => $comment,
|
|
|
|
'actorType' => 'users',
|
|
|
|
'message' => $comment,
|
|
|
|
'verb' => 'create',
|
|
|
|
];
|
|
|
|
|
|
|
|
$response = $this->apiCall("POST", $url, $data);
|
|
|
|
if ($response) {
|
|
|
|
echo "Comment added successfully to card ID: $cardId on board ID: $boardId.";
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
echo "Failed to add comment to card ID: $cardId.";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//Extract the initial message from all forwarded content
|
|
|
|
public function extractForwardedContent($body) {
|
|
|
|
$separator = "---------- Forwarded message ---------";
|
|
|
|
$position = strpos($body, $separator);
|
|
|
|
if ($position !== false) {
|
|
|
|
$body = substr($body, 0, $position);
|
|
|
|
}
|
|
|
|
$body = trim($body);
|
|
|
|
return $body;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Extract the initial subject from the description
|
|
|
|
public function findOriginalSubject($message) {
|
|
|
|
preg_match_all('/\bSubject:\s*([^\n\r]*)/i', $message, $matches);
|
|
|
|
if (!empty($matches[1])) {
|
|
|
|
$subject = trim($matches[1][0]);
|
|
|
|
$subject = preg_replace('/\s+To:.*$/', '', $subject);
|
|
|
|
return $subject;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2019-11-14 14:37:34 +00:00
|
|
|
}
|