X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Flibs%2Fwernis_functions.php;h=263e40935d67291ca4f4e33c84b604d0e37058ce;hp=5c76e50c24936abad4c286f5fbb3351f94f9cdf2;hb=99966a712b3b3d8b521524762e153353d1d20bd4;hpb=a090e351c49fe021fb3064325694da03402332e0 diff --git a/inc/libs/wernis_functions.php b/inc/libs/wernis_functions.php index 5c76e50c24..263e40935d 100644 --- a/inc/libs/wernis_functions.php +++ b/inc/libs/wernis_functions.php @@ -1,7 +1,7 @@ "failed_general", - 'message' => WERNIS_API_REQUEST_DATA_INVALID + 'status' => 'failed_general', + 'message' => '{--WERNIS_API_REQUEST_DATA_INVALID--}' ); } // END - if // Is the API id and MD5 hash there? - if ((getConfig('wernis_api_id') == "") || (getConfig('wernis_api_md5') == "")) { + if ((getWernisApiId() == '') || (getWernisApiMd5() == '')) { // Abort here... return array( - 'status' => "failed_general", - 'message' => WERNIS_API_REQUEST_DATA_MISSING + 'status' => 'failed_general', + 'message' => '{--WERNIS_API_REQUEST_DATA_MISSING--}' ); } // END - if // Add more request data - $requestData['api_id'] = getConfig(('wernis_api_id')); - $requestData['api_key'] = getConfig('wernis_api_md5'); + $requestData['api_id'] = getWernisApiId(); + $requestData['api_key'] = getWernisApiMd5(); + + // Is a purpose there? + if (!empty($requestData['purpose'])) { + // Eval the purpose + eval('$purpose = "' . doFinalCompilation($requestData['purpose'], FALSE) . '";'); + + // Prepare the purpose, it needs encoding + $requestData['purpose'] = encodeString($purpose); + } // END - if // Construct the request string - $requestString = getConfig('wernis_api_url') . $scriptName; + $requestString = getWernisApiUrl() . $scriptName; // Get the raw response from the lower function - $response = POST_URL($requestString, $requestData); + $response = sendHttpPostRequest($requestString, $requestData); // Check the response header if all is fine - if (strpos($response[0], "200") === false) { + if (!isHttpStatusOkay($response[0])) { // Something bad happend... :( return array( - 'status' => "request_error", - 'message' => sprintf(WERNIS_API_REQUEST_ERROR, $response[0]) + 'status' => 'request_error', + 'message' => '{%message,WERNIS_API_REQUEST_ERROR=' . $response[0] . '%}' ); } // END - if // All (maybe) fine so remove the response header from server - $response = $response[(count($response) - 1)]; + $responseLine = '*INVALID*'; + for ($idx = (count($response) - 1); $idx > 1; $idx--) { + $line = trim($response[$idx]); + if (!empty($line)) { + $responseLine = $line; + break; + } // END - if + } // END - for - // Prepare the returning result for higher functions - if (substr($response, 0, 1) == "&") { - // Remove the leading & (which can be used in Flash) - $response = substr($response, 1); + // Is the response leaded by a & symbol? + if (substr($responseLine, 0, 1) != '&') { + // Something badly happened on server-side + return array( + 'status' => 'request_problem', + 'message' => sprintf(getMessage('WERNIS_API_REQUEST_PROBLEM'), $response[0], secureString($responseLine)) + ); } // END - if + // Remove the leading & (which can be used in Flash) + $responseLine = substr($responseLine, 1); + // Bring back the response - $data = explode("=", $response); + $data = explode('=', $responseLine); // Default return array (should not stay empty) $return = array(); // We use only the first two entries (which shall be fine) - if ($data[0] === "error") { + if ($data[0] === 'error') { // The request has failed... :( switch ($data[1]) { - case "404": // Invalid API ID - case "AUTH": // Authorization has failed + case '404': // Invalid API id + case 'AUTH': // Authorization has failed $return = array( - 'status' => "auth_failed", - 'message' => WERNIS_API_REQUEST_FAILED_AUTH + 'status' => 'auth_failed', + 'message' => '{--WERNIS_API_REQUEST_FAILED_AUTH--}' ); break; - case "LOCKED": // User account is locked! - case "PASS": // Bad passphrase entered - case "USER": // Missing account or invalid password + case 'LOCKED': // User account is locked! + case 'PASS': // Bad passphrase entered + case 'USER': // Missing account or invalid password $return = array( - 'status' => "user_failed", - 'message' => WERNIS_API_REQUEST_FAILED_USER + 'status' => 'user_failed', + 'message' => '{--WERNIS_API_REQUEST_FAILED_USER--}' ); break; - case "OWN": // Transfer to own account + case 'OWN': // Transfer to own account $return = array( - 'status' => "own_failed", - 'message' => WERNIS_API_REQUEST_FAILED_OWN + 'status' => 'own_failed', + 'message' => '{--WERNIS_API_REQUEST_FAILED_OWN--}' ); break; - case "AMOUNT": // Amount is depleted + case 'AMOUNT': // Amount is depleted $return = array( - 'status' => "amount_failed", - 'message' => WERNIS_API_REQUEST_FAILED_AMOUNT + 'status' => 'amount_failed', + 'message' => '{--WERNIS_API_REQUEST_FAILED_AMOUNT--}' ); break; - case "AMOUNT-SEND": // API amount is depleted + case 'AMOUNT-SEND': // API amount is depleted $return = array( - 'status' => "api_amount_failed", - 'message' => WERNIS_API_REQUEST_FAILED_API_AMOUNT + 'status' => 'api_amount_failed', + 'message' => '{--WERNIS_API_REQUEST_FAILED_API_AMOUNT--}' ); break; default: // Unknown error (maybe new?) - DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Unknown error %s from WDS66 API received.", $data[1])); + logDebugMessage(__FUNCTION__, __LINE__, sprintf('Unknown error %s from WDS66 API received.', $data[1])); $return = array( - 'status' => "request_failed", - 'message' => sprintf(WERNIS_API_REQUEST_FAILED, $data[1]) + 'status' => 'request_failed', + 'message' => '{%message,WERNIS_API_REQUEST_FAILED=' . $data[1] . '%}' ); break; } } else { // All fine here $return = array( - 'status' => "OK", - 'response' => $response + 'status' => 'OK', + 'response' => $responseLine ); } @@ -190,19 +210,29 @@ function WERNIS_SEND_REQUEST ($scriptName, $requestData = array()) { } // Tests the function by calling balance.php on the API -function WERNIS_TEST_API () { +function doAdminTestWernisApi () { + // Only as admin + assert(isAdmin()); + // Result is always failed - $result = false; + $result = FALSE; + + // Prepare the request data + $requestData = array( + 't_uid' => getWernisRefid(), + 't_md5' => getWernisPassMd5() + ); // Return the result from the lower functions - $return = WERNIS_SEND_REQUEST("balance.php"); + $return = sendWernisApiRequest('balance.php', $requestData); - if ($return['status'] == "OK") { + // Did it went smoothly? + if (isHttpResponseStatusOkay($return)) { // All fine! - $result = true; + $result = TRUE; } else { - // Status failture text - WERNIS_STATUS_MESSAGE($return['message'], $return['status']); + // Status failure text + setWernisStatusMessage($return['message'], $return['status']); } // Return result @@ -210,193 +240,804 @@ function WERNIS_TEST_API () { } // Widthdraw this amount -function WERNIS_EXECUTE_WITHDRAW ($wdsId, $userMd5, $amount) { +function executeWernisApiWithdraw ($wdsId, $userMd5, $amount) { // Is the sponsor extension installed? - if (getConfig('wernis_withdraw_active') != "Y") { - if (!EXT_IS_ACTIVE('sponsor')) { + if (!isWernisWithdrawActive()) { + if (!isExtensionActive('sponsor')) { // No, abort here - return false; - } elseif (!IS_SPONSOR()) { + return FALSE; + } elseif (!isSponsor()) { // No sponsor, not allowed to withdraw! - return false; + return FALSE; } } // END - if // Default is failed attempt - $result = false; - - // Prepare the purpose - $eval = "\$purpose = \"".COMPILE_CODE(sprintf(WERNIS_API_PURPOSE_WITHDRAW, getUserId()))."\";"; - eval($eval); + $result = FALSE; // Prepare the request data $requestData = array( - 'sub_request' => "receive", - 't_uid' => bigintval($wdsId), - 't_md5' => $userMd5, - 'r_uid' => getConfig('wernis_refid'), - 'amount' => bigintval($amount), - 'purpose' => encodeString($purpose, false) + 'sub_request' => 'receive', + 't_uid' => bigintval($wdsId), + 't_md5' => $userMd5, + 'r_uid' => getWernisRefid(), + 'amount' => bigintval($amount), + 'purpose' => getMaskedMessage('WERNIS_API_PURPOSE_WITHDRAW', getMemberId()) ); // Return the result from the lower functions - $return = WERNIS_SEND_REQUEST("book.php", $requestData); + $return = sendWernisApiRequest('book.php', $requestData); - if ($return['status'] == "OK") { + // Did it went smoothly? + if (isHttpResponseStatusOkay($return)) { // All fine! - $result = true; + $result = TRUE; // Log the transfer - WERNIS_LOG_TRANSFER($wdsId, $amount, 'IN'); + logWernisTransfer($wdsId, $amount, 'WITHDRAW'); } else { - // Status failture text - WERNIS_STATUS_MESSAGE($return['message'], $return['status']); + // Status failure text + setWernisStatusMessage($return['message'], $return['status']); // Log the transfer - WERNIS_LOG_TRANSFER($wdsId, $amount, 'FAILED', $return['message'], $return['status']); + logWernisTransfer($wdsId, $amount, 'FAILED', $return['message'], $return['status']); } // Return result return $result; } - // Payout this amount -function WERNIS_EXECUTE_PAYOUT ($wdsId, $amount) { +function executeWernisApiPayout ($wdsId, $amount) { // Default is failed attempt - $result = false; - - // Prepare the purpose - $eval = "\$purpose = \"".COMPILE_CODE(sprintf(getMessage('WERNIS_API_PURPOSE_PAYOUT'), getUserId()))."\";"; - eval($eval); + $result = FALSE; // Prepare the request data $requestData = array( - 'sub_request' => "send", - 't_uid' => getConfig('wernis_refid'), - 't_md5' => getConfig('wernis_pass_md5'), - 'r_uid' => bigintval($wdsId), - 'amount' => bigintval($amount), - 'purpose' => encodeString($purpose, false) + 'sub_request' => 'send', + 't_uid' => getWernisRefid(), + 't_md5' => getWernisPassMd5(), + 'r_uid' => bigintval($wdsId), + 'amount' => bigintval($amount), + 'purpose' => getMaskedMessage('WERNIS_API_PURPOSE_PAYOUT', getMemberId()) ); // Return the result from the lower functions - $return = WERNIS_SEND_REQUEST("book.php", $requestData); + $return = sendWernisApiRequest('book.php', $requestData); - if ($return['status'] == "OK") { + if (isHttpResponseStatusOkay($return)) { // All fine! - $result = true; + $result = TRUE; // Log the transfer - WERNIS_LOG_TRANSFER($wdsId, $amount, 'OUT'); + logWernisTransfer($wdsId, $amount, 'PAYOUT'); } else { - // Status failture text - WERNIS_STATUS_MESSAGE($return['message'], $return['status']); + // Status failure text + setWernisStatusMessage($return['message'], $return['status']); // Log the transfer - WERNIS_LOG_TRANSFER($wdsId, $amount, 'FAILED', $return['message'], $return['status']); + logWernisTransfer($wdsId, $amount, 'FAILED', $return['message'], $return['status']); } // Return result return $result; } +// Execute auth.php request +function executeWernisApiAuth ($wernisId, $wernisPassword) { + // Prepare request data + $requestData = array( + 't_uid' => bigintval($wernisId), + 't_md5' => hashSha256($wernisPassword), + ); + + // Call auth.php + $return = sendWernisApiRequest('auth.php', $requestData); + + // Return full array + return $return; +} + +// Execute get.php reguest with given auth data (not all are used) +function executeWernisApiGet ($authData, $subRequest, $fields) { + // It must be an array + assert(is_array($authData)); + + // Check required array elements + assert(isset($authData['wernis_userid'])); + assert(isset($authData['api_auth_key'])); + assert(isset($authData['api_redirect_challenge'])); + + // Then create request array + $requestData = array( + 'sub_request' => $subRequest, + 'fields' => $fields, + 't_uid' => bigintval($authData['wernis_userid']), + 'auth_key' => $authData['api_auth_key'], + 'challenge' => $authData['api_redirect_challenge'] + ); + + // Call get.php + $return = sendWernisApiRequest('get.php', $requestData); + + // Return full array + return $return; +} + // Translate the status IN/OUT -function WERNIS_TRANSFER_STATUS ($status) { - // Default status - $return = sprintf(WERNIS_STATUS_UNKNWOWN, $status); - switch ($status) { - case "IN": // Withdraw - $return = WERNIS_STATUS_WITHDRAW; - break; +function translateWernisTransferStatus ($status) { + // Default status is unknown + $return = '{%message,WERNIS_STATUS_UNKNWOWN=' . $status . '%}'; - case "OUT": // Payout - $return = WERNIS_STATUS_PAYOUT; - break; + // Construct message id + $messageId = 'WERNIS_STATUS_' . $status; - case "FAILED": // Payout - $return = WERNIS_STATUS_FAILED; - break; - } + // Is it there? + if (isMessageIdValid($messageId)) { + // Then use it as message string + $return = '{--' . $messageId . '--}'; + } // END - if // Return the status return $return; } // Log the transfer -function WERNIS_LOG_TRANSFER ($wdsId, $amount, $type = 'FAILED', $message = "", $status = "") { +function logWernisTransfer ($wdsId, $amount, $type = 'FAILED', $message = '', $status = '') { // Register this wernis movement - SQL_QUERY_ESC("INSERT INTO `{!_MYSQL_PREFIX!}_user_wernis` (`userid`,`wernis_account`,`wernis_amount`,`wernis_timestamp`,`wernis_type`,`wernis_api_message`,`wernis_api_status`) VALUES (%d, %d, %d, UNIX_TIMESTAMP(), '%s', '%s', '%s')", - array(getUserId(), bigintval($wdsId), bigintval($amount), $type, $message, $status), __FUNCTION__, __LINE__); + sqlQueryEscaped("INSERT INTO `{?_MYSQL_PREFIX?}_user_wernis` (`userid`, `wernis_account`, `wernis_amount`, `wernis_timestamp`, `wernis_type`, `wernis_api_message`, `wernis_api_status`) VALUES (%s, %s, %s, UNIX_TIMESTAMP(), '%s', '%s', '%s')", + array( + getMemberId(), + bigintval($wdsId), + bigintval($amount), + $type, + $message, + $status + ), __FUNCTION__, __LINE__); } -// Take fees and factor -function WERNIS_TAKE_FEE ($points, $mode) { +// Calulcate fees and factor +function calculateWernisFee ($points, $mode) { // Payout or withdraw are allowed modes! - //* DEBUG: */ echo "mode={$mode},points={$points}
\n"; + //* DEBUG: */ debugOutput('mode=' . $mode . ',points=' . $points); if (!in_array($mode, array('payout', 'withdraw'))) { // Log error and abort - DEBUG_LOG(__FUNCTION__, __LINE__, "uid={getUserId()},mode={$mode},points={$points}"); - return false; + logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . getMemberId() . ',mode=' . $mode . ',points=' . $points . ' - unknown mode detected.'); + return FALSE; } // END - if // Is there a percentage or fixed fee? - if (getConfig('wernis_'.$mode.'_fee_percent') > 0) { + if (getConfig('wernis_' . $mode . '_fee_percent') > 0) { // Percentage fee $points -= $points * getConfig('wernis_'.$mode.'_fee_percent') / 100; - } elseif (getConfig('wernis_'.$mode.'_fee_fix') > 0) { + } elseif (getConfig('wernis_' . $mode . '_fee_fix') > 0) { // Fixed fee - $points -= getConfig('wernis_'.$mode.'_fee_fix'); + $points -= getConfig('wernis_' . $mode . '_fee_fix'); } // Divide/multiply the factor if ($mode == 'payout') { // Divide for payout - $points = $points / getConfig('wernis_payout_factor'); + $points = $points / getWernisPayoutFactor(); } else { // Multiply for withdraw - $points = $points * getConfig('wernis_withdraw_factor'); + $points = $points * getWernisWithdrawFactor(); } // Return value - //* DEBUG: */ echo "mode={$mode},points={$points}
\n"; + //* DEBUG: */ debugOutput('mode=' . $mode . ',points=' . $points); return $points; } // Add withdraw fees and factor -function WERNIS_ADD_WITHDRAW_FEE ($points) { +// @TODO Unused? +function calulcateWernisWithdrawFee ($points) { // Is there a percentage or fixed fee? - if (getConfig('wernis_withdraw_fee_percent') > 0) { + if (getWernisWithdrawFeePercent() > 0) { // Percentage fee - $points += $points * getConfig('wernis_withdraw_fee_percent') / 100; - } elseif (getConfig('wernis_withdraw_fee_fix') > 0) { + $points += $points * getWernisWithdrawFeePercent() / 100; + } elseif (getWernisWithdrawFeeFix() > 0) { // Fixed fee - $points += getConfig('wernis_withdraw_fee_fix'); + $points += getWernisWithdrawFeeFix(); } // Return value return $points; } -// Add all fees to the array -function WERNIS_ADD_FEES_TO_ARRAY (&$array) { - // Is the array an array? ;-) - if (!is_array($array)) { - // Log error and return - DEBUG_LOG(__FUNCTION__, __LINE__, " Type ".gettype($array)." != array."); - return; +// Displays registration form for WDS66 registration +function doDisplayWernisUserRegistrationForm () { + // Is the form sent? + if (isFormSent('register')) { + // Is wernis_id set? + if (!isPostRequestElementSet('wernis_id')) { + // Id not set + displayMessage('{--GUEST_WERNIS_REGISTRATION_ID_NOT_SET--}'); + } elseif (!isPostRequestElementSet('wernis_password')) { + // Password not set + displayMessage('{--GUEST_WERNIS_REGISTRATION_PASSWORD_NOT_SET--}'); + } else { + // So far, all fine, then let's do the call-back on auth.php ... + $response = executeWernisApiAuth(postRequestElement('wernis_id'), postRequestElement('wernis_password')); + + // Was the status okay? + if (isHttpResponseStatusOkay($response)) { + // All fine, then analyze API response + $args = convertApiResponseToArray($response['response'], '&', '='); + + // Is status set? + assert(isset($args['auth_status'])); + + // Add WDS66 userid + $args['wernis_userid'] = postRequestElement('wernis_id'); + + // "Detect" auth status + $callbackFunction = 'doWernisAuth' . capitalizeUnderscoreString($args['auth_status']); + + // Is the call-back there? + if (!is_callable($callbackFunction, FALSE, $callableName)) { + // Not there, could be bad. :( + reportBug(__FUNCTION__, __LINE__, 'Unsupported auth_status=' . $args['auth_status'] . ',args()=' . count($args) . ',callbackFunction=' . $callbackFunction . ' detected.'); + } // END - if + + // Then call it + $status = call_user_func($callbackFunction, $args); + + // @TODO Something more to do here? + die(__FUNCTION__ . ':' . __LINE__ . ': status[' . gettype($status) . ']=' . $status . ' - Unfinished.'); + } else { + // Something bad happened + displayMessage($response['message']); + } + } + } // END - if + + // Is there a challenge + response? + if ((isGetRequestElementSet('status')) && (isGetRequestElementSet('challenge')) && (isGetRequestElementSet('__challenge_response'))) { + // Redirect from modules.php?module=auth, so validate challenge response ... + // 1) Get first 24 characters = salt + $salt = substr(getRequestElement('__challenge_response'), 0, 24); + + // 2) Generate hash for challenge response + $challengeResponse = $salt . hashSha256($salt . getWernisApiMd5() . getRequestElement('challenge')); + + // Is the response valid? + if ($challengeResponse != getRequestElement('__challenge_response')) { + // Not valid + displayMessage('{--GUEST_WERNIS_REGISTRATION_INVALID_CHALLENGE_RESPONSE--}'); + return; + } // END - if + + /* + * Now, that the challenge-response is the same, the challenge itself + * is also the same. Next get the data from wernis_regs table by + * challenge. There is currently no other way to get the data as there + * is no Wernis user id provided. Later on the stored challenge response + * can be compared with provided. + */ + $return = doWernisFinishUserRegistration(getRequestElement('challenge'), getRequestElement('__challenge_response'), getRequestElement('status')); + + // Is the registration finished? + if ($return === FALSE) { + // No, then abort here silently as the function should have already displayed a message + return; + } // END - if + } elseif (!isFormSent('register')) { + // Form not send, so load form template + loadTemplate('guest_wernis_registration_rpc_form'); + } +} + +// Finish user registration with WDS66 API +function doWernisFinishUserRegistration ($challenge, $challengeResponse, $status) { + // Is the status 1? (= all fine with API call) + if ($status == '1') { + // Get mapped data based on challenge + $return = getWernisMappedDataFromApiByChallenge($challenge, $status); + + // Is the array filled? + if ((count($return['mapped_data']) > 0) && (empty($return['message']))) { + // Set must-fillout fields + $return['mapped_data'] = runFilterChain('register_must_fillout', $return['mapped_data']); + + // Add missing elements + $return['mapped_data']['gender'] = NULL; + $return['mapped_data']['birthday_selection'] = generateDayMonthYearSelectionBox($return['mapped_data']['birth_day'], $return['mapped_data']['birth_month'], $return['mapped_data']['birth_year']); + $return['mapped_data']['challenge'] = getRequestElement('challenge'); + $return['mapped_data']['__challenge_response'] = getRequestElement('__challenge_response'); + + // Display form + loadTemplate('guest_wernis_registration_form', FALSE, $return['mapped_data']); + + // All fine + return TRUE; + } else { + // Something unexpected happened (e.g. no API requests left) + displayMessage($return['message']); + return FALSE; + } + } else { + // Status does not need to be changed + die(__FUNCTION__ . ':' . __LINE__ . ': Reached!'); + } +} + +// "Getter" for mapped data by calling the API and given challenge and status +function getWernisMappedDataFromApiByChallenge ($challenge, $status) { + // Get stored registration data + $rows = getWernisRegistrationDataByKey('api_redirect_challenge', $challenge); + + // Zero result found? + if (count($rows) == 0) { + // Nothing found + displayMessage('{--GUEST_WERNIS_REGISTRATION_ZERO_ROWS_FOUND--}'); + + // Display form + loadTemplate('guest_wernis_registration_rpc_form'); + return array(); + } // END - if + + // Init array + $return = array( + // Mapped data + 'mapped_data' => array(), + // Any error message from API + 'message' => '' + ); + + // Has the auth status changed? + if ($rows[0]['api_auth_status'] != 'ACCEPTED') { + /* + * The authorization of this application has been accepted, so + * update it and ignore result from function because the update + * will always run. + */ + updateWernisRegistrationDataByKey('api_auth_status', 'api_redirect_challenge', $challenge, 'ACCEPTED'); + } // END - if + + // Now call "get.php" + $response = executeWernisApiGet($rows[0], 'data', 'vorname|name|strasse|plz|ort|birth_day|birth_month|birth_year|email|werber'); + + // Was the status okay? + if (isHttpResponseStatusOkay($response)) { + // API returned non-errous response, 'data=' must be found + assert(substr($response['response'], 0, 5) == 'data='); + + // And remove it, this is now BASE64-encoded + $encodedData = urldecode(substr($response['response'], 5)); + + // And decode it (all steps separated to later "easily" debug them) + $decodedData = base64_decode($encodedData); + + /* + * Do some checks on the decoded string, it should be a + * serialized array with 10 entries (see above + * executeWernisApiGet() call). + */ + assert(substr($decodedData, 0, 6) == 'a:10:{'); + assert(substr($decodedData, -1, 1) == '}'); + + // The array seems to be fine, unserialize it + $userData = unserialize($decodedData); + + // All mappings WDS66->mailer + $mappings = array( + 'vorname' => 'surname', + 'name' => 'family', + 'strasse' => 'street_nr', + 'plz' => 'zip', + 'ort' => 'city', + 'email' => 'email', + 'birth_day' => 'birth_day', + 'birth_month' => 'birth_month', + 'birth_year' => 'birth_year', + 'werber' => 'wernis_refid' + ); + + // Map all WDS66 entries into mailer entries + foreach ($mappings as $from => $to) { + // All must exist + if (!isset($userData[$from])) { + // Element $from does not exist + reportBug(__FUNCTION__, __LINE__, 'Cannot map from=' . $from . ' -> to=' . $to . ': element does not exist.'); + } // END - if + + // "Map" all + $return['mapped_data'][$to] = convertEmptyToNull($userData[$from]); + } // END - foreach + + // Both arrays must have same size + assert(count($userData) == count($return['mapped_data'])); + + // Now add userid from WDS66 + $return['mapped_data']['wernis_userid'] = bigintval($rows[0]['wernis_userid']); + } else { + // Something bad happened so copy the message + $return['message'] = $response['message']; + } + + // Return mapped data array + return $return; +} + +// Updates auth status by given key/value pair +function updateWernisRegistrationDataByKey ($updatedColumn, $key, $oldValue, $newValue) { + // Run the update + sqlQueryEscaped("UPDATE + `{?_MYSQL_PREFIX?}_wernis_regs` +SET + `%s` = '%s' +WHERE + `%s` = '%s' AND + `%s` != '%s' +LIMIT 1", + array( + $updatedColumn, + $newValue, + $key, + $oldValue, + $updatedColumn, + $oldValue + ), __FUNCTION__, __LINE__ + ); + + // Check if rows as been affected + return ifSqlHasZeroAffectedRows(); +} + +// "Getter" for Wernis registration data by given key and value +function getWernisRegistrationDataByKey ($key, $value, $limit = 1) { + // Init array + $rows = array(); + + // Now search for it + $result = sqlQueryEscaped("SELECT + `local_userid`, + `wernis_userid`, + `api_auth_status`, + `api_auth_key`, + `api_redirect_challenge`, + UNIX_TIMESTAMP(`record_inserted`) AS `record_inserted` +FROM + `{?_MYSQL_PREFIX?}_wernis_regs` +WHERE + `%s`='%s' +ORDER BY + `id` +LIMIT %d", + array( + $key, + $value, + $limit + ), __FUNCTION__, __LINE__ + ); + + // Is there an entry? + if (sqlNumRows($result) > 0) { + // At least one entry has been found, so loop through all + while ($row = sqlFetchArray($result)) { + // Add it + array_push($rows, $row); + } // END - while } // END - if - // Add both factors - $array['payout_factor'] = TRANSLATE_COMMA(getConfig('wernis_payout_factor')); - $array['withdraw_factor'] = TRANSLATE_COMMA(getConfig('wernis_withdraw_factor')); + // Free result + sqlFreeResult($result); + + // Return found entries + return $rows; +} + +// Do local user registration with data from WDS66 API +function doWernisUserRegistration () { + // Call generic registration function + $status = doGenericUserRegistration(); + + // Does this went fine? + if ($status === FALSE) { + // No, then abort here silently + return FALSE; + } // END - if + + // Make sure the user id is valid + assert(isset($GLOBALS['register_userid'])); + assert(isValidId($GLOBALS['register_userid'])); + + // Generic registration is finished, so add more data: +} + +//----------------------------------------------------------------------------- +// Auth status callback functions +//----------------------------------------------------------------------------- + +// Handler for auth_status=PENDING +function doWernisAuthPending ($args) { + // $args must always be an array + assert(is_array($args)); + + // auth_key and wernis_userid must be set + assert(isset($args['auth_key'])); + assert(isset($args['wernis_userid'])); + + // Generate a challenge that will be added to the URL + $challenge = hashSha256(generatePassword(128)); + + // Search entry in database by auth_key + if (countSumTotalData($args['auth_key'], 'wernis_regs', 'id', 'api_auth_key', TRUE) == 0) { + // "Register" this call + sqlQueryEscaped("INSERT INTO `{?_MYSQL_PREFIX?}_wernis_regs` ( + `wernis_userid`, + `api_auth_status`, + `api_auth_key`, + `api_redirect_challenge` +) VALUES ( + %s, + 'PENDING', + '%s', + '%s' +)", + array( + bigintval($args['wernis_userid']), + $args['auth_key'], + $challenge + ), __FUNCTION__, __LINE__ + ); + } else { + // Update challenge + sqlQueryEscaped("UPDATE + `{?_MYSQL_PREFIX?}_wernis_regs` +SET + `api_redirect_challenge`='%s' +WHERE + `api_auth_key`='%s' AND + `wernis_userid`=%s + `api_auth_status`='PENDING' +LIMIT 1", + array( + $challenge, + $args['auth_key'], + bigintval($args['wernis_userid']) + ), __FUNCTION__, __LINE__ + ); + } + + // Should always update/insert + assert(sqlAffectedRows() == 1); + + // Redirect to WDS66 module=auth ... + redirectToUrl(getWernisBaseUrl() . '/modules.php?module=auth&auth_key=' . $args['auth_key'] . '&params=' . urlencode(base64_encode('&module=' . getModule() . '&what=' . getWhat())) . '&challenge=' . $challenge); +} + +// Handler for auth_status=ACCEPTED +function doWernisAuthAccepted ($args) { + // $args must always be an array + assert(is_array($args)); + + // auth_key and wernis_userid must be set + assert(isset($args['auth_key'])); + assert(isset($args['wernis_userid'])); + die(__FUNCTION__ . ':' . __LINE__ . '
' . print_r($args, TRUE) . '
'); +} + +//----------------------------------------------------------------------------- +// Wrapper functions +//----------------------------------------------------------------------------- + +// Wrapper function for 'wernis_refid' +function getWernisRefid () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_refid'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_pass_md5' +function getWernisPassMd5 () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_pass_md5'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_api_id' +function getWernisApiId () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_api_id'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_api_md5' +function getWernisApiMd5 () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_api_md5'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_api_url' +function getWernisApiUrl () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_api_url'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_withdraw_active' +function getWernisWithdrawActive () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_withdraw_active'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_payout_active' +function getWernisPayoutActive () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_payout_active'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_withdraw_active' +function isWernisWithdrawActive () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = (getConfig('wernis_withdraw_active') == 'Y'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_payout_active' +function isWernisPayoutActive () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = (getConfig('wernis_payout_active') == 'Y'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_withdraw_factor' +function getWernisWithdrawFactor () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_withdraw_factor'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_payout_factor' +function getWernisPayoutFactor () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_payout_factor'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_withdraw_fee_percent' +function getWernisWithdrawFeePercent () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_withdraw_fee_percent'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_withdraw_fee_fix' +function getWernisWithdrawFeeFix () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_withdraw_fee_fix'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_payout_fee_percent' +function getWernisPayoutFeePercent () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_payout_fee_percent'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_payout_fee_fix' +function getWernisPayoutFeeFix () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_payout_fee_fix'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_min_payout' +function getWernisMinPayout () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_min_payout'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_min_withdraw' +function getWernisMinWithdraw () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_min_withdraw'); + } // END - if + + // Return cache + return $GLOBALS[__FUNCTION__]; +} + +// Wrapper function for 'wernis_base_url' +function getWernisBaseUrl () { + // Is there cache? + if (!isset($GLOBALS[__FUNCTION__])) { + // Get config entry + $GLOBALS[__FUNCTION__] = getConfig('wernis_base_url'); + } // END - if - // Add all fees - $array['payout_fee_percent'] = TRANSLATE_COMMA(getConfig('wernis_payout_fee_percent')); - $array['withdraw_fee_percent'] = TRANSLATE_COMMA(getConfig('wernis_withdraw_fee_percent')); - $array['payout_fee_fix'] = TRANSLATE_COMMA(getConfig('wernis_payout_fee_fix')); - $array['withdraw_fee_fix'] = TRANSLATE_COMMA(getConfig('wernis_withdraw_fee_fix')); + // Return cache + return $GLOBALS[__FUNCTION__]; } -// +// [EOF] ?>