function render() { $active_worker = UsermeetApplication::getActiveWorker(); $visit = UsermeetApplication::getVisit(); $tpl = DevblocksPlatform::getTemplateService(); $tpl->assign('path', $this->_TPL_PATH); $response = DevblocksPlatform::getHttpResponse(); $tpl->assign('request_path', implode('/', $response->path)); // Remember the last tab/URL if (null == ($selected_tab = @$response->path[1])) { $selected_tab = $visit->get(UsermeetVisit::KEY_HOME_SELECTED_TAB, 'notifications'); } $tpl->assign('selected_tab', $selected_tab); $tab_manifests = DevblocksPlatform::getExtensions('usermeet.home.tab', false); $tpl->assign('tab_manifests', $tab_manifests); // Custom workspaces // $workspaces = DAO_WorkerWorkspaceList::getWorkspaces($active_worker->id); // $tpl->assign('workspaces', $workspaces); // ====== Who's Online $whos_online = DAO_Worker::getAllOnline(); if (!empty($whos_online)) { $tpl->assign('whos_online', $whos_online); $tpl->assign('whos_online_count', count($whos_online)); } $tpl->display('file:' . $this->_TPL_PATH . 'home/index.tpl'); }
function handleRequest(DevblocksHttpRequest $request) { $stack = $request->path; $db = DevblocksPlatform::getDatabaseService(); // **** BEGIN AUTH @($verb = $_SERVER['REQUEST_METHOD']); @($header_date = $_SERVER['HTTP_DATE']); @($header_signature = $_SERVER['HTTP_PORTSENSOR_AUTH']); @($this->_payload = $this->_getRawPost()); @(list($auth_worker_email, $auth_signature) = explode(":", $header_signature, 2)); $url_parts = parse_url(DevblocksPlatform::getWebPath()); $url_path = $url_parts['path']; $url_query = $this->_sortQueryString($_SERVER['QUERY_STRING']); $string_to_sign_prefix = "{$verb}\n{$header_date}\n{$url_path}\n{$url_query}\n{$this->_payload}"; if (!$this->_validateRfcDate($header_date)) { $this->_error("Access denied! (Invalid timestamp)"); } // if(strpos($auth_access_key,'@')) { // WORKER-LEVEL AUTH $results = DAO_Worker::getWhere(sprintf("%s = %s", DAO_Worker::EMAIL, $db->qstr($auth_worker_email))); if (empty($results)) { $this->_error("Access denied! (Invalid authentication)"); } else { $worker = array_shift($results); $this->setActiveWorker($worker); } if (null == $this->getActiveWorker()) { $this->_error("Access denied! (Invalid worker)"); } if (!$worker->hasPriv('plugin.usermeet.webapi')) { $this->_error("Access denied! (No permission)"); } $pass = $this->getActiveWorker()->pass; $string_to_sign = "{$string_to_sign_prefix}\n{$pass}\n"; $compare_hash = base64_encode(sha1($string_to_sign, true)); if (0 != strcmp($auth_signature, $compare_hash)) { $this->_error("Access denied! (Invalid password)"); } // **** END APP AUTH // Figure out our format by looking at the last path argument @(list($command, $format) = explode('.', array_pop($stack))); array_push($stack, $command); $this->_format = $format; // Call the verb as an action $method = strtolower($verb) . 'Action'; if (method_exists($this, $method)) { call_user_func(array(&$this, $method), $stack); } else { $this->_error("Invalid action."); } }
function render() { $active_worker = FegApplication::getActiveWorker(); $visit = FegApplication::getVisit(); $tpl = DevblocksPlatform::getTemplateService(); $tpl->assign('path', $this->_TPL_PATH); $response = DevblocksPlatform::getHttpResponse(); $tpl->assign('request_path', implode('/', $response->path)); // ====== Who's Online $whos_online = DAO_Worker::getAllOnline(); if (!empty($whos_online)) { $tpl->assign('whos_online', $whos_online); $tpl->assign('whos_online_count', count($whos_online)); } $tpl->display('file:' . $this->_TPL_PATH . 'stats/index.tpl'); }
function authenticate() { // Pull from $_POST @($email = DevblocksPlatform::importGPC($_POST['email'])); @($password = DevblocksPlatform::importGPC($_POST['password'])); $worker = DAO_Worker::login($email, $password); if (!is_null($worker)) { $session = DevblocksPlatform::getSessionService(); $visit = new CerberusVisit(); $visit->setWorker($worker); $session->setVisit($visit); // [TODO] Only direct to /welcome when tour is enabled return true; } else { return false; } }
function render() { $tpl = DevblocksPlatform::getTemplateService(); $tpl->assign('path', $this->_TPL_PATH); $active_worker = FegApplication::getActiveWorker(); $visit = FegApplication::getVisit(); $response = DevblocksPlatform::getHttpResponse(); $translate = DevblocksPlatform::getTranslationService(); $url = DevblocksPlatform::getUrlService(); $stack = $response->path; @array_shift($stack); // customer @($customer_id = array_shift($stack)); @($customer = DAO_CustomerAccount::get($customer_id)); if (empty($customer)) { echo "<H1>" . $translate->_('customer.display.invalid_customer') . "</H1>"; return; } $tpl->assign('customer_id', $customer_id); // Tabs $tab_manifests = DevblocksPlatform::getExtensions('feg.customer.tab', false); $tpl->assign('tab_manifests', $tab_manifests); @($tab_selected = array_shift($stack)); if (empty($tab_selected)) { $tab_selected = 'property'; } $tpl->assign('tab_selected', $tab_selected); switch ($tab_selected) { case 'property': @($tab_parm = array_shift($stack)); break; } // ====== Who's Online $whos_online = DAO_Worker::getAllOnline(); if (!empty($whos_online)) { $tpl->assign('whos_online', $whos_online); $tpl->assign('whos_online_count', count($whos_online)); } $tpl->display('file:' . $this->_TPL_PATH . 'customer/index.tpl'); }
// Sales Group $sales_gid = DAO_Group::createTeam(array(DAO_Group::TEAM_NAME => 'Sales')); // Sales Spam Bucket $sales_spam_bid = DAO_Bucket::create('Spam', $sales_gid); DAO_GroupSettings::set($sales_gid, DAO_GroupSettings::SETTING_SPAM_ACTION, '2'); DAO_GroupSettings::set($sales_gid, DAO_GroupSettings::SETTING_SPAM_ACTION_PARAM, $sales_spam_bid); DAO_GroupSettings::set($sales_gid, DAO_GroupSettings::SETTING_SPAM_THRESHOLD, '85'); // Default catchall DAO_Group::updateTeam($dispatch_gid, array(DAO_Group::IS_DEFAULT => 1)); } // If this worker doesn't exist, create them if (null === ($lookup = DAO_Worker::lookupAgentEmail($worker_email))) { $worker_id = DAO_Worker::create($worker_email, $worker_pass, 'Super', 'User', 'Administrator'); // Superuser bit $fields = array(DAO_Worker::IS_SUPERUSER => 1); DAO_Worker::updateAgent($worker_id, $fields); // Add the worker e-mail to the addresses table if (!empty($worker_email)) { DAO_Address::lookupAddress($worker_email, true); } // Authorize this e-mail address (watchers, etc.) DAO_AddressToWorker::assign($worker_email, $worker_id); DAO_AddressToWorker::update($worker_email, array(DAO_AddressToWorker::IS_CONFIRMED => 1)); // Default group memberships if (!empty($dispatch_gid)) { DAO_Group::setTeamMember($dispatch_gid, $worker_id, true); } if (!empty($support_gid)) { DAO_Group::setTeamMember($support_gid, $worker_id, true); } if (!empty($sales_gid)) {
function doRecoverStep3Action() { @($password = DevblocksPlatform::importGPC($_REQUEST['password'], 'string')); $email = $_SESSION[self::KEY_FORGOT_EMAIL]; $sentcode = $_SESSION[self::KEY_FORGOT_SENTCODE]; $code = $_SESSION[self::KEY_FORGOT_CODE]; $worker_id = DAO_Worker::lookupAgentEmail($email); if (empty($email) || empty($code) || empty($worker_id)) { return; } if (0 == strcmp($sentcode, $code)) { // passed DAO_Worker::updateAgent($worker_id, array(DAO_Worker::PASSWORD => md5($password))); unset($_SESSION[self::KEY_FORGOT_EMAIL]); unset($_SESSION[self::KEY_FORGOT_CODE]); unset($_SESSION[self::KEY_FORGOT_SENTCODE]); DevblocksPlatform::redirect(new DevblocksHttpResponse(array('login'))); } else { DevblocksPlatform::redirect(new DevblocksHttpResponse(array('login', 'forgot', 'step2'))); } }
public function getRenderedContent($message_id) { $raw = $this->content; $replace = array(); $with = array(); $replace[] = '#timestamp#'; $with[] = date('r'); if (!empty($message_id)) { $message = DAO_Ticket::getMessage($message_id); $ticket = DAO_Ticket::getTicket($message->ticket_id); $sender = DAO_Address::get($message->address_id); $sender_org = DAO_ContactOrg::get($sender->contact_org_id); $replace[] = '#sender_first_name#'; $replace[] = '#sender_last_name#'; $replace[] = '#sender_org#'; $with[] = $sender->first_name; $with[] = $sender->last_name; $with[] = !empty($sender_org) ? $sender_org->name : ""; $replace[] = '#ticket_id#'; $replace[] = '#ticket_mask#'; $replace[] = '#ticket_subject#'; $with[] = $ticket->id; $with[] = $ticket->mask; $with[] = $ticket->subject; } if (null != ($active_worker = CerberusApplication::getActiveWorker())) { $worker = DAO_Worker::getAgent($active_worker->id); // most recent info (not session) $replace[] = '#worker_first_name#'; $replace[] = '#worker_last_name#'; $replace[] = '#worker_title#'; $with[] = $worker->first_name; $with[] = $worker->last_name; $with[] = $worker->title; } return str_replace($replace, $with, $raw); }
public function writeResponse(DevblocksHttpResponse $response) { $path = $response->path; // [JAS]: Ajax? // [TODO] Explore outputting whitespace here for Safari // if(empty($path)) // return; $tpl = DevblocksPlatform::getTemplateService(); $session = DevblocksPlatform::getSessionService(); $settings = DevblocksPlatform::getPluginSettingsService(); $translate = DevblocksPlatform::getTranslationService(); $active_worker = FegApplication::getActiveWorker(); $visit = $session->getVisit(); $page_manifests = $this->_getAllowedPages(); $controller = array_shift($path); // Default page [TODO] This is supposed to come from framework.config.php if (empty($controller)) { $controller = 'preferences'; } // [JAS]: Require us to always be logged in for Feg pages if (empty($visit) && 0 != strcasecmp($controller, 'login')) { $query = array(); if (!empty($response->path)) { $query = array('url' => urlencode(implode('/', $response->path))); } DevblocksPlatform::redirect(new DevblocksHttpRequest(array('login'), $query)); } $page_id = $this->_getPageIdByUri($controller); @($page = DevblocksPlatform::getExtension($page_id, true)); /* @var $page FegPageExtension */ if (empty($page)) { header("Status: 404"); return; // [TODO] 404 } // [JAS]: Listeners (Step-by-step guided tour, etc.) $listenerManifests = DevblocksPlatform::getExtensions('devblocks.listener.http'); foreach ($listenerManifests as $listenerManifest) { /* @var $listenerManifest DevblocksExtensionManifest */ $inst = $listenerManifest->createInstance(); /* @var $inst DevblocksHttpRequestListenerExtension */ $inst->run($response, $tpl); } $tpl->assign('active_worker', $active_worker); $tour_enabled = false; if (!empty($visit) && !is_null($active_worker)) { $tour_enabled = intval(DAO_WorkerPref::get($active_worker->id, 'assist_mode', 1)); $keyboard_shortcuts = intval(DAO_WorkerPref::get($active_worker->id, 'keyboard_shortcuts', 1)); $tpl->assign('pref_keyboard_shortcuts', $keyboard_shortcuts); // $active_worker_memberships = $active_worker->getMemberships(); // $tpl->assign('active_worker_memberships', $active_worker_memberships); $unread_notifications = DAO_WorkerEvent::getUnreadCountByWorker($active_worker->id); $tpl->assign('active_worker_notify_count', $unread_notifications); DAO_Worker::logActivity($active_worker->id, $page->getActivity()); } $tpl->assign('tour_enabled', $tour_enabled); // [JAS]: Variables provided to all page templates $tpl->assign('settings', $settings); $tpl->assign('session', $_SESSION); $tpl->assign('translate', $translate); $tpl->assign('visit', $visit); $tpl->assign('license', FegLicense::getInstance()); $tpl->assign('page_manifests', $page_manifests); $tpl->assign('page', $page); $tpl->assign('response_uri', implode('/', $response->path)); $core_tpl = APP_PATH . '/features/feg.core/templates/'; $tpl->assign('core_tpl', $core_tpl); // Prebody Renderers $preBodyRenderers = DevblocksPlatform::getExtensions('feg.renderer.prebody', true); if (!empty($preBodyRenderers)) { $tpl->assign('prebody_renderers', $preBodyRenderers); } // Postbody Renderers $postBodyRenderers = DevblocksPlatform::getExtensions('feg.renderer.postbody', true); if (!empty($postBodyRenderers)) { $tpl->assign('postbody_renderers', $postBodyRenderers); } // Timings $tpl->assign('render_time', microtime(true) - DevblocksPlatform::getStartTime()); if (function_exists('memory_get_usage') && function_exists('memory_get_peak_usage')) { $tpl->assign('render_memory', memory_get_usage() - DevblocksPlatform::getStartMemory()); $tpl->assign('render_peak_memory', memory_get_peak_usage() - DevblocksPlatform::getStartPeakMemory()); } $tpl->display($core_tpl . 'border.tpl'); // $cache = DevblocksPlatform::getCacheService(); // $cache->printStatistics(); }
function showWorkspaceTabAction() { $tpl = DevblocksPlatform::getTemplateService(); $tpl->assign('path', $this->_TPL_PATH); $visit = PortSensorApplication::getVisit(); $db = DevblocksPlatform::getDatabaseService(); $active_worker = PortSensorApplication::getActiveWorker(); $current_workspace = DevblocksPlatform::importGPC($_REQUEST['workspace'], 'string', ''); $workspaces = DAO_Worklist::getWorkspaces($active_worker->id); // Fix a bad/old cache if (!empty($current_workspace) && false === array_search($current_workspace, $workspaces)) { $current_workspace = ''; } $views = array(); if (empty($current_workspace) && !empty($workspaces)) { // custom dashboards $current_workspace = reset($workspaces); } if (!empty($current_workspace)) { // Remember the tab $visit->set(PortSensorVisit::KEY_HOME_SELECTED_TAB, 'w_' . $current_workspace); $lists = DAO_Worklist::getWhere(sprintf("%s = %d AND %s = %s", DAO_Worklist::WORKER_ID, $active_worker->id, DAO_Worklist::WORKSPACE, $db->qstr($current_workspace))); // Load the workspace sources to map to view renderer $source_manifests = DevblocksPlatform::getExtensions(Extension_WorklistSource::EXTENSION_POINT, false); // Loop through list schemas if (is_array($lists) && !empty($lists)) { foreach ($lists as $list) { /* @var $list Model_Worklist */ $view_id = 'cust_' . $list->id; if (null == ($view = Ps_AbstractViewLoader::getView($view_id))) { $list_view = $list->view; // Make sure we can find the workspace source (plugin not disabled) if (!isset($source_manifests[$list->source_extension]) || null == ($workspace_source = $source_manifests[$list->source_extension]) || !isset($workspace_source->params['view_class'])) { continue; } // Make sure our workspace source has a valid renderer class $view_class = $workspace_source->params['view_class']; if (!class_exists($view_class)) { continue; } $view = new $view_class(); $view->id = $view_id; $view->name = $list_view->title; $view->renderLimit = $list_view->num_rows; $view->renderPage = 0; $view->view_columns = $list_view->columns; $view->params = $list_view->params; $view->renderSortBy = $list_view->sort_by; $view->renderSortAsc = $list_view->sort_asc; Ps_AbstractViewLoader::setView($view_id, $view); } if (!empty($view)) { $views[] = $view; } } } $tpl->assign('current_workspace', $current_workspace); $tpl->assign('views', $views); } // Log activity DAO_Worker::logActivity($active_worker->id, new Model_Activity('activity.mail.workspaces', array('<i>' . $current_workspace . '</i>'))); $tpl->display('file:' . $this->_TPL_PATH . 'home/workspaces/index.tpl'); }
/** * @return Model_WatcherMailFilter[]|false */ static function getMatches(CerberusTicket $ticket, $event, $only_worker_id = null) { $matches = array(); if (!empty($only_worker_id)) { $filters = DAO_WatcherMailFilter::getWhere(sprintf("%s = %d AND %s = %d", DAO_WatcherMailFilter::WORKER_ID, $only_worker_id, DAO_WatcherMailFilter::IS_DISABLED, 0)); } else { $filters = DAO_WatcherMailFilter::getWhere(sprintf("%s = %d", DAO_WatcherMailFilter::IS_DISABLED, 0)); } // [JAS]: Don't send obvious spam to watchers. if ($ticket->spam_score >= 0.9) { return false; } // Build our objects $ticket_from = DAO_Address::get($ticket->last_wrote_address_id); $ticket_group_id = $ticket->team_id; // [TODO] These expensive checks should only populate when needed $messages = DAO_Ticket::getMessagesByTicket($ticket->id); $message_headers = array(); if (empty($messages)) { return false; } if (null != @($message_last = array_pop($messages))) { /* @var $message_last CerberusMessage */ $message_headers = $message_last->getHeaders(); } // Clear the rest of the message manifests unset($messages); $custom_fields = DAO_CustomField::getAll(); // Lazy load when needed on criteria basis $ticket_field_values = null; $address_field_values = null; $org_field_values = null; // Worker memberships (for checking permissions) $workers = DAO_Worker::getAll(); $group_rosters = DAO_Group::getRosters(); // Check filters if (is_array($filters)) { foreach ($filters as $filter) { /* @var $filter Model_WatcherMailFilter */ $passed = 0; // check the worker's group memberships if (!isset($workers[$filter->worker_id]) || $workers[$filter->worker_id]->is_disabled || !$workers[$filter->worker_id]->is_superuser && !isset($group_rosters[$ticket->team_id][$filter->worker_id])) { // no membership continue; } // check criteria foreach ($filter->criteria as $rule_key => $rule) { @($value = $rule['value']); switch ($rule_key) { case 'dayofweek': $current_day = strftime('%w'); //$current_day = 1; // Forced to English abbrevs as indexes $days = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'); // Is the current day enabled? if (isset($rule[$days[$current_day]])) { $passed++; } break; case 'timeofday': $current_hour = strftime('%H'); $current_min = strftime('%M'); //$current_hour = 17; //$current_min = 5; if (null != ($from_time = @$rule['from'])) { list($from_hour, $from_min) = explode(':', $from_time); } if (null != ($to_time = @$rule['to'])) { if (list($to_hour, $to_min) = explode(':', $to_time)) { } } // Do we need to wrap around to the next day's hours? if ($from_hour > $to_hour) { // yes $to_hour += 24; // add 24 hrs to the destination (1am = 25th hour) } // Are we in the right 24 hourly range? if ((int) $current_hour >= $from_hour && (int) $current_hour <= $to_hour) { // If we're in the first hour, are we minutes early? if ($current_hour == $from_hour && (int) $current_min < $from_min) { break; } // If we're in the last hour, are we minutes late? if ($current_hour == $to_hour && (int) $current_min > $to_min) { break; } $passed++; } break; case 'event': if (!empty($event) && is_array($rule) && isset($rule[$event])) { $passed++; } break; case 'groups': if (null !== @($group_buckets = $rule['groups'][$ticket->team_id]) && (empty($group_buckets) || in_array($ticket->category_id, $group_buckets))) { $passed++; } break; case 'next_worker_id': // If it's an assigned event, we only care about the filter's owner if (!empty($event) && 0 == strcasecmp($event, 'ticket_assignment')) { if (intval($value) == intval($filter->worker_id)) { $passed++; break; } } if (intval($value) == intval($ticket->next_worker_id)) { $passed++; } break; case 'mask': $regexp_mask = DevblocksPlatform::strToRegExp($value); if (@preg_match($regexp_mask, $ticket->mask)) { $passed++; } break; case 'from': $regexp_from = DevblocksPlatform::strToRegExp($value); if (@preg_match($regexp_from, $ticket_from->email)) { $passed++; } break; case 'subject': $regexp_subject = DevblocksPlatform::strToRegExp($value); if (@preg_match($regexp_subject, $ticket->subject)) { $passed++; } break; case 'body': if (null == ($message_body = $message_last->getContent())) { break; } // Line-by-line body scanning (sed-like) $lines = preg_split("/[\r\n]/", $message_body); if (is_array($lines)) { foreach ($lines as $line) { if (@preg_match($value, $line)) { $passed++; break; } } } break; case 'header1': case 'header2': case 'header3': case 'header4': case 'header5': @($header = strtolower($rule['header'])); if (empty($header)) { $passed++; break; } if (empty($value)) { // we're checking for null/blanks if (!isset($message_headers[$header]) || empty($message_headers[$header])) { $passed++; } } elseif (isset($message_headers[$header]) && !empty($message_headers[$header])) { $regexp_header = DevblocksPlatform::strToRegExp($value); // Flatten CRLF if (@preg_match($regexp_header, str_replace(array("\r", "\n"), ' ', $message_headers[$header]))) { $passed++; } } break; default: // ignore invalids // Custom Fields if (0 == strcasecmp('cf_', substr($rule_key, 0, 3))) { $field_id = substr($rule_key, 3); // Make sure it exists if (null == @($field = $custom_fields[$field_id])) { continue; } // Lazy values loader $field_values = array(); switch ($field->source_extension) { case ChCustomFieldSource_Address::ID: if (null == $address_field_values) { $address_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Address::ID, $ticket_from->id)); } $field_values =& $address_field_values; break; case ChCustomFieldSource_Org::ID: if (null == $org_field_values) { $org_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Org::ID, $ticket_from->contact_org_id)); } $field_values =& $org_field_values; break; case ChCustomFieldSource_Ticket::ID: if (null == $ticket_field_values) { $ticket_field_values = array_shift(DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Ticket::ID, $ticket->id)); } $field_values =& $ticket_field_values; break; } // Type sensitive value comparisons // [TODO] Operators switch ($field->type) { case 'S': // string // string case 'T': // clob // clob case 'U': // URL $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : ''; $oper = isset($rule['oper']) ? $rule['oper'] : "="; if ($oper == "=" && @preg_match(DevblocksPlatform::strToRegExp($value, true), $field_val)) { $passed++; } elseif ($oper == "!=" && @(!preg_match(DevblocksPlatform::strToRegExp($value, true), $field_val))) { $passed++; } break; case 'N': // number $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : 0; $oper = isset($rule['oper']) ? $rule['oper'] : "="; if ($oper == "=" && intval($field_val) == intval($value)) { $passed++; } elseif ($oper == "!=" && intval($field_val) != intval($value)) { $passed++; } elseif ($oper == ">" && intval($field_val) > intval($value)) { $passed++; } elseif ($oper == "<" && intval($field_val) < intval($value)) { $passed++; } break; case 'E': // date $field_val = isset($field_values[$field_id]) ? intval($field_values[$field_id]) : 0; $from = isset($rule['from']) ? $rule['from'] : "0"; $to = isset($rule['to']) ? $rule['to'] : "now"; if (intval(@strtotime($from)) <= $field_val && intval(@strtotime($to)) >= $field_val) { $passed++; } break; case 'C': // checkbox $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : 0; if (intval($value) == intval($field_val)) { $passed++; } break; case 'D': // dropdown // dropdown case 'X': // multi-checkbox // multi-checkbox case 'M': // multi-picklist // multi-picklist case 'W': // worker $field_val = isset($field_values[$field_id]) ? $field_values[$field_id] : array(); if (!is_array($value)) { $value = array($value); } if (is_array($field_val)) { // if multiple things set foreach ($field_val as $v) { // loop through possible if (isset($value[$v])) { // is any possible set? $passed++; break; } } } else { // single if (isset($value[$field_val])) { // is our set field in possibles? $passed++; break; } } break; } } break; } } // If our rule matched every criteria, stop and return the filter if ($passed == count($filter->criteria)) { DAO_WatcherMailFilter::increment($filter->id); // ++ the times we've matched $matches[$filter->id] = $filter; } } } if (!empty($matches)) { return $matches; } // No matches return false; }
function render() { $tpl = DevblocksPlatform::getTemplateService(); $active_worker = CerberusApplication::getActiveWorker(); $memberships = $active_worker->getMemberships(); $response = DevblocksPlatform::getHttpResponse(); @($section = $response->path[1]); //print_r($_REQUEST);exit(); //@$page = DevblocksPlatform::importGPC($_GET['password']); @($page = DevblocksPlatform::importGPC($_REQUEST['page'], 'integer')); if ($page == NULL) { $page = 0; } if (isset($_POST['a2'])) { @($section = $_POST['a2']); } else { @($section = $response->path[2]); } //print_r($section); //echo $section; switch ($section) { case 'search': $title = 'Search'; $query = $_POST['query']; if ($query && false === strpos($query, '*')) { $query = '*' . $query . '*'; } if (!is_null($query)) { $params = array(); $type = $_POST['type']; switch ($type) { case "mask": $params[SearchFields_Ticket::TICKET_MASK] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_MASK, DevblocksSearchCriteria::OPER_LIKE, strtoupper($query)); break; case "sender": $params[SearchFields_Ticket::TICKET_FIRST_WROTE] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_FIRST_WROTE, DevblocksSearchCriteria::OPER_LIKE, strtolower($query)); break; case "subject": $params[SearchFields_Ticket::TICKET_SUBJECT] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_SUBJECT, DevblocksSearchCriteria::OPER_LIKE, $query); break; case "content": $params[SearchFields_Ticket::TICKET_MESSAGE_CONTENT] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_MESSAGE_CONTENT, DevblocksSearchCriteria::OPER_LIKE, $query); break; } } else { //show the search form because no search has been submitted $tpl->display('file:' . dirname(__FILE__) . '/templates/tickets/search.tpl'); return; } break; case 'sidebar': $groups = DAO_Group::getAll(); $tpl->assign('groups', $groups); $group_buckets = DAO_Bucket::getTeams(); $tpl->assign('group_buckets', $group_buckets); $workers = DAO_Worker::getAll(); $tpl->assign('workers', $workers); $group_counts = DAO_Overview::getGroupTotals(); $tpl->assign('group_counts', $group_counts); $waiting_counts = DAO_Overview::getWaitingTotals(); $tpl->assign('waiting_counts', $waiting_counts); $worker_counts = DAO_Overview::getWorkerTotals(); $tpl->assign('worker_counts', $worker_counts); $tpl->display('file:' . dirname(__FILE__) . '/templates/tickets/sidebar.tpl'); return; break; case 'overview': default: $workers = DAO_Worker::getAll(); $group_buckets = DAO_Bucket::getTeams(); $groups = DAO_Group::getAll(); @($filter = $response->path[3]); switch ($filter) { case 'group': @($filter_group_id = $response->path[4]); $params = array(SearchFields_Ticket::TICKET_CLOSED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CLOSED, '=', CerberusTicketStatus::OPEN), SearchFields_Ticket::TICKET_WAITING => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_WAITING, '=', 0), SearchFields_Ticket::TICKET_NEXT_WORKER_ID => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_NEXT_WORKER_ID, '=', 0)); if (!is_null($filter_group_id) && isset($groups[$filter_group_id])) { $tpl->assign('filter_group_id', $filter_group_id); $title = $groups[$filter_group_id]->name; $params[SearchFields_Ticket::TICKET_TEAM_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID, '=', $filter_group_id); @($filter_bucket_id = $response->path[5]); if (!is_null($filter_bucket_id)) { $tpl->assign('filter_bucket_id', $filter_bucket_id); @($title .= ': ' . ($filter_bucket_id == 0 ? 'Inbox' : $group_buckets[$filter_group_id][$filter_bucket_id]->name)); $params[SearchFields_Ticket::TICKET_CATEGORY_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CATEGORY_ID, '=', $filter_bucket_id); } else { @($title .= ' (Spam Filtered)'); $params[SearchFields_Ticket::TICKET_SPAM_SCORE] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_SPAM_SCORE, '<=', '0.9000'); } } break; case 'waiting': @($filter_waiting_id = $response->path[4]); $params = array(SearchFields_Ticket::TICKET_CLOSED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CLOSED, '=', CerberusTicketStatus::OPEN), SearchFields_Ticket::TICKET_WAITING => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_WAITING, '=', 1)); if (!is_null($filter_waiting_id) && isset($groups[$filter_waiting_id])) { $tpl->assign('filter_waiting_id', $filter_waiting_id); $title = '[Waiting] ' . $groups[$filter_waiting_id]->name; $params[SearchFields_Ticket::TICKET_TEAM_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID, '=', $filter_waiting_id); @($filter_bucket_id = $response->path[5]); if (!is_null($filter_bucket_id)) { $tpl->assign('filter_bucket_id', $filter_bucket_id); @($title .= ': ' . ($filter_bucket_id == 0 ? 'Inbox' : $group_buckets[$filter_waiting_id][$filter_bucket_id]->name)); $params[SearchFields_Ticket::TICKET_CATEGORY_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CATEGORY_ID, '=', $filter_bucket_id); } } break; case 'worker': @($filter_worker_id = $response->path[4]); $params = array(SearchFields_Ticket::TICKET_CLOSED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CLOSED, '=', CerberusTicketStatus::OPEN), SearchFields_Ticket::TICKET_WAITING => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_WAITING, '=', 0), $params[SearchFields_Ticket::TICKET_TEAM_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID, 'in', array_keys($memberships))); if (!is_null($filter_worker_id)) { $tpl->assign('filter_bucket_id', $filter_bucket_id); $title = "For " . $workers[$filter_worker_id]->getName(); $params[SearchFields_Ticket::TICKET_NEXT_WORKER_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_NEXT_WORKER_ID, '=', $filter_worker_id); @($filter_group_id = $response->path[5]); if (!is_null($filter_group_id) && isset($groups[$filter_group_id])) { $title .= ' in ' . $groups[$filter_group_id]->name; $params[SearchFields_Ticket::TICKET_TEAM_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID, '=', $filter_group_id); } } break; case 'all': default: $title = 'All (Spam Filtered)'; $params = array(SearchFields_Ticket::TICKET_CLOSED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CLOSED, '=', CerberusTicketStatus::OPEN), SearchFields_Ticket::TICKET_WAITING => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_WAITING, '=', 0), SearchFields_Ticket::TICKET_NEXT_WORKER_ID => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_NEXT_WORKER_ID, '=', 0), SearchFields_Ticket::TICKET_SPAM_SCORE => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_SPAM_SCORE, '<=', '0.9000'), SearchFields_Ticket::TICKET_TEAM_ID => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID, 'in', array_keys($memberships))); break; } // $params = array( // new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CLOSED,'=',CerberusTicketStatus::OPEN), // new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_NEXT_WORKER_ID,'=',0), // new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_SPAM_SCORE,'<=','0.9000'), // new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID,'in',array_keys($memberships)) // ); // $title = "Overview"; break; } $mobileView = C4_AbstractViewLoader::getView('', "VIEW_MOBILE"); //print_r($mobileView); if ($mobileView == NULL) { $mobileView = new C4_MobileTicketView(); //C4_TicketView(); } $mobileView->id = "VIEW_MOBILE"; $mobileView->name = $title; $mobileView->view_columns = array(SearchFields_Ticket::TICKET_LAST_ACTION_CODE); $mobileView->params = $params; $mobileView->renderLimit = 10; //$overViewDefaults->renderLimit; $mobileView->renderPage = $page; $mobileView->renderSortBy = SearchFields_Ticket::TICKET_UPDATED_DATE; $mobileView->renderSortAsc = 0; C4_AbstractViewLoader::setView($mobileView->id, $mobileView); $views[] = $mobileView; $tpl->assign('views', $views); if ($filter == null) { $filter = 'all'; } $tpl->assign('filter', $filter); $fid = $response->path[4]; if ($fid == null) { $fid = '0'; } $tpl->assign('fid', $fid); $bucket_id = $response->path[5]; if ($bucket_id == null) { $buket_id = 0; } $tpl->assign('bid', $bucket_id); $tpl->assign('title', $title); $tpl->assign('tickets', $tickets[0]); $tpl->assign('next_page', $page + 1); $tpl->assign('prev_page', $page - 1); //print_r($tickets);exit(); $tpl->display('file:' . dirname(__FILE__) . '/templates/tickets.tpl'); }
private function _getTicketLastAction($ticket) { static $workers = null; $action_code = $ticket[SearchFields_Ticket::TICKET_LAST_ACTION_CODE]; $output = ''; if (is_null($workers)) { $workers = DAO_Worker::getAll(); } // [TODO] Translate switch ($action_code) { case CerberusTicketActionCode::TICKET_OPENED: $output = sprintf("New from %s", $ticket[SearchFields_Ticket::TICKET_LAST_WROTE]); break; case CerberusTicketActionCode::TICKET_CUSTOMER_REPLY: @($worker_id = $ticket[SearchFields_Ticket::TICKET_NEXT_WORKER_ID]); @($worker = $workers[$worker_id]); $output = sprintf("Incoming for %s", !empty($worker) ? $worker->getName() : "Helpdesk"); break; case CerberusTicketActionCode::TICKET_WORKER_REPLY: @($worker_id = $ticket[SearchFields_Ticket::TICKET_LAST_WORKER_ID]); @($worker = $workers[$worker_id]); $output = sprintf("Outgoing from %s", !empty($worker) ? $worker->getName() : "Helpdesk"); break; } return $output; }
function showTaskBulkPanelAction() { @($ids = DevblocksPlatform::importGPC($_REQUEST['ids'])); @($view_id = DevblocksPlatform::importGPC($_REQUEST['view_id'])); $tpl = DevblocksPlatform::getTemplateService(); $tpl->assign('view_id', $view_id); if (!empty($ids)) { $id_list = DevblocksPlatform::parseCsvString($ids); $tpl->assign('ids', implode(',', $id_list)); } $workers = DAO_Worker::getAllActive(); $tpl->assign('workers', $workers); // Custom Fields $custom_fields = DAO_CustomField::getBySource(ChCustomFieldSource_Task::ID); $tpl->assign('custom_fields', $custom_fields); $tpl->cache_lifetime = "0"; $tpl->display('file:' . $this->_TPL_PATH . 'tasks/rpc/bulk.tpl'); }
function renderCriteriaParam($param) { $field = $param->field; $values = !is_array($param->value) ? array($param->value) : $param->value; switch ($field) { case SearchFields_FeedbackEntry::WORKER_ID: $workers = DAO_Worker::getAll(); $strings = array(); foreach ($values as $val) { if (0 == $val) { $strings[] = "Nobody"; } else { if (!isset($workers[$val])) { continue; } $strings[] = $workers[$val]->getName(); } } echo implode(", ", $strings); break; case SearchFields_FeedbackEntry::QUOTE_MOOD: $strings = array(); // [TODO] Translations foreach ($values as $val) { switch ($val) { case 0: $strings[] = "Neutral"; break; case 1: $strings[] = "Praise"; break; case 2: $strings[] = "Criticism"; break; } } echo implode(", ", $strings); break; default: parent::renderCriteriaParam($param); break; } }
function renderCriteriaParam($param) { $field = $param->field; $vals = $param->value; if (!is_array($vals)) { $vals = array($vals); } // Do we need to do anything special on custom fields? if ('cf_' == substr($field, 0, 3)) { $field_id = intval(substr($field, 3)); $custom_fields = DAO_CustomField::getAll(); switch ($custom_fields[$field_id]->type) { case Model_CustomField::TYPE_WORKER: $workers = DAO_Worker::getAll(); foreach ($vals as $idx => $worker_id) { if (isset($workers[$worker_id])) { $vals[$idx] = $workers[$worker_id]->getName(); } } break; } } echo implode(', ', $vals); }
function showTabHistoryAction() { $translate = DevblocksPlatform::getTranslationService(); @($org = DevblocksPlatform::importGPC($_REQUEST['org'])); $tpl = DevblocksPlatform::getTemplateService(); $tpl->assign('path', $this->_TPL_PATH); $contact = DAO_ContactOrg::get($org); $tpl->assign('contact', $contact); $visit = CerberusApplication::getVisit(); /* @var $visit CerberusVisit */ $tickets_view = C4_AbstractViewLoader::getView('contact_history'); // All org contacts $people = DAO_Address::getWhere(sprintf("%s = %d", DAO_Address::CONTACT_ORG_ID, $contact->id)); if (null == $tickets_view) { $tickets_view = new C4_TicketView(); $tickets_view->id = 'contact_history'; $tickets_view->name = $translate->_('addy_book.history.view_title'); $tickets_view->view_columns = array(SearchFields_Ticket::TICKET_LAST_ACTION_CODE, SearchFields_Ticket::TICKET_CREATED_DATE, SearchFields_Ticket::TICKET_TEAM_ID, SearchFields_Ticket::TICKET_CATEGORY_ID); $tickets_view->params = array(); $tickets_view->renderLimit = 10; $tickets_view->renderPage = 0; $tickets_view->renderSortBy = SearchFields_Ticket::TICKET_CREATED_DATE; $tickets_view->renderSortAsc = false; } @($tickets_view->name = $translate->_('ticket.requesters') . ": " . htmlspecialchars($contact->name) . ' - ' . intval(count($people)) . ' contact(s)'); $tickets_view->params = array(SearchFields_Ticket::REQUESTER_ID => new DevblocksSearchCriteria(SearchFields_Ticket::REQUESTER_ID, 'in', array_keys($people)), SearchFields_Ticket::TICKET_DELETED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_DELETED, DevblocksSearchCriteria::OPER_EQ, 0)); $tpl->assign('contact_history', $tickets_view); C4_AbstractViewLoader::setView($tickets_view->id, $tickets_view); $workers = DAO_Worker::getAll(); $tpl->assign('workers', $workers); $teams = DAO_Group::getAll(); $tpl->assign('teams', $teams); $buckets = DAO_Bucket::getAll(); $tpl->assign('buckets', $buckets); $team_categories = DAO_Bucket::getTeams(); $tpl->assign('team_categories', $team_categories); $tpl->display('file:' . $this->_TPL_PATH . 'contacts/orgs/tabs/history.tpl'); exit; }
function handleRequest(DevblocksHttpRequest $request) { $stack = $request->path; $db = DevblocksPlatform::getDatabaseService(); // **** BEGIN AUTH @($verb = $_SERVER['REQUEST_METHOD']); @($header_date = $_SERVER['HTTP_DATE']); @($header_signature = $_SERVER['HTTP_CERB4_AUTH']); @($this->_payload = $this->_getRawPost()); @(list($auth_access_key, $auth_signature) = explode(":", $header_signature, 2)); $url_parts = parse_url(DevblocksPlatform::getWebPath()); $url_path = $url_parts['path']; $url_query = $this->_sortQueryString($_SERVER['QUERY_STRING']); $string_to_sign_prefix = "{$verb}\n{$header_date}\n{$url_path}\n{$url_query}\n{$this->_payload}"; if (!$this->_validateRfcDate($header_date)) { $this->_error("Access denied! (Invalid timestamp)"); } if (strpos($auth_access_key, '@')) { // WORKER-LEVEL AUTH $workers = DAO_Worker::getAll(); foreach ($workers as $worker) { /* @var $worker CerberusWorker */ if ($worker->email == $auth_access_key) { $this->setActiveWorker($worker); break; } } if (null == $this->getActiveWorker()) { $this->_error("Access denied! (Invalid worker)"); } $pass = $this->getActiveWorker()->pass; $string_to_sign = "{$string_to_sign_prefix}\n{$pass}\n"; $compare_hash = base64_encode(sha1($string_to_sign, true)); if (0 != strcmp($auth_signature, $compare_hash)) { $this->_error("Access denied! (Invalid password)"); } } else { // APP-LEVEL AUTH $stored_keychains = DAO_WebapiKey::getWhere(sprintf("%s = %s", DAO_WebapiKey::ACCESS_KEY, $db->qstr(str_replace(' ', '', $auth_access_key)))); /* @var $stored_keychain Model_WebApiKey */ if (!empty($stored_keychains)) { @($stored_keychain = array_shift($stored_keychains)); @($auth_secret_key = $stored_keychain->secret_key); @($auth_rights = $stored_keychain->rights); $string_to_sign = "{$string_to_sign_prefix}\n{$auth_secret_key}\n"; $compare_hash = base64_encode(sha1($string_to_sign, true)); if (0 != strcmp($auth_signature, $compare_hash)) { $this->_error("Access denied! (Invalid signature)"); } // Check that this IP is allowed to perform the VERB if (!$stored_keychain->isValidIp($_SERVER['REMOTE_ADDR'])) { $this->_error(sprintf("Access denied! (IP %s not authorized)", $_SERVER['REMOTE_ADDR'])); } } else { $this->_error("Access denied! (Unknown access key)"); } } // **** END APP AUTH // Figure out our format by looking at the last path argument @(list($command, $format) = explode('.', array_pop($stack))); array_push($stack, $command); $this->_format = $format; if (null != $this->getActiveWorker()) { $method = strtolower($verb) . 'WorkerAction'; if (method_exists($this, $method)) { call_user_func(array(&$this, $method), $stack); } } else { $method = strtolower($verb) . 'Action'; if (method_exists($this, $method)) { call_user_func(array(&$this, $method), $stack, $stored_keychain); } } }
function authenticate($params = array()) { $server = $params['server']; $port = $params['port']; $dn = $params['dn']; $password = $params['password']; $worker_id = null; // attempt login $conn = ldap_connect($server, $port); ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3); if ($conn) { $auth = ldap_bind($conn, $dn, $password); if ($auth) { // search for this user $search_results = ldap_search($conn, $dn, '(objectclass=*)', array('mail')); if ($search_results) { $user_entry = ldap_first_entry($conn, $search_results); if ($user_entry) { // get email addresses for this user $emails = ldap_get_values($conn, $user_entry, 'mail'); if ($emails) { foreach ($emails as $email) { if (is_null($worker_id)) { $worker_id = DAO_Worker::lookupAgentEmail($email); } } } } } } } // we found a worker, continue login if (!is_null($worker_id)) { $worker = DAO_Worker::getAgent($worker_id); $session = DevblocksPlatform::getSessionService(); $visit = new CerberusVisit(); $visit->setWorker($worker); $session->setVisit($visit); return true; } else { return false; } }
function showTabMembersAction() { @($group_id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0)); $tpl = DevblocksPlatform::getTemplateService(); $tpl_path = $this->_TPL_PATH; $tpl->assign('path', $tpl_path); $active_worker = CerberusApplication::getActiveWorker(); if (!$active_worker->isTeamManager($group_id) && !$active_worker->is_superuser) { return; } else { $group = DAO_Group::getTeam($group_id); $tpl->assign('team', $group); } $members = DAO_Group::getTeamMembers($group_id); $tpl->assign('members', $members); $workers = DAO_Worker::getAllActive(); $tpl->assign('workers', $workers); $tpl->display('file:' . $tpl_path . 'groups/manage/members.tpl'); }
function getRoleAction() { $translate = DevblocksPlatform::getTranslationService(); $worker = FegApplication::getActiveWorker(); if (!$worker || !$worker->is_superuser) { echo $translate->_('common.access_denied'); return; } @($id = DevblocksPlatform::importGPC($_REQUEST['id'])); $tpl = DevblocksPlatform::getTemplateService(); $tpl->assign('path', $this->_TPL_PATH); $plugins = DevblocksPlatform::getPluginRegistry(); $tpl->assign('plugins', $plugins); $acl = DevblocksPlatform::getAclRegistry(); $tpl->assign('acl', $acl); $workers = DAO_Worker::getAllActive(); $tpl->assign('workers', $workers); $role = DAO_WorkerRole::get($id); $tpl->assign('role', $role); $role_privs = DAO_WorkerRole::getRolePrivileges($id); $tpl->assign('role_privs', $role_privs); $role_roster = DAO_WorkerRole::getRoleWorkers($id); $tpl->assign('role_workers', $role_roster); $tpl->assign('license', FegLicense::getInstance()); $tpl->display('file:' . $this->_TPL_PATH . 'setup/tabs/acl/edit_role.tpl'); }
function showMailRoutingRulePanelAction() { @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0)); @($group_id = DevblocksPlatform::importGPC($_REQUEST['group_id'], 'integer', 0)); $active_worker = CerberusApplication::getActiveWorker(); $tpl = DevblocksPlatform::getTemplateService(); $tpl_path = $this->_TPL_PATH; $tpl->assign('path', $tpl_path); $tpl->assign('group_id', $group_id); if (null != ($rule = DAO_MailToGroupRule::get($id))) { $tpl->assign('rule', $rule); } // Make sure we're allowed to change this group's setup if (!$active_worker->isTeamManager($group_id) && !$active_worker->is_superuser) { return; } $groups = DAO_Group::getAll(); $tpl->assign('groups', $groups); $workers = DAO_Worker::getAll(); $tpl->assign('workers', $workers); // Custom Fields: Address $address_fields = DAO_CustomField::getBySource(ChCustomFieldSource_Address::ID); $tpl->assign('address_fields', $address_fields); // Custom Fields: Orgs $org_fields = DAO_CustomField::getBySource(ChCustomFieldSource_Org::ID); $tpl->assign('org_fields', $org_fields); // Custom Fields: Ticket $ticket_fields = DAO_CustomField::getBySource(ChCustomFieldSource_Ticket::ID); $tpl->assign('ticket_fields', $ticket_fields); $tpl->display('file:' . $tpl_path . 'configuration/tabs/mail/routing/peek.tpl'); }
function run() { $logger = DevblocksPlatform::getConsoleLog(); $logger->info("[Alerts] Starting..."); $alerts = DAO_Alert::getAll(); $check_sensors = DAO_Sensor::getAll(); $workers = DAO_Worker::getAll(); if (is_array($alerts)) { foreach ($alerts as $alert) { /* @var $alert Model_Alert */ if (!isset($workers[$alert->worker_id])) { continue; } $logger->info(sprintf("[Alerts] Checking '%s' for %s...", $alert->name, $workers[$alert->worker_id]->getName())); $hit_sensors = $alert->getMatches($check_sensors); if (is_array($hit_sensors)) { $alert->run($hit_sensors); } } } $logger->info("[Alerts] Finished!"); }
function doRecoverStep3Action() { @($password = DevblocksPlatform::importGPC($_REQUEST['password'], 'string')); $email = $_SESSION[self::KEY_FORGOT_EMAIL]; $sentcode = $_SESSION[self::KEY_FORGOT_SENTCODE]; $code = $_SESSION[self::KEY_FORGOT_CODE]; $worker = null; $results = DAO_Worker::getWhere(sprintf("%s = %s", DAO_Worker::EMAIL, Um_ORMHelper::qstr($email))); if (!empty($results)) { $worker = array_shift($results); } if (empty($email) || empty($code) || empty($worker)) { return; } if (0 == strcmp($sentcode, $code)) { // passed DAO_Worker::update($worker->id, array(DAO_Worker::PASS => md5($password))); unset($_SESSION[self::KEY_FORGOT_EMAIL]); unset($_SESSION[self::KEY_FORGOT_CODE]); unset($_SESSION[self::KEY_FORGOT_SENTCODE]); DevblocksPlatform::redirect(new DevblocksHttpResponse(array('login'))); } else { DevblocksPlatform::redirect(new DevblocksHttpResponse(array('login', 'forgot', 'step2'))); } }
private function _handleImportWorker($xml) { $settings = CerberusSettings::getInstance(); $logger = DevblocksPlatform::getConsoleLog(); $sFirstName = (string) $xml->first_name; $sLastName = (string) $xml->last_name; $sEmail = (string) $xml->email; $sPassword = (string) $xml->password; $isSuperuser = (int) $xml->is_superuser; // Dupe check worker email if (null != ($worker_id = DAO_Worker::lookupAgentEmail($sEmail))) { $logger->info('[Importer] Avoiding creating duplicate worker #' . $worker_id . ' (' . $sEmail . ')'); return true; } $worker_id = DAO_Worker::create($sEmail, CerberusApplication::generatePassword(8), $sFirstName, $sLastName, ''); DAO_Worker::updateAgent($worker_id, array(DAO_Worker::PASSWORD => $sPassword, DAO_Worker::IS_SUPERUSER => intval($isSuperuser))); // Address to Worker DAO_AddressToWorker::assign($sEmail, $worker_id); DAO_AddressToWorker::update($sEmail, array(DAO_AddressToWorker::IS_CONFIRMED => 1)); $logger->info('[Importer] Imported worker #' . $worker_id . ' (' . $sEmail . ')'); DAO_Worker::clearCache(); return true; }
function showContactHistoryAction() { $translate = DevblocksPlatform::getTranslationService(); @($ticket_id = DevblocksPlatform::importGPC($_REQUEST['ticket_id'], 'integer')); $tpl = DevblocksPlatform::getTemplateService(); $tpl->assign('path', $this->_TPL_PATH); $ticket = DAO_Ticket::getTicket($ticket_id); $requesters = $ticket->getRequesters(); $contact = DAO_Address::get($ticket->first_wrote_address_id); $tpl->assign('contact', $contact); $visit = CerberusApplication::getVisit(); /* @var $visit CerberusVisit */ $view = C4_AbstractViewLoader::getView('', 'contact_history'); if (null == $view) { $view = new C4_TicketView(); $view->id = 'contact_history'; $view->name = $translate->_('addy_book.history.view.title'); $view->view_columns = array(SearchFields_Ticket::TICKET_LAST_ACTION_CODE, SearchFields_Ticket::TICKET_CREATED_DATE, SearchFields_Ticket::TICKET_TEAM_ID, SearchFields_Ticket::TICKET_CATEGORY_ID); $view->params = array(); $view->renderLimit = 10; $view->renderSortBy = SearchFields_Ticket::TICKET_CREATED_DATE; $view->renderSortAsc = false; } $view->name = vsprintf($translate->_('addy_book.history.view.requester'), intval(count($requesters))); $view->params = array(SearchFields_Ticket::REQUESTER_ID => new DevblocksSearchCriteria(SearchFields_Ticket::REQUESTER_ID, 'in', array_keys($requesters)), SearchFields_Ticket::TICKET_DELETED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_DELETED, DevblocksSearchCriteria::OPER_EQ, 0)); $view->renderPage = 0; $tpl->assign('view', $view); C4_AbstractViewLoader::setView($view->id, $view); $workers = DAO_Worker::getAll(); $tpl->assign('workers', $workers); $teams = DAO_Group::getAll(); $tpl->assign('teams', $teams); $buckets = DAO_Bucket::getAll(); $tpl->assign('buckets', $buckets); $team_categories = DAO_Bucket::getTeams(); $tpl->assign('team_categories', $team_categories); $tpl->display('file:' . $this->_TPL_PATH . 'display/modules/history/index.tpl'); }
function renderCriteriaParam($param) { $field = $param->field; $values = !is_array($param->value) ? array($param->value) : $param->value; switch ($field) { case SearchFields_CrmOpportunity::WORKER_ID: $workers = DAO_Worker::getAll(); $strings = array(); foreach ($values as $val) { if (empty($val)) { $strings[] = "Nobody"; } elseif (!isset($workers[$val])) { continue; } else { $strings[] = $workers[$val]->getName(); } } echo implode(", ", $strings); break; default: parent::renderCriteriaParam($param); break; } }
@($worker_pass = DevblocksPlatform::importGPC($_POST['worker_pass'], 'string')); @($worker_pass2 = DevblocksPlatform::importGPC($_POST['worker_pass2'], 'string')); $db = DevblocksPlatform::getDatabaseService(); $settings = DevblocksPlatform::getPluginSettingsService(); if (!empty($form_submit)) { // Persist form scope $tpl->assign('worker_email', $worker_email); $tpl->assign('worker_pass', $worker_pass); $tpl->assign('worker_pass2', $worker_pass2); // Sanity/Error checking if (!empty($worker_email) && !empty($worker_pass) && $worker_pass == $worker_pass2) { // If this worker doesn't exist, create them $results = DAO_Worker::getWhere(sprintf("%s = %s", DAO_Worker::EMAIL, $db->qstr($worker_email))); if (empty($results)) { $fields = array(DAO_Worker::EMAIL => $worker_email, DAO_Worker::PASS => md5($worker_pass), DAO_Worker::FIRST_NAME => 'Super', DAO_Worker::LAST_NAME => 'User', DAO_Worker::TITLE => 'Administrator', DAO_Worker::IS_SUPERUSER => 1); $worker_id = DAO_Worker::create($fields); } $tpl->assign('step', STEP_REGISTER); $tpl->display('steps/redirect.tpl'); exit; } else { $tpl->assign('failed', true); } } else { // Defaults } $tpl->assign('template', 'steps/step_defaults.tpl'); break; case STEP_REGISTER: @($form_submit = DevblocksPlatform::importGPC($_POST['form_submit'], 'integer')); @($skip = DevblocksPlatform::importGPC($_POST['skip'], 'integer', 0));
private function _workerAssignedTask($event) { $translate = DevblocksPlatform::getTranslationService(); $events = DevblocksPlatform::getEventService(); $worker_id = $event->params['worker_id']; $context = $event->params['context']; $task_id = $event->params['context_id']; $mail_service = DevblocksPlatform::getMailService(); $mailer = null; // lazy load $settings = DevblocksPlatform::getPluginSettingsService(); $reply_to = $settings->get('cerberusweb.core', CerberusSettings::DEFAULT_REPLY_FROM, CerberusSettingsDefaults::DEFAULT_REPLY_FROM); $reply_personal = $settings->get('cerberusweb.core', CerberusSettings::DEFAULT_REPLY_PERSONAL, CerberusSettingsDefaults::DEFAULT_REPLY_PERSONAL); $task = DAO_Task::get($task_id); // Sanitize and combine all the destination addresses $next_worker = DAO_Worker::get($worker_id); $notify_emails = $next_worker->email; if (empty($notify_emails)) { return; } try { if (null == $mailer) { $mailer = $mail_service->getMailer(CerberusMail::getMailerDefaults()); } // Create the message $mail = $mail_service->createMessage(); $mail->setTo(array($notify_emails)); $mail->setFrom(array($reply_to => $reply_personal)); $mail->setReplyTo($reply_to); $mail->setSubject(sprintf("[Task Assignment #%d]: %s", $task->id, $task->title)); $headers = $mail->getHeaders(); $headers->addTextHeader('X-Mailer', 'Cerberus Helpdesk (Build ' . APP_BUILD . ')'); $headers->addTextHeader('Precedence', 'List'); $headers->addTextHeader('Auto-Submitted', 'auto-generated'); $body = sprintf("[Task Assignment #%d]: %s", $task->id, $task->title); $mft = DevblocksPlatform::getExtension($context, false, true); $ext = $mft->createInstance(); $url = $ext->getPermalink($task_id); $body .= "\r\n" . $url; // Comments $comments = DAO_Comment::getByContext(CerberusContexts::CONTEXT_TASK, $task_id); foreach ($comments as $comment_id => $comment) { $address = DAO_Address::get($comment->address_id); $body .= "\r\nCommented By: " . $address->first_name . " " . $address->last_name; $body .= "\r\n" . $comment->comment; } unset($comments); $body .= "\r\n"; $mail->setBody($body); $result = $mailer->send($mail); } catch (Exception $e) { echo "Task Email Notification failed to send<br>"; } }
function handleRequest(DevblocksHttpRequest $request) { $worker = CerberusApplication::getActiveWorker(); if (empty($worker)) { return; } $stack = $request->path; array_shift($stack); // print @($object = strtolower(array_shift($stack))); // ticket|message|etc $tpl = DevblocksPlatform::getTemplateService(); $tpl->assign('path', $this->_TPL_PATH); $settings = DevblocksPlatform::getPluginSettingsService(); $tpl->assign('settings', $settings); $translate = DevblocksPlatform::getTranslationService(); $tpl->assign('translate', $translate); $teams = DAO_Group::getAll(); $tpl->assign('teams', $teams); $buckets = DAO_Bucket::getAll(); $tpl->assign('buckets', $buckets); $workers = DAO_Worker::getAll(); $tpl->assign('workers', $workers); // Security $active_worker = CerberusApplication::getActiveWorker(); $active_worker_memberships = $active_worker->getMemberships(); // [TODO] Make this pluggable // Subcontroller switch ($object) { case 'ticket': @($id = array_shift($stack)); @($ticket = is_numeric($id) ? DAO_Ticket::getTicket($id) : DAO_Ticket::getTicketByMask($id)); $convo_timeline = array(); $messages = $ticket->getMessages(); foreach ($messages as $message_id => $message) { /* @var $message CerberusMessage */ $key = $message->created_date . '_m' . $message_id; // build a chrono index of messages $convo_timeline[$key] = array('m', $message_id); } @($mail_inline_comments = DAO_WorkerPref::get($active_worker->id, 'mail_inline_comments', 1)); if ($mail_inline_comments) { // if inline comments are enabled $comments = DAO_TicketComment::getByTicketId($ticket->id); arsort($comments); $tpl->assign('comments', $comments); // build a chrono index of comments foreach ($comments as $comment_id => $comment) { /* @var $comment Model_TicketComment */ $key = $comment->created . '_c' . $comment_id; $convo_timeline[$key] = array('c', $comment_id); } } ksort($convo_timeline); $tpl->assign('convo_timeline', $convo_timeline); // Comment parent addresses $comment_addresses = array(); foreach ($comments as $comment) { /* @var $comment Model_TicketComment */ $address_id = intval($comment->address_id); if (!isset($comment_addresses[$address_id])) { $address = DAO_Address::get($address_id); $comment_addresses[$address_id] = $address; } } $tpl->assign('comment_addresses', $comment_addresses); // Message Notes $notes = DAO_MessageNote::getByTicketId($ticket->id); $message_notes = array(); // Index notes by message id if (is_array($notes)) { foreach ($notes as $note) { if (!isset($message_notes[$note->message_id])) { $message_notes[$note->message_id] = array(); } $message_notes[$note->message_id][$note->id] = $note; } } $tpl->assign('message_notes', $message_notes); // Make sure we're allowed to view this ticket or message if (!isset($active_worker_memberships[$ticket->team_id])) { echo "<H1>" . $translate->_('common.access_denied') . "</H1>"; return; } $tpl->assign('ticket', $ticket); $tpl->display('file:' . $this->_TPL_PATH . 'print/ticket.tpl'); break; case 'message': @($id = array_shift($stack)); @($message = DAO_Ticket::getMessage($id)); @($ticket = DAO_Ticket::getTicket($message->ticket_id)); // Make sure we're allowed to view this ticket or message if (!isset($active_worker_memberships[$ticket->team_id])) { echo "<H1>" . $translate->_('common.access_denied') . "</H1>"; return; } // Message Notes $notes = DAO_MessageNote::getByTicketId($ticket->id); $message_notes = array(); // Index notes by message id if (is_array($notes)) { foreach ($notes as $note) { if (!isset($message_notes[$note->message_id])) { $message_notes[$note->message_id] = array(); } $message_notes[$note->message_id][$note->id] = $note; } } $tpl->assign('message_notes', $message_notes); $tpl->assign('message', $message); $tpl->assign('ticket', $ticket); $tpl->display('file:' . $this->_TPL_PATH . 'print/message.tpl'); break; } }