function searchUsers($get) { /*** * ***/ global $udb, $login_status; $q = $udb->sanitize($get['q']); $response = array('search' => $q); $search = array('username' => $q, 'name' => $q, 'dblink' => $q); $cols = array('username', 'name', 'dblink', "email_verified", "alternate_email_verified", "admin_flag", "alternate_email"); if (!empty($get['cols'])) { if (checkUserColumnExists($get['cols'], false)) { # Replace the defaults $colList = explode(',', $get['cols']); $search = array(); foreach ($colList as $col) { $col = trim($col); # If the column exists, we don't have to sanitize it # $col = $db->sanitize($col); $search[$col] = $q; $cols[] = $col; } } else { $response['notice'] = 'Invalid columns; defaults used'; $response["detail"] = checkUserColumnExists($get["cols"], false, true); } } $response['status'] = true; $result = $udb->getQueryResults($search, $cols, 'OR', true, true); $suFlag = $login_status['detail']['userdata']['su_flag']; $isSu = boolstr($suFlag); $adminFlag = $login_status['detail']['userdata']['admin_flag']; $isAdmin = boolstr($adminFlag); foreach ($result as $k => $entry) { $clean = array('email' => $entry['username'], 'uid' => $entry['dblink'], "has_verified_email" => boolstr($entry["email_verified"]) || boolstr($entry["alternate_email_verified"])); if ($isAdmin) { $clean["is_admin"] = boolstr($entry["admin_flag"]); $clean["alternate_email"] = $entry["alternate_email"]; $tmpUser = new UserFunctions($clean["email"]); $clean["unrestricted"] = $tmpUser->meetsRestrictionCriteria(); } $nameXml = $entry['name']; $xml = new Xml(); $xml->setXml($nameXml); $clean['first_name'] = htmlspecialchars_decode($xml->getTagContents('fname')); $clean['last_name'] = htmlspecialchars_decode($xml->getTagContents('lname')); $clean['full_name'] = htmlspecialchars_decode($xml->getTagContents('name')); $clean['handle'] = $xml->getTagContents('dname'); $result[$k] = $clean; } $response['result'] = $result; $response['count'] = sizeof($result); returnAjax($response); }
$altPhone = "<p>Congratulations! Your phone number is verified.</p>"; } catch (Exception $e) { $needPhone = false; $deferredJS .= "console.warn('An exception was thrown checking for SMS-ability:','" . $e->getMessage() . "');\n"; $altPhone = "<p>You don't have a phone number registered with us. Please go to account settings and add a phone number.</p>"; } $verifyphone_link = $needPhone ? "<li><a href='?q=verify'>Verify Phone</a></li>" : null; $phone_verify_form = $needPhone ? $phone_verify_template : $altPhone; } catch (Exception $e) { # There have been no cookies set. $logged_in = false; $twofactor = "Please log in."; } if ($logged_in) { $xml->setXml($_COOKIE[$cookieperson]); $full_name = $xml->getTagContents("<name>"); $first_name = $xml->getTagContents("<fname>"); $display_name = $xml->getTagContents("<dname>"); if (empty($first_name)) { $first_name = $_COOKIE[$cookieperson]; } } else { if ($captive_login) { header("Refresh: 0; url={$baseurl}"); $deferredJS .= "\nwindow.location.href=\"{$baseurl}\";"; } } // $random = "<li><a href='#' id='totp_help'>Help with Two-Factor Authentication</a></li>"; try { $has2fa = strbool($user->has2FA()); } catch (Exception $e) {
public function writeToUser($data, $col, $validation_data = null, $replace = true, $alert_forbidden_column = true) { /*** * Write data to a user column. * * @param string $data the data to be written * @param string $col the database column to be written to * @param array $validation_data data to verify access to the * user. An array of "password"=>$password or manually provided * cookie data with $this->linkColumn as the key. If this isn't * provided, cookies are used. * @param bool $replace whether to replace existing * data. Otherwise, it appends. Default: true. * @return ***/ $vmeta = false; $error = false; if (empty($data) || empty($col)) { return array('status' => false, 'error' => 'Bad request'); } $validated = false; if (is_array($validation_data)) { if (array_key_exists($this->linkColumn, $validation_data) && !empty($validation_data[$this->linkColumn])) { // confirm with validateUser(); $validated = $this->validateUser($validation_data[$this->linkColumn], $validation_data['hash'], $validation_data['secret']); $method = 'Confirmation token'; $where_col = $this->linkColumn; $user = $validation_data[$this->linkColumn]; } elseif (array_key_exists('password', $validation_data)) { # confirm with lookupUser(); # If TOTP is enabled, this lookup will always fail ... $vmeta = $this->lookupUser($validation_data['username'], $validation_data['password']); $validated = $vmeta[0]; if ($validated) { $this->getUser(array('username' => $validation_data['username'])); } $method = 'Password'; } elseif (array_key_exists('application_verification', $validation_data)) { # The user is accessing through an app. Check the # verification chain. $status = $this->verifyApp($validation_data['application_verification']); if ($status['status'] !== true) { // array("status"=>false,"error"=>"Bad application verification","human_error"=>"There was a problem verifying the application","app_error_code"=>106); return $status; } } else { return array('status' => false, 'error' => 'Bad validation data'); } } else { $validated = $this->validateUser(); $method = 'Cookie'; } if ($validated) { $userdata = $this->getUser(); $where_col = $this->linkColumn; $user = $userdata[$where_col]; if (empty($user)) { return array('status' => false, 'error' => 'Problem assigning user'); } // write it to the db // replace or append based on flag $real_col = $this->sanitize($col, true); if (!$replace) { # pull the existing data ... $l = $this->openDB(); $prequery = "SELECT `{$real_col}` FROM `" . $this->getTable() . "` WHERE `{$where_col}`='{$user}'"; # Look for relevent JSON entries or XML entries and replace them $r = mysqli_query($l, $prequery); $row = mysqli_fetch_row($r); $d = $row[0]; $jd = json_decode($d, true); if ($jd == null) { # XML -- only takes one tag in!! $xml_data = explode('</', $data); $tag = array_pop($xml_data); $tag = $this->sanitize(substr($tag, 0, -1)); $tag = '<' . $tag . '>'; $xml = new Xml(); $xml->setXml($data); $tag_data = $xml->getTagContents($tag); $clean_tag_data = $this->sanitize($tag_data); $new_data = $xml->updateTag($tag, $clean_tag_data); } else { $jn = json_decode($data, true); foreach ($jn as $k => $v) { $ck = $this->sanitize($k); $cv = $this->sanitize($v); $jd[$ck] = $cv; } $new_data = json_encode($jd); } $real_data = mysqli_real_escape_string($l, $new_data); } else { $real_data = $this->sanitize($data); } if (empty($real_data)) { return array('status' => false, 'error' => 'Invalid input data (sanitization error)'); } $query = 'UPDATE `' . $this->getTable() . "` SET `{$real_col}`=\"" . $real_data . "\" WHERE `{$where_col}`='{$user}'"; $l = $this->openDB(); mysqli_query($l, 'BEGIN'); $r = mysqli_query($l, $query); $finish_query = $r ? 'COMMIT' : 'ROLLBACK'; if ($finish_query == 'ROLLBACK') { $error = mysqli_error($l); } $r2 = mysqli_query($l, $finish_query); return array('status' => $r, 'data' => $data, 'col' => $col, 'action' => $finish_query, 'result' => $r2, 'method' => $method, 'error' => $error); } else { return array('status' => false, 'error' => 'Bad validation', 'method' => $method, 'validated_meta' => $vmeta, 'working_data' => $validation_data, 'link_col' => $this->linkColumn); } #,"validated_details_token"=>$this->validateUser($validation_data[$this->linkColumn],$validation_data['hash'],$validation_data['secret'],true)); }