]> git.defcon.no Git - hermes/commitdiff
backlog add
authorJon Langseth <fishy@defcon.no>
Tue, 6 Aug 2013 10:38:14 +0000 (12:38 +0200)
committerJon Langseth <fishy@defcon.no>
Tue, 6 Aug 2013 10:38:14 +0000 (12:38 +0200)
api/config.php.sample
api/lib/user_functions.php
api/t/tests_common.pm
api/t/user.t
api/user.php
doc/api-nodes.txt
guc-clients/listsipusers

index 997812ae6c1c35f13b3e20110905a5f2910a3c3c..a5378074b542652b22e83612f2bfe79648e62d00 100644 (file)
@@ -40,6 +40,7 @@ function get_config()
                'kamailio_subscriber_table' => 'subscriber',
                'kamailio_alias_table' => 'dbaliases',
                'kamailio_domain_table' => 'domain',
+               'kamailio_location_table' => 'location',
 
                'hermes_users_table' => 'users',
                'hermes_phones_table' => 'phones',
@@ -51,7 +52,7 @@ function get_config()
 
                'auth_backend' => 'permitall',
                'sessionkey_lifetime' => 5, // Minutes
-               'standard_dialplan' => '(*xx*.|xxx.)',
+               'standard_dialplan' => '(**x*x.|*xx*|*xx*x.|*xx*x.*|*xx|*xx.|xxx.)',
                'default_domain' => 'hig.no',
                'permit_multiple_e164alias' => false,
                'standard_password_length' => 10,
index c8556f149476fd04fcb3f2bb243f1ed92f92018e..2deef712c209c00238ce061c2a6e29ab1ec0fc1c 100644 (file)
@@ -265,12 +265,12 @@ function update_provision_pw ( $username, $domain, $password )
 function list_users ( $search = null )
 {
        global $config;
-       $query = sprintf("SELECT CONCAT(username, '@', domain), displayname FROM %s ORDER BY username,domain", $config['hermes_users_table'] );
+       $query = sprintf("SELECT CONCAT(username, '@', domain), displayname, username, domain FROM %s ORDER BY username,domain", $config['hermes_users_table'] );
 
        if ( array_key_exists ( 'search', $_POST ) )
        {
                $search = $_POST['search']; // TODO: Add some sanitation and input validation!
-               $query = sprintf("SELECT CONCAT(username, '@', domain) FROM %s WHERE CONCAT(username, '@', domain) LIKE '%%%s%%' ORDER BY username,domain", $config['hermes_users_table'], sql_clean( $search ) );
+               $query = sprintf("SELECT CONCAT(username, '@', domain), displayname, username, domain FROM %s WHERE CONCAT(username, '@', domain) LIKE '%%%s%%' ORDER BY username,domain", $config['hermes_users_table'], sql_clean( $search ) );
        }
 
        $result = sql_dbquery( $config['hermes_db'], $query );
@@ -278,7 +278,8 @@ function list_users ( $search = null )
        $list = array();
        while ( $row = @mysql_fetch_row( $result ) )
        {
-               array_push( $list, array( "user" => $row[0], "displayname" => $row[1] ) );
+               $online = is_online( $row[2], $row[3] ) ? online : offline;
+               array_push( $list, array( "user" => $row[0], "displayname" => $row[1], "status" => $online ) );
        }
        return $list;
        print json_encode( array( 'response' => 'ok', 'list' => $list ));
@@ -337,5 +338,30 @@ function get_userdata( $username, $domain )
 
        return $user;
 }
-       
+
+function get_locations( $username, $domain )
+{
+       global $config;
+
+       $query = sprintf ("SELECT contact, UNIX_TIMESTAMP(expires) as expires, user_agent, socket FROM %s WHERE username = '%s' AND (domain = '%s' OR domain is NULL)",
+               $config['kamailio_location_table'],
+               sql_clean($username),
+               sql_clean($domain));
+
+       $result = sql_dbquery( $config['kamailio_db'], $query );
+       if ( !$result ) return null;
+       $list = array();
+       while ( $row = @mysql_fetch_row( $result ) )
+       {
+               array_push( $list, array( "contact" => $row[0], "expires" => $row[1], "useragent" => $row[2] ) );
+       }
+       return $list;
+}
+
+function is_online( $username, $domain )
+{
+       if ( get_locations( $username, $domain ) != null ) return true;
+       else return false;
+}
+
 ?>
index ee6d3a5507c8d4754951a3acc0ef0ec20046fc1c..43356324a8c5f4363102a2ac97e89ad158583b3b 100644 (file)
@@ -41,8 +41,8 @@ BEGIN {
        %EXPORT_TAGS = ( 'all' => [ qw( ) ] );
        @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); 
 }
