getAllIntegration('wp_user_auth', 'wp_auth', 1);
if (!is_wp_error($existResetInteg) && count($existResetInteg) > 0) {
if ('reset' === $existResetInteg[0]->integration_name) {
$user = get_userdata($userID);
if ($user) {
$validKey = check_password_reset_key($token, $user->user_login);
if (is_wp_error($validKey)) {
echo "
This password reset token is invalid.
";
exit();
}
} else {
echo "Invalid User!!
";
exit();
}
}
}
}
private function getJSFileSrc($postId) {
$formUpdateVersion = get_option('bit-form_form_update_version');
$formScriptSrc = BITFORMS_UPLOAD_BASE_URL . "/form-scripts/$postId/bitform-js-$postId.js?bfv=$formUpdateVersion";
return $formScriptSrc;
}
public function generateJs($formID = null) {
$isFormPreview = get_transient('bitform_form_preview');
if ($isFormPreview && !$formID) {
delete_transient('bitform_form_preview');
return;
}
FrontendHelpers::isPageBuilder();
global $isPageBuilder;
if ($isPageBuilder) {
return;
}
// for unique fields ids in the same form (e.g. multiple forms in the same page)
$allFields = [];
$formContents = [];
$contentIds = [];
$formIDs = [];
$preview = false;
$postId = '';
if ($formID) {
$formIDs[] = $formID;
$FrontendFormManager = new FrontendFormManager($formID, 1);
$FormIdentifier = esc_js($FrontendFormManager->getFormIdentifier());
$formContent = $FrontendFormManager->getFormContentWithValue($this->getValuesFromQueryParams());
$formContents[] = $formContent;
$fields = $this->triggerWorkflowOnLoad($formID, 1, $formContent->fields);
array_push($contentIds, $FormIdentifier);
foreach ($fields as $fk => $field) {
$allFields[$field->typ][] = ['fk' => $fk, 'field' => $field, 'formID' => $formID, 'contentId' => $FormIdentifier];
}
$preview = true;
$postId = $formID;
} else {
global $post;
if (!is_object($post) && !isset($post->ID)) {
return;
}
FrontendHelpers::handleBfFormIdsSession();
global $bfFrontendFormIds;
$bfUniqFormIds = array_unique($bfFrontendFormIds);
$regenerateScriptFlag = $this->regenerateScriptChecker($bfUniqFormIds);
$postId = $post->ID;
if (!$regenerateScriptFlag) {
$regenerateScriptFlag = $this->deleteUnusedFormPageIds($postId, $bfUniqFormIds);
}
$isJsGenerating = get_option('bitforms_frontend_js_generating');
if (!$regenerateScriptFlag && !$isJsGenerating) {
wp_enqueue_script('bit-form-all-script-test', $this->getJSFileSrc($postId), [], '', true);
return;
}
$formIDs = $bfUniqFormIds;
foreach ($bfFrontendFormIds as $index => $formId) {
$shortCodeCounter = $index + 1;
$FrontendFormManager = new FrontendFormManager($formId, $shortCodeCounter);
$FormIdentifier = esc_js($FrontendFormManager->getFormIdentifier());
$formContent = $FrontendFormManager->getFormContentWithValue($this->getValuesFromQueryParams());
$formContents[] = $formContent;
$fields = $this->triggerWorkflowOnLoad($formId, $shortCodeCounter, $formContent->fields);
array_push($contentIds, $FormIdentifier);
foreach ($fields as $fk => $field) {
$allFields[$field->typ][] = ['fk' => $fk, 'field' => $field, 'formID' => $formId, 'contentId' => $FormIdentifier];
}
}
}
(new FrontEndScriptGenerator())->generateJsFile($formContents, $allFields, $contentIds, $postId, $formIDs, $preview);
wp_enqueue_script('bit-form-all-script-test', $this->getJSFileSrc($postId), [], '', true);
}
private function deleteUnusedFormPageIds($postId, $formIDs) {
global $post;
if (!is_object($post) && !isset($post->ID)) {
return;
}
$postId = $post->ID;
$formModel = new FormModel();
$forms = $formModel->get(
['id', 'generated_script_page_ids']
);
$regenerateScriptFlag = false;
foreach ($forms as $form) {
$formId = $form->id;
$generatedScriptPageIdsDecoded = json_decode($form->generated_script_page_ids, true);
$generatedScriptPageIds = is_array($generatedScriptPageIdsDecoded) ? array_keys($generatedScriptPageIdsDecoded) : [];
if (!empty($generatedScriptPageIds) && !in_array($formId, $formIDs) && in_array($postId, $generatedScriptPageIds)) {
unset($generatedScriptPageIdsDecoded[$postId]);
$regenerateScriptFlag = true;
$formModel->update(['generated_script_page_ids' => wp_json_encode($generatedScriptPageIdsDecoded)], ['id' => $formId]);
}
}
return $regenerateScriptFlag;
}
private function regenerateScriptChecker($formsIds) {
global $post;
if (!is_object($post) && !isset($post->ID)) {
return;
}
$postId = $post->ID;
$regenerateScriptFlag = false;
$formModel = new FormModel();
foreach ($formsIds as $formId) {
$formInstance = new FormManager($formId);
$generatedPages = $formInstance->getFormData('generated_script_page_ids');
if (empty($generatedPages)) {
$regenerateScriptFlag = true;
} elseif (is_object($generatedPages) && (!isset($generatedPages->{$postId}) || (isset($generatedPages->{$postId}) && false === $generatedPages->{$postId}))) {
$regenerateScriptFlag = true;
}
if (!$regenerateScriptFlag) {
continue;
}
$generatedPages->{$postId} = true;
$formModel->update(
[
'generated_script_page_ids' => \wp_json_encode($generatedPages)
],
[
'id' => $formId,
]
);
}
return $regenerateScriptFlag;
}
private function addInlineScript($code, $handle = '', $position = 'after') {
$scriptHandle = !empty($handle) ? $handle : 'bf-inline-script';
if (!wp_script_is($scriptHandle)) {
wp_register_script($scriptHandle, '', [], '', true);
wp_enqueue_script($scriptHandle);
}
wp_add_inline_script($scriptHandle, $code, $position);
}
private function addInlineStyle($code, $handle = '') {
$styleHandle = !empty($handle) ? $handle : 'bf-inline-style';
if (!wp_style_is($styleHandle)) {
wp_register_style($styleHandle, '', [], '', true);
wp_enqueue_style($styleHandle);
}
wp_add_inline_style($styleHandle, $code);
}
private function triggerWorkflowOnLoad($formID, $shortCodeCounter, $fields) {
$FrontendFormManager = new FrontendFormManager($formID, $shortCodeCounter);
$previousValue = $this->getValuesFromQueryParams();
$formContent = $FrontendFormManager->getFormContentWithValue($previousValue);
if (!empty($formContent->workFlowExist)) {
$workFlowRunHelper = new WorkFlow($formID);
if (!empty($formContent->workFlowExist->onload)) {
$workFlowreturnedOnLoad = $workFlowRunHelper->executeOnLoad(
'create',
$fields
);
if (!empty($workFlowreturnedOnLoad['fields'])) {
return $workFlowreturnedOnLoad['fields'];
}
}
}
return $fields;
}
private function executeOnUserInput($formID, $shortCodeCounter, $fields) {
$FrontendFormManager = new FrontendFormManager($formID, $shortCodeCounter);
$previousValue = $this->getValuesFromQueryParams();
$formContent = $FrontendFormManager->getFormContentWithValue($previousValue);
$customCodesExist = strpos(FrontEndScriptGenerator::getCustomCodes($formID)['JavaScript'], 'bfVars');
if ($customCodesExist || (!empty($formContent->workFlowExist) && !empty($formContent->workFlowExist->oninput))) {
$workFlowRunHelper = new WorkFlow($formID);
return $workFlowRunHelper->executeOnUserInput('create', $fields);
}
}
private function getValuesFromQueryParams() {
$reqField = $_SERVER['QUERY_STRING'];
$queryParamsValue = [];
if (!empty($reqField)) {
foreach (explode('&', $reqField) as $keyValue) {
// $pattern = '/([a-zA-Z0-9])([a-zA-Z])\=+/';
$pattern = '/([^.]+)=(.*?)([^.]+)/';
$matches = preg_match($pattern, $keyValue, $matchFormat);
if ($matches) {
list($field, $value) = explode('=', $keyValue, 2);
if (!trim($value)) {
continue;
}
$queryParamsValue[$field][] = sanitize_text_field(urldecode($value));
}
}
}
return $queryParamsValue;
}
public function handleFrontendRenderRequest($atts, $formPreview = false) {
static $shortCodeCounter = 0;
$shortCodeCounter += 1;
if ($formPreview) {
// when $formPreview is true, it means that the atts is the form id
$formID = $atts;
} else {
$atts = shortcode_atts(['id' => 0], $atts);
$formID = intval($atts['id']);
}
if (!$formID) {
return __('Form ID cannot be empty', 'bit-form');
}
if (!$this->isExist($formID)) {
return sprintf(__('#%s no. Form doesn\'t exists', 'bit-form'), $formID);
}
FrontendHelpers::handleBfFormIdsSession($formID);
$FrontendFormManager = new FrontendFormManager($formID, $shortCodeCounter);
$font = $FrontendFormManager->getFont();
if ($font && !$formPreview) {
wp_enqueue_style('google-font', $font, '1.0.0', true);
}
if (!empty($_GET['token']) && !empty($_GET['id'])) {
$this->validPassowordResetToken($_GET['token'], $_GET['id'], $formID);
}
$previousValue = $this->getValuesFromQueryParams();
$errorMessages = []; // delete
$FormIdentifier = esc_js($FrontendFormManager->getFormIdentifier());
$nonce = $FrontendFormManager->getFormToken();
$file = count($FrontendFormManager->getUploadFields()) > 0 ? $FrontendFormManager->getUploadFields() : false;
if ($FrontendFormManager->checkStatus()) {
$FrontendFormManager->setViewCount();
$formContent = $FrontendFormManager->getFormContentWithValue($previousValue);
$fields = $formContent->fields;
$layout = $formContent->layout;
$buttons = !empty($formContent->buttons) ? $formContent->buttons : '';
$additional = $formContent->additional;
$fields = $this->triggerWorkflowOnLoad($formID, $shortCodeCounter, $fields);
$workFlowreturnedOnUserInput = $this->executeOnUserInput($formID, $shortCodeCounter, $fields);
// only for form not preview
if (!wp_style_is('bitform-style' . $formID)) {
$this->loadAssets(true, $formID, $file);
}
// test for form before remove
$noLabel = ['decision-box', 'html', 'button', 'paypal', 'razorpay', 'recaptcha'];
$newFields = json_decode(json_encode($fields), true);
foreach ($newFields as $fldKey => $field) {
if (!in_array($field['typ'], $noLabel) && isset($field['lbl'])) {
$lblReplaceToBackslash = str_replace('$_bf_$', '\\', $field['lbl']);
$newFields[$fldKey]['lbl'] = FieldValueHandler::replaceSmartTagWithValue($lblReplaceToBackslash);
}
}
$fieldsKey = $FrontendFormManager->getFieldsKey();
$captchaV3Settings = $FrontendFormManager->getCaptchaV3Settings();
if ($FrontendFormManager->getCaptchaSettings() || $captchaV3Settings) {
$integrationHandler = new IntegrationHandler(0);
$allFormIntegrations = $integrationHandler->getAllIntegration('app');
if (!is_wp_error($allFormIntegrations)) {
foreach ($allFormIntegrations as $integration) {
if (
$FrontendFormManager->getCaptchaSettings()
&& !is_null($integration->integration_type)
&& 'gReCaptcha' === $integration->integration_type
) {
$integrationDetails = json_decode($integration->integration_details);
$integrationDetails->id = $integration->id;
$reCAPTCHA = $integrationDetails;
$reCAPTCHAVersion = 'v2';
}
if ($captchaV3Settings) {
if (!is_null($integration->integration_type) && 'gReCaptchaV3' === $integration->integration_type) {
$integrationDetails = json_decode($integration->integration_details);
$integrationDetails->id = $integration->id;
$reCAPTCHA = $integrationDetails;
$reCAPTCHAVersion = 'v3';
}
}
}
}
}
$configs = [
'bf_separator' => BITFORMS_BF_SEPARATOR,
];
$bitFormFrontArr = [
'ajaxURL' => admin_url('admin-ajax.php'),
'nonce' => $nonce,
'version' => BITFORMS_VERSION,
'layout' => $layout,
'fields' => $newFields,
'buttons' => $buttons,
'fieldsKey' => $fieldsKey,
'file' => $file,
'configs' => $configs,
'formId' => $formID,
'GCLID' => $FrontendFormManager->isGCLIDEnabled(),
'assetUrl' => BITFORMS_ASSET_URI,
'onfieldCondition' => !empty($workFlowreturnedOnUserInput['onfield_input_conditions']) ? $workFlowreturnedOnUserInput['onfield_input_conditions'] : false,
'smartTags' => !empty($workFlowreturnedOnUserInput['smart_tags']) ? $workFlowreturnedOnUserInput['smart_tags'] : [],
'paymentCallbackUrl' => get_rest_url() . 'bitform/v1/payments/razorpay',
'gRecaptchaSiteKey' => !empty($reCAPTCHA->siteKey) ? $reCAPTCHA->siteKey : null,
'gRecaptchaVersion' => !empty($reCAPTCHAVersion) ? $reCAPTCHAVersion : null,
];
if (isset($additional->enabled->validateFocusLost)) {
$bitFormFrontArr['validateFocusLost'] = true;
}
$bitFormsFront = apply_filters(
'bitforms_localized_script',
$bitFormFrontArr
);
$fields = \json_encode($fields);
$layout = \json_encode($layout);
$buttons = \json_encode($buttons);
$frontArr = json_encode($bitFormFrontArr);
$bfGlobals = "if(!window.bf_globals) {
window.bf_globals = {}
} if(!window.bf_globals.{$FormIdentifier}) {
window.bf_globals.{$FormIdentifier} = {}
}
window.bf_globals.{$FormIdentifier} = {...window.bf_globals.{$FormIdentifier}, ...{$frontArr}};";
$this->addInlineScript($bfGlobals, 'bit-form-all-script', 'before');
$html = '';
FrontendHelpers::isPageBuilder();
global $isPageBuilder;
if ($isPageBuilder) {
$newFormId = $formID . '-formid';
$formStyles = file_get_contents(BITFORMS_CONTENT_DIR . '/form-styles/bitform-' . $newFormId . '.css');
$html .= '';
}
$html .= $FrontendFormManager->formView($fields, $file, $errorMessages);
// if form preview then return html otherwise echo with output buffer
if ($formPreview) {
$formViewObject = new \stdClass();
$formViewObject->html = $html;
$formViewObject->font = $font;
$formViewObject->bfGlobals = $bfGlobals;
return $formViewObject;
}
ob_start();
echo trim($html);
return ob_get_clean();
}
}
private function isExist($formID) {
$formModel = new FormModel();
$form = $formModel->get(
[
'id'
],
[
'id' => $formID,
]
);
if (!is_wp_error($form)) {
return true;
}
return false;
}
public function loadAssets($recheck = false, $formID = 0, $isFileExists = false) {
FrontendHelpers::getFormIdsFromPost();
FrontendHelpers::isPageBuilder();
global $bfUniqFormIds;
global $bfMultipleFormsExists;
if ($formID) {
$formIds = [$formID];
if (count($bfUniqFormIds) > 1) {
$bfMultipleFormsExists = true;
}
} else {
$formIds = $bfUniqFormIds;
}
foreach ($formIds as $formID) {
if ($bfMultipleFormsExists) {
$newFormId = $formID . '-formid';
} else {
$newFormId = $formID;
}
if (is_readable(BITFORMS_CONTENT_DIR . '/form-styles/bitform-' . $newFormId . '.css')) {
$styleModifyTime = filemtime(BITFORMS_CONTENT_DIR . '/form-styles/bitform-' . $newFormId . '.css');
wp_register_style(
'bitform-style' . $formID,
BITFORMS_UPLOAD_BASE_URL . '/form-styles/bitform-' . $newFormId . '.css',
[],
$styleModifyTime,
'all'
);
wp_enqueue_style('bitform-style' . $formID);
}
if (is_readable(BITFORMS_CONTENT_DIR . '/form-styles/bitform-custom-' . $newFormId . '.css')) {
$styleModifyTime = filemtime(BITFORMS_CONTENT_DIR . '/form-styles/bitform-custom-' . $newFormId . '.css');
wp_register_style(
'bitform-style-custom-' . $formID,
BITFORMS_UPLOAD_BASE_URL . '/form-styles/bitform-custom-' . $newFormId . '.css',
[],
$styleModifyTime,
'all'
);
wp_enqueue_style('bitform-style-custom-' . $formID);
}
}
}
}