| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | /* user_model.php | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This model implements user authentication and authorization | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | // Uses 'phpass' from http://www.openwall.com/phpass/ to implement password hashing
 | 
					
						
							| 
									
										
										
										
											2017-11-07 08:45:06 +08:00
										 |  |  | // TODO migration away from this?
 | 
					
						
							|  |  |  | //require_once('application/third_party/PasswordHash.php');
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class User_Model extends CI_Model { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: object get($username)
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	// Retrieve a user
 | 
					
						
							|  |  |  | 	function get($username) { | 
					
						
							| 
									
										
										
										
											2019-10-06 02:35:55 +08:00
										 |  |  | 		// Clean ID
 | 
					
						
							|  |  |  | 		$clean_username = $this->security->xss_clean($username); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->db->where('user_name', $clean_username); | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 		$r = $this->db->get($this->config->item('auth_table')); | 
					
						
							|  |  |  | 		return $r; | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: object get_by_id($id)
 | 
					
						
							|  |  |  | 	// Retrieve a user by user ID
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	function get_by_id($id) { | 
					
						
							| 
									
										
										
										
											2019-10-06 02:35:55 +08:00
										 |  |  | 				// Clean ID
 | 
					
						
							|  |  |  | 		$clean_id = $this->security->xss_clean($id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->db->where('user_id', $clean_id); | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 		$r = $this->db->get($this->config->item('auth_table')); | 
					
						
							|  |  |  | 		return $r; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 	// FUNCTION: object get_all_lotw_users
 | 
					
						
							|  |  |  | 	// Returns all users with lotw details
 | 
					
						
							|  |  |  | 	function get_all_lotw_users() { | 
					
						
							|  |  |  | 		$this->db->where('user_lotw_name !=', null); | 
					
						
							| 
									
										
										
										
											2020-09-08 07:30:16 +08:00
										 |  |  | 		$this->db->where('user_lotw_name !=', ""); | 
					
						
							| 
									
										
										
										
											2020-09-06 23:55:30 +08:00
										 |  |  | 		$r = $this->db->get($this->config->item('auth_table')); | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 		return $r; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 	// FUNCTION: object get_by_email($email)
 | 
					
						
							|  |  |  | 	// Retrieve a user by email address
 | 
					
						
							|  |  |  | 	function get_by_email($email) { | 
					
						
							| 
									
										
										
										
											2019-10-06 02:35:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		$clean_email = $this->security->xss_clean($email); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->db->where('user_email', $clean_email); | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 		$r = $this->db->get($this->config->item('auth_table')); | 
					
						
							|  |  |  | 		return $r; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-18 23:29:22 +08:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	 * Function: check_email_address | 
					
						
							|  |  |  | 	 *  | 
					
						
							|  |  |  | 	 * Checks if an email address is already in use | 
					
						
							|  |  |  | 	 *  | 
					
						
							|  |  |  | 	 * @param string $email | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	function check_email_address($email) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$clean_email = $this->security->xss_clean($email); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->db->where('user_email', $clean_email); | 
					
						
							|  |  |  | 		$query = $this->db->get($this->config->item('auth_table')); | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		if ($query->num_rows() > 0) { | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-16 01:29:33 +08:00
										 |  |  | 	function get_email_address($userid) { | 
					
						
							|  |  |  | 		$this->db->where('user_id', $userid); | 
					
						
							|  |  |  | 		$query = $this->db->get($this->config->item('auth_table')); | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		$ret = $query->row(); | 
					
						
							|  |  |  | 		return $ret->user_email; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: bool exists($username)
 | 
					
						
							|  |  |  | 	// Check if a user exists (by username)
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	function exists($username) { | 
					
						
							| 
									
										
										
										
											2019-10-06 02:35:55 +08:00
										 |  |  | 		$clean_username = $this->security->xss_clean($username); | 
					
						
							|  |  |  | 		if($this->get($clean_username)->num_rows() == 0) { | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 			return 0; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 	// FUNCTION: bool exists_by_id($id)
 | 
					
						
							|  |  |  | 	// Check if a user exists (by user ID)
 | 
					
						
							|  |  |  | 	function exists_by_id($id) { | 
					
						
							| 
									
										
										
										
											2019-10-06 02:35:55 +08:00
										 |  |  | 		$clean_id = $this->security->xss_clean($id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if($this->get_by_id($clean_id)->num_rows() == 0) { | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 			return 0; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// FUNCTION: bool exists_by_email($email)
 | 
					
						
							|  |  |  | 	// Check if a user exists (by email address)
 | 
					
						
							|  |  |  | 	function exists_by_email($email) { | 
					
						
							| 
									
										
										
										
											2017-12-01 10:01:11 +08:00
										 |  |  | 		if($this->get_by_email($email)->num_rows() == 0) { | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 			return 0; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: bool add($username, $password, $email, $type)
 | 
					
						
							|  |  |  | 	// Add a user
 | 
					
						
							| 
									
										
										
										
											2021-05-07 14:03:25 +08:00
										 |  |  | 	function add($username, $password, $email, $type, $firstname, $lastname, $callsign, $locator, $timezone, | 
					
						
							| 
									
										
										
										
											2022-10-19 22:27:26 +08:00
										 |  |  | 		$measurement, $user_date_format, $user_stylesheet, $user_qth_lookup, $user_sota_lookup, $user_wwff_lookup, | 
					
						
							|  |  |  | 		$user_show_notes, $user_column1, $user_column2, $user_column3, $user_column4, $user_column5, | 
					
						
							| 
									
										
										
										
											2023-01-28 00:24:48 +08:00
										 |  |  | 		$user_show_profile_image, $user_previous_qsl_type, $user_amsat_status_upload) { | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 		// Check that the user isn't already used
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 		if(!$this->exists($username)) { | 
					
						
							|  |  |  | 			$data = array( | 
					
						
							| 
									
										
										
										
											2019-10-06 05:16:58 +08:00
										 |  |  | 				'user_name' => xss_clean($username), | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 				'user_password' => $this->_hash($password), | 
					
						
							| 
									
										
										
										
											2019-10-06 05:16:58 +08:00
										 |  |  | 				'user_email' => xss_clean($email), | 
					
						
							|  |  |  | 				'user_type' => xss_clean($type), | 
					
						
							|  |  |  | 				'user_firstname' => xss_clean($firstname), | 
					
						
							|  |  |  | 				'user_lastname' => xss_clean($lastname), | 
					
						
							|  |  |  | 				'user_callsign' => xss_clean($callsign), | 
					
						
							|  |  |  | 				'user_locator' => xss_clean($locator), | 
					
						
							| 
									
										
										
										
											2020-09-17 03:54:26 +08:00
										 |  |  | 				'user_timezone' => xss_clean($timezone), | 
					
						
							|  |  |  | 				'user_measurement_base' => xss_clean($measurement), | 
					
						
							|  |  |  | 				'user_date_format' => xss_clean($user_date_format), | 
					
						
							| 
									
										
										
										
											2020-09-23 16:59:49 +08:00
										 |  |  | 				'user_stylesheet' => xss_clean($user_stylesheet), | 
					
						
							| 
									
										
										
										
											2022-10-19 22:27:26 +08:00
										 |  |  | 				'user_qth_lookup' => xss_clean($user_qth_lookup), | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 				'user_sota_lookup' => xss_clean($user_sota_lookup), | 
					
						
							| 
									
										
										
										
											2022-10-19 20:52:43 +08:00
										 |  |  | 				'user_wwff_lookup' => xss_clean($user_wwff_lookup), | 
					
						
							| 
									
										
										
										
											2021-03-21 04:19:07 +08:00
										 |  |  | 				'user_show_notes' => xss_clean($user_show_notes), | 
					
						
							| 
									
										
										
										
											2021-05-05 23:52:42 +08:00
										 |  |  | 				'user_column1' => xss_clean($user_column1), | 
					
						
							|  |  |  | 				'user_column2' => xss_clean($user_column2), | 
					
						
							|  |  |  | 				'user_column3' => xss_clean($user_column3), | 
					
						
							|  |  |  | 				'user_column4' => xss_clean($user_column4), | 
					
						
							| 
									
										
										
										
											2021-05-07 14:03:25 +08:00
										 |  |  | 				'user_column5' => xss_clean($user_column5), | 
					
						
							| 
									
										
										
										
											2022-07-03 17:39:05 +08:00
										 |  |  | 				'user_show_profile_image' => xss_clean($user_show_profile_image), | 
					
						
							| 
									
										
										
										
											2022-11-25 07:22:31 +08:00
										 |  |  | 				'user_previous_qsl_type' => xss_clean($user_previous_qsl_type), | 
					
						
							| 
									
										
										
										
											2023-01-28 00:24:48 +08:00
										 |  |  | 				'user_amsat_status_upload' => xss_clean($user_amsat_status_upload), | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 			); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 			// Check the password is valid
 | 
					
						
							|  |  |  | 			if($data['user_password'] == EPASSWORDINVALID) { | 
					
						
							|  |  |  | 				return EPASSWORDINVALID; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// Check the email address isn't in use
 | 
					
						
							|  |  |  | 			if($this->exists_by_email($email)) { | 
					
						
							|  |  |  | 				return EEMAILEXISTS; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-06 18:32:54 +08:00
										 |  |  | 			// Add user and insert bandsettings for user
 | 
					
						
							| 
									
										
										
										
											2011-08-18 09:27:53 +08:00
										 |  |  | 			$this->db->insert($this->config->item('auth_table'), $data); | 
					
						
							| 
									
										
										
										
											2022-09-06 18:32:54 +08:00
										 |  |  | 			$insert_id = $this->db->insert_id(); | 
					
						
							| 
									
										
										
										
											2022-10-06 04:13:12 +08:00
										 |  |  | 			$this->db->query("insert into bandxuser (bandid, userid, active, cq, dok, dxcc, iota, pota, sig, sota, uscounties, was, wwff, vucc) select bands.id, " . $insert_id . ", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 from bands;"); | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 			return OK; | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 			return EUSERNAMEEXISTS; | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 	// FUNCTION: bool edit()
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// Edit a user
 | 
					
						
							| 
									
										
										
										
											2011-08-20 03:33:37 +08:00
										 |  |  | 	function edit($fields) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Check user privileges
 | 
					
						
							|  |  |  | 		if(($this->session->userdata('user_type') == 99) || ($this->session->userdata('user_id') == $fields['id'])) { | 
					
						
							|  |  |  | 			if($this->exists_by_id($fields['id'])) { | 
					
						
							|  |  |  | 				$data = array( | 
					
						
							| 
									
										
										
										
											2019-10-06 04:57:44 +08:00
										 |  |  | 					'user_name' => xss_clean($fields['user_name']), | 
					
						
							|  |  |  | 					'user_email' => xss_clean($fields['user_email']), | 
					
						
							|  |  |  | 					'user_callsign' => xss_clean($fields['user_callsign']), | 
					
						
							|  |  |  | 					'user_locator' => xss_clean($fields['user_locator']), | 
					
						
							|  |  |  | 					'user_firstname' => xss_clean($fields['user_firstname']), | 
					
						
							|  |  |  | 					'user_lastname' => xss_clean($fields['user_lastname']), | 
					
						
							|  |  |  | 					'user_timezone' => xss_clean($fields['user_timezone']), | 
					
						
							|  |  |  | 					'user_lotw_name' => xss_clean($fields['user_lotw_name']), | 
					
						
							|  |  |  | 					'user_eqsl_name' => xss_clean($fields['user_eqsl_name']), | 
					
						
							|  |  |  | 					'user_clublog_name' => xss_clean($fields['user_clublog_name']), | 
					
						
							| 
									
										
										
										
											2020-09-14 18:29:02 +08:00
										 |  |  | 					'user_measurement_base' => xss_clean($fields['user_measurement_base']), | 
					
						
							| 
									
										
										
										
											2020-09-16 05:04:47 +08:00
										 |  |  | 					'user_date_format' => xss_clean($fields['user_date_format']), | 
					
						
							| 
									
										
										
										
											2020-09-23 16:59:49 +08:00
										 |  |  | 					'user_stylesheet' => xss_clean($fields['user_stylesheet']), | 
					
						
							| 
									
										
										
										
											2022-10-19 22:27:26 +08:00
										 |  |  | 					'user_qth_lookup' => xss_clean($fields['user_qth_lookup']), | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 					'user_sota_lookup' => xss_clean($fields['user_sota_lookup']), | 
					
						
							| 
									
										
										
										
											2022-10-19 20:52:43 +08:00
										 |  |  | 					'user_wwff_lookup' => xss_clean($fields['user_wwff_lookup']), | 
					
						
							| 
									
										
										
										
											2021-03-21 04:19:07 +08:00
										 |  |  | 					'user_show_notes' => xss_clean($fields['user_show_notes']), | 
					
						
							| 
									
										
										
										
											2021-05-05 23:52:42 +08:00
										 |  |  | 					'user_column1' => xss_clean($fields['user_column1']), | 
					
						
							|  |  |  | 					'user_column2' => xss_clean($fields['user_column2']), | 
					
						
							|  |  |  | 					'user_column3' => xss_clean($fields['user_column3']), | 
					
						
							|  |  |  | 					'user_column4' => xss_clean($fields['user_column4']), | 
					
						
							| 
									
										
										
										
											2021-05-07 14:03:25 +08:00
										 |  |  | 					'user_column5' => xss_clean($fields['user_column5']), | 
					
						
							| 
									
										
										
										
											2022-07-03 17:39:05 +08:00
										 |  |  | 					'user_show_profile_image' => xss_clean($fields['user_show_profile_image']), | 
					
						
							| 
									
										
										
										
											2022-11-25 07:22:31 +08:00
										 |  |  | 					'user_previous_qsl_type' => xss_clean($fields['user_previous_qsl_type']), | 
					
						
							| 
									
										
										
										
											2023-01-28 00:24:48 +08:00
										 |  |  | 					'user_amsat_status_upload' => xss_clean($fields['user_amsat_status_upload']), | 
					
						
							| 
									
										
										
										
											2011-08-20 03:33:37 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-20 03:33:37 +08:00
										 |  |  | 				// Check to see if the user is allowed to change user levels
 | 
					
						
							|  |  |  | 				if($this->session->userdata('user_type') == 99) { | 
					
						
							|  |  |  | 					$data['user_type'] = $fields['user_type']; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-20 03:33:37 +08:00
										 |  |  | 				// Check to see if username is used already
 | 
					
						
							|  |  |  | 				if($this->exists($fields['user_name']) && $this->get($fields['user_name'])->row()->user_id != $fields['id']) { | 
					
						
							|  |  |  | 					return EUSERNAMEEXISTS; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				// Check to see if email address is used already
 | 
					
						
							|  |  |  | 				if($this->exists_by_email($fields['user_email']) && $this->get_by_email($fields['user_email'])->row()->user_id != $fields['id']) { | 
					
						
							|  |  |  | 					return EEMAILEXISTS; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-20 03:33:37 +08:00
										 |  |  | 				// Hash password
 | 
					
						
							|  |  |  | 				if($fields['user_password'] != NULL) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					$data['user_password'] = $this->_hash($fields['user_password']); | 
					
						
							|  |  |  | 					if($data['user_password'] == EPASSWORDINVALID) { | 
					
						
							|  |  |  | 						return EPASSWORDINVALID; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-17 21:54:16 +08:00
										 |  |  | 				if($fields['user_lotw_password'] != NULL) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					$data['user_lotw_password'] = $fields['user_lotw_password']; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2019-06-19 22:24:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				if($fields['user_clublog_password'] != NULL) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					$data['user_clublog_password'] = $fields['user_clublog_password']; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-17 22:08:26 +08:00
										 |  |  | 				if($fields['user_eqsl_password'] != NULL) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					$data['user_eqsl_password'] = $fields['user_eqsl_password']; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-20 03:33:37 +08:00
										 |  |  | 				// Update the user
 | 
					
						
							|  |  |  | 				$this->db->where('user_id', $fields['id']); | 
					
						
							|  |  |  | 				$this->db->update($this->config->item('auth_table'), $data); | 
					
						
							|  |  |  | 				return OK; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				return ENOSUCHUSER; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2011-08-20 03:33:37 +08:00
										 |  |  | 			return EFORBIDDEN; | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// FUNCTION: bool delete()
 | 
					
						
							|  |  |  | 	// Deletes a user
 | 
					
						
							|  |  |  | 	function delete($user_id) { | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 		if($this->exists_by_id($user_id)) { | 
					
						
							|  |  |  | 			$this->db->query("DELETE FROM ".$this->config->item('auth_table')." WHERE user_id = '".$user_id."'"); | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 			return 1; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: bool login()
 | 
					
						
							|  |  |  | 	// Validates a username/password combination
 | 
					
						
							|  |  |  | 	// This is really just a wrapper around User_Model::authenticate
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	function login() { | 
					
						
							| 
									
										
										
										
											2017-11-07 08:45:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-06 02:35:55 +08:00
										 |  |  | 		$username = $this->input->post('user_name', true); | 
					
						
							|  |  |  | 		$password = $this->input->post('user_password', true); | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return $this->authenticate($username, $password); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: void clear_session()
 | 
					
						
							|  |  |  | 	// Clears a user's login session
 | 
					
						
							|  |  |  | 	// Nothing is returned - it can be assumed that if this is called, the user's
 | 
					
						
							|  |  |  | 	// login session *will* be cleared, no matter what state it is in
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	function clear_session() { | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-07 08:45:06 +08:00
										 |  |  | 		$this->session->sess_destroy(); | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: void update_session()
 | 
					
						
							|  |  |  | 	// Updates a user's login session after they've logged in
 | 
					
						
							|  |  |  | 	// TODO: This should return bool TRUE/FALSE or 0/1
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	function update_session($id) { | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 		$u = $this->get_by_id($id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$userdata = array( | 
					
						
							| 
									
										
										
										
											2018-12-01 03:00:09 +08:00
										 |  |  | 			'user_id'		 => $u->row()->user_id, | 
					
						
							|  |  |  | 			'user_name'		 => $u->row()->user_name, | 
					
						
							|  |  |  | 			'user_type'		 => $u->row()->user_type, | 
					
						
							|  |  |  | 			'user_callsign'		 => $u->row()->user_callsign, | 
					
						
							|  |  |  | 			'user_locator'		 => $u->row()->user_locator, | 
					
						
							|  |  |  | 			'user_lotw_name'	 => $u->row()->user_lotw_name, | 
					
						
							|  |  |  | 			'user_eqsl_name'	 => $u->row()->user_eqsl_name, | 
					
						
							|  |  |  | 			'user_eqsl_qth_nickname' => $u->row()->user_eqsl_qth_nickname, | 
					
						
							| 
									
										
										
										
											2019-06-25 19:46:13 +08:00
										 |  |  | 			'user_hash'		 => $this->_hash($u->row()->user_id."-".$u->row()->user_type), | 
					
						
							|  |  |  | 			'radio' => isset($_COOKIE["radio"])?$_COOKIE["radio"]:"", | 
					
						
							| 
									
										
										
										
											2020-09-14 18:29:02 +08:00
										 |  |  | 			'station_profile_id' => isset($_COOKIE["station_profile_id"])?$_COOKIE["station_profile_id"]:"", | 
					
						
							|  |  |  | 			'user_measurement_base' => $u->row()->user_measurement_base, | 
					
						
							| 
									
										
										
										
											2020-09-16 05:04:47 +08:00
										 |  |  | 			'user_date_format' => $u->row()->user_date_format, | 
					
						
							| 
									
										
										
										
											2020-09-23 16:59:49 +08:00
										 |  |  | 			'user_stylesheet' => $u->row()->user_stylesheet, | 
					
						
							| 
									
										
										
										
											2022-10-19 22:27:26 +08:00
										 |  |  | 			'user_qth_lookup' => isset($u->row()->user_qth_lookup) ? $u->row()->user_qth_lookup : 0, | 
					
						
							| 
									
										
										
										
											2021-07-20 21:07:55 +08:00
										 |  |  | 			'user_sota_lookup' => isset($u->row()->user_sota_lookup) ? $u->row()->user_sota_lookup : 0, | 
					
						
							| 
									
										
										
										
											2022-10-19 20:52:43 +08:00
										 |  |  | 			'user_wwff_lookup' => isset($u->row()->user_wwff_lookup) ? $u->row()->user_wwff_lookup : 0, | 
					
						
							| 
									
										
										
										
											2021-07-20 21:07:55 +08:00
										 |  |  | 			'user_show_notes' => isset($u->row()->user_show_notes) ? $u->row()->user_show_notes : 1, | 
					
						
							| 
									
										
										
										
											2022-07-03 17:39:05 +08:00
										 |  |  | 			'user_show_profile_image' => isset($u->row()->user_show_profile_image) ? $u->row()->user_show_profile_image : 0, | 
					
						
							| 
									
										
										
										
											2021-07-20 21:07:55 +08:00
										 |  |  | 			'user_column1' => isset($u->row()->user_column1) ? $u->row()->user_column1: 'Mode', | 
					
						
							|  |  |  | 			'user_column2' => isset($u->row()->user_column2) ? $u->row()->user_column2: 'RSTS', | 
					
						
							|  |  |  | 			'user_column3' => isset($u->row()->user_column3) ? $u->row()->user_column3: 'RSTR', | 
					
						
							|  |  |  | 			'user_column4' => isset($u->row()->user_column4) ? $u->row()->user_column4: 'Band', | 
					
						
							|  |  |  | 			'user_column5' => isset($u->row()->user_column5) ? $u->row()->user_column5: 'Country', | 
					
						
							| 
									
										
										
										
											2022-11-25 07:22:31 +08:00
										 |  |  | 			'user_previous_qsl_type' => isset($u->row()->user_previous_qsl_type) ? $u->row()->user_previous_qsl_type: 0, | 
					
						
							| 
									
										
										
										
											2023-01-28 00:24:48 +08:00
										 |  |  | 			'user_amsat_status_upload' => isset($u->row()->user_amsat_status_upload) ? $u->row()->user_amsat_status_upload: 0, | 
					
						
							| 
									
										
										
										
											2021-09-08 01:07:48 +08:00
										 |  |  | 			'active_station_logbook' => $u->row()->active_station_logbook, | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->session->set_userdata($userdata); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: bool validate_session()
 | 
					
						
							|  |  |  | 	// Validate a user's login session
 | 
					
						
							|  |  |  | 	// If the user's session is corrupted in any way, it will clear the session
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	function validate_session() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if($this->session->userdata('user_id')) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$user_id = $this->session->userdata('user_id'); | 
					
						
							|  |  |  | 			$user_type = $this->session->userdata('user_type'); | 
					
						
							|  |  |  | 			$user_hash = $this->session->userdata('user_hash'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if($this->_auth($user_id."-".$user_type, $user_hash)) { | 
					
						
							| 
									
										
										
										
											2011-08-20 01:24:56 +08:00
										 |  |  | 				// Freshen the session
 | 
					
						
							|  |  |  | 				$this->update_session($user_id); | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 				return 1; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$this->clear_session(); | 
					
						
							|  |  |  | 				return 0; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: bool authenticate($username, $password)
 | 
					
						
							|  |  |  | 	// Authenticate a user against the users table
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	function authenticate($username, $password) { | 
					
						
							|  |  |  | 		$u = $this->get($username); | 
					
						
							| 
									
										
										
										
											2017-11-07 08:45:06 +08:00
										 |  |  | 		if($u->num_rows() != 0) | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			if($this->_auth($password, $u->row()->user_password)) { | 
					
						
							|  |  |  | 				return 1; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: bool authorize($level)
 | 
					
						
							|  |  |  | 	// Checks a user's level of access against the given $level
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	function authorize($level) { | 
					
						
							|  |  |  | 		$u = $this->get_by_id($this->session->userdata('user_id')); | 
					
						
							| 
									
										
										
										
											2011-08-20 01:24:56 +08:00
										 |  |  | 		$l = $this->config->item('auth_mode'); | 
					
						
							|  |  |  | 		// Check to see if the minimum level of access is higher than
 | 
					
						
							|  |  |  | 		// the user's own level. If it is, use that.
 | 
					
						
							|  |  |  | 		if($this->config->item('auth_mode') > $level) { | 
					
						
							|  |  |  | 			$level = $this->config->item('auth_mode'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if(($this->validate_session()) && ($u->row()->user_type >= $level) || $this->config->item('use_auth') == FALSE || $level == 0) { | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 			return 1; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: bool set($username, $data)
 | 
					
						
							|  |  |  | 	// Updates a user's record in the database
 | 
					
						
							|  |  |  | 	// TODO: This returns TRUE/1 no matter what at the moment - should
 | 
					
						
							|  |  |  | 	// TODO: return TRUE/FALSE or 0/1 depending on success/failure
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	function set($username, $data) { | 
					
						
							|  |  |  | 		$this->db->where('user_name', $username); | 
					
						
							|  |  |  | 		$this->db->update($this->config->item('auth_table', $data)); | 
					
						
							|  |  |  | 		return 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: object users()
 | 
					
						
							|  |  |  | 	// Returns a list of users
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	function users() { | 
					
						
							|  |  |  | 		$r = $this->db->get($this->config->item('auth_table')); | 
					
						
							|  |  |  | 		return $r; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-28 06:47:25 +08:00
										 |  |  | 	// FUNCTION: array timezones()
 | 
					
						
							|  |  |  | 	// Returns a list of timezones
 | 
					
						
							|  |  |  | 	function timezones() { | 
					
						
							| 
									
										
										
										
											2021-09-29 03:34:32 +08:00
										 |  |  | 		$r = $this->db->query('SELECT id, name FROM timezones ORDER BY `offset`'); | 
					
						
							| 
									
										
										
										
											2011-09-28 06:47:25 +08:00
										 |  |  | 		$ts = array(); | 
					
						
							|  |  |  | 		foreach ($r->result_array() as $t) { | 
					
						
							|  |  |  | 			$ts[$t['id']] = $t['name']; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return $ts; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-09 19:13:41 +08:00
										 |  |  | 	// FUNCTION: array getThemes()
 | 
					
						
							|  |  |  | 	// Returns a list of themes
 | 
					
						
							|  |  |  | 	function getThemes() { | 
					
						
							|  |  |  | 		$result = $this->db->query('SELECT * FROM themes order by name'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $result->result(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-18 23:29:22 +08:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	 * FUNCTION: set_password_reset_code | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * Stores generated password reset code in the database and sets the date to exactly | 
					
						
							|  |  |  | 	 * when the sql query runs. | 
					
						
							|  |  |  | 	 *  | 
					
						
							|  |  |  | 	 * @param string $user_email | 
					
						
							|  |  |  | 	 * @return string $reset_code | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	function set_password_reset_code($user_email, $reset_code) { | 
					
						
							|  |  |  | 		$data = array( | 
					
						
							|  |  |  | 			'reset_password_code' => $reset_code, | 
					
						
							|  |  |  | 			'reset_password_date' => date('Y-m-d H:i:s') | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 		$this->db->where('user_email', $user_email); | 
					
						
							|  |  |  | 		$this->db->update('users', $data); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-19 00:14:22 +08:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	 * FUNCTION: reset_password | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * Sets new password for users account where the reset code matches then clears the password reset code and password reset date. | 
					
						
							|  |  |  | 	 *  | 
					
						
							|  |  |  | 	 * @param string $password | 
					
						
							|  |  |  | 	 * @return string $reset_code | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	function reset_password($password, $reset_code) { | 
					
						
							|  |  |  | 		$data = array( | 
					
						
							|  |  |  | 			'user_password' => $this->_hash($password), | 
					
						
							|  |  |  | 			'reset_password_code' => NULL, | 
					
						
							|  |  |  | 			'reset_password_date' => NULL | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 		$this->db->where('reset_password_code', $reset_code); | 
					
						
							|  |  |  | 		$this->db->update('users', $data); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: bool _auth($password, $hash)
 | 
					
						
							|  |  |  | 	// Checks a password against the stored hash
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	private function _auth($password, $hash) { | 
					
						
							| 
									
										
										
										
											2017-11-07 08:45:06 +08:00
										 |  |  | 		if(password_verify($password, $hash)) { | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 			return 1; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-19 03:57:27 +08:00
										 |  |  | 	// FUNCTION: string _hash($password)
 | 
					
						
							|  |  |  | 	// Returns a hashed version of the supplied $password
 | 
					
						
							|  |  |  | 	// Will return '0' in the event of problems with the
 | 
					
						
							|  |  |  | 	// hashing function
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 	private function _hash($password) { | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  |         $hash = password_hash($password, PASSWORD_DEFAULT); | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if(strlen($hash) < 20) { | 
					
						
							| 
									
										
										
										
											2011-08-20 00:13:26 +08:00
										 |  |  | 			return EPASSWORDINVALID; | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			return $hash; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-02-26 17:37:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-18 08:31:15 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ?>
 |