From 18828322dfaaad99cfd36bcc788d04488dac7d14 Mon Sep 17 00:00:00 2001 From: mattf Date: Thu, 14 Jan 2021 14:14:48 +0000 Subject: [PATCH] Added 'copy_user' function to the Non-Agent API. git-svn-id: svn://192.168.202.10@3342 3d104415-ff17-0410-8863-d5cf3c621b8a --- UPGRADE | 2 + docs/NON-AGENT_API.txt | 33 ++++- www/vicidial/non_agent_api.php | 220 ++++++++++++++++++++++++++++++++- 3 files changed, 251 insertions(+), 4 deletions(-) diff --git a/UPGRADE b/UPGRADE index f51b5731..71a3ec79 100644 --- a/UPGRADE +++ b/UPGRADE @@ -562,6 +562,8 @@ OTHER CHANGES: 159. Added Agent Search Method override options for campaigns and in-groups. +160. Added 'copy_user' function to the Non-Agent API. + diff --git a/docs/NON-AGENT_API.txt b/docs/NON-AGENT_API.txt index fc28625a..3d512403 100644 --- a/docs/NON-AGENT_API.txt +++ b/docs/NON-AGENT_API.txt @@ -1,4 +1,4 @@ -NON-AGENT API DOCUMENT Started: 2008-07-24 Updated: 2020-12-01 +NON-AGENT API DOCUMENT Started: 2008-07-24 Updated: 2021-01-13 This document describes the functions of an API(Application Programming Interface) for all functions NOT directly relating to the VICIDIAL Agent screen. @@ -26,6 +26,7 @@ did_log_export - exports all calls inbound to a DID for one day agent_stats_export - exports agent statistics for set time period add_user - adds a user to the system update_user - updates some user settings in the system +copy_user - copies an existing user in the system to a new user ID and name add_phone - adds a phone to the system update_phone - updates or deletes an existing phone record in the system add_phone_alias - adds a phone alias record to the system @@ -167,6 +168,7 @@ Changes: 201106-1654 - Added campaign_id option to agent_stats_export function 201113-0713 - Added delete_did option to update_did function 201201-1625 - Added group_by_campaign option to agent_stats_export function +210113-1714 - Added copy_user function API Functions use the 'function' variable @@ -1204,6 +1206,35 @@ SUCCESS: add_user USER HAS BEEN ADDED - 6666|1000|1234|8|Testing+Person|AGENTS +-------------------------------------------------------------------------------- +copy_user - copies an existing user in the system to a new user ID and name + +NOTE: api user for this function must have user_level set to 8 or higher and "modify users" enabled + +REQUIRED FIELDS- +agent_user - 2-20 characters (for auto-generated send 'AUTOGENERATED') +agent_pass - 1-20 characters +agent_full_name - 1-50 characters +source_user - 2-20 characters (must be an existing user ID in the system) + +NOTE: This function does not work with Vtiger integration + +Example URL strings for API calls: +http://server/vicidial/non_agent_api.php?source=test&function=copy_user&user=6666&pass=1234&agent_user=1000&agent_pass=9999&source_user=5555&agent_full_name=Copy+Person + +Example responses: +ERROR: copy_user USER DOES NOT HAVE PERMISSION TO COPY USERS - 6666|0 +ERROR: copy_user YOU MUST USE ALL REQUIRED FIELDS - 6666|1000|5555||| +ERROR: copy_user USER DOES NOT HAVE PERMISSION TO COPY USERS IN THIS USER LEVEL - 9|8 +ERROR: copy_user SOURCE USER DOES NOT EXIST - 6666|5555 +ERROR: copy_user USER GROUP DOES NOT EXIST - 6666|ADFHR +ERROR: copy_user USER ALREADY EXISTS - 6666|6666 +SUCCESS: copy_user USER HAS BEEN COPIED - 6666|1000|1234|Testing+Person|5555 + + + + + -------------------------------------------------------------------------------- update_user - updates or deletes a user entry already in the system diff --git a/www/vicidial/non_agent_api.php b/www/vicidial/non_agent_api.php index 48f73d8d..04166e31 100644 --- a/www/vicidial/non_agent_api.php +++ b/www/vicidial/non_agent_api.php @@ -1,7 +1,7 @@ LICENSE: AGPLv2 +# Copyright (C) 2021 Matt Florell LICENSE: AGPLv2 # # This script is designed as an API(Application Programming Interface) to allow # other programs to interact with all non-agent-screen VICIDIAL functions @@ -158,10 +158,11 @@ # 201113-0713 - Added delete_did option to update_did function, Issue #1242 # 201201-1625 - Added group_by_campaign option to agent_stats_export function # 201214-1547 - Fixes for PHP8 compatibility +# 210113-1714 - Added copy_user function # -$version = '2.14-135'; -$build = '201214-1547'; +$version = '2.14-136'; +$build = '210113-1714'; $api_url_log = 0; $startMS = microtime(); @@ -558,6 +559,8 @@ if (isset($_GET["delete_did"])) {$delete_did=$_GET["delete_did"];} elseif (isset($_POST["delete_did"])) {$delete_did=$_POST["delete_did"];} if (isset($_GET["group_by_campaign"])) {$group_by_campaign=$_GET["group_by_campaign"];} elseif (isset($_POST["group_by_campaign"])) {$group_by_campaign=$_POST["group_by_campaign"];} +if (isset($_GET["source_user"])) {$source_user=$_GET["source_user"];} + elseif (isset($_POST["source_user"])) {$source_user=$_POST["source_user"];} header ("Content-type: text/html; charset=utf-8"); @@ -794,12 +797,14 @@ if ($non_latin < 1) $on_hook_agent = preg_replace('/[^-_0-9a-zA-Z]/','',$on_hook_agent); $delete_did = preg_replace('/[^0-9a-zA-Z]/','',$delete_did); $group_by_campaign = preg_replace('/[^0-9a-zA-Z]/','',$group_by_campaign); + $source_user = preg_replace('/[^-_0-9a-zA-Z]/','',$source_user); } else { $user = preg_replace("/'|\"|\\\\|;|#/","",$user); $pass = preg_replace("/'|\"|\\\\|;|#/","",$pass); $source = preg_replace("/'|\"|\\\\|;|#/","",$source); + $source_user = preg_replace("/'|\"|\\\\|;|#/","",$source_user); } $USarea = substr($phone_number, 0, 3); @@ -2864,6 +2869,215 @@ if ($function == 'add_user') +################################################################################ +### copy_user - adds user to the vicidial_users table +################################################################################ +if ($function == 'copy_user') + { + if(strlen($source)<2) + { + $result = 'ERROR'; + $result_reason = "Invalid Source"; + echo "$result: $result_reason - $source\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + echo "ERROR: Invalid Source: |$source|\n"; + exit; + } + else + { + if ( (!preg_match("/ $function /",$api_allowed_functions)) and (!preg_match("/ALL_FUNCTIONS/",$api_allowed_functions)) ) + { + $result = 'ERROR'; + $result_reason = "auth USER DOES NOT HAVE PERMISSION TO USE THIS FUNCTION"; + echo "$result: $result_reason: |$user|$function|\n"; + $data = "$allowed_user"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + exit; + } + $stmt="SELECT count(*) from vicidial_users where user='$user' and vdc_agent_api_access='1' and modify_users='1' and user_level >= 8 and active='Y';"; + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $allowed_user=$row[0]; + if ($allowed_user < 1) + { + $result = 'ERROR'; + $result_reason = "copy_user USER DOES NOT HAVE PERMISSION TO COPY USERS"; + $data = "$allowed_user"; + echo "$result: $result_reason: |$user|$data\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + exit; + } + else + { + if ( (strlen($agent_user)<2) or (strlen($agent_pass)<2) or (strlen($source_user)<1) or (strlen($agent_full_name)<1) ) + { + $result = 'ERROR'; + $result_reason = "copy_user YOU MUST USE ALL REQUIRED FIELDS"; + $data = "$agent_user|$agent_pass|$source_user|$agent_full_name"; + echo "$result: $result_reason: |$user|$data\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + exit; + } + else + { + $stmt="SELECT user_level,user_group,modify_same_user_level from vicidial_users where user='$user' and vdc_agent_api_access='1' and modify_users='1' and user_level >= 8;"; + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $user_level = $row[0]; + $LOGuser_group = $row[1]; + $modify_same_user_level = $row[2]; + + $stmt="SELECT user_level,user_group from vicidial_users where user='$source_user';"; + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $SOURCEuser_level = $row[0]; + $SOURCEuser_group = $row[1]; + + $stmt="SELECT allowed_campaigns,admin_viewable_groups from vicidial_user_groups where user_group='$LOGuser_group';"; + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $LOGallowed_campaigns = $row[0]; + $LOGadmin_viewable_groups = $row[1]; + + $LOGadmin_viewable_groupsSQL=''; + $whereLOGadmin_viewable_groupsSQL=''; + if ( (!preg_match('/\-\-ALL\-\-/i',$LOGadmin_viewable_groups)) and (strlen($LOGadmin_viewable_groups) > 3) ) + { + $rawLOGadmin_viewable_groupsSQL = preg_replace("/ -/",'',$LOGadmin_viewable_groups); + $rawLOGadmin_viewable_groupsSQL = preg_replace("/ /","','",$rawLOGadmin_viewable_groupsSQL); + $LOGadmin_viewable_groupsSQL = "and user_group IN('---ALL---','$rawLOGadmin_viewable_groupsSQL')"; + $whereLOGadmin_viewable_groupsSQL = "where user_group IN('---ALL---','$rawLOGadmin_viewable_groupsSQL')"; + } + + if ( ( ($user_level < 9) and ($user_level <= $SOURCEuser_level) ) or ( ($modify_same_user_level < 1) and ($user_level >= 9) and ($user_level==$SOURCEuser_level) ) ) + { + $result = 'ERROR'; + $result_reason = "copy_user USER DOES NOT HAVE PERMISSION TO COPY USERS IN THIS USER LEVEL"; + $data = "$SOURCEuser_level|$user_level"; + echo "$result: $result_reason: |$user|$data\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + exit; + } + else + { + $stmt="SELECT count(*) from vicidial_user_groups where user_group='$SOURCEuser_group' $LOGadmin_viewable_groupsSQL;"; + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $group_exists=$row[0]; + if ($group_exists < 1) + { + $result = 'ERROR'; + $result_reason = "copy_user USER GROUP DOES NOT EXIST"; + $data = "$SOURCEuser_group"; + echo "$result: $result_reason: |$user|$data\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + exit; + } + else + { + $stmt="SELECT count(*) from vicidial_users where user='$agent_user';"; + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $user_exists=$row[0]; + if ($user_exists > 0) + { + $result = 'ERROR'; + $result_reason = "copy_user USER ALREADY EXISTS"; + $data = "$agent_user"; + echo "$result: $result_reason: |$user|$data\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + exit; + } + else + { + # if user value is set to autogenerate then find the next value for user + if (preg_match('/AUTOGENERA/',$agent_user)) + { + $new_user=0; + $auto_user_add_value=0; + while ($new_user < 2) + { + if ($new_user < 1) + { + $stmt = "SELECT auto_user_add_value FROM system_settings;"; + $rslt=mysql_to_mysqli($stmt, $link); + $ss_auav_ct = mysqli_num_rows($rslt); + if ($ss_auav_ct > 0) + { + $row=mysqli_fetch_row($rslt); + $auto_user_add_value = $row[0]; + } + $new_user++; + } + $stmt = "SELECT count(*) FROM vicidial_users where user='$auto_user_add_value';"; + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + if ($row[0] < 1) + { + $new_user++; + } + else + { + # echo "\n"; + $auto_user_add_value = ($auto_user_add_value + 7); + } + } + $agent_user = $auto_user_add_value; + + $stmt="UPDATE system_settings SET auto_user_add_value='$agent_user';"; + $rslt=mysql_to_mysqli($stmt, $link); + } + + $pass_hash=''; + if ( ($SSpass_hash_enabled > 0) and (strlen($agent_pass) > 1) ) + { + $agent_pass = preg_replace("/\'|\"|\\\\|;| /","",$agent_pass); + $pass_hash = exec("../agc/bp.pl --pass=$agent_pass"); + $pass_hash = preg_replace("/PHASH: |\n|\r|\t| /",'',$pass_hash); + $agent_pass=''; + } + + $stmt="INSERT INTO vicidial_users (user,pass,full_name,user_level,user_group,phone_login,phone_pass,delete_users,delete_user_groups,delete_lists,delete_campaigns,delete_ingroups,delete_remote_agents,load_leads,campaign_detail,ast_admin_access,ast_delete_phones,delete_scripts,modify_leads,hotkeys_active,change_agent_campaign,agent_choose_ingroups,closer_campaigns,scheduled_callbacks,agentonly_callbacks,agentcall_manual,vicidial_recording,vicidial_transfers,delete_filters,alter_agent_interface_options,closer_default_blended,delete_call_times,modify_call_times,modify_users,modify_campaigns,modify_lists,modify_scripts,modify_filters,modify_ingroups,modify_usergroups,modify_remoteagents,modify_servers,view_reports,vicidial_recording_override,alter_custdata_override,qc_enabled,qc_user_level,qc_pass,qc_finish,qc_commit,add_timeclock_log,modify_timeclock_log,delete_timeclock_log,alter_custphone_override,vdc_agent_api_access,modify_inbound_dids,delete_inbound_dids,active,alert_enabled,download_lists,agent_shift_enforcement_override,manager_shift_enforcement_override,export_reports,delete_from_dnc,email,user_code,territory,allow_alerts,agent_choose_territories,custom_one,custom_two,custom_three,custom_four,custom_five,voicemail_id,agent_call_log_view_override,callcard_admin,agent_choose_blended,realtime_block_user_info,custom_fields_modify,force_change_password,agent_lead_search_override,modify_shifts,modify_phones,modify_carriers,modify_labels,modify_statuses,modify_voicemail,modify_audiostore,modify_moh,modify_tts,preset_contact_search,modify_contacts,modify_same_user_level,admin_hide_lead_data,admin_hide_phone_data,agentcall_email,agentcall_chat,modify_email_accounts,pass_hash,alter_admin_interface_options,max_inbound_calls,modify_custom_dialplans,wrapup_seconds_override,modify_languages,selected_language,user_choose_language,ignore_group_on_search,api_list_restrict,api_allowed_functions,lead_filter_id,admin_cf_show_hidden,user_hide_realtime,modify_colors,user_nickname,user_new_lead_limit,api_only_user,modify_auto_reports,modify_ip_lists,ignore_ip_list,ready_max_logout,export_gdpr_leads,access_recordings,pause_code_approval,max_hopper_calls,max_hopper_calls_hour,mute_recordings,hide_call_log_info,next_dial_my_callbacks,user_admin_redirect_url,max_inbound_filter_enabled,max_inbound_filter_statuses,max_inbound_filter_ingroups,max_inbound_filter_min_sec,status_group_id) SELECT \"$agent_user\",\"$agent_pass\",\"$agent_full_name\",user_level,user_group,phone_login,phone_pass,delete_users,delete_user_groups,delete_lists,delete_campaigns,delete_ingroups,delete_remote_agents,load_leads,campaign_detail,ast_admin_access,ast_delete_phones,delete_scripts,modify_leads,hotkeys_active,change_agent_campaign,agent_choose_ingroups,closer_campaigns,scheduled_callbacks,agentonly_callbacks,agentcall_manual,vicidial_recording,vicidial_transfers,delete_filters,alter_agent_interface_options,closer_default_blended,delete_call_times,modify_call_times,modify_users,modify_campaigns,modify_lists,modify_scripts,modify_filters,modify_ingroups,modify_usergroups,modify_remoteagents,modify_servers,view_reports,vicidial_recording_override,alter_custdata_override,qc_enabled,qc_user_level,qc_pass,qc_finish,qc_commit,add_timeclock_log,modify_timeclock_log,delete_timeclock_log,alter_custphone_override,vdc_agent_api_access,modify_inbound_dids,delete_inbound_dids,active,alert_enabled,download_lists,agent_shift_enforcement_override,manager_shift_enforcement_override,export_reports,delete_from_dnc,email,user_code,territory,allow_alerts,agent_choose_territories,custom_one,custom_two,custom_three,custom_four,custom_five,voicemail_id,agent_call_log_view_override,callcard_admin,agent_choose_blended,realtime_block_user_info,custom_fields_modify,force_change_password,agent_lead_search_override,modify_shifts,modify_phones,modify_carriers,modify_labels,modify_statuses,modify_voicemail,modify_audiostore,modify_moh,modify_tts,preset_contact_search,modify_contacts,modify_same_user_level,admin_hide_lead_data,admin_hide_phone_data,agentcall_email,agentcall_chat,modify_email_accounts,\"$pass_hash\",alter_admin_interface_options,max_inbound_calls,modify_custom_dialplans,wrapup_seconds_override,modify_languages,selected_language,user_choose_language,ignore_group_on_search,api_list_restrict,api_allowed_functions,lead_filter_id,admin_cf_show_hidden,user_hide_realtime,modify_colors,user_nickname,user_new_lead_limit,api_only_user,modify_auto_reports,modify_ip_lists,ignore_ip_list,ready_max_logout,export_gdpr_leads,access_recordings,pause_code_approval,max_hopper_calls,max_hopper_calls_hour,mute_recordings,hide_call_log_info,next_dial_my_callbacks,user_admin_redirect_url,max_inbound_filter_enabled,max_inbound_filter_statuses,max_inbound_filter_ingroups,max_inbound_filter_min_sec,status_group_id from vicidial_users where user=\"$source_user\";"; + $rslt=mysql_to_mysqli($stmt, $link); + $affected_rows = mysqli_affected_rows($link); + + $stmtA="INSERT INTO vicidial_inbound_group_agents (user,group_id,group_rank,group_weight,calls_today,group_type) SELECT \"$agent_user\",group_id,group_rank,group_weight,\"0\",group_type from vicidial_inbound_group_agents where user=\"$source_user\";"; + $rslt=mysql_to_mysqli($stmtA, $link); + $affected_rowsA = mysqli_affected_rows($link); + + $stmtB="INSERT INTO vicidial_campaign_agents (user,campaign_id,campaign_rank,campaign_weight,calls_today) SELECT \"$agent_user\",campaign_id,campaign_rank,campaign_weight,\"0\" from vicidial_campaign_agents where user=\"$source_user\";"; + $rslt=mysql_to_mysqli($stmtB, $link); + $affected_rowsB = mysqli_affected_rows($link); + + ### LOG INSERTION Admin Log Table ### + $SQL_log = "$stmt|$stmtA|$stmtB|"; + $SQL_log = preg_replace('/;/', '', $SQL_log); + $SQL_log = addslashes($SQL_log); + $stmt="INSERT INTO vicidial_admin_log set event_date='$NOW_TIME', user='$user', ip_address='$ip', event_section='USERS', event_type='COPY', record_id='$agent_user', event_code='ADMIN API COPY USER', event_sql=\"$SQL_log\", event_notes='user: $agent_user source_user: $source_user rows: $affected_rows,$affected_rowsA,$affected_rowsB';"; + if ($DB) {echo "|$stmt|$stmtA|$stmtB|\n";} + $rslt=mysql_to_mysqli($stmt, $link); + + $result = 'SUCCESS'; + $result_reason = "copy_user USER HAS BEEN COPIED"; + $data = "$agent_user|$agent_pass|$agent_full_name|$source_user"; + echo "$result: $result_reason - $user|$data\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + } + } + } + } + } + } + exit; + } +################################################################################ +### END copy_user +################################################################################ + + + + + ################################################################################ ### update_user - updates user entry already in the system ################################################################################