X-Git-Url: https://git.defcon.no/?a=blobdiff_plain;f=api%2Falias.php;fp=api%2Falias.php;h=6451b2eef3efa52c774c1997afbd9b072df6f3e5;hb=220a8d4c07bfb4cb6be8122fda7dc6ceb0d1da8f;hp=0000000000000000000000000000000000000000;hpb=e9dd114b2570a41c4f517bdee270fbc2c791de92;p=hermes diff --git a/api/alias.php b/api/alias.php new file mode 100644 index 0000000..6451b2e --- /dev/null +++ b/api/alias.php @@ -0,0 +1,212 @@ + 'failed', 'cause' => 'error', 'detail' => 'Database connection failed.')); + exit; +} + +//************************************************************************************* + switch ( $_SERVER['PATH_INFO'] ) + { + case "/list": + /* + Required parameters should be... + destination + */ + $list = array(); + $dest_username = ""; + $dest_domain = ""; + $e164_only = false; + if ( array_key_exists( 'destination', $_GET) ) + { + $tmp = split_sipaddress($_GET['destination']); + if ( !$tmp ) + { + print json_encode ( array( 'response' => 'failed', 'cause' => 'invalid', 'detail' => 'Invalid SIP address') ); + break; + } + list ( $dest_username, $dest_domain ) = $tmp; + + if ( array_key_exists( 'e164', $_GET ) ) + { + if ( strtolower($_GET['e164']) == "true" ) $e164_only = true; + $list = get_e164_alias( $dest_username, $dest_domain ); + } + else if ( $dest_username && $dest_domain ) + { + $list = get_aliases( $dest_username, $dest_domain ); + } + } + else if ( array_key_exists( 'alias', $_GET) ) + { + $tmp = split_sipaddress($_GET['alias']); + if ( !$tmp ) + { + print json_encode ( array( 'response' => 'failed', 'cause' => 'invalid', 'detail' => 'Invalid SIP address') ); + break; + } + list ( $alias_username, $alias_domain ) = $tmp; + + $list = get_destination( $alias_username, $alias_domain ); + } + else + $list = get_aliases( null, null ); + + + print json_encode ( array( 'response' => 'ok', 'aliases' => $list ) ); + break; + case "/add": + if ( array_key_exists( 'destination', $_GET) + && ( ( array_key_exists( 'alias_username', $_GET) && array_key_exists( 'alias_domain', $_GET ) ) || array_key_exists('alias', $_GET) ) ) + { + $alias_username = ""; + $alias_domain = ""; + if ( array_key_exists('alias_username', $_GET) ) + { + $alias_username = $_GET['alias_username']; + $alias_domain = $_GET['alias_domain']; + } + else + { + $alias = split_sipaddress($_GET['alias']); + if ( !$alias ) + { + print json_encode ( array( 'response' => 'failed', 'cause' => 'invalid', 'detail' => 'Invalid SIP address') ); + break; + } + list ( $alias_username, $alias_domain ) = $alias; + } + + if ( !verify_sipadress($_GET['destination']) ) + { + // TODO: Provide a better response.. + print json_encode ( array( 'response' => 'invalid', 'cause' => 'destination' ) ); + break; + } + if ( !verify_sipadress( $alias_username . "@" . $alias_domain) ) + { + // TODO: Provide a better response.. + print json_encode ( array( 'response' => 'invalid', 'cause' => 'alias' ) ); + break; + } + + // TODO: Verify that alias does not collide with existing SIP-adress + if ( is_kamailio_domain( $alias_domain) && is_kamailio_subscriber($alias_username, $alias_domain) ) + { + print json_encode ( array( 'response' => 'failed', 'cause' => 'exists', 'detail' => 'The desired alias collides with an existing non-alias.' )); + break; + } + + list ( $dest_username, $dest_domain ) = split_sipaddress( $_GET['destination']); + + if ( (!$dest_username)||(!$dest_domain)) + { + // TODO: Provide a better response.. + print json_encode ( array( 'response' => 'invalid', 'cause' => 'alias' ) ); + break; + } + if ( !is_kamailio_domain( $alias_domain ) ) + { + print json_encode ( array( 'response' => 'invalid', 'cause' => 'nxdomain' ) ); + break; + } + if ( is_kamailio_domain( $dest_domain) && ( !is_kamailio_subscriber($dest_username, $dest_domain) ) ) + { + print json_encode( array ( 'response' => 'failed', 'cause' => 'nonexistant', 'detail' => 'Requesting a local alias, but there is no such user')); + break; + } + if ( verify_e164( $alias_username ) && is_kamailio_subscriber($dest_username, $dest_domain) ) + { + $t = get_e164_alias( $dest_username, $dest_domain ); + if ( $t ) + { + print json_encode ( array( + 'response' => 'failed', + 'cause' => 'exists', + 'detail' => 'User already has E164 number alias', + 'alias' => $t['alias'] )); + break; + } + } + if ( alias_exists ( $alias_username, $alias_domain ) ) + { + print json_encode( array ( 'response' => 'failed', 'cause' => 'exists', 'detail' => 'The requested alias is already present.')); + break; + } + if ( add_alias( $alias_username, $alias_domain, $dest_username, $dest_domain ) ) + { + print json_encode( array ('response' => 'ok', + 'alias' => $alias_username . "@" . $alias_domain, + 'destination' => $dest_username . "@" . $dest_domain )); + break; + } + print json_encode ( array ( 'response' => 'error' )); + break; + } + else + { + print json_encode ( array( 'response' => 'invalid') ); + } + break; + case "/remove": + if ( ( array_key_exists( 'alias_username', $_GET) && array_key_exists( 'alias_domain', $_GET ) ) || array_key_exists('alias', $_GET) ) + { + $alias_username = ""; + $alias_domain = ""; + if ( array_key_exists('alias_username', $_GET) ) + { + $alias_username = $_GET['alias_username']; + $alias_domain = $_GET['alias_domain']; + } + else + { + $alias = split_sipaddress($_GET['alias']); + if ( !$alias ) + { + print json_encode ( array( 'response' => 'failed', 'cause' => 'invalid', 'detail' => 'Invalid SIP address') ); + break; + } + list ( $alias_username, $alias_domain ) = $alias; + } + + if ( !verify_sipadress( $alias_username . "@" . $alias_domain) ) + { + // TODO: Provide a better response.. + print json_encode ( array( 'response' => 'invalid', 'cause' => 'address', 'detail' => 'Not a valid SIP address' ) ); + break; + } + if ( ! alias_exists ( $alias_username, $alias_domain ) ) + { + print json_encode( array ( 'response' => 'failed', 'cause' => 'nonexistant', 'detail' => 'The requested alias does not exist.')); + break; + } + if ( remove_alias( $alias_username, $alias_domain ) ) + { + print json_encode( array ('response' => 'ok', + 'alias' => $alias_username . "@" . $alias_domain)); + break; + } + print json_encode ( array ( 'response' => 'error' )); + break; + } + print json_encode ( array( 'response' => 'invalid') ); + break; + default: + print json_encode ( array( 'response' => 'invalid') ); + } +mysql_close( $config['sql_link'] ); +?>