. * * Version 0.1 * Author: Daniel Larraz */ include_once $API_core.'json_api.php'; include_once $API_core.'complex_ajax_return_functions.php'; include_once $API_core.'conf_file.php'; include_once $base_plugin.'php/paths.php'; $output = array(); // -- DEBUG VARIABLE: EXECUTED PROGRAMS OUTPUTS -- /* ------------------------------------------------------------------------ */ if ( $_POST['type']=="nv" ) { if ( isset($_POST['form_fields']) ) { $post_data=jsondecode ($_POST['form_fields']); } switch ($_POST['action']) { case 'restart_radius': restart_radius (); break; /* Certificates panel */ case 'delete_cert_files': delete_cert_files (); break; case 'save_cert_pass': save_cert_pass ($post_data); break; /* Users panel */ case 'create_user': create_user ($post_data); break; case 'update_user': update_user ($post_data); break; case 'get_user_info': get_user_info ($_POST['username']); break; case 'delete_user': delete_user ($_POST['username']); break; /* Auth servers panel */ case 'create_auth_server': create_auth_server ($post_data); break; case 'update_auth_server': update_auth_server ($_POST['servername'], $post_data); break; case 'get_auth_server_info': get_auth_server_info ($_POST['servername']); break; case 'delete_auth_server': delete_auth_server ($_POST['servername']); break; /* Acct servers panel */ case 'update_acct_server': update_acct_server ($_POST['servername'], $post_data); break; case 'get_acct_server_info': get_acct_server_info ($_POST['servername']); break; /* Clients panel */ case 'create_client': create_client ($post_data); break; case 'update_client': update_client ($_POST['clientname'], $post_data); break; case 'get_client_info': get_client_info ($_POST['clientname']); break; case 'delete_client': delete_client ($_POST['clientname']); break; } /* DEBUG OUTPUT */ //response_additem ("html", "
".print_r($post_data,true)."", "debug"); //response_additem ("html", "
".print_r($output,true)."", "debug"); response_return (); } /* ------------------------------------------------------------------------ */ function execute ($cmd) /* ------------------------------------------------------------------------ */ { global $output; exec ("sudo ".$cmd, $return); $output = array_merge ($output, $return); // DEBUG LOG } /* ------------------------------------------------------------------------ */ function error_msg ($msg) /* ------------------------------------------------------------------------ */ { //response_additem ("html", "" ,"output"); response_additem ("script", "alert('".$msg."')"); } /* ------------------------------------------------------------------------ */ function restart_radius () /* ------------------------------------------------------------------------ */ { execute ('sudo /etc/init.d/freeradius restart'); response_additem ("html", "" ,"output"); } /* ------------------------------------------------------------------------ */ function delete_cert_files () /* ------------------------------------------------------------------------ */ { global $paths; global $base_plugin; execute ('rm '.$paths['cacert']); execute ('rm '.$paths['server_cert']); execute ('rm '.$paths['server_key']); response_additem ("script", "cert_files_deleted()"); } /* ------------------------------------------------------------------------ */ function is_cert_pass_valid ($pass) /* ------------------------------------------------------------------------ */ { $pass_len = strlen($pass); return ($pass_len >= 4 && $pass_len <= 8191); } /* ------------------------------------------------------------------------ */ function is_password_valid ($password, $uploadfile) /* ------------------------------------------------------------------------ */ { exec ("sudo /etc/ssl/sh/mod_key.sh $uploadfile $password", $ret); return ($ret[0] == "VALID_FILE"); } /* ------------------------------------------------------------------------ */ function is_cert_pass_form_valid ($post_data, $uploadfile) /* ------------------------------------------------------------------------ */ { $is_valid = false; if ( !is_cert_pass_valid ($post_data['cert_pass']) ) { response_additem ("script", "cert_set_alert('cert_pass')"); } elseif ( $post_data['cert_pass'] != $post_data['cnf_cert_pass'] ) { error_msg ('Password missmatch.'); } elseif ( !is_password_valid ($post_data['cert_pass'], $uploadfile) ) { error_msg ('Private key file does not have that password.'); } else { $is_valid = true; } return $is_valid; } /* ------------------------------------------------------------------------ */ function check_certs_files($key_pass) /* ------------------------------------------------------------------------ */ { global $paths; include_once $base_plugin.'php/certs.php'; if ( exists_certificates ($paths) ) { if ( are_cert_and_key_valid($paths, $key_pass) ) { restart_radius (); response_additem ("script", "$('#radius_config').show()"); } else { response_additem ("script", "alert('Certificate and private key mismatch.')"); } } } /* ------------------------------------------------------------------------ */ function save_cert_pass ($post_data) /* ------------------------------------------------------------------------ */ { global $paths; global $base_plugin; $uploadfile = $base_plugin.'data/server_key'; if ( is_cert_pass_form_valid ($post_data, $uploadfile) ) { exec("sudo mv ".$uploadfile." ".$paths['server_key']); exec("sudo chown root:root ".$paths['server_key']); $sed = 'sed \'/private_key_password/c\\\t\t\tprivate_key_password = '. $post_data['cert_pass']."' ".$paths['fr_eap']." > ". $base_plugin."data/temp_eap"; execute ($sed); execute ("mv ".$base_plugin."data/temp_eap ".$paths['fr_eap']); execute ("chown root:freerad ".$paths['fr_eap']); response_additem ("script", "reset_cert_pass_form()"); check_certs_files ($post_data['cert_pass']); } response_additem ("html", "" ,"output"); } /* ------------------------------------------------------------------------ */ function get_user_info ($username) /* ------------------------------------------------------------------------ */ { global $paths; $users = load_conf_file ($paths['users']); $info = $users[$username]; /* Pre: the form has been reset */ response_additem ("value", $username ,"username"); response_additem ("value", $info['Cleartext-Password'] ,"password"); response_additem ("value", $info['Cleartext-Password'] ,"cnf_password"); response_additem ("script", "$('#username').attr('readonly','true')"); response_additem ("script", "$('#username').addClass('readonly')"); if ( isset($info['Session-Timeout']) ) { response_additem ("script", "$('#timeout_ckb').attr('checked','true')"); response_additem ("script", "$('#session_timeout').val('".$info['Session-Timeout']."')"); response_additem ("script", "onchange_timeout_ckb()"); } if ( isset($info['Login-Time']) ) { $login_time = $info['Login-Time']; $slot = strtok ($login_time, ","); while ($slot !== false) { $dweek = substr($slot, 0, 2); $hour_start = substr($slot, 2, 2); $min_start = substr($slot, 4, 2); $hour_end = substr($slot, 7, 2); $min_end = substr($slot, 9, 2); response_additem ("script", "add_time_slot('".$dweek."', '". $hour_start."', '".$min_start."', '".$hour_end."', '".$min_end."')"); $slot = strtok (","); } } } /* ------------------------------------------------------------------------ */ function delete_user ($username) /* ------------------------------------------------------------------------ */ { global $paths; global $base_plugin; $users = load_conf_file ($paths['users']); if ( isset($users[$username]) ) { unset($users[$username]); save_conf_file ($paths['users'], $users); include_once $base_plugin.'php/write_fr_users.php'; write_fr_users ($paths['fr_users'], $users); execute ('sudo /etc/init.d/freeradius restart'); response_additem ("script", "$('#user_".$username."').remove()"); response_additem ("html", "" ,"output"); } else { error_msg ('User does not exist.'); } } /* ------------------------------------------------------------------------ */ function is_time_slot_valid ($field, $idx, $min, $max, $post_data) /* ------------------------------------------------------------------------ */ { $is_valid = (isset($post_data['ts_'.$field.'_'.$idx]) && preg_match('/^[0-9]+$/', trim($post_data['ts_'.$field.'_'.$idx])) ); if ($is_valid) { $value = intval($post_data['ts_'.$field.'_'.$idx]); $is_valid = $value >= $min && $value <= $max; } return $is_valid; } /* ------------------------------------------------------------------------ */ function are_time_slots_valid ($post_data) /* ------------------------------------------------------------------------ */ { $are_valid = true; $nslots = intval($_POST['nslots']); for ($i=0; $i<$nslots && $are_valid; $i++) { if ($post_data['dweek_'.$i]) { if (!is_time_slot_valid ('hour_start', $i, 0, 23, $post_data)) { $are_valid = false; } elseif (!is_time_slot_valid ('min_start', $i, 0, 59, $post_data)) { $are_valid = false; } elseif (!is_time_slot_valid ('hour_end', $i, 0, 23, $post_data)) { $are_valid = false; } elseif (!is_time_slot_valid ('min_end', $i, 0, 59, $post_data)) { $are_valid = false; } } } return $are_valid; } /* ------------------------------------------------------------------------ */ function is_user_form_valid ($username, $post_data) /* ------------------------------------------------------------------------ */ { $is_valid = false; if ( !preg_match('/^[ a-z0-9_]{1,253}$/i', $username) ) { // FreeRADIUS username can be up to 253 characters in length error_msg ('Username is invalid.'); } elseif ( strlen($post_data['password']) == 0 ) { error_msg ('Password is invalid.'); } elseif ( $post_data['password'] != $post_data['cnf_password'] ) { error_msg ('Password missmatch.'); } elseif ( $post_data['timeout_ckb'] && intval($post_data['session_timeout']) <= 0 ) { error_msg ('Session timeout is invalid.'); } elseif ( !are_time_slots_valid($post_data) ) { error_msg ('Time slot is invalid.'); } else { $is_valid = true; } return $is_valid; } /* ------------------------------------------------------------------------ */ function add_user_data ($username, $post_data, $users) /* ------------------------------------------------------------------------ */ { unset ($users[$username]['Session-Timeout']); unset ($users[$username]['Login-Time']); $users[$username]['Cleartext-Password'] = $post_data['password']; if ( isset($post_data['timeout_ckb']) ) { $users[$username]['Session-Timeout'] = intval($post_data['session_timeout']); } $nslots = intval($_POST['nslots']); for ($i=0; $i<$nslots; $i++) { if ($post_data['dweek_'.$i]) { $dweek = $post_data['dweek_'.$i]; $hour_start = intval($post_data['ts_hour_start_'.$i]); $min_start = intval($post_data['ts_min_start_'.$i]); $hour_end = intval($post_data['ts_hour_end_'.$i]); $min_end = intval($post_data['ts_min_end_'.$i]); $users[$username]['Login-Time'] .= $dweek.sprintf("%02d", $hour_start).sprintf("%02d", $min_start)."-". sprintf("%02d", $hour_end).sprintf("%02d", $min_end).","; response_additem ("script", "remove_time_slot(".$idx.")"); } } $users[$username]['Login-Time'] = substr($users[$username]['Login-Time'], 0, -1); // Remove last ',' return $users; } /* ------------------------------------------------------------------------ */ function create_usr_show_tip($username, $info) /* ------------------------------------------------------------------------ */ { response_additem ("script", "user_logtime['".$username."']=[]"); $dweek_str = array ( 'Al' => 'All', 'Wk' => 'Monday-Friday', 'Mo' => 'Monday', 'Tu' => 'Tuesday', 'We' => 'Wednesday', 'Th' => 'Thursday', 'Fr' => 'Friday', 'Sa' => 'Saturday', 'Su' => 'Sunday' ); $login_time = $info; $slot = strtok ($login_time, ","); while ($slot !== false) { $dweek = substr($slot, 0, 2); $hour_start = substr($slot, 2, 2); $min_start = substr($slot, 4, 2); $hour_end = substr($slot, 7, 2); $min_end = substr($slot, 9, 2); $logtime = ''.$dweek_str[$dweek].', '.$hour_start.':'. $min_start.'-'.$hour_end.':'.$min_end; response_additem ("script", "user_logtime['".$username."'].push('$logtime')"); $slot = strtok (","); } response_additem ("script", "create_user_tip('".$username."')"); } /* ------------------------------------------------------------------------ */ function add_user ($username, $post_data, $users, $is_new) /* ------------------------------------------------------------------------ */ { global $paths; global $base_plugin; if ( is_user_form_valid ($username, $post_data) ) { $users = add_user_data ($username, $post_data, $users); save_conf_file ($paths['users'], $users); include_once $base_plugin.'php/write_fr_users.php'; write_fr_users ($paths['freeradius'].'users', $users); execute ('sudo /etc/init.d/freeradius restart'); response_additem ("script", "reset_user_form()"); response_additem ("html", "" ,"output"); include_once $base_plugin.'php/display_users.php'; if ( $is_new ) { response_additem ("script", "cancel_new_user()"); response_additem ("append", '