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, $entryID = null)
{
$isFormPreview = get_transient('bitform_form_preview');
if ($isFormPreview && !$formID) {
delete_transient('bitform_form_preview');
return;
}
$isPageBuilder = FrontendHelpers::checkIsPageBuilder($_SERVER);
$bfFrontendFormIds = FrontendHelpers::$bfFrontendFormIds;
if ($isPageBuilder || empty($bfFrontendFormIds)) {
return;
}
// for unique fields ids in the same form (e.g. multiple forms in the same page)
$allFields = [];
$formContents = [];
$contentIds = [];
$formIDs = [];
$preview = false;
$postId = '';
$formUpdateVersion = get_option('bit-form_form_update_version');
if ($formID) {
$formIDs[] = $formID;
$FrontendFormManager = new FrontendFormManager($formID, 1);
$FormIdentifier = esc_js($FrontendFormManager->getFormIdentifier());
$formContent = $FrontendFormManager->getFormContentWithValue($this->getValuesFromQueryParams());
$formContent->formId = $formID;
$formContents[] = $formContent;
$workFlowRunType = $entryID ? 'edit' : 'create';
$fields = $formContent->fields;
if ($entryID) {
$fields = $this->setFieldsValue($fields, $formID, $entryID);
}
$fields = $this->triggerWorkflowOnLoad($formID, 1, $fields, $workFlowRunType);
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;
}
$bfFrontendFormIds = FrontendHelpers::$bfFrontendFormIds;
$bfUniqFormIds = FrontendHelpers::getAllUniqFormIdsInPage();
$formIDs = $bfUniqFormIds;
$regenerateScriptFlag = $this->regenerateScriptChecker($bfUniqFormIds);
$postId = $post->ID;
if (!$regenerateScriptFlag) {
$regenerateScriptFlag = $this->deleteUnusedFormPageIds($postId, $bfUniqFormIds);
}
$isJsGenerating = get_option('bitforms_frontend_js_generating');
if (!$regenerateScriptFlag && !$isJsGenerating && !empty($formIDs)) {
wp_enqueue_script('bit-form-all-script-test', $this->getJSFileSrc($postId), [], $formUpdateVersion, true);
return;
}
foreach ($bfFrontendFormIds as $index => $formId) {
$shortCodeCounter = $index + 1;
$FrontendFormManager = new FrontendFormManager($formId, $shortCodeCounter);
$FormIdentifier = esc_js($FrontendFormManager->getFormIdentifier());
$formContent = $FrontendFormManager->getFormContentWithValue($this->getValuesFromQueryParams());
$formContent->formId = $formId;
$formContents[] = $formContent;
$fields = $this->triggerWorkflowOnLoad($formId, $shortCodeCounter, $formContent->fields);
$contentIds[] = $FormIdentifier;
foreach ($fields as $fk => $field) {
$allFields[$field->typ][] = ['fk' => $fk, 'field' => $field, 'formID' => $formId, 'contentId' => $FormIdentifier];
}
}
}
if (empty($formIDs)) {
return;
}
(new FrontEndScriptGenerator())->generateJsFile($formContents, $allFields, $contentIds, $postId, $formIDs, $preview);
wp_enqueue_script('bit-form-all-script-test', $this->getJSFileSrc($postId), [], $formUpdateVersion, 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]);
if (empty($generatedScriptPageIdsDecoded)) {
$generatedScriptPageIdsDecoded = new \stdClass();
}
$regenerateScriptFlag = true;
$formModel->update(['generated_script_page_ids' => wp_json_encode($generatedScriptPageIdsDecoded)], ['id' => $formId]);
}
}
if ($regenerateScriptFlag) {
$formUpdateVersion = get_option('bit-form_form_update_version');
if (!$formUpdateVersion) {
$formUpdateVersion = 1;
} else {
$formUpdateVersion = (int) $formUpdateVersion + 1;
}
update_option('bit-form_form_update_version', $formUpdateVersion);
}
return $regenerateScriptFlag;
}
private function regenerateScriptChecker($formsIds)
{
global $post;
if (!is_a($post, 'WP_Post') && !isset($post->ID)) {
return;
}
$postId = $post->ID;
$regenerateScriptFlag = false;
$formModel = new FormModel();
foreach ($formsIds as $formId) {
$formInstance = new FormManager($formId);
if (!$formInstance->isExist()) {
continue;
}
$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;
}
if (!is_object($generatedPages)) {
$generatedPages = (object) [];
}
$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, $workFlowRunType = 'create')
{
$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(
$workFlowRunType,
$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 = isset($atts['form_preview']) ? $atts['form_preview'] : false;
if (isset($atts['form_id'])) {
$formID = intval($atts['form_id']);
}
if (isset($atts['entry_id'])) {
$entryId = intval($atts['entry_id']);
} else {
$entryId = false;
}
if (isset($atts['id'])) {
$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);
}
// check for abandoned form entry id
$isAbandoned = false;
if (empty($entryId) && Utilities::isPro() && class_exists('\BitCode\BitFormPro\Admin\FormSettings\FormAbandonment')) {
$FormAbandonment = new FormAbandonment($formID);
$isAbandoned = $FormAbandonment->checkAbandonedFormEntryId();
}
FrontendHelpers::setBfFrontendFormIds($formID);
$bfFrontendFormIds = FrontendHelpers::$bfFrontendFormIds;
$shortCodeCounter = count($bfFrontendFormIds);
$FrontendFormManager = new FrontendFormManager($formID, $shortCodeCounter);
if (!$FrontendFormManager->checkStatus()) {
return sprintf(__('#%s no. Form is not active', 'bit-form'), $formID);
}
ob_start();
$this->loadAssets($formID);
$font = $FrontendFormManager->getFont();
if ($font && !$formPreview) {
wp_enqueue_style('bf-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;
$FrontendFormManager->setViewCount();
$formContent = $FrontendFormManager->getFormContentWithValue($previousValue);
$fields = $formContent->fields;
$layout = $formContent->layout;
$nestedLayout = isset($formContent->nestedLayout) ? $formContent->nestedLayout : (object) [];
$buttons = !empty($formContent->buttons) ? $formContent->buttons : '';
$additional = $formContent->additional;
$workFlowRunType = $entryId ? 'edit' : 'create';
if ($entryId) {
$fields = $this->setFieldsValue($fields, $formID, $entryId);
}
$fields = $this->triggerWorkflowOnLoad($formID, $shortCodeCounter, $fields, $workFlowRunType);
$workFlowreturnedOnUserInput = $this->executeOnUserInput($formID, $shortCodeCounter, $fields);
// test for form before remove
$noLabel = ['decision-box', 'html', 'button', 'paypal', 'razorpay', 'recaptcha'];
foreach ($fields as $fldKey => $field) {
if (!in_array($field->typ, $noLabel) && isset($field->lbl)) {
$lblReplaceToBackslash = str_replace('$_bf_$', '\\', $field->lbl);
$fields->{$fldKey}->lbl = FieldValueHandler::replaceSmartTagWithValue($lblReplaceToBackslash);
}
}
$fieldsKey = $FrontendFormManager->getFieldsKey();
$captchaV3Settings = $FrontendFormManager->getCaptchaV3Settings();
if ($FrontendFormManager->getCaptchaSettings() || $captchaV3Settings || $FrontendFormManager->getTurnstileSettings()) {
$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 (
$FrontendFormManager->getTurnstileSettings()
&& !is_null($integration->integration_type)
&& 'turnstileCaptcha' === $integration->integration_type
) {
$integrationDetails = json_decode($integration->integration_details);
$turnstileSiteKey = $integrationDetails->siteKey;
}
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';
}
}
}
}
}
if ($captchaV3Settings && !empty($reCAPTCHA->siteKey)) {
// DANGER: no matter what, DONT CHANGE THE SCRIPT ID OF THIS SCRIPT
$scriptId = BITFORMS_PREFIX . 'recaptcha';
wp_enqueue_script($scriptId, "https://www.google.com/recaptcha/api.js?render={$reCAPTCHA->siteKey}");
}
$configs = [
'bf_separator' => BITFORMS_BF_SEPARATOR,
];
// check if fields has paypal or razorpay
$paymentFields = ['paypal', 'razorpay', 'stripe'];
$paymentFieldData = [];
foreach ($fields as $key => $field) {
if (in_array($field->typ, $paymentFields)) {
$paymentFieldData[$key] = $field;
}
}
if (!empty($paymentFieldData)) {
$integrationHandler = new IntegrationHandler(0);
foreach ($paymentFieldData as $fldKey => $fldData) {
if ('paypal' === $fldData->typ) {
$paypalIntegration = $integrationHandler->getAIntegration($fldData->payIntegID);
$integrationDetails = json_decode($paypalIntegration[0]->integration_details);
$clientID = $integrationDetails->clientID;
$fields->{$fldKey}->clientId = $clientID;
} elseif ('razorpay' === $fldData->typ) {
$razorpayIntegration = $integrationHandler->getAIntegration($fldData->payIntegID);
$integrationDetails = json_decode($razorpayIntegration[0]->integration_details);
$clientID = $integrationDetails->apiKey;
$fields->{$fldKey}->clientId = $clientID;
} elseif ('stripe' === $fldData->typ) {
$stripeIntegration = $integrationHandler->getAIntegration($fldData->payIntegID);
$integrationDetails = json_decode($stripeIntegration[0]->integration_details);
$publishableKey = $integrationDetails->publishableKey;
$fields->{$fldKey}->publishableKey = $publishableKey;
}
}
}
$bitFormFrontArr = [
'ajaxURL' => admin_url('admin-ajax.php'),
'nonce' => $nonce,
'version' => BITFORMS_VERSION,
'layout' => $layout,
'nestedLayout' => $nestedLayout,
'fields' => $fields,
'buttons' => $buttons,
'fieldsKey' => $fieldsKey,
'file' => $file,
'configs' => $configs,
'formId' => $formID,
'appID' => "bitforms_{$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,
'turnstileSiteKey' => !empty($turnstileSiteKey) ? $turnstileSiteKey : null
];
if ($entryId) {
$bitFormFrontArr['entryId'] = $entryId;
}
if (isset($additional->enabled->validateFocusLost)) {
$bitFormFrontArr['validateFocusLost'] = true;
}
if (!empty($isAbandoned)) {
$bitFormFrontArr['oldValues'] = $this->getFieldsValue($formID, $isAbandoned);
if (empty($entryId)) {
$bitFormFrontArr['entryId'] = $isAbandoned;
}
}
if (is_array($layout) && count($layout) > 1) {
$formInfo = $FrontendFormManager->getFormInfo();
$multiStepSettings = isset($formInfo->multiStepSettings) ? $formInfo->multiStepSettings : null;
$newTempSettings = (object) [
'validateOnStepChange' => isset($multiStepSettings->validateOnStepChange) ? $multiStepSettings->validateOnStepChange : false,
'maintainStepHistory' => isset($multiStepSettings->maintainStepHistory) ? $multiStepSettings->maintainStepHistory : false,
'saveProgress' => isset($multiStepSettings->saveProgress) ? $multiStepSettings->saveProgress : false,
'showPercentage' => isset($multiStepSettings->progressSettings->showPercentage) ? $multiStepSettings->progressSettings->showPercentage : false,
];
$bitFormFrontArr['formInfo'] = (object) [
'multiStepSettings' => $newTempSettings
];
}
$bitFormsFront = apply_filters(
'bitforms_localized_script',
$bitFormFrontArr
);
$layout = \json_encode($layout);
$buttons = \json_encode($buttons);
$frontArr = json_encode($bitFormFrontArr);
$bfGlobals = <<addInlineScript($bfGlobals, 'bit-form-all-script', 'before');
$html = $FrontendFormManager->formView($fields, $file, $errorMessages);
// if form preview then return html otherwise echo with output buffer
if ($formPreview) {
ob_clean();
$formViewObject = new \stdClass();
$formViewObject->html = $html;
$formViewObject->font = $font;
$formViewObject->bfGlobals = $bfGlobals;
return $formViewObject;
}
$html .= <<{$bfGlobals}
BFGLOBALSSCRIPT;
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;
}
private function getFieldsValue($formID, $entryID)
{
$formEntryModel = new FormEntryMetaModel();
$metaValues = $formEntryModel->get(
[
'meta_key',
'meta_value'
],
[
'bitforms_form_entry_id' => $entryID,
]
);
$fldsData = (object) [];
if (!is_wp_error($metaValues)) {
foreach ($metaValues as $metaValue) {
$metaKey = $metaValue->meta_key;
$metaVal = $metaValue->meta_value;
// if meta value is array then convert to string
if (preg_match('/^\[.*\]$/', $metaVal)) {
$metaVal = json_decode($metaVal);
//check is it array of objects
if (is_array($metaVal) && is_object($metaVal[0])) {
$metaVal = $metaValue->meta_value;
} else {
$metaVal = implode(BITFORMS_BF_SEPARATOR, $metaVal);
}
}
if (!isset($fldsData->{$metaKey})) {
$fldsData->{$metaKey} = '';
}
$fldsData->{$metaKey} = $metaVal;
}
}
return $fldsData;
}
public function setFieldsValue($fields, $formID, $entryID)
{
$formEntryModel = new FormEntryMetaModel();
$metaValues = $formEntryModel->get(
[
'meta_key',
'meta_value'
],
[
'bitforms_form_entry_id' => $entryID,
]
);
if (!is_wp_error($metaValues)) {
foreach ($metaValues as $metaValue) {
$metaKey = $metaValue->meta_key;
$metaVal = $metaValue->meta_value;
// if meta value is array then convert to string
if (preg_match('/^\[.*\]$/', $metaVal)) {
$metaVal = json_decode($metaVal);
//check is it array of objects
if (is_array($metaVal) && is_object($metaVal[0])) {
$metaVal = $metaValue->meta_value;
} else {
$metaVal = implode(BITFORMS_BF_SEPARATOR, $metaVal);
}
}
if (property_exists($fields, $metaKey)) {
$fields->{$metaKey}->val = $metaVal;
if ('file-up' === $fields->{$metaKey}->typ || 'advanced-file-up' === $fields->{$metaKey}->typ) {
$fields->{$metaKey}->val = $metaValue->meta_value;
$fields->{$metaKey}->config->oldFiles = $metaValue->meta_value;
$urlQuery = parse_url(FileDownloadProvider::getBaseDownloadURL(), PHP_URL_QUERY);
$baseDLURL = FileDownloadProvider::getBaseDownloadURL();
$baseDLURL = empty($urlQuery) ? $baseDLURL . '?' : $baseDLURL . '&';
$fields->{$metaKey}->config->baseDLURL = $baseDLURL . "formID={$formID}&entryID={$entryID}";
}
}
}
}
return $fields;
}
public function loadAssets($formID = 0)
{
$bfUniqFormIds = FrontendHelpers::getAllFormIdsInPage();
$isPageBuilder = FrontendHelpers::$isPageBuilder;
$bfMultipleFormsExists = $isPageBuilder ? true : count($bfUniqFormIds) > 1;
if (!empty($formID)) {
$formIds = [$formID];
} else {
$formIds = $bfUniqFormIds;
}
foreach ($formIds as $formID) {
global $bitform_dequeued_styles;
if (is_array($bitform_dequeued_styles) && in_array($formID, $bitform_dequeued_styles)) {
continue;
}
if ($bfMultipleFormsExists) {
$newFormId = $formID . '-formid';
} else {
$newFormId = $formID;
}
$formUpdateVersion = get_option('bit-form_form_update_version');
if (!wp_style_is('bitform-style-' . $newFormId) && is_readable(BITFORMS_CONTENT_DIR . '/form-styles/bitform-' . $newFormId . '.css')) {
wp_enqueue_style(
'bitform-style-' . $newFormId,
BITFORMS_UPLOAD_BASE_URL . "/form-styles/bitform-{$newFormId}.css",
[],
$formUpdateVersion
);
if ($isPageBuilder) {
$formStyle = file_get_contents(BITFORMS_CONTENT_DIR . '/form-styles/bitform-' . $newFormId . '.css');
echo sprintf("", $formStyle);
}
}
if (!wp_style_is('bitform-style-custom-' . $formID) && is_readable(BITFORMS_CONTENT_DIR . '/form-styles/bitform-custom-' . $formID . '.css')) {
wp_enqueue_style(
'bitform-style-custom-' . $formID,
BITFORMS_UPLOAD_BASE_URL . "/form-styles/bitform-custom-{$formID}.css",
[],
$formUpdateVersion
);
if ($isPageBuilder) {
$formStyle = file_get_contents(BITFORMS_CONTENT_DIR . '/form-styles/bitform-custom-' . $formID . '.css');
echo sprintf("", $formStyle);
}
}
}
}
}