-our $api_base  = "http://10.0.2.5/hermes/api/";
-our $api_key   = "4hErgw3QFJLeuXGW";
+our $api_base  = "http://sippbx.hig.no/hermes/api/";
+our $api_key   = "e065gBpUwqzY0a5o";
 our $invalid_key = "invalidkey" . int(rand(255));
 
 our $test_username = "testauth-" . int(rand(255));
index 6373c6cdf696b1dcb5fd77aeeadf899bfd0faab9..21d675d5ad11aeedce93fad65d5bb2285cd462ab 100644 (file)
@@ -91,7 +91,7 @@ ok( $data->{'user'}->{'ha1'} =~ m/[a-z0-9]{16,}/,     'user/get ha1 hash generated')
 undef $data;
 
 $data = exec_apinode("user/gen_pw", undef);
-ok( $data =~ m/[a-zA-Z0-9]{24}/,               'user/gen_pw format OK');
+ok( $data =~ m/[a-zA-Z0-9]{8}/,                'user/gen_pw format OK');
 $temp = $data;
 undef $data;
 
index 260ac35016365afc7f19a8d703beccd74ce019e5..e8099d9dfebcfbe479f840c277d043c5b8fe10b9 100644 (file)
@@ -101,6 +101,40 @@ token_auth();
                        else
                                print json_encode ( array( 'response' => 'invalid') );
                        break;
+
+               case "/location":
+                       if ( array_key_exists('user', $_POST) ||
+                               ( array_key_exists('username', $_POST) && array_key_exists('domain', $_POST )))
+                       {
+                               $username = "";
+                               $domain = "";
+                               if ( array_key_exists('username', $_POST) )
+                               {
+                                       $username = $_POST['username'];
+                                       $domain = $_POST['domain'];
+                               }
+                               else
+                               {
+                                       $user = split_sipaddress($_POST['user']);
+                                       if ( !$user )
+                                       {
+                                               print json_encode ( array( 'response' => 'failed', 'cause' => 'invalid', 'detail' => 'Invalid SIP address') );
+                                               break;
+                                       }
+                                       list ( $username, $domain ) = $user;
+                               }
+                               $location = get_locations( $username, $domain );
+                               if ( $location == null )
+                               {
+                                       print json_encode( array( 'response' => 'failed', 'cause' => 'offline' ));
+                                       break;
+                               }
+                               print json_encode( array( 'response' => 'ok', 'locations' => $location ));
+                       }
+                       else
+                               print json_encode ( array( 'response' => 'invalid') );
+                       break;
+
                case "/list":
                        /* 
                        Simply list all users in user@domain format 
index 42150590925c825d644b25e79df5daac69314888..a3cafc99bed7291c1dcd2e79a24b63fe280471a5 100644 (file)
@@ -250,6 +250,27 @@ user/get
        Returns 'failed' with 'cause' = 'nonexistant' if user does not exist..
        Returns 'failed' with 'cause' = 'invalid' if SIP address is malformed.
 
+user/location
+-------------------
+  Required:
+       user=user@bar.bz *
+    
+  Description:
+       Return registered user agent locations for a given user, with 
+        contact and user agent information.
+       
+  Return:
+       On success, returns the array 'locations', each element contianing:
+               'contact' is the registration contact (the location)
+               'useragent' is the UA string from the client
+               'expires' is the expiration time of the registration, as unix timestamp
+       
+       Returns 'failed' with 'cause' = 'offline' if user is not registered ...
+       Returns 'failed' with 'cause' = 'invalid' if SIP address is malformed.
+
+  TODO:
+       Add a return code for non-existant subscriber?
+
 user/list
 -------------------
   Optional:
@@ -705,6 +726,11 @@ api/alias/list destination=foo@bar.bz e164=true
 TODO list:
 ---------------------
 
+user/forward To set up permanent forwarding. Call forward is stored as a user
+  preference value in the kamailio database. Evample of diverting calls to
+  'jonl@hig.no' to the number +4761135280':
+insert into usr_preferences (username, domain, attribute, value, last_modified) values ( 'jonl', 'hig.no', 'cfu', '+4761135280', now());
+
 Some TODO's listed above ...
 
 Permissions! (user/permissions?user=...)
index fccedb0e57a022170bed2d156a014f967f693073..10cdb96e26e70485a3ffaa93e78414323d838d9f 100755 (executable)
@@ -90,6 +90,7 @@ my @users = @$t;
 foreach my $u ( @users )
 {
        printf("%-24s", $u->{'user'});
+       printf("%-12s", $u->{'status'});
        my $alias_data = exec_apinode("alias/list", { 'destination' => $u->{'user'} });
        if ( $alias_data->{'response'} eq 'ok' )
        {