. * * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, * California 94120-7775, or email info@knowledgetree.com. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices * must display the words "Powered by KnowledgeTree" and retain the original * copyright notice. * * @copyright 2008-2009, KnowledgeTree Inc. * @license GNU General Public License version 3 * @author KnowledgeTree Team * @package KTAPI * @version Version 0.9 */ $_session_id = session_id(); if (empty($_session_id)) session_start(); unset($_session_id); require_once(realpath(dirname(__FILE__) . '/../config/dmsDefaults.php')); require_once(KT_LIB_DIR . '/filelike/fsfilelike.inc.php'); require_once(KT_LIB_DIR . '/foldermanagement/folderutil.inc.php'); require_once(KT_LIB_DIR . '/browse/DocumentCollection.inc.php'); require_once(KT_LIB_DIR . "/browse/columnregistry.inc.php"); define('KTAPI_DIR', KT_DIR . '/ktapi'); require_once(KTAPI_DIR .'/KTAPIConstants.inc.php'); require_once(KTAPI_DIR .'/KTAPISession.inc.php'); require_once(KTAPI_DIR .'/KTAPIFolder.inc.php'); require_once(KTAPI_DIR .'/KTAPIDocument.inc.php'); require_once(KTAPI_DIR .'/KTAPIAcl.inc.php'); require_once(KTAPI_DIR .'/KTAPICollection.inc.php'); require_once(KTAPI_DIR .'/KTAPIBulkActions.inc.php'); /** * This class defines functions that MUST exist in the inheriting class * * @abstract * @author KnowledgeTree Team * @package KTAPI * @version Version 0.9 */ abstract class KTAPI_FolderItem { /** * This is a reference to the core KTAPI controller * * @author KnowledgeTree Team * @access protected * @var object $ktapi The KTAPI object */ protected $ktapi; /** * This checks if a user can access an object with a certain permission. * * @author KnowledgeTree Team * @access public * @param object $object The object the user is trying to access * @param string $permission The permissions string * @return object $user The User object */ public function &can_user_access_object_requiring_permission(&$object, $permission) { $user = $this->ktapi->can_user_access_object_requiring_permission($object, $permission); return $user; } public abstract function getObject(); public abstract function getRoleAllocation(); public abstract function getPermissionAllocation(); public abstract function isSubscribed(); public abstract function unsubscribe(); public abstract function subscribe(); } /** * This class extends the PEAR_Error class for errors in the KTAPI class * * @author KnowledgeTree Team * @package KTAPI * @version Version 0.9 */ class KTAPI_Error extends PEAR_Error { /** * This method determines if there is an error in the object itself or just a common error * * @author KnowledgeTree Team * @access public * @return VOID */ public function KTAPI_Error($msg, $obj = null) { if (PEAR::isError($obj)) { parent::PEAR_Error($msg . ' - ' . $obj->getMessage()); } else { parent::PEAR_Error($msg); } } } /** * This class extends the KTAPI_Error class for errors in the KTAPI Document class * * @author KnowledgeTree Team * @package KTAPI * @version Version 0.9 */ class KTAPI_DocumentTypeError extends KTAPI_Error { } /** * This is the main KTAPI class * * @author KnowledgeTree Team * @package KTAPI * @version Version 0.9 */ class KTAPI { /** * This is the current session. * * @author KnowledgeTree Team * @access protected * @var object $session The KTAPI_Session object */ protected $session = null; protected $version = 3; private $esig_enabled; public function KTAPI() { $this->esig_enabled = $this->electronic_sig_enabled(); } /** * This returns the current session. * * @author KnowledgeTree Team * @access protected * @return object $session The KTAPI_Session object */ public function &get_session() { $session = $this->session; return $session; } /** * This returns the session user object or an error object. * * @author KnowledgeTree Team * @access protected * @return object $user SUCCESS - The User object | FAILURE - an error object */ public function & get_user() { $ktapi_session = $this->get_session(); if (is_null($ktapi_session) || PEAR::isError($ktapi_session)) { $error = new PEAR_Error(KTAPI_ERROR_SESSION_INVALID); return $error; } $user = $ktapi_session->get_user(); if (is_null($user) || PEAR::isError($user)) { $error = new PEAR_Error(KTAPI_ERROR_USER_INVALID); return $error; } return $user; } /** * Get the available columns for the given view (browse | search) * * @author KnowledgeTree Team * @access public * @param string $view The namespace for the view - ktcore.views.browse | ktcore.views.search * @return unknown */ function get_columns_for_view($view = 'ktcore.views.browse') { $ktapi_session = $this->get_session(); if (is_null($ktapi_session) || PEAR::isError($ktapi_session)) { $error = new PEAR_Error(KTAPI_ERROR_SESSION_INVALID); return $error; } $collection = new KTAPI_Collection(); return $collection->get_columns($view); } /** * This returns a permission object or an error object. * * @author KnowledgeTree Team * @access protected * @param string $permission The permissions string * @return object $permissions SUCCESS - The KTPermission object | FAILURE - an error object */ public function &get_permission($permission) { $permissions = & KTPermission::getByName($permission); if (is_null($permissions) || PEAR::isError($permissions)) { $error = new PEAR_Error(KTAPI_ERROR_PERMISSION_INVALID); return $error; } return $permissions; } /** * Returns an associative array of permission namespaces and their names * * @author KnowledgeTree Team * @access public * @return array */ public function get_permission_types() { $types = array(); $list = KTAPI_Permission::getList(); foreach($list as $val) { $types[$val->getNameSpace()] = $val->getName(); } return $types; } /** * Returns folder permissions * * @author KnowledgeTree Team * @access public * @param string * @param int * */ public function get_folder_permissions($username, $folder_id) { if (is_null($this->session)) { return array( "status_code" => 1, "message" => "Your session is not active" ); } /* We need to create a new instance of KTAPI to get another user */ $user_ktapi = new KTAPI(); $user_ktapi->start_system_session($username); $folder = KTAPI_Folder::get($user_ktapi, $folder_id); $permissions = $folder->getPermissionAllocation(); $user_ktapi->session_logout(); return array( "status_code" => 0, "results" => $permissions->permissions ); } /** * Returns folder permissions * * @access public * @param string * @param int * */ public function get_document_permissions($username, $document_id) { if (is_null($this->session)) { return array( "status_code" => 1, "message" => "Your session is not active" ); } /* We need to create a new instance of KTAPI to get another user */ $user_ktapi = new KTAPI(); $user_ktapi->start_system_session($username); $document = KTAPI_Document::get($user_ktapi, $document_id); if (get_class($document) == 'PEAR_Error') { return array( "status_code" => 0, "results" => null ); } $permissions = $document->getPermissionAllocation(); $user_ktapi->session_logout(); return array( "status_code" => 0, "results" => $permissions->permissions ); } /** * Add folder permission * * @author KnowledgeTree Team * @access public * @param string * @param string * @param int * */ public function add_folder_user_permissions($username, $folder_id, $namespace, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.permissions_change'); if ($response['status_code'] == 1) return $response; if (is_null($this->session)) { return array( "status_code" => 1, "message" => "Your session is not active" ); } /* First check that user trying to add permission can actually do so */ $folder = KTAPI_Folder::get($this, $folder_id); $permissions = $folder->getPermissionAllocation(); $detail = $permissions->permissions; if(!in_array("Manage security", $detail)) { return array( "status_code" => 1, "message" => "User does not have permission to manage security" ); } /* We need to create a new instance of KTAPI to get another user */ $user_ktapi = new KTAPI(); $user_ktapi->start_system_session($username); $folder = KTAPI_Folder::get($user_ktapi, $folder_id); if(PEAR::isError($folder)) { $user_ktapi->session_logout(); return array( "status_code" => 1, "message" => $folder->getMessage() ); } $permission = KTAPI_Permission::getByNamespace($namespace); if(PEAR::isError($permission)) { $user_ktapi->session_logout(); return array( "status_code" => 1, "message" => $permission->getMessage() ); } $user = KTAPI_User::getByUsername($username); if(PEAR::isError($user)) { $user_ktapi->session_logout(); return array( "status_code" => 1, "message" => $user->getMessage() ); } $permissions = $folder->getPermissionAllocation(); $permissions->add($user, $permission); $permissions->save(); } /** * Add folder role permission * * @access public * @param string * @param string * @param int * */ public function add_folder_role_permissions($role, $folder_id, $namespace, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.permissions_change'); if ($response['status_code'] == 1) return $response; if (is_null($this->session)) { return array( "status_code" => 1, "message" => "Your session is not active" ); } /* First check that user trying to add permission can actually do so */ $folder = KTAPI_Folder::get($this, $folder_id); $permissions = $folder->getPermissionAllocation(); $detail = $permissions->permissions; if(!in_array("Manage security", $detail)) { return array( "status_code" => 1, "message" => "User does not have permission to manage security" ); } $folder = KTAPI_Folder::get($this, $folder_id); if(PEAR::isError($folder)) { return array( "status_code" => 1, "message" => $folder->getMessage() ); } $permission = KTAPI_Permission::getByNamespace($namespace); if(PEAR::isError($permission)) { return array( "status_code" => 1, "message" => $permission->getMessage() ); } $role = KTAPI_Role::getByName($role); if(PEAR::isError($role)) { return array( "status_code" => 1, "message" => $role->getMessage() ); } $permissions = $folder->getPermissionAllocation(); $permissions->add($role, $permission); $permissions->save(); } /** * Add folder group permission * * @access public * @param string * @param string * @param int * */ public function add_folder_group_permissions($group, $folder_id, $namespace, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.permissions_change'); if ($response['status_code'] == 1) return $response; if (is_null($this->session)) { return array( "status_code" => 1, "message" => "Your session is not active" ); } /* First check that user trying to add permission can actually do so */ $folder = KTAPI_Folder::get($this, $folder_id); $permissions = $folder->getPermissionAllocation(); $detail = $permissions->permissions; if(!in_array("Manage security", $detail)) { return array( "status_code" => 1, "message" => "User does not have permission to manage security" ); } $folder = KTAPI_Folder::get($this, $folder_id); if(PEAR::isError($folder)) { return array( "status_code" => 1, "message" => $folder->getMessage() ); } $permission = KTAPI_Permission::getByNamespace($namespace); if(PEAR::isError($permission)) { return array( "status_code" => 1, "message" => $permission->getMessage() ); } $group = KTAPI_Role::getByName($group); if(PEAR::isError($group)) { return array( "status_code" => 1, "message" => $group->getMessage() ); } $permissions = $folder->getPermissionAllocation(); $permissions->add($group, $permission); $permissions->save(); } /** * This checks if a user can access an object with a certain permission. * * @author KnowledgeTree Team * @access public * @param object $object The internal document object or a folder object * @param string $permission The permissions string * @return object $user SUCCESS - The User object | FAILURE - an error object */ public function can_user_access_object_requiring_permission(&$object, $permission) { assert(!is_null($object)); assert(is_a($object,'DocumentProxy') || is_a($object,'FolderProxy') || is_a($object,'Document') || is_a($object,'Folder')); /* if(is_null($object) || PEAR::isError($object)){ $error = $object; return $object; } if(!is_a($object,'DocumentProxy') && !is_a($object,'FolderProxy') && !is_a($object,'Document') && !is_a($object,'Folder')){ $error = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); return $error; } */ $permissions = &KTAPI::get_permission($permission); if (is_null($permissions) || PEAR::isError($permissions)) { $error = $permissions; return $error; } $user = &KTAPI::get_user(); if (is_null($user) || PEAR::isError($user)) { $error = $user; return $error; } if (!KTPermissionUtil::userHasPermissionOnItem($user, $permission, $object)) { $error = new PEAR_Error(KTAPI_ERROR_INSUFFICIENT_PERMISSIONS); return $error; } return $user; } /** * Returns the version id for the associated version number * * @param int $document_id * @param string $version_number * @return int */ function get_url_version_number($document_id, $version_number) { $ktapi_session = $this->get_session(); if (is_null($ktapi_session) || PEAR::isError($ktapi_session)) { $error = new PEAR_Error(KTAPI_ERROR_SESSION_INVALID); return $error; } $document_id = sanitizeForSQL($document_id); $version_number = sanitizeForSQL($version_number); $pos = strpos($version_number, "."); $major = substr($version_number, 0, $pos); $minor = substr($version_number, ($pos+1)); $sql = "SELECT id FROM document_content_version WHERE document_id = {$document_id} AND major_version = '{$major}' AND minor_version = '{$minor}'"; $row = DBUtil::getOneResult($sql); $row = (int)$row['id']; if (is_null($row) || PEAR::isError($row)) { $row = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $row); } return $row; } /** * Search for documents matching the oem_no. * * Note that oem_no is associated with a document and not with version of file (document content). * oem_no is set on a document using document::update_sysdata(). * * @author KnowledgeTree Team * @access public * @param string $oem_no The oem number * @param boolean $idsOnly Defaults to true * @return array|object $results SUCCESS - the list of documents | FAILURE - and error object */ public function get_documents_by_oem_no($oem_no, $idsOnly=true) { $sql = array("SELECT id FROM documents WHERE oem_no=?",$oem_no); $rows = DBUtil::getResultArray($sql); if (is_null($rows) || PEAR::isError($rows)) { $results = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); } else { $results = array(); foreach($rows as $row) { $documentid = $row['id']; $results[] = $idsOnly ? $documentid : KTAPI_Document::get($this, $documentid); } } return $results; } /** * This returns a session object based on a session id. * * @author KnowledgeTree Team * @access public * @param string $session The sesssion id * @param string $ip The users ip address * @param string $app The originating application type Webservices|Webdav|Webapp * @return object $session_object SUCCESS - The KTAPI_Session object | FAILURE - an error object */ public function & get_active_session($session, $ip=null, $app='ws') { if (!is_null($this->session)) { $error = new PEAR_Error('A session is currently active.'); return $error; } $session_object = &KTAPI_UserSession::get_active_session($this, $session, $ip, $app); if (is_null($session_object) || PEAR::isError($session_object)) { $error = new PEAR_Error('Session is invalid'); return $error; } $this->session = &$session_object; return $session_object; } /** * Creates a session and returns the session object based on authentication credentials. * * @author KnowledgeTree Team * @access public * @param string $username The users username * @param string $password The password of the user * @param string $ip The users ip address * @param string $app The originating application type Webservices|Webdav|Webapp * @return object $session SUCCESS - The KTAPI_Session object | FAILURE - an error object */ public function & start_session($username, $password, $ip=null, $app='ws') { if (!is_null($this->session)) { $error = new PEAR_Error('A session is currently active.'); return $error; } $session = &KTAPI_UserSession::start_session($this, $username, $password, $ip, $app); if (is_null($session)) { $error = new PEAR_Error('Session is null.'); return $error; } if (PEAR::isError($session)) { $error = new PEAR_Error('Session is invalid. ' . $session->getMessage()); return $error; } $this->session = &$session; return $session; } /** * start a root session. * * @author KnowledgeTree Team * @access public * @return object $session The KTAPI_SystemSession */ public function & start_system_session($username = null) { if(is_null($username)) { $user = User::get(1); } else { $user = User::getByUserName($username); } if(PEAR::isError($user)) { return new PEAR_Error('Username invalid'); } $session = & new KTAPI_SystemSession($this, $user); $this->session = &$session; return $session; } /** * Starts an anonymous session. * * @author KnowledgeTree Team * @param string $ip The users ip address * @return object $session SUCCESS - The KTAPI_Session object | FAILURE - an error object */ function &start_anonymous_session($ip=null) { if (!is_null($this->session)) { $error = new PEAR_Error('A session is currently active.'); return $error; } $session = &KTAPI_AnonymousSession::start_session($this, $ip); if (is_null($session)) { $error = new PEAR_Error('Session is null.'); return $error; } if (PEAR::isError($session)) { $error = new PEAR_Error('Session is invalid. ' . $session->getMessage()); return $error; } $this->session = &$session; return $session; } function session_logout() { $this->session->logout(); $this->session = null; } /** * Gets the root folder. * Root folder id is always equal to '1' * * @author KnowledgeTree Team * @access public * @return object $folder The KTAPI_Folder object */ public function &get_root_folder() { $folder = $this->get_folder_by_id(1); return $folder; } /** * Obtains the folder using a folder id. * * @author KnowledgeTree Team * @access public * @param integer $folderid The id of the folder * @return object $session SUCCESS - The KTAPI_Folder object | FAILURE - an error object */ public function &get_folder_by_id($folderid) { if (is_null($this->session)) { $error = new PEAR_Error('A session is not active'); return $error; } $folder = KTAPI_Folder::get($this, $folderid); return $folder; } /** * Gets the the folder object based on the folder name * * @author KnowledgeTree Team * @access public * @param string $foldername The folder name * @return object $folder The KTAPI_Folder object */ public function &get_folder_by_name($foldername, $parentId = 1) { $folder = KTAPI_Folder::_get_folder_by_name($this, $foldername, $parentId); return $folder; } /** * This returns a refererence to a document based on document id. * * @author KnowledgeTree Team * @access public * @param integer $documentid The document id * @return object $document The KTAPI_Document object */ public function &get_document_by_id($documentid) { $document = KTAPI_Document::get($this, $documentid); return $document; } /** * This returns a document type id based on the name or an error object. * * @author KnowledgeTree Team * @access public * @param string $documenttype The document type * @return integer|object $result SUCCESS - the document type id | FAILURE - an error object */ public function get_documenttypeid($documenttype) { $sql = array("SELECT id FROM document_types_lookup WHERE name=? and disabled=0", $documenttype); $row = DBUtil::getOneResult($sql); if (is_null($row) || PEAR::isError($row)) { $result = new KTAPI_DocumentTypeError(KTAPI_ERROR_DOCUMENT_TYPE_INVALID, $row); } else { $result = $row['id']; } return $result; } /** * Returns the id for a link type or an error object. * * @author KnowledgeTree Team * @access public * @param string $linktype The link type * @return integer|object $result SUCCESS - the link type id | FAILURE - an error object */ public function get_link_type_id($linktype) { $sql = array("SELECT id FROM document_link_types WHERE name=?",$linktype); $row = DBUtil::getOneResult($sql); if (is_null($row) || PEAR::isError($row)) { $result = new PEAR_Error(KTAPI_ERROR_DOCUMENT_LINK_TYPE_INVALID); } else { $result = $row['id']; } return $result; } /** * Returns an array of document types or an error object. * * @author KnowledgeTree Team * @access public * @return array|object $results SUCCESS - the array of document types | FAILURE - an error object */ public function get_documenttypes() { $sql = "SELECT name FROM document_types_lookup WHERE disabled=0"; $rows = DBUtil::getResultArray($sql); if (is_null($rows) || PEAR::isError($rows)) { $results = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); } else { $results = array(); foreach($rows as $row) { $results[] = $row['name']; } } return $results; } /** * Returns an array of document link types or an error object. * * @author KnowledgeTree Team * @access public * @return array|object $results SUCCESS - the array of document link types | FAILURE - an error object */ public function get_document_link_types() { $sql = "SELECT name FROM document_link_types order by name"; $rows = DBUtil::getResultArray($sql); if (is_null($rows) || PEAR::isError($rows)) { $response['status_code'] = 1; if(is_null($rows)) { $response['message'] = "No types"; } else { $response['message'] = $rows->getMessage(); } return $response; } else { $results = array(); foreach($rows as $row) { $results[] = $row['name']; } } $response['status_code'] = 0; $response['results'] = $results; return $response; } /** * This should actually not be in ktapi, but in webservice * This method gets metadata fieldsets based on the document type * * @author KnowledgeTree Team * @access public * @param string $document_type The type of document * @return mixed Error object|SOAP object|Array of fieldsets */ public function get_document_type_metadata($document_type='Default') { // now get document type specifc ids $typeid =$this->get_documenttypeid($document_type); if (is_a($typeid, 'KTAPI_DocumentTypeError')) { return $typeid; } if (is_null($typeid) || PEAR::isError($typeid)) { $response['message'] = $typeid->getMessage(); return new SOAP_Value('return',"{urn:$this->namespace}kt_metadata_response", $response); } $doctype_ids = KTFieldset::getForDocumentType($typeid, array('ids' => false)); if (is_null($doctype_ids) || PEAR::isError($doctype_ids)) { $response['message'] = $generic_ids->getMessage(); return new SOAP_Value('return',"{urn:$this->namespace}kt_metadata_response", $response); } // first get generic ids $generic_ids = KTFieldset::getGenericFieldsets(array('ids' => false)); if (is_null($generic_ids) || PEAR::isError($generic_ids)) { $response['message'] = $generic_ids->getMessage(); return new SOAP_Value('return',"{urn:$this->namespace}kt_metadata_response", $response); } // lets merge the results $fieldsets = kt_array_merge($generic_ids, $doctype_ids); $results = array(); foreach ($fieldsets as $fieldset) { if ($fieldset->getIsConditional()) { /* this is not implemented...*/ continue; } $fields = $fieldset->getFields(); $result = array( 'fieldset' => $fieldset->getName(), 'description' => $fieldset->getDescription() ); $fieldsresult = array(); foreach ($fields as $field) { $value = 'n/a'; //$controltype = 'string'; // Replace with true $controltype = strtolower($field->getDataType()); if ($field->getHasLookup()) { $controltype = 'lookup'; if ($field->getHasLookupTree()) { $controltype = 'tree'; } } $options = array(); if ($field->getInetLookupType() == 'multiwithcheckboxes' || $field->getInetLookupType() == 'multiwithlist') { $controltype = 'multiselect'; } switch ($controltype) { case 'lookup': $selection = KTAPI::get_metadata_lookup($field->getId()); break; case 'tree': $selection = KTAPI::get_metadata_tree($field->getId()); break; case 'large text': $options = array( 'ishtml' => $field->getIsHTML(), 'maxlength' => $field->getMaxLength() ); $selection= array(); break; case 'multiselect': $selection = KTAPI::get_metadata_lookup($field->getId()); $options = array( 'type' => $field->getInetLookupType() ); break; default: $selection= array(); } $fieldsresult[] = array( 'name' => $field->getName(), 'required' => $field->getIsMandatory(), 'value' => $value, 'description' => $field->getDescription(), 'control_type' => $controltype, 'selection' => $selection, 'options' => $options ); } $result['fields'] = $fieldsresult; $results [] = $result; } return $results; } /** * Returns an array of username/name combinations or an error object. * * @author KnowledgeTree Team * @access public * @return array|object $results SUCCESS - the array of all username/name combinations | FAILURE - an error object */ public function get_users() { $sql = "SELECT username, name FROM users WHERE disabled=0"; $rows = DBUtil::getResultArray($sql); if (is_null($rows) || PEAR::isError($rows)) { $results = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); } else { $results = $rows; } return $results; } /** * This returns an array for a metadata tree lookup or an error object. * * @author KnowledgeTree Team * @access public * @param integer $fieldid The field id to get metadata for * @return array|object $results SUCCESS - the array of metedata for the field | FAILURE - an error object */ public function get_metadata_lookup($fieldid) { $sql = "SELECT name FROM metadata_lookup WHERE disabled=0 AND document_field_id=$fieldid ORDER BY name"; $rows = DBUtil::getResultArray($sql); if (is_null($rows) || PEAR::isError($rows)) { $results = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); } else { $results = array(); foreach($rows as $row) { $results[] = $row['name']; } } return $results; } /** * This returns a metadata tree or an error object. * * @author KnowledgeTree Team * @access private * @param integer $fieldid The field id of the document to get data for * @param integer $parentid The id of the parent of the metadata tree * @return array|object $results SUCCESS - the array of metadata for the field | FAILURE - an error object */ private function _load_metadata_tree($fieldid, $parentid=0) { $results = KTAPI::get_metadata_lookup($fieldid); return $results; /* $sql = "SELECT id, name FROM metadata_lookup_tree WHERE document_field_id=$fieldid AND metadata_lookup_tree_parent=$parentid"; $rows = DBUtil::getResultArray($sql); if (is_null($rows) || PEAR::isError($rows)) { return new PEAR_Error(KTAPI_ERROR_INTERNAL_ERROR); } $results=array(); foreach($rows as $row) { $result=array( 'name' => $row['name'], 'children' => load($fieldid, $row['id']) ); $results[] = $result; } return $results;*/ } /** * This returns a metadata tree or an error object. * * @author KnowledgeTree Team * @access public * @param integer $fieldid The id of the tree field to get the metadata for * @return array|object $results SUCCESS - the array of metadata for the field | FAILURE - an error object */ public function get_metadata_tree($fieldid) { $results = KTAPI::_load_metadata_tree($fieldid); return $results; } /** * Returns a list of active workflows or an error object. * * @author KnowledgeTree Team * @access public * @return array|object $results SUCCESS - the array of active workflows | FAILURE - an error object */ public function get_workflows() { $sql = "SELECT name FROM workflows WHERE enabled=1"; $rows=DBUtil::getResultArray($sql); if (is_null($rows) || PEAR::isError($rows)) { $results = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); } else { $results = array(); foreach($rows as $row) { $results[] = $row['name']; } } return $results; } /** * Get the users subscriptions * * @author KnowledgeTree Team * @access public * @param string $filter * @return array of Subscription */ public function getSubscriptions($filter=null) { $user = $this->get_user(); $userId = $user->getID(); $subscriptions = SubscriptionManager::listSubscriptions($userId); return $subscriptions; } /** * Perform a bulk action on a list of folders and documents * Available actions are copy, move, delete, archive, checkout, undo_checkout and immute. * * * $ktapi = new KTAPI(); * $session = $ktapi->start_system_session(); * * $items = array(); * $items['documents'][] = $document_id; * $items['folders'][] = $folder_id; * * $response = $ktapi->performBulkAction('move', $items, 'Reason for moving', $target_folder_id); * if($response['status_code'] != 0) return 'ERROR'; * * * * @author KnowledgeTree Team * @access public * @param string $action The action to be performed * @param array $items A list of id's and item type in the format array('documents' => array(1,6), 'folders' => array(3,4)) * @param string $reason The reason for performing the action - only immute does not require a reason. * @param integer $target_folder_id The id of the target folder if required - copy and move require this. * @return array The response array. On success response['results'] will be empty | contain an array of failed items. */ public function performBulkAction($action, $items, $reason = '', $target_folder_id = null, $sig_username = '', $sig_password = '') { // NOTE at the moment this checks for the electronic signature on ANY bulk action // this is fine for now as the only actions defined are: // copy, move, delete, archive, checkout, undo_checkout and immute // ALL of which require signature checking when turned on // IF you are adding more actions. be sure they require signature checking // or EXCLUDE them from the check to prevent them being affected $response = $this->_check_electronic_signature($target_folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.permissions_change'); if ($response['status_code'] == 1) return $response; $response['status_code'] = 1; if(!is_array($items)){ $response['message'] = sprintf(_kt("The list of id's must be an array of format array('documents' => array(1,2), 'folders' => array(2,3)). Received: %s") , $items); return $response; } if(empty($items)){ $response['message'] = _kt('No items found to perform the action on.'); return $response; } if(!is_string($action)){ $response['message'] = sprintf(_kt("The bulk action to perform must be a string. Received: %s") , $action); return $response; } // Check that the action exists in the bulk actions class $bulkActions = new ReflectionClass('KTAPI_BulkActions'); $methods = $bulkActions->getMethods(); $exists = false; foreach ($methods as $method){ if($method->getName() == $action){ $actionMethod = $method; $exists = true; break; } } if(!$exists) { $response['message'] = sprintf(_kt("The requested action has not been implemented: %s") , $action); return $response; } // Create the document and folder objects $objects = array(); if(isset($items['folders'])){ foreach($items['folders'] as $item) { $folder = $this->get_folder_by_id($item); $objects[] = $folder; } } if(isset($items['documents'])){ foreach($items['documents'] as $item) { $document = $this->get_document_by_id($item); $objects[] = $document; } } if(empty($objects)){ $response['message'] = _kt('No folder or document items found to perform the action on.'); return $response; } // perform the action $ktapi_bulkactions = new KTAPI_BulkActions($this); // Get target folder object if required if(in_array($action, array('move', 'copy'))){ if(!is_int($target_folder_id) || empty($target_folder_id)){ $response['message'] = _kt('No target folder has been specified.'); return $response; } $target = $this->get_folder_by_id($target_folder_id); // call the action $result = $ktapi_bulkactions->$action($objects, $target, $reason); }else if($action == 'immute'){ // call the action $result = $ktapi_bulkactions->$action($objects); }else { // call the action $result = $ktapi_bulkactions->$action($objects, $reason); } if(PEAR::isError($result)) { $response['message'] = sprintf(_kt("The bulk action failed: %s") , $result->getMessage()); return $response; } // if failed items are returned - flatten the objects if(is_array($result)){ if(isset($result['docs'])){ foreach ($result['docs'] as $key => $item){ $result['docs'][$key]['object'] = $item['object']->get_detail(); } } if(isset($result['folders'])){ foreach ($result['folders'] as $key => $item){ $result['folders'][$key]['object'] = $item['object']->get_detail(); } } } // For a successful action $response['status_code'] = 0; $response['results'] = $result; return $response; } /* *** ACL Roles and Role_Allocation *** */ /** * Get a list of available roles * * @author KnowledgeTree Team * @access public * @param string $filter The beginning letter(s) of the role being searched for * @return array Response. */ public function get_roles($filter = null) { $response['status_code'] = 1; // check the filter if(!empty($filter)) { if(!is_string($filter)){ $response['message'] = _kt('Filter should be a string.'); return $response; } // escape filter string - prevent sql injection $filter = addslashes($filter); $filter = "name like '{$filter}%'"; } $listing = KTAPI_Role::getList($filter); if(PEAR::isError($listing)){ $response['message'] = $listing->getMessage(); return $response; } // flatten role objects $roles = array(); foreach ($listing as $ktapi_roll) { $roles[] = array( 'id' => $ktapi_roll->getId(), 'name' => $ktapi_roll->getName(), ); } $response['status_code'] = 0; $response['results'] = $roles; return $response; } /** * Get a role using its id * * @author KnowledgeTree Team * @access public * @param integer $role_id The id of the role * @return array Response */ public function get_role_by_id($role_id) { $response['status_code'] = 1; if(!is_numeric($role_id)){ $response['message'] = _kt('Role id must be numeric.'); return $response; } $role = KTAPI_Role::getById($role_id); if(PEAR::isError($role)) { $response['message'] = $role->getMessage(); return $response; } $response['status_code'] = 0; $response['results'] = array( 'id' => $role->getId(), 'name' => $role->getName() ); return $response; } /** * Get a role based on its name * * @author KnowledgeTree Team * @access public * @param string $role_name The name of the role * @return array Response */ public function get_role_by_name($role_name) { $response['status_code'] = 1; if(!is_string($role_name)){ $response['message'] = _kt('Role name must be a string.'); return $response; } $role = KTAPI_Role::getByName($role_name); if(PEAR::isError($role)) { $response['message'] = $role->getMessage(); return $response; } $response['status_code'] = 0; $response['results'] = array( 'id' => $role->getId(), 'name' => $role->getName() ); return $response; } /** * Get the list of role allocations on a folder * * @author KnowledgeTree Team * @access public * @param integar $folder_id The id of the folder * @return array Response */ public function get_role_allocation_for_folder($folder_id) { $response['status_code'] = 1; if(!is_numeric($folder_id)){ $response['message'] = _kt('Folder id must be numeric.'); return $response; } $folder = $this->get_folder_by_id($folder_id); if(PEAR::isError($folder)) { $response['message'] = $folder->getMessage(); return $response; } $role_allocation = $folder->getRoleAllocation(); // flatten object $membership = $role_allocation->getMembership(); $response['status_code'] = 0; $response['results'] = $membership; return $response; } /** * Add a user to a role on a folder * * @author KnowledgeTree Team * @access public * @param integer $folder_id The folder id * @param integer $role_id The id of the role being modified * @param integer $user_id The id of the user to be added * @return array Response */ public function add_user_to_role_on_folder($folder_id, $role_id, $user_id, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.role_allocations_change'); if ($response['status_code'] == 1) return $response; $response['status_code'] = 1; if(!is_numeric($user_id)){ $response['message'] = _kt('User id must be numeric.'); return $response; } $member['users'][] = $user_id; return $this->add_members_to_role_on_folder($folder_id, $role_id, $member, $sig_username, $sig_password, $reason); } /** * Add a group to a role on a folder * * @author KnowledgeTree Team * @access public * @param integer $folder_id The folder id * @param integer $role_id The id of the role being modified * @param integer $group_id The id of the group to be added * @return array Response */ public function add_group_to_role_on_folder($folder_id, $role_id, $group_id, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.role_allocations_change'); if ($response['status_code'] == 1) return $response; $response['status_code'] = 1; if(!is_numeric($group_id)){ $response['message'] = _kt('Group id must be numeric.'); return $response; } $member['groups'][] = $group_id; return $this->add_members_to_role_on_folder($folder_id, $role_id, $member, $sig_username, $sig_password, $reason); } /** * Remove a user from a role on a folder * * @author KnowledgeTree Team * @access public * @param integer $folder_id The folder id * @param integer $role_id The id of the role being modified * @param integer $user_id The id of the user to be removed * @return array Response */ public function remove_user_from_role_on_folder($folder_id, $role_id, $user_id, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.role_allocations_change'); if ($response['status_code'] == 1) return $response; $response['status_code'] = 1; if(!is_numeric($user_id)){ $response['message'] = _kt('User id must be numeric.'); return $response; } $member['users'][] = $user_id; return $this->remove_members_from_role_on_folder($folder_id, $role_id, $member, $sig_username, $sig_password, $reason); } /** * Remove a group from a role on a folder * * @author KnowledgeTree Team * @access public * @param integer $folder_id The folder id * @param integer $role_id The id of the role being modified * @param integer $group_id The id of the group to be removied * @return array Response */ public function remove_group_from_role_on_folder($folder_id, $role_id, $group_id, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.role_allocations_change'); if ($response['status_code'] == 1) return $response; $response['status_code'] = 1; if(!is_numeric($group_id)){ $response['message'] = _kt('Group id must be numeric.'); return $response; } $member['groups'][] = $group_id; return $this->remove_members_from_role_on_folder($folder_id, $role_id, $member, $sig_username, $sig_password, $reason); } /** * Remove members (user, group) from a role on a folder * * @author KnowledgeTree Team * @access public * @param integer $folder_id The folder id * @param integer $role_id The id of the role being modified * @param array $members The list of id's of members to be removed - array('users' => array(1,2), 'groups' => array(2,4)) * @return array Response */ public function remove_members_from_role_on_folder($folder_id, $role_id, $members, $sig_username = '', $sig_password = '', $reason = '') { return $this->update_members_on_role_on_folder($folder_id, $role_id, $members, 'remove', $sig_username, $sig_password, $reason); } /** * Add members (user, group) to a role on a folder * * @author KnowledgeTree Team * @access public * @param integer $folder_id The folder id * @param integer $role_id The id of the role being modified * @param array $members The list of id's of members to be added - array('users' => array(1,2), 'groups' => array(2,4)) * @return array Response */ public function add_members_to_role_on_folder($folder_id, $role_id, $members, $sig_username = '', $sig_password = '', $reason = '') { return $this->update_members_on_role_on_folder($folder_id, $role_id, $members, 'add', $sig_username, $sig_password, $reason); } /** * Add / remove members (user, group) to / from a role on a folder * * @author KnowledgeTree Team * @access private * @param integer $folder_id The folder id * @param integer $role_id The id of the role being modified * @param array $members The list of id's of members to be updated - array('users' => array(1,2), 'groups' => array(2,4)) * @param string $update The type of modification - add | remove * @return array Response */ private function update_members_on_role_on_folder($folder_id, $role_id, $members, $update = 'add', $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.role_allocations_change'); if ($response['status_code'] == 1) return $response; // Check input information $response['status_code'] = 1; if(!is_numeric($folder_id)){ $response['message'] = _kt('Folder id must be numeric.'); return $response; } if(!is_numeric($role_id)){ $response['message'] = _kt('Role id must be numeric.'); return $response; } if(!is_array($members)){ $response['message'] = _kt("The list of members must be in the format: array('users' => array(1,2), 'groups' => array(2,4)).')"); return $response; } if(!isset($members['users']) && !isset($members['groups'])){ $response['message'] = _kt("The list of members must be in the format: array('users' => array(1,2), 'groups' => array(2,4)).')"); return $response; } // Get folder and role objects $folder = $this->get_folder_by_id($folder_id); if(PEAR::isError($folder)) { $response['message'] = $folder->getMessage(); return $response; } $role = KTAPI_Role::getById($role_id); if(PEAR::isError($role)) { $response['message'] = $role->getMessage(); return $response; } // Get the role allocation for the folder $role_allocation = $folder->getRoleAllocation(); // Get member objects and add them to the role // Users if(isset($members['users'])){ foreach($members['users'] as $user_id){ // Get the user object $member = KTAPI_User::getById($user_id); if(PEAR::isError($member)) { $response['message'] = $member->getMessage(); return $response; } // Add to / remove from the role $role_allocation->$update($role, $member); } } // Groups if(isset($members['groups'])){ foreach($members['groups'] as $group_id){ // Get the group object $member = KTAPI_Group::getById($group_id); if(PEAR::isError($member)) { $response['message'] = $member->getMessage(); return $response; } // Add to / remove from the role $role_allocation->$update($role, $member); } } // Save the new allocations $role_allocation->save(); $response['status_code'] = 0; return $response; } /** * Check if a user or group is allocated to a role on the folder * * @author KnowledgeTree Team * @access public * @param integer $folder_id The folder id * @param integer $role_id The id of the role being checked * @param integer $member_id The id of the user or group * @param string $member_type user | group * @return array Response */ public function is_member_in_role_on_folder($folder_id, $role_id, $member_id, $member_type = 'user') { $response['status_code'] = 1; // Get folder and role objects $folder = $this->get_folder_by_id($folder_id); if(PEAR::isError($folder)) { $response['message'] = $folder->getMessage(); return $response; } $role = KTAPI_Role::getById($role_id); if(PEAR::isError($role)) { $response['message'] = $role->getMessage(); return $response; } // get the member object switch($member_type){ case 'user': $member = KTAPI_User::getById($member_id); break; case 'group': $member = KTAPI_Group::getById($member_id); break; default: $response['message'] = _kt('Unrecognised member type. Must be group or user.'); return $response; } if(PEAR::isError($member)) { $response['message'] = $member->getMessage(); return $response; } // Get the role allocation for the folder $role_allocation = $folder->getRoleAllocation(); $check = $role_allocation->doesRoleHaveMember($role, $member); $result = ($check) ? 'YES' : 'NO'; $response['status_code'] = 0; $response['results'] = $result; return $response; } /** * Removes all members (users, groups) from all roles or from the specified role on the folder * * @author KnowledgeTree Team * @access public * @param integer $folder_id The folder id * @param integer $role_id Optional. The id of the role being reset. * @return array Response */ public function remove_all_role_allocation_from_folder($folder_id, $role_id = null, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.role_allocations_change'); if ($response['status_code'] == 1) return $response; $response['status_code'] = 1; // Get folder and role objects $folder = $this->get_folder_by_id($folder_id); if(PEAR::isError($folder)) { $response['message'] = $folder->getMessage(); return $response; } $role = null; if(!empty($role_id)){ $role = KTAPI_Role::getById($role_id); if(PEAR::isError($role)) { $response['message'] = $role->getMessage(); return $response; } } // Get the role allocation for the folder $role_allocation = $folder->getRoleAllocation(); $role_allocation->removeAll($role); $role_allocation->save(); $response['status_code'] = 0; $response['results'] = $result; return $response; } /** * Overrides the parents role allocation * * @author KnowledgeTree Team * @access public * @param integer $folder_id The folder id * @return array Response */ public function override_role_allocation_on_folder($folder_id, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.role_allocations_change'); if ($response['status_code'] == 1) return $response; $response['status_code'] = 1; // Get folder object $folder = $this->get_folder_by_id($folder_id); if(PEAR::isError($folder)) { $response['message'] = $folder->getMessage(); return $response; } // Get the role allocation for the folder $role_allocation = $folder->getRoleAllocation(); $result = $role_allocation->overrideAllocation(); $response['status_code'] = 0; $response['results'] = $result; return $response; } /** * Inherits the role allocation from the parent * * @author KnowledgeTree Team * @access public * @param integer $folder_id The folder id * @return array Response */ public function inherit_role_allocation_on_folder($folder_id, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.role_allocations_change'); if ($response['status_code'] == 1) return $response; $response['status_code'] = 1; // Get folder object $folder = $this->get_folder_by_id($folder_id); if(PEAR::isError($folder)) { $response['message'] = $folder->getMessage(); return $response; } // Get the role allocation for the folder $role_allocation = $folder->getRoleAllocation(); $result = $role_allocation->inheritAllocation(); $response['status_code'] = 0; $response['results'] = $result; return $response; } /* *** Refactored web services functions *** */ /** * Creates a new anonymous session. * * @author KnowledgeTree Team * @access public * @param string $ip The users IP address * @return array Response 'results' contain the session id | 'message' contains the error message on failure */ function anonymous_login($ip=null) { $session = $this->start_anonymous_session($ip); if(PEAR::isError($session)){ $response['status_code'] = 1; $response['message']= $session->getMessage(); return $response; } $session= $session->get_session(); $response['results'] = $session; $response['message'] = ''; $response['status_code'] = 0; return $response; } /** * Creates a new session for the user. * * @author KnowledgeTree Team * @access public * @param string $username The users username * @param string $password The users password * @param string $ip Optional. The users IP address * @return array Response 'results' contain the session id | 'message' contains the error message on failure */ function login($username, $password, $ip=null) { $session = $this->start_session($username,$password, $ip); if(PEAR::isError($session)){ $response['status_code'] = 1; $response['message']= $session->getMessage(); return $response; } $session = $session->get_session(); $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $session; return $response; } /** * Closes an active session. * * @author KnowledgeTree Team * @access public * @return array Response Empty on success | 'message' contains the error message on failure */ function logout() { $session = &$this->get_session(); if(PEAR::isError($session)){ $response['status_code'] = 1; $response['message']= $session->getMessage(); return $response; } $session->logout(); $response['status_code'] = 0; return $response; } /** * Returns the folder details for a given folder id. * * @author KnowledgeTree Team * @access public * @param integer $folder_id The id of the folder * @return array Response 'results' contains kt_folder_detail | 'message' contains error message on failure */ function get_folder_detail($folder_id) { $folder = &$this->get_folder_by_id($folder_id); if (PEAR::isError($folder)) { $response['status_code'] = 1; $response['message']= $folder->getMessage(); return $response; } $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $folder->get_detail(); return $response; } /** * Retrieves all shortcuts linking to a specific folder * * @author KnowledgeTree Team * @access public * @param integer $folder_id The id of the folder * @return array Response 'results' contains kt_folder_shortcuts | 'message' contains error message on failure * */ function get_folder_shortcuts($folder_id) { $folder = $this->get_folder_by_id($folder_id); if(PEAR::isError($folder)){ $response['status_code'] = 1; $response['message']= $folder->getMessage(); return $response; } $shortcuts = $folder->get_shortcuts(); if(PEAR::isError($shortcuts)){ $response['status_code'] = 1; $response['message']= $shortcuts->getMessage(); return $response; } $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $shortcuts; return $response; } /** * Returns folder detail given a folder name which could include a full path. * * @author KnowledgeTree Team * @access public * @param string $folder_name The name of the folder * @return array Response 'results' contains kt_folder_detail | 'message' contains error message on failure */ function get_folder_detail_by_name($folder_name) { $folder = &$this->get_folder_by_name($folder_name); if(PEAR::isError($folder)){ $response['status_code'] = 1; $response['message']= $folder->getMessage(); return $response; } $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $folder->get_detail(); return $response; } /** * Returns the contents of a folder - list of contained documents and folders * * @author KnowledgeTree Team * @access public * @param integer $folder_id The id of the folder * @param integer $depth The depth to display - 1 = direct contents, 2 = include contents of the contained folders, etc * @param string $what Filter on what should be returned, takes a combination of the following: D = documents, F = folders, S = shortcuts * @return array Response 'results' contains kt_folder_contents | 'message' contains error message on failure */ function get_folder_contents($folder_id, $depth=1, $what='DFS') { $folder = &$this->get_folder_by_id($folder_id); if(PEAR::isError($folder)){ $response['status_code'] = 1; $response['message']= $folder->getMessage(); return $response; } $listing = $folder->get_listing($depth, $what); $contents = array( 'folder_id' => $folder_id+0, 'folder_name'=>$folder->get_folder_name(), 'full_path'=>$folder->get_full_path(), 'items'=>$listing ); $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $contents; return $response; } /** * Creates a new folder inside the given folder * * @author KnowledgeTree Team * @access public * @param integer $folder_id The id of the parent folder * @param string $folder_name The name of the new folder * @return array Response 'results' contains kt_folder_detail | 'message' contains error message on failure */ function create_folder($folder_id, $folder_name, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.add'); if ($response['status_code'] == 1) return $response; $folder = &$this->get_folder_by_id($folder_id); if (PEAR::isError($folder)) { $response['status_code'] = 1; $response['message']= $folder->getMessage(); return $response; } $newfolder = $folder->add_folder($folder_name); if (PEAR::isError($newfolder)) { $response['status_code'] = 1; $response['message']= $newfolder->getMessage(); return $response; } $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $newfolder->get_detail(); return $response; } /** * Creates a shortcut to an existing folder * * @author KnowledgeTree Team * @access public * @param integer $target_folder_id Id of the folder containing the shortcut. * @param integer $source_folder_id Id of the folder to which the shortcut will point. * @return array Response 'results' contains kt_shortcut_detail | 'message' contains error message on failure */ function create_folder_shortcut($target_folder_id, $source_folder_id, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.create_shortcut'); if ($response['status_code'] == 1) return $response; $folder = &$this->get_folder_by_id($target_folder_id); if (PEAR::isError($folder)) { $response['status_code'] = 1; $response['message']= $folder->getMessage(); return $response; } $source_folder = &$this->get_folder_by_id($source_folder_id); if (PEAR::isError($source_folder)) { $response['status_code'] = 1; $response['message']= $source_folder->getMessage(); return $response; } $shortcut = &$folder->add_folder_shortcut($source_folder_id); if (PEAR::isError($shortcut)) { $response['status_code'] = 1; $response['message']= $shortcut->getMessage(); return $response; } $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $shortcut->get_detail(); return $response; } /** * Creates a shortcut to an existing document * * @author KnowledgeTree Team * @access public * @param integer $target_folder_id Id of the parent folder containing the shortcut * @param integer $source_document_id Id of the document to which the shortcut will point * @return array Response 'results' contains kt_document_detail | 'message' contains error message on failure */ function create_document_shortcut($target_folder_id, $source_document_id, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.create_shortcut'); if ($response['status_code'] == 1) return $response; $folder = &$this->get_folder_by_id($target_folder_id); if (PEAR::isError($folder)) { $response['status_code'] = 1; $response['message']= $folder->getMessage(); return $response; } $source_document = &$this->get_document_by_id($source_document_id); if (PEAR::isError($source_document)) { $response['status_code'] = 1; $response['message']= $source_document->getMessage(); return $response; } $shortcut = &$folder->add_document_shortcut($source_document_id); if (PEAR::isError($shortcut)) { $response['status_code'] = 1; $response['message']= $shortcut->getMessage(); return $response; } $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $shortcut->get_detail(); return $response; } /** * Deletes a folder. * * @author KnowledgeTree Team * @access public * @param integer $folder_id The id of the folder to delete * @param string $reason The reason for performing the deletion * @return array Response | 'message' contains error message on failure */ function delete_folder($folder_id, $reason, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.delete'); if ($response['status_code'] == 1) return $response; $folder = &$this->get_folder_by_id($folder_id); if (PEAR::isError($folder)) { $response['status_code'] = 1; $response['message']= $folder->getMessage(); return $response; } $result = $folder->delete($reason); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message']= $result->getMessage(); return $response; } $response['status_code'] = 0; return $response; } /** * Renames a folder. * * @author KnowledgeTree Team * @access public * @param integer $folder_id The id of the folder * @param string $newname The new name of the folder * @return array Response | 'message' contains error message on failure */ function rename_folder($folder_id, $newname, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.rename'); if ($response['status_code'] == 1) return $response; $folder = &$this->get_folder_by_id($folder_id); if (PEAR::isError($folder)) { $response['status_code'] = 1; $response['message']= $folder->getMessage(); return $response; } $result = $folder->rename($newname); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message']= $result->getMessage(); return $response; } $response['status_code'] = 0; return $response; } /** * Makes a copy of a folder in another location. * * @author KnowledgeTree Team * @access public * @param integer $sourceid The id of the folder to be copied * @param integer $targetid The id of the folder in which the copy should be placed * @param string $reason The reason for performing the copy * @return array Response | 'message' contains error message on failure */ function copy_folder($source_id, $target_id, $reason, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($source_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.copy'); if ($response['status_code'] == 1) return $response; $src_folder = &$this->get_folder_by_id($source_id); if (PEAR::isError($src_folder)) { $response['status_code'] = 1; $response['message']= $src_folder->getMessage(); return $response; } $tgt_folder = &$this->get_folder_by_id($target_id); if (PEAR::isError($tgt_folder)) { $response['status_code'] = 1; $response['message']= $tgt_folder->getMessage(); return $response; } $result= $src_folder->copy($tgt_folder, $reason); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message']= $result->getMessage(); return $response; } $response['status_code'] = 0; if($this->version >= 2){ $sourceName = $src_folder->get_folder_name(); $targetPath = $tgt_folder->get_full_path(); $response['results'] = $this->get_folder_detail_by_name($targetPath . '/' . $sourceName); return $response; } return $response; } /** * Moves a folder to another location. * * @author KnowledgeTree Team * @access public * @param integer $sourceid The id of the folder to be moved * @param integer $targetid The id of the folder into which the folder should be moved * @param string $reason The reason for performing the move * @return array Response | 'message' contains error message on failure */ function move_folder($source_id, $target_id, $reason, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($source_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.move'); if ($response['status_code'] == 1) return $response; $src_folder = &$this->get_folder_by_id($source_id); if (PEAR::isError($src_folder)) { $response['status_code'] = 1; $response['message']= $src_folder->getMessage(); return $response; } $tgt_folder = &$this->get_folder_by_id($target_id); if (PEAR::isError($tgt_folder)) { $response['status_code'] = 1; $response['message']= $tgt_folder->getMessage(); return $response; } $result = $src_folder->move($tgt_folder, $reason); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message']= $result->getMessage(); return $response; } $response['status_code'] = 0; if($this->version >= 2){ $response['results'] = $this->get_folder_detail($source_id); return $response; } return $response; } /** * Returns a list of document types. * * @author KnowledgeTree Team * @access public * @return array Response 'results' contain kt_document_types_response | 'message' contains error message on failure */ public function get_document_types() { $result = $this->get_documenttypes(); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message']= $result->getMessage(); return $response; } $response['status_code']= 0; $response['results']= $result; return $response; } /** * Returns a list of document link types - Attachment, Reference, etc * * @return array Response 'results' contain kt_document_link_types_response | 'message' contains error message on failure */ public function get_document_link_types_list() { $result = $this->get_document_link_types(); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message']= $result->getMessage(); return $response; } $response['status_code']= 0; $response['results'] = $result; return $response; } /** * Returns document details given a document_id. * Details can be filtered using a combination of the following: M = metadata, L = links, T = workflow transitions, * V = version history, H = transaction history * * @author KnowledgeTree Team * @access public * @param integer $document_id The id of the document * @param string $detailstr Optional. Filter on the level of detail to return. * @return array Response 'results' contain kt_document_detail | 'message' contains error message on failure */ public function get_document_detail($document_id, $detailstr='') { $document = $this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message']= $document->getMessage(); return $response; } $detail = $document->get_detail(); if (PEAR::isError($detail)) { $response['status_code'] = 1; $response['message']= $detail->getMessage(); return $response; } $response['status_code'] = 0; $response['message'] = ''; if ($this->version >= 2) { $detail['metadata'] = array(); $detail['links'] = array(); $detail['transitions'] = array(); $detail['version_history'] = array(); $detail['transaction_history'] = array(); if (stripos($detailstr,'M') !== false) { $response = $this->get_document_metadata($document_id); $detail['metadata'] = $response['results']; $detail['name'] = 'metadata'; } if (stripos($detailstr,'L') !== false) { $response = $this->get_document_links($document_id); $detail['links'] = $response['results']; $detail['name'] = 'links'; } if (stripos($detailstr,'T') !== false) { $response = $this->get_document_workflow_transitions($document_id); $detail['transitions'] = $response['results'] ; $detail['name'] = 'transitions'; } if (stripos($detailstr,'V') !== false) { $response = $this->get_document_version_history($document_id); $detail['version_history'] = $response['results']; $detail['name'] = 'version_history'; } if (stripos($detailstr,'H') !== false) { $response = $this->get_document_transaction_history($document_id); $detail['transaction_history'] = $response['results']; $detail['name'] = 'transaction_history'; } } $response['results'] = $detail; return $response; } /** * Returns the document details given the filename of the document * Details can be filtered using a combination of the following: M = metadata, L = links, T = workflow transitions, * V = version history, H = transaction history * * @author KnowledgeTree Team * @access public * @param integer $folder_id The id of the folder in which to find the document * @param string $filename The filename of the document * @param string $detail Optional. Filter on the level of detail to return. * @return array Response 'results' contain kt_document_detail | 'message' contains error message on failure */ public function get_document_detail_by_filename($folder_id, $filename, $detail='') { return $this->get_document_detail_by_name($folder_id, $filename, 'F', $detail); } /** * Returns the document details give the title of the document * Details can be filtered using a combination of the following: M = metadata, L = links, T = workflow transitions, * V = version history, H = transaction history * * @author KnowledgeTree Team * @access public * @param interger $folder_id The id of the folder in which to find the document * @param string $title The title of the document * @param string $detail Optional. Filter on the level of detail to return. * @return array Response 'results' contain kt_document_detail | 'message' contains error message on failure */ public function get_document_detail_by_title($folder_id, $title, $detail='') { return $this->get_document_detail_by_name($folder_id, $title, 'T', $detail); } /** * Returns document detail given a document name which could include a full path. * Details can be filtered using a combination of the following: M = metadata, L = links, T = workflow transitions, * V = version history, H = transaction history * * @author KnowledgeTree Team * @access public * @param integer $folder_id The id of the folder in which to find the document * @param string $document_name The name of the document * @param string @what Optional. Defaults to T. The type of name - F = filename or T = title * @param string $detail Optional. Filter on the level of detail to return. * @return array Response 'results' contain kt_document_detail | 'message' contains error message on failure */ public function get_document_detail_by_name($folder_id, $document_name, $what='T', $detail='') { $response['status_code'] = 1; if (empty($document_name)) { $response['message'] = 'Document_name is empty.'; return $response; } if (!in_array($what, array('T','F'))) { $response['message'] = 'Invalid what code'; return $response; } if ($folder_id < 1) $folder_id = 1; $root = &$this->get_folder_by_id($folder_id); if (PEAR::isError($root)) { $response['message'] = $root->getMessage(); return $response; } if ($what == 'T') { $document = &$root->get_document_by_name($document_name); } else { $document = &$root->get_document_by_filename($document_name); } if (PEAR::isError($document)) { $response['message'] = $document->getMessage(); return $response; } return $this->get_document_detail($document->documentid, $detail); } /** * Returns the role allocation on the document * * @author KnowledgeTree Team * @access public * @author KnowledgeTree Team * @access public * @param integer $document_id The id of the document * @return array Response */ public function get_role_allocation_for_document($document_id) { $document = $this->get_document_by_id($document_id); if(PEAR::isError($document)){ $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $allocation = $document->getRoleAllocation(); $response['status_code'] = 0; $response['results'] = $allocation->getMembership(); return $response; } /** * Emails a document as an attachment or hyperlink to a list of users, groups or external email addresses. * In the case of external addresses, if a hyperlink is used then a timed download link (via webservices) is sent allowing the recipient a window period in which to download the document. * The period is set through the webservices config option webservice/downloadExpiry. Defaults to 30 minutes. * * @author KnowledgeTree Team * @access public * @param string $document_id The id of the document * @param array $members The email recipients (users, groups, external) in the format: array('users' => array(1,2), 'groups' => array(3,1), 'external' => array('name@email.com')) * @param string $comment Content to be appended to the email * @param bool $attach TRUE if document is an attachment | FALSE if using a hyperlink to the document * @return array Response */ public function email_document($document_id, $members, $content = '', $attach = true) { $response['status_code'] = 1; if(!isset($members['users']) && !isset($members['groups']) && !isset($members['external'])){ $response['message'] = _kt("No recipients were provided. The list of recipients should be in the format: array('users' => array(1,2), 'groups' => array(3,1), 'external' => array('name@email.com'))."); return $response; } $document = $this->get_document_by_id($document_id); if(PEAR::isError($document)){ $response['message'] = $document->getMessage(); return $response; } $recipients = array(); // Get member objects and add them to the role // Users if(isset($members['users'])){ foreach($members['users'] as $user_id){ // Get the user object $member = KTAPI_User::getById($user_id); if(PEAR::isError($member)) { $response['message'] = $member->getMessage(); return $response; } // Add to recipients list $recipients[] = $member; } } // Groups if(isset($members['groups'])){ foreach($members['groups'] as $group_id){ // Get the group object $member = KTAPI_Group::getById($group_id); if(PEAR::isError($member)) { $response['message'] = $member->getMessage(); return $response; } // Add to recipients list $recipients[] = $member; } } // External recipients if(isset($members['external'])){ foreach ($members['external'] as $email_address){ // Add to recipients list $recipients[] = $member; } } $result = $document->email($recipients, $content, $attach); if (PEAR::isError($result)) { $response['message'] = $result->getMessage(); return $response; } $response['status_code'] = 0; return $response; } /** * Retrieves all shortcuts linking to a specific document * * @author KnowledgeTree Team * @access public * @param ing $document_id * @return kt_document_shortcuts. * */ public function get_document_shortcuts($document_id) { $document = $this->get_document_by_id($document_id); if(PEAR::isError($document)){ $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $shortcuts = $document->get_shortcuts(); if(PEAR::isError($shortcuts)){ $response['status_code'] = 1; $response['message'] = $shortcuts->getMessage(); return $response; } $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $shortcuts; return $response; } /** * Adds a document to the repository. * * @author KnowledgeTree Team * @access public * @param int $folder_id * @param string $title * @param string $filename * @param string $documenttype * @param string $tempfilename * @return kt_document_detail. */ public function add_document($folder_id, $title, $filename, $documenttype, $tempfilename, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.add'); if ($response['status_code'] == 1) return $response; // we need to add some security to ensure that people don't frig the checkin process to access restricted files. // possibly should change 'tempfilename' to be a hash or id of some sort if this is troublesome. $upload_manager = new KTUploadManager(); if (!$upload_manager->is_valid_temporary_file($tempfilename)) { $response['status_code'] = 1; $response['message'] = "Invalid temporary file: $tempfilename. Not compatible with $upload_manager->temp_dir."; return $response; } $folder = &$this->get_folder_by_id($folder_id); if (PEAR::isError($folder)) { $response['status_code'] = 1; $response['message'] = $folder->getMessage(); return $response; } $document = &$folder->add_document($title, $filename, $documenttype, $tempfilename); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $document->get_detail(); return $response; } public function add_small_document_with_metadata($folder_id, $title, $filename, $documenttype, $base64, $metadata, $sysdata, $sig_username = '', $sig_password = '', $reason = '') { $add_result = $this->add_small_document($folder_id, $title, $filename, $documenttype, $base64, $sig_username, $sig_password, $reason); if($add_result['status_code'] != 0){ return $add_result; } $document_id = $add_result['results']['document_id']; $update_result = $this->update_document_metadata($document_id, $metadata, $sysdata, $sig_username, $sig_password, $reason); if($update_result['status_code'] != 0){ $this->delete_document($document_id, 'Rollback because metadata could not be added', false); return $update_result; } $document = $this->get_document_by_id($document_id); $result = $document->removeUpdateNotification(); if (PEAR::isError($result)) { // not much we can do, maybe just log! } $result = $document->mergeWithLastMetadataVersion(); if (PEAR::isError($result)) { // not much we can do, maybe just log! } return $update_result; } public function add_document_with_metadata($folder_id, $title, $filename, $documenttype, $tempfilename, $metadata, $sysdata, $sig_username = '', $sig_password = '', $reason = '') { $add_result = $this->add_document($folder_id, $title, $filename, $documenttype, $tempfilename, $sig_username, $sig_password, $reason); if($add_result['status_code'] != 0){ return $add_result; } $document_id = $add_result['results']['document_id']; $update_result = $this->update_document_metadata($document_id, $metadata, $sysdata, $sig_username, $sig_password, $reason); if($update_result['status_code'] != 0){ $this->delete_document($document_id, 'Rollback because metadata could not be added', false); return $update_result; } $document = $this->get_document_by_id($document_id); $result = $document->removeUpdateNotification(); if (PEAR::isError($result)) { // not much we can do, maybe just log! } $result = $document->mergeWithLastMetadataVersion(); if (PEAR::isError($result)) { // not much we can do, maybe just log! } return $update_result; } /** * Find documents matching the document oem (integration) no * * @author KnowledgeTree Team * @access public * @param string $oem_no * @param string $detail * @return kt_document_collection_response */ public function get_documents_detail_by_oem_no($oem_no, $detail) { $documents = $this->get_documents_by_oem_no($oem_no); $collection = array(); foreach($documents as $documentId) { $detail = $this->get_document_detail($documentId, $detail); if ($detail['status_code'] != 0) { continue; } $collection[] = $detail->value; } $response=array(); $response['status_code'] = 0; $response['message'] = empty($collection) ? _kt('No documents were found matching the specified document no') : ''; $response['results'] = $collection; return $collection; } /** * Adds a document to the repository. * * @author KnowledgeTree Team * @access public * @param int $folder_id * @param string $title * @param string $filename * @param string $documenttype * @param string $base64 * @return kt_document_detail. */ public function add_small_document($folder_id, $title, $filename, $documenttype, $base64, $sig_username = '', $sig_password = '', $reason = '') { $folder = &$this->get_folder_by_id($folder_id); if (PEAR::isError($folder)) { $response['status_code'] = 1; $response['message'] = $folder->getMessage(); return $response; } $upload_manager = new KTUploadManager(); $tempfilename = $upload_manager->store_base64_file($base64); if (PEAR::isError($tempfilename)) { $reason = $tempfilename->getMessage(); $response['status_code'] = 1; $response['message'] = 'Cannot write to temp file: ' . $tempfilename . ". Reason: $reason"; return $response; } // simulate the upload $tempfilename = $upload_manager->uploaded($filename,$tempfilename, 'A'); // add the document $document = &$folder->add_document($title, $filename, $documenttype, $tempfilename); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $document->get_detail(); return $response; } /** * Does a document checkin. * * @author KnowledgeTree Team * @access public * @param int $folder_id * @param string $title * @param string $filename * @param string $documenttype * @param string $tempfilename * @return kt_document_detail. status_code can be KTWS_ERR_INVALID_SESSION, KTWS_ERR_INVALID_FOLDER, KTWS_ERR_INVALID_DOCUMENT or KTWS_SUCCESS */ public function checkin_document($document_id, $filename, $reason, $tempfilename, $major_update, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.check_in'); if ($response['status_code'] == 1) return $response; // we need to add some security to ensure that people don't frig the checkin process to access restricted files. // possibly should change 'tempfilename' to be a hash or id of some sort if this is troublesome. $upload_manager = new KTUploadManager(); if (!$upload_manager->is_valid_temporary_file($tempfilename)) { $response['status_code'] = 1; $response['message'] = 'Invalid temporary file'; return $response; } $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } // checkin $result = $document->checkin($filename, $reason, $tempfilename, $major_update); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } // get status after checkin return $this->get_document_detail($document_id); } public function checkin_small_document_with_metadata($document_id, $filename, $reason, $base64, $major_update, $metadata, $sysdata, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.check_in'); if ($response['status_code'] == 1) return $response; $add_result = $this->checkin_small_document($document_id, $filename, $reason, $base64, $major_update, $sig_username, $sig_password); if($add_result['status_code'] != 0){ return $add_result; } $update_result = $this->update_document_metadata($document_id, $metadata, $sysdata, $sig_username, $sig_password, $reason); if($update_result['status_code'] != 0){ return $update_result; } $document = $this->get_document_by_id($document_id); $result = $document->removeUpdateNotification(); if (PEAR::isError($result)) { // not much we can do, maybe just log! } $result = $document->mergeWithLastMetadataVersion(); if (PEAR::isError($result)) { // not much we can do, maybe just log! } return $update_result; } public function checkin_document_with_metadata($document_id, $filename, $reason, $tempfilename, $major_update, $metadata, $sysdata, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.check_in'); if ($response['status_code'] == 1) return $response; $add_result = $this->checkin_document($document_id, $filename, $reason, $tempfilename, $major_update, $sig_username, $sig_password); if($add_result['status_code'] != 0){ return $add_result; } $update_result = $this->update_document_metadata($session_id, $document_id, $metadata, $sysdata, $sig_username, $sig_password, $reason); if($update_result['status_code'] != 0){ return $update_result; } $document = $this->get_document_by_id($document_id); $result = $document->removeUpdateNotification(); if (PEAR::isError($result)) { // not much we can do, maybe just log! } $result = $document->mergeWithLastMetadataVersion(); if (PEAR::isError($result)) { // not much we can do, maybe just log! } return $update_result; } /** * Does a document checkin. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param string $filename * @param string $reason * @param string $base64 * @param boolean $major_update * @return kt_document_detail. */ public function checkin_small_document($document_id, $filename, $reason, $base64, $major_update, $sig_username = '', $sig_password = '' ) { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.check_in'); if ($response['status_code'] == 1) return $response; $upload_manager = new KTUploadManager(); $tempfilename = $upload_manager->store_base64_file($base64, 'su_'); if (PEAR::isError($tempfilename)) { $reason = $tempfilename->getMessage(); $response['status_code'] = 1; $response['message'] = 'Cannot write to temp file: ' . $tempfilename . ". Reason: $reason"; return $response; } // simulate the upload $tempfilename = $upload_manager->uploaded($filename,$tempfilename, 'C'); $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->checkin($filename, $reason, $tempfilename, $major_update); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } // get status after checkin return $this->get_document_detail($document_id); } /** * Does a document checkout. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param string $reason * @return kt_document_detail. */ public function checkout_document($document_id, $reason, $download = true, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.check_out'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->checkout($reason); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $session = &$this->get_session(); $url = ''; if ($download) { $download_manager = new KTDownloadManager(); $download_manager->set_session($session->session); $download_manager->cleanup(); $url = $download_manager->allow_download($document); } if ($this->version >= 2) { $response = $this->get_document_detail($document_id); $response['results']['url'] = $url; return $response; } $response['status_code'] = 0; $response['message'] = ''; $response['results'] = $url; return $response; } /** * Does a document checkout. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param string $reason * @param boolean $download * @return kt_document_detail */ public function checkout_small_document($document_id, $reason, $download, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.check_out'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->checkout($reason); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $content=''; if ($download) { $document = $document->document; $oStorage =& KTStorageManagerUtil::getSingleton(); $filename = $oStorage->temporaryFile($document); $fp=fopen($filename,'rb'); if ($fp === false) { $response['status_code'] = 1; $response['message'] = 'The file is not in the storage system. Please contact an administrator!'; return $response; } $content = fread($fp, filesize($filename)); fclose($fp); $content = base64_encode($content); } if ($this->version >= 2) { $result = $this->get_document_detail($document_id); $result['results']['content'] = $content; return $result; } $response['status_code'] = 0; $response['results'] = $content; return $response; } /** * Undoes a document checkout. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param string $reason * @return kt_document_detail. */ public function undo_document_checkout($document_id, $reason, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.force_checkin'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->undo_checkout($reason); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } if ($this->version >= 2) { return $this->get_document_detail($document_id); } $response['status_code'] = 0; return $response; } /** * Fetches a list of checked out documents (optionally limited to the logged in user) * * @param boolean $userSpecific limit to current user * @return $checkedout An array of checked out documents */ // TODO determine whether the listing is showing docs the user should not be able to see // (when not restricting to docs checked out by that user) public function get_checkedout_docs($userSpecific = true) { $checkedout = array(); $where = null; // limit to current user? if ($userSpecific) { $where = array('checked_out_user_id = ?', $this->get_user()->getId()); } else { $where = array('is_checked_out = ?', 1); } $checkedout = KTAPI_Document::getList($where); return $checkedout; } /** * Returns a reference to a file to be downloaded. * * @author KnowledgeTree Team * @access public * @param int $document_id * @return kt_response. */ public function download_document($document_id, $version=null) { $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->download(); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $session = &$this->get_session(); $download_manager = new KTDownloadManager(); $download_manager->set_session($session->session); $download_manager->cleanup(); $url = $download_manager->allow_download($document); $response['status_code'] = 0; $response['results'] = urlencode($url); return $response; } /** * Returns a reference to a file to be downloaded. * * @author KnowledgeTree Team * @access public * @param int $document_id * @return kt_response. */ public function download_small_document($document_id, $version=null) { $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->download(); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $content=''; $document = $document->document; $oStorage =& KTStorageManagerUtil::getSingleton(); $filename = $oStorage->temporaryFile($document); $fp=fopen($filename,'rb'); if ($fp === false) { $response['status_code'] = 1; $response['message'] = 'The file is not in the storage system. Please contact an administrator!'; return $response; } $content = fread($fp, filesize($filename)); fclose($fp); $content = base64_encode($content); $response['status_code'] = 0; $response['results'] = $content; return $response; } /** * Deletes a document. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param string $reason * @return kt_response */ public function delete_document($document_id, $reason, $auth_sig = true, $sig_username = '', $sig_password = '') { if ($auth_sig) { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.delete'); if ($response['status_code'] == 1) return $response; } $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->delete($reason); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $response['status_code'] = 0; return $response; } /** * Change the document type. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param string $documenttype * @return array */ public function change_document_type($document_id, $documenttype, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.document_type_change'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->change_document_type($documenttype); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } return $this->get_document_detail($document_id); } /** * Copy a document to another folder. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param int $folder_id * @param string $reason * @param string $newtitle * @param string $newfilename * @return array */ public function copy_document($document_id,$folder_id,$reason,$newtitle=null,$newfilename=null, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.copy'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $tgt_folder = &$this->get_folder_by_id($folder_id); if (PEAR::isError($tgt_folder)) { $response['status_code'] = 1; $response['message'] = $tgt_folder->getMessage(); return $response; } $result = $document->copy($tgt_folder, $reason, $newtitle, $newfilename); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $new_document_id = $result->documentid; return $this->get_document_detail($new_document_id, ''); } /** * Move a document to another location. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param int $folder_id * @param string $reason * @param string $newtitle * @param string $newfilename * @return array */ public function move_document($document_id,$folder_id,$reason,$newtitle=null,$newfilename=null, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.move'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } if ($document->ktapi_folder->folderid != $folder_id) { // we only have to do something if the source and target folders are different $tgt_folder = &$this->get_folder_by_id($folder_id); if (PEAR::isError($tgt_folder)) { $response['status_code'] = 1; $response['message'] = $tgt_folder->getMessage(); return $response; } $result = $document->move($tgt_folder, $reason, $newtitle, $newfilename); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } } return $this->get_document_detail($document_id, ''); } /** * Changes the document title. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param string $newtitle * @return arry */ public function rename_document_title($document_id,$newtitle, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.rename'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->rename($newtitle); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } return $this->get_document_detail($document_id); } /** * Renames the document filename. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param string $newfilename * @return array */ public function rename_document_filename($document_id,$newfilename, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.rename'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->renameFile($newfilename); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } return $this->get_document_detail($document_id); } /** * Changes the owner of a document. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param string $username * @param string $reason * @return array */ public function change_document_owner($document_id, $username, $reason, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.document_owner_change'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->change_owner($username, $reason); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } return $this->get_document_detail($document_id); } /** * Start a workflow on a document * * @author KnowledgeTree Team * @access public * @param int $document_id * @param string $workflow * @return array */ public function start_document_workflow($document_id,$workflow, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.workflow_state_transition'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = &$document->start_workflow($workflow); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } return $this->get_document_detail($document_id); } /** * Removes the workflow process on a document. * * @author KnowledgeTree Team * @access public * @param int $document_id * @return array */ public function delete_document_workflow($document_id, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.workflow_state_transition'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->delete_workflow(); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } return $this->get_document_detail($document_id); } /** * Starts a transitions on a document with a workflow. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param string $transition * @param string $reason * @return array */ public function perform_document_workflow_transition($document_id,$transition,$reason, $sig_username = '', $sig_password = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.workflow_state_transition'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->perform_workflow_transition($transition,$reason); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result>getMessage(); return $response; } return $this->get_document_detail($document_id); } /** * Returns the metadata on a document. * * @author KnowledgeTree Team * @access public * @param int $document_id * @return array */ public function get_document_metadata($document_id) { $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $metadata = $document->get_metadata(); $num_metadata=count($metadata); for($i=0;$i<$num_metadata;$i++) { $num_fields = count($metadata[$i]['fields']); for($j=0;$j<$num_fields;$j++) { $selection=$metadata[$i]['fields'][$j]['selection']; $new = array(); foreach($selection as $item) { $new[] = array( 'id'=>null, 'name'=>$item, 'value'=>$item, 'parent_id'=>null ); } $metadata[$i]['fields'][$j]['selection'] = $new; } } $response['status_code'] = 0; $response['result'] = $metadata; return $response; } /** * Updates document metadata. * * @author KnowledgeTree Team * @access public * @param int $document_id * @param array $metadata * @return array */ public function update_document_metadata($document_id,$metadata, $sysdata=null, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.metadata_update'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->update_metadata($metadata); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $result = $document->update_sysdata($sysdata); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } return $this->get_document_detail($document_id, 'M'); } /** * Returns a list of available transitions on a give document with a workflow. * * @author KnowledgeTree Team * @access public * @param int $document_id * @return array */ public function get_document_workflow_transitions($document_id) { $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->get_workflow_transitions(); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $response['status_code'] = 0; $response['transitions'] = $result; return $response; } /** * Returns the current state that the document is in. * * @author KnowledgeTree Team * @access public * @param int $document_id * @return array */ public function get_document_workflow_state($document_id) { $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->get_workflow_state(); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $response['status_code'] = 0; $response['message'] = $result; return $response; } /** * Returns the document transaction history. * * @author KnowledgeTree Team * @access public * @param int $document_id * @return array */ public function get_document_transaction_history($document_id) { $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->get_transaction_history(); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $response['status_code'] = 0; $response['history'] = $result; return $response; } /** * Returns the folder transaction history. * * @author KnowledgeTree Team * @access public * @param int $folder_id * @return array */ public function get_folder_transaction_history($folder_id) { $folder = &$this->get_folder_by_id($folder_id); if (PEAR::isError($folder)) { $response['status_code'] = 1; $response['message'] = $folder->getMessage(); return $response; } $result = $folder->get_transaction_history(); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $response['status_code'] = 0; $response['history'] = $result; return $response; } /** * Returns the version history. * * @author KnowledgeTree Team * @access public * @param int $document_id * @return kt_document_version_history_response */ public function get_document_version_history($document_id) { $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $result = $document->get_version_history(); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $response['status_code'] = 0; $response['history'] = $result; return $response; } /** * Returns a list of linked documents * * @author KnowledgeTree Team * @access public * @param string $session_id * @param int $document_id * @return array * * */ public function get_document_links($document_id) { $response['status_code'] = 1; $response['message'] = ''; $response['parent_document_id'] = (int) $document_id; $response['links'] = array(); $document = &$this->get_document_by_id($document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $links = $document->get_linked_documents(); $response['status_code'] = 0; $response['links'] = $links; return $response; } /** * Removes a link between documents * * @author KnowledgeTree Team * @access public * @param int $parent_document_id * @param int $child_document_id * @return kt_response */ public function unlink_documents($parent_document_id, $child_document_id, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($parent_document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.unlink'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($parent_document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $child_document = &$this->get_document_by_id($child_document_id); if (PEAR::isError($child_document)) { $response['status_code'] = 1; $response['message'] = $child_document->getMessage(); return $response; } $result = $document->unlink_document($child_document); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $response['status_code'] = 0; return $response; } /** * Creates a link between documents * * @author KnowledgeTree Team * @access public * @param int $parent_document_id * @param int $child_document_id * @param string $type * @return boolean */ public function link_documents($parent_document_id, $child_document_id, $type, $sig_username = '', $sig_password = '', $reason = '') { $response = $this->_check_electronic_signature($parent_document_id, $sig_username, $sig_password, $reason, $reason, 'ktcore.transactions.link'); if ($response['status_code'] == 1) return $response; $document = &$this->get_document_by_id($parent_document_id); if (PEAR::isError($document)) { $response['status_code'] = 1; $response['message'] = $document->getMessage(); return $response; } $child_document = &$this->get_document_by_id($child_document_id); if (PEAR::isError($child_document)) { $response['status_code'] = 1; $response['message'] = $child_document->getMessage(); return $response; } $result = $document->link_document($child_document, $type); if (PEAR::isError($result)) { $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $response['status_code'] = 0; return $response; } /** * Retrieves the server policies for this server * * @author KnowledgeTree Team * @access public * @return array $response The formatted response array */ public function get_client_policies($client=null) { $config = KTConfig::getSingleton(); $policies = array( array( 'name' => 'explorer_metadata_capture', 'value' => bool2str($config->get('clientToolPolicies/explorerMetadataCapture')), 'type' => 'boolean' ), array( 'name' => 'office_metadata_capture', 'value' => bool2str($config->get('clientToolPolicies/officeMetadataCapture')), 'type' => 'boolean' ), array( 'name' => 'capture_reasons_delete', 'value' => bool2str($config->get('clientToolPolicies/captureReasonsDelete')), 'type' => 'boolean' ), array( 'name' => 'capture_reasons_checkin', 'value' => bool2str($config->get('clientToolPolicies/captureReasonsCheckin')), 'type' => 'boolean' ), array( 'name' => 'capture_reasons_checkout', 'value' => bool2str($config->get('clientToolPolicies/captureReasonsCheckout')), 'type' => 'boolean' ), array( 'name' => 'capture_reasons_cancelcheckout', 'value' => bool2str($config->get('clientToolPolicies/captureReasonsCancelCheckout')), 'type' => 'boolean' ), array( 'name' => 'capture_reasons_copyinkt', 'value' => bool2str($config->get('clientToolPolicies/captureReasonsCopyInKT')), 'type' => 'boolean' ), array( 'name' => 'capture_reasons_moveinkt', 'value' => bool2str($config->get('clientToolPolicies/captureReasonsMoveInKT')), 'type' => 'boolean' ), array( 'name' => 'allow_remember_password', 'value' => bool2str($config->get('clientToolPolicies/allowRememberPassword')), 'type' => 'boolean' ), ); $response['policies'] = $policies; $response['message'] = _kt('Knowledgetree client policies retrieval succeeded.'); $response['status_code'] = 0; return $response; } /** * This is the search interface * * @author KnowledgeTree Team * @access public * @param string $query * @param string $options * @return array $response The formatted response array */ public function search($query, $options) { $response['status_code'] = 1; $response['results'] = array(); $results = processSearchExpression($query); if (PEAR::isError($results)) { $response['message'] = _kt('Could not process query.') . $results->getMessage(); return $response; } $response['message'] = ''; if(empty($results)){ $response['message'] = _kt('Your search did not return any results'); } $response['status_code'] = 0; $response['results'] = $results; return $response; } /** * Method to create a saved search * * @author KnowledgeTree Team * @access public * @param string $name The name of the saved search * @param string $query The saved search query * @return array $response The formatted response array */ public function create_saved_search($name, $query) { $savedSearch = new savedSearches($this); if(PEAR::isError($savedSearch)){ $response['status_code'] = 1; $response['message'] = $savedSearch->getMessage(); return $response; } $result = $savedSearch->create($name, $query); if(PEAR::isError($result)){ $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $response['message'] = ''; $response['status_code'] = 0; $response['results']['search_id'] = $result; return $response; } /** * Method to retrieve a saved search * * @author KnowledgeTree Team * @access public * @param string $searchID The id of the saved search * @return array $response The formatted response array */ public function get_saved_search($searchID) { $savedSearch = new savedSearches($this); if(PEAR::isError($savedSearch)){ $response['status_code'] = 1; $response['message'] = $savedSearch->getMessage(); return $response; } $result = $savedSearch->get_saved_search($searchID); if(PEAR::isError($result)){ $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } if(empty($result)){ $response['status_code'] = 1; $response['message'] = _kt('No saved searches found'); return $response; } $response['message'] = ''; $response['status_code'] = 0; $response['results'] = $result[0]; return $response; } /** * Method to retrieve a list of saved searches * * @author KnowledgeTree Team * @access public * @return array $response The formatted response array */ public function get_saved_search_list() { $savedSearch = new savedSearches($this); if(PEAR::isError($savedSearch)){ $response['status_code'] = 1; $response['message'] = $savedSearch->getMessage(); return $response; } $result = $savedSearch->get_list(); if(PEAR::isError($result)){ $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } if(empty($result)){ $response['status_code'] = 1; $response['message'] = _kt('No saved searches found'); return $response; } $response['message'] = ''; $response['status_code'] = 0; $response['results'] = $result; return $response; } /** * Method to delete a saved searche * * @author KnowledgeTree Team * @access public * @param string $searchID The id of the saved search to delete * @return array $response The formatted response array */ public function delete_saved_search($searchID) { $savedSearch = new savedSearches($this); if(PEAR::isError($savedSearch)){ $response['status_code'] = 1; $response['message'] = $savedSearch->getMessage(); return $response; } $result = $savedSearch->delete($searchID); if(PEAR::isError($result)){ $response['status_code'] = 1; $response['message'] = $result->getMessage(); return $response; } $response['message'] = ''; $response['status_code'] = 0; return $response; } /** * Method to retrieve a list of saved searches * * @author KnowledgeTree Team * @access public * @param string $searchID The id of the saved search to delete * @return array $response The formatted response array */ public function run_saved_search($searchID) { $savedSearch = new savedSearches($this); if(PEAR::isError($savedSearch)){ $response['status_code'] = 1; $response['message'] = $savedSearch->getMessage(); return $response; } $results = $savedSearch->run_saved_search($searchID); if(PEAR::isError($results)){ $response['status_code'] = 1; $response['message'] = $results->getMessage(); return $response; } $response['message'] = ''; if(empty($results)){ $response['message'] = _kt('Your saved search did not return any results'); } $response['status_code'] = 0; $response['results'] = $results; return $response; } /** * Method to get the details of a user * * @author KnowledgeTree Team * @access private * @param object $oUser The user object * @return array $results The user details in an array */ private function _get_user_details($oUser) { $results['user_id'] = $oUser->getId(); $results['username'] = $oUser->getUsername(); $results['name'] = $oUser->getName(); $results['email'] = $oUser->getEmail(); return $results; } /** * Method to return a user based on the userID * * @author KnowledgeTree Team * @access public * @param string $userID The id of the user * @return array $response The formatted response array */ public function get_user_by_id($userID) { $user = KTAPI_User::getById($userID); if(PEAR::isError($user)){ $response['status_code'] = 1; $response['message'] = $user->getMessage(); return $response; } $results = $this->_get_user_details($user); $response['message'] = ''; $response['status_code'] = 0; $response['results'] = $results; return $response; } /** * Method to return a user based on the username * * @author KnowledgeTree Team * @access public * @param string $username The username of the user * @return array $response The formatted response array */ public function get_user_by_username($username) { $user = KTAPI_User::getByUsername($username); if(PEAR::isError($user)){ $response['status_code'] = 1; $response['message'] = $user->getMessage(); return $response; } $results = $this->_get_user_details($user); $response['message'] = ''; $response['status_code'] = 0; $response['results'] = $results; return $response; } /** * Method to return a user based on the username * * @author KnowledgeTree Team * @access public * @param string $username The username of the user * @return array $response The formatted response array */ public function get_user_object_by_username($username) { return KTAPI_User::getByUsername($username); } /** * Method to return a user based on the name * * @author KnowledgeTree Team * @access public * @param string $name The name of the user * @return array $response The formatted response array */ public function get_user_by_name($name) { $user = KTAPI_User::getByName($name); if(PEAR::isError($user)){ $response['status_code'] = 1; $response['message'] = $user->getMessage(); return $response; } $results = $this->_get_user_details($user); $response['message'] = ''; $response['status_code'] = 0; $response['results'] = $results; return $response; } /** * Method to return a list of users matching the filter criteria * * @author KnowledgeTree Team * @access public * @param string $filter * @param string $options * @return array $response The formatted response array */ public function get_user_list($filter = NULL, $options = NULL) { $users = KTAPI_User::getList($filter, $options); if(PEAR::isError($users)){ $response['status_code'] = 1; $response['message'] = $users->getMessage(); return $response; } foreach($users as $user){ $results[] = $this->_get_user_details($user); } $response['message'] = ''; $response['status_code'] = 0; $response['results'] = $results; return $response; } /** * Method to check if a document is subscribed * * @author KnowledgeTree Team * @access public * @param string $documentID The id of the document * @return array $response The formatted response array */ public function is_document_subscribed($documentID) { $document = $this->get_document_by_id($documentID); if(PEAR::isError($document)){ $response['message'] = $document->getMessage(); $response['status_code'] = 1; return $response; } $result = $document->isSubscribed(); $response['message'] = ''; $response['status_code'] = 0; if($result){ $response['results']['subscribed'] = 'TRUE'; }else{ $response['results']['subscribed'] = 'FALSE'; } return $response; } /** * Method to subscribe to a document * * @author KnowledgeTree Team * @access public * @param string $documentID The id of the document * @return array $response The formatted response array */ public function subscribe_to_document($documentID) { $document = $this->get_document_by_id($documentID); if(PEAR::isError($document)){ $response['message'] = $document->getMessage(); $response['status_code'] = 1; return $response; } $result = $document->subscribe(); if($result === TRUE){ $response['message'] = ''; $response['status_code'] = 0; $response['results']['action_result'] = 'TRUE'; }else{ $response['message'] = $result; $response['status_code'] = 1; } return $response; } /** * Method to unsubscribe from a document * * @author KnowledgeTree Team * @access public * @param string $documentID The id of the document * @return array $response The formatted response array */ public function unsubscribe_from_document($documentID) { $document = $this->get_document_by_id($documentID); if(PEAR::isError($document)){ $response['message'] = $document->getMessage(); $response['status_code'] = 1; return $response; } $result = $document->unsubscribe(); if($result === TRUE){ $response['message'] = ''; $response['status_code'] = 0; $response['results']['action_result'] = 'TRUE'; }else{ $response['message'] = $result; $response['status_code'] = 1; } return $response; } /** * Method to check if a folder is subscribed * * @author KnowledgeTree Team * @access public * @param string $folderID The id of the folder * @return array $response The formatted response array */ public function is_folder_subscribed($folderID) { $folder = $this->get_folder_by_id($folderID); if(PEAR::isError($folder)){ $response['message'] = $folder->getMessage(); $response['status_code'] = 1; return $response; } $result = $folder->isSubscribed(); $response['message'] = ''; $response['status_code'] = 0; if($result){ $response['results']['subscribed'] = 'TRUE'; }else{ $response['results']['subscribed'] = 'FALSE'; } return $response; } /** * Method to subscribe to a folder * * @author KnowledgeTree Team * @access public * @param string $folderID The id of the folder * @return array $response The formatted response array */ public function subscribe_to_folder($folderID) { $folder = $this->get_folder_by_id($folderID); if(PEAR::isError($folder)){ $response['message'] = $folder->getMessage(); $response['status_code'] = 1; return $response; } $result = $folder->subscribe(); if($result === TRUE){ $response['message'] = ''; $response['status_code'] = 0; $response['results']['action_result'] = 'TRUE'; }else{ $response['message'] = $result; $response['status_code'] = 1; } return $response; } /** * Method to unsubscribe from a folder * * @author KnowledgeTree Team * @access public * @param string $folderID The id of the folder * @return array $response The formatted response array */ public function unsubscribe_from_folder($folderID) { $folder = $this->get_folder_by_id($folderID); if(PEAR::isError($folder)){ $response['message'] = $folder->getMessage(); $response['status_code'] = 1; return $response; } $result = $folder->unsubscribe(); if($result === TRUE){ $response['message'] = ''; $response['status_code'] = 0; $response['results']['action_result'] = 'TRUE'; }else{ $response['message'] = $result; $response['status_code'] = 1; } return $response; } public function is_latest_version($documentID, $contentID) { $sql = 'SELECT COUNT(document_content_version.id) AS newdocumentcount FROM document_content_version WHERE document_content_version.document_id ="'.$documentID.'" AND document_content_version.id > "'.$contentID.'"'; $row = DBUtil::getOneResult($sql); $row = (int)$row['newdocumentcount']; if ($row > 0) { $response['is_latest'] = 'FALSE'; } else { $response['is_latest'] = 'TRUE'; } $response['status_code'] = 0; return $response; } /** * Method to check whether electronic signatures are enabled * * @author KnowledgeTree Team * @access public * @return bool $enabled true or false */ public function electronic_sig_enabled() { // Check that the wintools plugin is active and available, return false if not. if (!KTPluginUtil::pluginIsActive('ktdms.wintools')) { return false; } // Check config for api signatures enabled $oConfig =& KTConfig::getSingleton(); $enabled = $oConfig->get('e_signatures/enableApiSignatures', false); // Check that the license is valid $enabled = (BaobabKeyUtil::getLicenseCount() >= MIN_LICENSES) & $enabled; return $enabled; } /** * Attempts authentication of the signature * * @author KnowledgeTree Team * @access private * @param string $username The user's username * @param string $password The user's password * @param string $comment A comment on the action performed * @param string $action The action performed * @param string $details Details about the action performed * @return bool True if authenticated | False if rejected */ private function _authenticateSignature($username, $password, $comment, $action, $details) { $eSignature = new ESignature('api'); $result = $eSignature->sign($username, $password, $comment, $action, $details); if(!$result){ $this->esig_error = $eSignature->getError(); } return $result; } /** * Method to execute electronic signature checks on action * * @author KnowledgeTree Team * @access private * @param string $item_id ID of document/folder which will be used as detail string in authentication records * @param string $username The user's username * @param string $password The user's password * @param string $comment A comment on the action performed * @param string $details Unused * @param string $action The action performed * @return array $response containing success/failure result and appropriate message */ private function _check_electronic_signature($item_id, $username, $password, $comment, $details, $action) { $response = array(); $response['status_code'] = 0; // check electronic signature authentication, if on if ($this->esig_enabled && !$this->_authenticateSignature($username, $password, $comment, $action, $item_id)) { $response['status_code'] = 1; $response['message'] = $this->esig_error; return $response; } return $response; } } /** * This class handles the saved search functionality within the API * * @author KnowledgeTree Team * @package KTAPI * @version Version 0.9 */ class savedSearches { /** * Instance of the KTAPI object * * @access private */ private $ktapi; /** * Constructs the bulk actions object * * @author KnowledgeTree Team * @access public * @param KTAPI $ktapi Instance of the KTAPI object */ function __construct(&$ktapi) { // $this->ktapi = new KTAPI(); $this->ktapi = $ktapi; } /** * This method creates the saved search * * @author KnowledgeTree Team * @access public * @param string $name The name of the search * @param string $query The query string to be saved * @return string|object $result SUCCESS - The id of the saved search | FAILURE - an error object */ public function create($name, $query) { $user = $this->ktapi->get_user(); if (is_null($user) || PEAR::isError($user)) { $result = new PEAR_Error(KTAPI_ERROR_USER_INVALID); return $result; } $userID = $user->getId(); $result = SearchHelper::saveSavedSearch($name, $query, $userID); return $result; } /** * This method gets a saved searche based on the id * * @author KnowledgeTree Tean * @access public * @param integer $searchID The id of the saved search * @return array|object $search SUCESS - The saved search data | FAILURE - a pear error object */ public function get_saved_search($searchID) { $search = SearchHelper::getSavedSearch($searchID); return $search; } /** * This method gets a list of saved searches * * @author KnowledgeTree Tean * @access public * @return array|object $list SUCESS - The list of saved searches | FAILURE - an error object */ public function get_list() { $user = $this->ktapi->get_user(); if (is_null($user) || PEAR::isError($user)) { $list = new PEAR_Error(KTAPI_ERROR_USER_INVALID); return $list; } $userID = $user->getId(); $list = SearchHelper::getSavedSearches($userID); if (PEAR::isError($list)) { $list = new PEAR_Error('Invalid saved search result'); return $list; } return $list; } /** * This method deletes the saved search * * @author KnowledgeTree Team * @access public * @param string $searchID The id of the saved search * @return void */ public function delete($searchID) { SearchHelper::deleteSavedSearch($searchID); } /** * This method runs the saved search bsed on the id of the saved search * * @author KnowledgeTree Team * @access public * @param integer $searchID The id of the saved search * @return array|object $results SUCCESS - The results of the saved serach | FAILURE - a pear error object */ public function run_saved_search($searchID) { $search = $this->get_saved_search($searchID); if(is_null($search) || PEAR::isError($search)){ $results = new PEAR_Error('Invalid saved search'); return $results; } $query = $search[0]['expression']; $results = processSearchExpression($query); return $results; } } ?>