{
parent::__construct($params);
$this->_connect();
-
- /* These next lines will translate between indexes used in the
- * application and LDAP. The rationale is that translation here will
- * help make Congregation more driver-independant. The keys used to
- * contruct user arrays should be more appropriate to human-legibility
- * (name instead of 'cn' and email instead of 'mail'). This translation
- * is only needed because LDAP indexes users based on an arbitrary
- * attribute and the application indexes by extension/context. In my
- * environment users are indexed by their 'mail' attribute and others
- * may index based on 'cn' or 'uid'. Any time a new $prefs['uid'] needs
- * to be supported, this function should be checked and possibly
- * extended to handle that translation.
- */
- switch($this->_params['uid']) {
- case 'cn':
- $this->_ldapKey = 'cn';
- $this->_appKey = 'name';
- break;
- case 'mail':
- $this->_ldapKey = 'mail';
- $this->_appKey = 'email';
- break;
- case 'uid':
- # FIXME Probably a better app key to map here
- # There is no value that maps uid to LDAP so we can choose to use
- # either extension or name, or anything really. I want to
- # support it since it's a very common DN attribute.
- # Since it's entirely administrator's preference, I'll
- # set it to name for now
- $this->_ldapKey = 'uid';
- $this->_appKey = 'name';
- break;
- case 'voiceMailbox':
- $this->_ldapKey = 'voiceMailbox';
- $this->_appKey = 'extension';
- break;
- }
}
/**
}
/**
- * Get a context's dialplan and return as a multi-dimensional associative
- * array
- *
- * @param string $context Context to return extensions for
- *
- * @param boolean $preprocess Parse includes and barelines and add their
- * information into the extensions array
- *
- * @return array Multi-dimensional associative array of extensions data
- *
- */
- public function getDialplan($context, $preprocess = false)
- {
- # FIXME Implement preprocess functionality. Don't forget to cache!
- static $dialplans = array();
- if (isset($dialplans[$context])) {
- return $dialplans[$context];
- }
-
- $res = @ldap_search($this->_LDAP,
- SHOUT_ASTERISK_BRANCH.','.$this->_params['basedn'],
- "(&(objectClass=".SHOUT_CONTEXT_EXTENSIONS_OBJECTCLASS.")(context=$context))",
- array(SHOUT_DIALPLAN_EXTENSIONLINE_ATTRIBUTE, SHOUT_DIALPLAN_INCLUDE_ATTRIBUTE,
- SHOUT_DIALPLAN_IGNOREPAT_ATTRIBUTE, 'description',
- SHOUT_DIALPLAN_BARELINE_ATTRIBUTE));
- if (!$res) {
- return PEAR::raiseError("Unable to locate any extensions " .
- "underneath ".SHOUT_ASTERISK_BRANCH.",".$this->_params['basedn'] .
- " matching those search filters");
- }
-
- $res = ldap_get_entries($this->_LDAP, $res);
- $dialplans[$context] = array();
- $dialplans[$context]['name'] = $context;
- $i = 0;
- while ($i < $res['count']) {
- # Handle extension lines
- if (isset($res[$i][strtolower(SHOUT_DIALPLAN_EXTENSIONLINE_ATTRIBUTE)])) {
- $j = 0;
- while ($j < $res[$i][strtolower(SHOUT_DIALPLAN_EXTENSIONLINE_ATTRIBUTE)]['count']) {
- @$line = $res[$i][strtolower(SHOUT_DIALPLAN_EXTENSIONLINE_ATTRIBUTE)][$j];
-
- # Basic sanity check for length. FIXME
- if (strlen($line) < 5) {
- break;
- }
- # Can't use strtok here because there may be commass in the
- # arg string
-
- # Get the extension
- $token1 = strpos($line, ',');
- $token2 = strpos($line, ',', $token1 + 1);
- $token3 = strpos($line, '(', $token2 + 1);
-
- $extension = substr($line, 0, $token1);
- if (!isset($dialplans[$context]['extensions'][$extension])) {
- $dialplan[$context]['extensions'][$extension] = array();
- }
- $token1++;
- # Get the priority
- $priority = substr($line, $token1, $token2 - $token1);
- $dialplans[$context]['extensions'][$extension][$priority] =
- array();
- $token2++;
-
- # Get Application and args
- $application = substr($line, $token2, $token3 - $token2);
-
- if ($token3) {
- $application = substr($line, $token2, $token3 - $token2);
- $args = substr($line, $token3);
- $args = preg_replace('/^\(/', '', $args);
- $args = preg_replace('/\)$/', '', $args);
- } else {
- # This application must not have any args
- $application = substr($line, $token2);
- $args = '';
- }
-
- # Merge all that data into the returning array
- $dialplans[$context]['extensions'][$extension][$priority]['application'] =
- $application;
- $dialplans[$context]['extensions'][$extension][$priority]['args'] =
- $args;
- $j++;
- }
-
- # Sort the extensions data
- foreach ($dialplans[$context]['extensions'] as
- $extension => $data) {
- ksort($dialplans[$context]['extensions'][$extension]);
- }
- uksort($dialplans[$context]['extensions'],
- array(new Shout, "extensort"));
- }
- # Handle include lines
- if (isset($res[$i]['asteriskincludeline'])) {
- $j = 0;
- while ($j < $res[$i]['asteriskincludeline']['count']) {
- @$line = $res[$i]['asteriskincludeline'][$j];
- $dialplans[$context]['includes'][$j] = $line;
- $j++;
- }
- }
-
- # Handle ignorepat
- if (isset($res[$i]['asteriskignorepat'])) {
- $j = 0;
- while ($j < $res[$i]['asteriskignorepat']['count']) {
- @$line = $res[$i]['asteriskignorepat'][$j];
- $dialplans[$context]['ignorepats'][$j] = $line;
- $j++;
- }
- }
- # Handle ignorepat
- if (isset($res[$i]['asteriskextensionbareline'])) {
- $j = 0;
- while ($j < $res[$i]['asteriskextensionbareline']['count']) {
- @$line = $res[$i]['asteriskextensionbareline'][$j];
- $dialplans[$context]['barelines'][$j] = $line;
- $j++;
- }
- }
-
- # Increment object
- $i++;
- }
- return $dialplans[$context];
- }
-
- /**
- * Get the limits for the current user, the user's context, and global
- * Return the most specific values in every case. Return default values
- * where no data is found. If $extension is specified, $context must
- * also be specified.
- *
- * @param optional string $context Context to search
- *
- * @param optional string $extension Extension/user to search
- *
- * @return array Array with elements indicating various limits
- */
- # FIXME Figure out how this fits into Shout/Congregation better
- public function getLimits($context = null, $extension = null)
- {
-
- $limits = array('telephonenumbersmax',
- 'voicemailboxesmax',
- 'asteriskusersmax');
-
- if(!is_null($extension) && is_null($context)) {
- return PEAR::raiseError("Extension specified but no context " .
- "given.");
- }
-
- if (!is_null($context) && isset($limits[$context])) {
- if (!is_null($extension) &&
- isset($limits[$context][$extension])) {
- return $limits[$context][$extension];
- }
- return $limits[$context];
- }
-
- # Set some default limits (to unlimited)
- static $cachedlimits = array();
- # Initialize the limits with defaults
- if (count($cachedlimits) < 1) {
- foreach ($limits as $limit) {
- $cachedlimits[$limit] = 99999;
- }
- }
-
- # Collect the global limits
- $res = @ldap_search($this->_LDAP,
- SHOUT_ASTERISK_BRANCH.','.$this->_params['basedn'],
- '(&(objectClass=asteriskLimits)(cn=globals))',
- $limits);
-
- if (!$res) {
- return PEAR::raiseError('Unable to search the LDAP server for ' .
- 'global limits');
- }
-
- $res = ldap_get_entries($this->_LDAP, $res);
- # There should only have been one object returned so we'll just take the
- # first result returned
- if ($res['count'] > 0) {
- foreach ($limits as $limit) {
- if (isset($res[0][$limit][0])) {
- $cachedlimits[$limit] = $res[0][$limit][0];
- }
- }
- } else {
- return PEAR::raiseError("No global object found.");
- }
-
- # Get limits for the context, if provided
- if (isset($context)) {
- $res = ldap_search($this->_LDAP,
- SHOUT_ASTERISK_BRANCH.','.$this->_params['basedn'],
- "(&(objectClass=asteriskLimits)(cn=$context))");
-
- if (!$res) {
- return PEAR::raiseError('Unable to search the LDAP server ' .
- "for $context specific limits");
- }
-
- $cachedlimits[$context][$extension] = array();
- if ($res['count'] > 0) {
- foreach ($limits as $limit) {
- if (isset($res[0][$limit][0])) {
- $cachedlimits[$context][$limit] = $res[0][$limit][0];
- } else {
- # If no value is provided use the global limit
- $cachedlimits[$context][$limit] = $cachedlimits[$limit];
- }
- }
- } else {
-
- foreach ($limits as $limit) {
- $cachedlimits[$context][$limit] =
- $cachedlimits[$limit];
- }
- }
-
- if (isset($extension)) {
- $res = @ldap_search($this->_LDAP,
- SHOUT_USERS_BRANCH.','.$this->_params['basedn'],
- "(&(objectClass=asteriskLimits)(voiceMailbox=$extension)".
- "(context=$context))");
-
- if (!$res) {
- return PEAR::raiseError('Unable to search the LDAP server '.
- "for Extension $extension, $context specific limits");
- }
-
- $cachedlimits[$context][$extension] = array();
- if ($res['count'] > 0) {
- foreach ($limits as $limit) {
- if (isset($res[0][$limit][0])) {
- $cachedlimits[$context][$extension][$limit] =
- $res[0][$limit][0];
- } else {
- # If no value is provided use the context limit
- $cachedlimits[$context][$extension][$limit] =
- $cachedlimits[$context][$limit];
- }
- }
- } else {
- foreach ($limits as $limit) {
- $cachedlimits[$context][$extension][$limit] =
- $cachedlimits[$context][$limit];
- }
- }
- return $cachedlimits[$context][$extension];
- }
- return $cachedlimits[$context];
- }
- }
-
- /**
* Save an extension to the LDAP tree
*
* @param string $context Context to which the user should be added
return $dn;
}
- /* Needed because uksort can't take a classed function as its callback arg */
- protected function _sortexten($e1, $e2)
- {
- print "$e1 and $e2\n";
- $ret = Shout::extensort($e1, $e2);
- print "returning $ret";
- return $ret;
- }
-
/**
* Attempts to open a connection to the LDAP server.
*