public function read($uri, $justthese = false) { $map = Config::get($uri['concept'], 'OpenLDAP.mapping'); if ($justthese === false || $justthese === null) { $sr = ldap_search($this->con, $this->config['context'], '(' . $map['id'] . '=' . $uri['id'] . ')'); } else { $sr = ldap_search($this->con, $this->config['context'], '(' . $map['id'] . '=' . $uri['id'] . ')', self::parseJustthese($justthese, $map)); } if (!$sr) { return false; } $return = self::_formatEntries(ldap_get_entries($this->con, $sr), $map); return isset($return[0]) ? $return[0] : array(); }
/** * Atualiza um contato recente * * @license http://www.gnu.org/copyleft/gpl.html GPL * @author Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) * @sponsor Caixa Econômica Federal * @author José Vicente Tezza Jr. * @return retorna a uri do contato recente * @access public * */ function put($request, $id) { $this->secured(); //verificar se a preferencia de contatos dinamicos nao esta ativada if (!$this->isEnabledDynamicContacts(Config::me("uidNumber"))) { $response = new Response($request); $this->createException($request, $response, Response::UNAUTHORIZED, 'Resource unauthorized', 'disabled dynamic contacts preference'); return $response; } $post = $request->dataDecoded; $response = new Response($request); if (count($post) == 0) { $this->createException($request, $response, Response::BADREQUEST, 'Bad request', 'Invalid template data'); return $response; } //recupera os atributos definidos no conceito 'user' $map = Config::get('dynamicContact', 'PostgreSQL.mapping'); $params = array(); foreach ($post as $key => $value) { if (!isset($map[$key]) || $key == 'id' || $key == 'timestamp' || $key == 'number_of_messages') { continue; } $params[$key] = $value; } if (count($params) == 0) { $this->createException($request, $response, Response::BADREQUEST, 'Bad request', 'Invalid template data'); return $response; } //completar os atributos $params['owner'] = Config::me("uidNumber"); $params['timestamp'] = time(); $params['id'] = $id; $response->addHeader('Content-type', 'aplication/json'); $response->code = Response::NOCONTENT; try { $dynamicContact = Controller::read(array('concept' => 'dynamicContact'), false, array('filter' => array('AND', array('=', 'owner', Config::me("uidNumber")), array('=', 'id', $id)))); //Se existe o recurso if ($dynamicContact) { //Normaliza o recurso if (is_array($dynamicContact)) { $dynamicContact = $dynamicContact[0]; } $params['number_of_messages'] = $dynamicContact['number_of_messages'] + 1; $dynamicContact = Controller::update(array('concept' => 'dynamicContact', 'id' => $id), $params); if (!$dynamicContact) { $this->createException($request, $response, Response::INTERNALSERVERERROR, 'Internal Server Error', Controller::service('PostgreSQL')->error); return $response; } } else { /* $idDynamicContact = Controller::create( array('concept' => 'dynamicContact'), $params); */ //if (!$idDynamicContact) { $this->createException($request, $response, Response::NOTFOUND, 'Bad request', 'Invalid data'); return $response; //} } } catch (Exception $ex) { $this->createException($request, $response, Response::INTERNALSERVERERROR, 'Internal Server Error', 'Internal Server Error'); return $response; } $response->body = json_encode(null); return $response; }
/** * Retorna uma lista de usuários * * @license http://www.gnu.org/copyleft/gpl.html GPL * @author Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) * @sponsor Caixa Econômica Federal * @author José Vicente Tezza Jr. * @return Retorna uma lista de usuários do LDAP * @access public * */ function get($request) { $response = new Response($request); $response->addHeader('Content-type', 'aplication/json'); $response->code = Response::OK; $h = new Hypermedia(); $c = new Collection($request->resources, 'UsersResource'); $this->secured(); try { //Executa uma consulta de usuários do LDAP a partir de um determinado atributo e valor if (isset($_GET['field']) && isset($_GET['value'])) { //recupera os atributos definidos no conceito 'user' $map = Config::get('user', 'OpenLDAP.mapping'); //verifica se o campo(atributo) passado pelo usuário está definido no conceito 'user' if (isset($map[$_GET['field']])) { $users = Controller::find(array('concept' => 'user', 'service' => 'OpenLDAP'), false, array('filter' => array('=', $_GET['field'], $_GET['value']), 'notExternal' => true)); } else { //lança warning no log do Expresso trigger_error("Invalid field (" . $_GET['field'] . ") in the query.", E_USER_WARNING); //formata os atributos LDAP do conceito 'user' $attributes = implode(', ', $map); //Configura o erro na hypermedia $error = new Error(); $error->setCode(Response::NOTFOUND); $error->setTitle('UserLDAP not found'); $error->setDescription("Invalid field (" . $_GET['field'] . ") in the query. Use of these: " . $attributes); $c->setError($error); $h->setCollection($c); //retorna a hypermedia $response->code = Response::NOTFOUND; $response->body = $h->getHypermedia($request->accept[10][0]); return $response; } } else { //Executa a consulta dos primeiros 20 usuarios do LDAP $users = Controller::find(array('concept' => 'user', 'service' => 'OpenLDAP'), false, array('filter' => array('=', 'phpgwAccountType', 'u'), 'limit' => 20, 'notExternal' => true)); } //Se nao foi encontrado usuarios na consulta if ($users === false) { $error = new Error(); $error->setCode(Response::NOTFOUND); $error->setTitle('UserLDAP not found'); $error->setDescription('Users not found.'); $c->setError($error); $h->setCollection($c); $response->code = Response::NOTFOUND; $response->body = $h->getHypermedia($request->accept[10][0]); return $response; } foreach ($users as $value) { $d = new Data(); $i = new Item($request->resources, 'UsersResource', $value['uid']); $d->setName('name'); $d->setValue($value['name']); $d->setPrompt('Nome do Usuario'); $d->setDataType('string'); $d->setMaxLength('100'); $d->setMinLength(null); $d->setRequired(true); $i->addData($d); $d = new Data(); $d->setName('email'); $d->setValue($value['mail']); $d->setPrompt('Email do Usuario'); $d->setDataType('string'); $d->setMaxLength('100'); $d->setMinLength(null); $d->setRequired(true); $i->addData($d); $d = new Data(); $d->setName('telephoneNumber'); $d->setValue($value['telephoneNumber']); $d->setPrompt('Telefone do Usuario'); $d->setDataType('string'); $d->setMaxLength('100'); $d->setMinLength(null); $d->setRequired(true); $i->addData($d); $d = new Data(); $d->setName('vacationActive'); $d->setValue($value['vacationActive']); $d->setPrompt('Status da Regra fora de Escritorio'); $d->setDataType('boolean'); $d->setMaxLength('10'); $d->setMinLength(null); $d->setRequired(null); $i->addData($d); $d = new Data(); $d->setName('vacationInfo'); $d->setValue($value['vacationInfo']); $d->setPrompt('Mensagem da Regra fora de Escritorio'); $d->setDataType('boolean'); $d->setMaxLength('10'); $d->setMinLength(null); $d->setRequired(null); $i->addData($d); $l = new Link(); $l->setHref(''); $l->setRel('delete'); $l->setAlt('Remover'); $l->setPrompt('Remover'); $l->setRender('link'); $i->addLink($l); $l = new Link(); $l->setHref(''); $l->setRel('put'); $l->setAlt('Atualizar'); $l->setPrompt('Atualizar'); $l->setRender('link'); $i->addLink($l); $l = new Link(); $l->setHref('/userldap/' . $value['uid']); $l->setRel('get'); $l->setAlt('Buscar'); $l->setPrompt('Buscar'); $l->setRender('link'); $i->addLink($l); $c->addItem($i); } $t = new Template(); $d = new Data(); $d->setName('name'); $d->setValue(null); $d->setPrompt('Nome do Usuario'); $d->setDataType('string'); $d->setMaxLength(100); $d->setMinLength(null); $d->setRequired(true); $t->addData($d); $d = new Data(); $d->setName('email'); $d->setValue(null); $d->setPrompt('Email do Usuario'); $d->setDataType('string'); $d->setMaxLength(100); $d->setMinLength(null); $d->setRequired(true); $t->addData($d); $d = new Data(); $d->setName('telefone'); $d->setValue(null); $d->setPrompt('Telefone do Usuario'); $d->setDataType('string'); $d->setMaxLength(100); $d->setMinLength(null); $d->setRequired(true); $t->addData($d); $queries = new Querie(); $queries->setHref($c->href); $queries->setData('field', '', true); $queries->setData('value', '', true); $c->addQueries($queries); $h->setCollection($c); } catch (Exception $ex) { $error = new Error(); $error->setCode(Response::INTERNALSERVERERROR); $error->setTitle('Internal Server Error'); $error->setDescription($ex); $c->setError($error); $h->setCollection($c); $response->code = Response::INTERNALSERVERERROR; $response->body = $h->getHypermedia($request->accept[10][0]); return $response; } $response->body = $h->getHypermedia($request->accept[10][0]); return $response; }
private function parseCondition($condition) { $tables = array(); $conditions = ''; $matches = array(); if (preg_match_all('/\\s*(AND|^)\\s*([a-z]+)\\.([a-z]+)\\s+\\=\\s+([a-z]+)\\.([a-z]+)(\\s|$)+/i', $condition, $matches, PREG_SET_ORDER)) { foreach ($matches as $i => $v) { if (!isset($this->maps[$v[2]]) || !isset($this->tables[$v[2]])) { $this->maps[$v[2]] = Config::get($v[2], 'MySQL.mapping'); $this->tables[$v[2]] = Config::get($v[2], 'MySQL.concept'); } if (!isset($this->maps[$v[4]]) || !isset($this->tables[$v[4]])) { $this->maps[$v[4]] = Config::get($v[4], 'MySQL.mapping'); $this->tables[$v[4]] = Config::get($v[4], 'MySQL.concept'); } if (isset($this->maps[$v[2]][$v[3]]) && isset($this->maps[$v[4]][$v[5]])) { $conditions .= ' ' . $v[1] . ' ' . $this->tables[$v[2]] . '.' . $this->maps[$v[2]][$v[3]] . ' = ' . $this->tables[$v[4]] . '.' . $this->maps[$v[4]][$v[5]]; } else { continue; } if (!in_array($this->tables[$v[2]], $tables)) { $tables[] = $this->tables[$v[2]]; } if (!in_array($this->tables[$v[4]], $tables)) { $tables[] = $this->tables[$v[4]]; } } } if (preg_match_all('/\\s*(AND|OR|^)\\s*([a-z]+)\\.([a-z]+)\\s+([\\=\\>\\<\\!]+|like)+\\s+([a-z0-9\\/\\+\\=]+)(\\s|$)+/i', $condition, $matches, PREG_SET_ORDER)) { foreach ($matches as $i => $v) { if (!isset($this->maps[$v[2]]) || !isset($this->tables[$v[2]])) { $this->maps[$v[2]] = Config::get($v[2], 'MySQL.mapping'); $this->tables[$v[2]] = Config::get($v[2], 'MySQL.concept'); } if (isset($this->maps[$v[2]][$v[3]])) { $conditions .= ' ' . $v[1] . ' ' . $this->tables[$v[2]] . '.' . $this->maps[$v[2]][$v[3]] . ' ' . $v[4] . ' \'' . mysql_real_escape_string(base64_decode($v[5])) . '\''; } else { continue; } if (!in_array($this->tables[$v[2]], $tables)) { $tables[] = $this->tables[$v[2]]; } } } return count($tables) > 0 && count($conditions) > 0 ? array('tables' => $tables, 'conditions' => $conditions) : ''; }
/** * Salva um contato recente * * @license http://www.gnu.org/copyleft/gpl.html GPL * @author Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) * @sponsor Caixa Econômica Federal * @author José Vicente Tezza Jr. * @return retorna a uri do contato recente * @access public * */ function post($request) { $this->secured(); //verificar se a preferencia de contatos dinamicos nao esta ativada if (!$this->isEnabledDynamicContacts(Config::me("uidNumber"))) { $response = new Response($request); $this->createException($request, $response, Response::UNAUTHORIZED, 'Resource unauthorized', 'disabled dynamic contacts preference'); return $response; } if (count($_POST) == 0) { $response = new Response($request); $response->code = Response::INTERNALSERVERERROR; return $response; } //recuperar os atributos definidos no conceito 'user' $map = Config::get('dynamicContact', 'PostgreSQL.mapping'); $params = array(); foreach ($_POST as $key => $value) { if (!isset($map[$key]) || $key == 'id' || $key == 'timestamp' || $key == 'number_of_messages') { continue; } $params[$key] = $value; } if (count($params) == 0) { $response = new Response($request); $response->code = Response::INTERNALSERVERERROR; return $response; } $response = new Response($request); $response->addHeader('Content-type', 'aplication/json'); $response->code = Response::CREATED; //completar os atributos $params['owner'] = Config::me("uidNumber"); $params['number_of_messages'] = '1'; $params['timestamp'] = time(); try { //verificar o limite maximo de contatos dinamicos nas preferencias do administrador $sql = "SELECT config_value " . "FROM phpgw_config " . "WHERE config_app = 'expressoMail' " . "AND config_name = 'expressoMail_Number_of_dynamic_contacts'"; $numberOfMessages = Controller::service('PostgreSQL')->execResultSql($sql, true); $numberOfMessages = count($numberOfMessages) > 0 ? (int) $numberOfMessages['config_value'] : 0; //realizar busca de contatos dinamicos ordenados pela data de utilizacao $dynamicContacts = Controller::find(array('concept' => 'dynamicContact'), false, array('filter' => array('=', 'owner', Config::me("uidNumber")), 'order' => array('timestamp'))); $numberOfDynamicContacts = $dynamicContacts !== false ? count($dynamicContacts) : 0; //se a quantidade de contatos dinamicos de usuario exceder o limite maximo definido nas preferencias do administrador, //remover o contato dinamico mais antigo if ($numberOfMessages > 0 && $numberOfDynamicContacts >= $numberOfMessages) { $id = $dynamicContacts[0]['id']; $delete = Controller::delete(array('concept' => 'dynamicContact', 'id' => $id)); if (!$delete) { $this->createException($request, $response, Response::INTERNALSERVERERROR, 'Internal Server Error', Controller::service('PostgreSQL')->error); return $response; } } //inserir o novo contato dinamico $create = Controller::create(array('concept' => 'dynamicContact'), $params); if (!$create) { throw new Exception(Controller::service('PostgreSQL')->error); } } catch (Exception $ex) { $response->code = Response::INTERNALSERVERERROR; return $response; } $response->body = json_encode(null); return $response; }