diff --git a/admin/database.php b/admin/database.php index ea81fd868c9..cc417b52903 100644 --- a/admin/database.php +++ b/admin/database.php @@ -1072,6 +1072,7 @@ function get_max_question_order($gid) 'listpublic'=>$_POST['public'], 'htmlemail'=>$_POST['htmlemail'], 'tokenanswerspersistence'=>$_POST['tokenanswerspersistence'], + 'alloweditaftercompletion'=>$_POST['alloweditaftercompletion'], 'usecaptcha'=>$_POST['usecaptcha'], 'emailresponseto'=>trim($_POST['emailresponseto']), 'emailnotificationto'=>trim($_POST['emailnotificationto']), @@ -1373,6 +1374,7 @@ function get_max_question_order($gid) 'public'=>$_POST['public'], 'htmlemail'=>$_POST['htmlemail'], 'tokenanswerspersistence'=>$_POST['tokenanswerspersistence'], + 'alloweditaftercompletion'=>$_POST['alloweditaftercompletion'], 'usecaptcha'=>$_POST['usecaptcha'], 'publicstatistics'=>$_POST['publicstatistics'], 'publicgraphs'=>$_POST['publicgraphs'], diff --git a/admin/editsurveysettings.php b/admin/editsurveysettings.php index d9365a438f8..51ddb8e8e71 100644 --- a/admin/editsurveysettings.php +++ b/admin/editsurveysettings.php @@ -51,6 +51,7 @@ $esrow['ipaddr'] = 'N'; $esrow['refurl'] = 'N'; $esrow['tokenanswerspersistence'] = 'N'; + $esrow['alloweditaftercompletion'] = 'N'; $esrow['assesments'] = 'N'; $esrow['startdate'] = ''; $esrow['savetimings'] = 'N'; @@ -866,6 +867,16 @@ $editsurvey .= ">".$clang->gT("No")."\n" . "\n"; + // Allow editing answers after completion + $editsurvey .= "
  • \n" + . "
  • \n"; // Save timings $editsurvey .= "
  • \n"; diff --git a/admin/install/create-mssql.sql b/admin/install/create-mssql.sql index c2abedb3c97..b4fe6972102 100644 --- a/admin/install/create-mssql.sql +++ b/admin/install/create-mssql.sql @@ -292,6 +292,7 @@ CREATE TABLE [prefix_surveys] ( [allowjumps] char(1) default 'N', [navigationdelay] tinyint default '0', [nokeyboard] char(1) default 'N', + [alloweditaftercompletion] char(1) default 'N', PRIMARY KEY ([sid]) ) @@ -318,11 +319,11 @@ CREATE TABLE [prefix_surveys_languagesettings] ( [surveyls_email_register] TEXT NULL, [surveyls_email_confirm_subj] VARCHAR(255) NULL, [surveyls_email_confirm] TEXT NULL, + [surveyls_dateformat] INT NOT NULL DEFAULT 1, [email_admin_notification_subj] VARCHAR(255) NULL, [email_admin_notification] TEXT NULL, [email_admin_responses_subj] VARCHAR(255) NULL, [email_admin_responses] TEXT NULL, - [surveyls_dateformat] INT NOT NULL DEFAULT 1, [surveyls_numberformat] INT NOT NULL DEFAULT 0, PRIMARY KEY ([surveyls_survey_id],[surveyls_language]) ) diff --git a/admin/install/create-mssqlnative.sql b/admin/install/create-mssqlnative.sql index 5d2f9f0fa94..ac402fe60f8 100644 --- a/admin/install/create-mssqlnative.sql +++ b/admin/install/create-mssqlnative.sql @@ -301,6 +301,7 @@ CREATE TABLE [prefix_surveys] ( [allowjumps] char(1) default 'N', [navigationdelay] tinyint default '0', [nokeyboard] char(1) default 'N', + [alloweditaftercompletion] char(1) default 'N', PRIMARY KEY ([sid]) ) @@ -327,11 +328,11 @@ CREATE TABLE [prefix_surveys_languagesettings] ( [surveyls_email_register] varchar(max) NULL, [surveyls_email_confirm_subj] VARCHAR(255) NULL, [surveyls_email_confirm] varchar(max) NULL, + [surveyls_dateformat] INT NOT NULL DEFAULT 1, [email_admin_notification_subj] VARCHAR(255) NULL, [email_admin_notification] varchar(max) NULL, [email_admin_responses_subj] VARCHAR(255) NULL, [email_admin_responses] varchar(max) NULL, - [surveyls_dateformat] INT NOT NULL DEFAULT 1, [surveyls_numberformat] INT NOT NULL DEFAULT 0, PRIMARY KEY ([surveyls_survey_id],[surveyls_language]) ) @@ -423,7 +424,6 @@ CREATE TABLE [prefix_templates] ( ); - -- -- Create failed_login_attempts -- diff --git a/admin/install/create-mysql.sql b/admin/install/create-mysql.sql index b17f024724f..cdaa1ee5333 100644 --- a/admin/install/create-mysql.sql +++ b/admin/install/create-mysql.sql @@ -281,6 +281,7 @@ CREATE TABLE `prefix_surveys` ( `allowjumps` char(1) default 'N', `navigationdelay` tinyint(2) default '0', `nokeyboard` char(1) default 'N', + `alloweditaftercompletion` char(1) default 'N', PRIMARY KEY(`sid`) ) ENGINE=$databasetabletype CHARACTER SET utf8 COLLATE utf8_unicode_ci; @@ -306,11 +307,11 @@ CREATE TABLE `prefix_surveys_languagesettings` ( `surveyls_email_confirm_subj` VARCHAR(255) NULL, `surveyls_email_confirm` TEXT NULL, `surveyls_dateformat` INT UNSIGNED NOT NULL DEFAULT 1, - `surveyls_numberformat` INT NOT NULL DEFAULT 0, `email_admin_notification_subj` VARCHAR(255) NULL, `email_admin_notification` TEXT NULL, `email_admin_responses_subj` VARCHAR(255) NULL, `email_admin_responses` TEXT NULL, + `surveyls_numberformat` INT NOT NULL DEFAULT 0, PRIMARY KEY (`surveyls_survey_id`, `surveyls_language`) ) ENGINE = $databasetabletype CHARACTER SET utf8 COLLATE utf8_unicode_ci; diff --git a/admin/install/create-postgres.sql b/admin/install/create-postgres.sql index b93cab28200..4d4c6e4cf87 100644 --- a/admin/install/create-postgres.sql +++ b/admin/install/create-postgres.sql @@ -305,7 +305,8 @@ CREATE TABLE prefix_surveys ( showprogress character(1) DEFAULT 'N'::bpchar, allowjumps character(1) DEFAULT 'N'::bpchar, navigationdelay smallint DEFAULT '0', - nokeyboard character(1) DEFAULT 'N'::bpchar + nokeyboard character(1) DEFAULT 'N'::bpchar, + alloweditaftercompletion character(1) DEFAULT 'N'::bpchar ); ALTER TABLE ONLY prefix_surveys ADD CONSTRAINT prefix_surveys_pkey PRIMARY KEY (sid); @@ -331,11 +332,11 @@ CREATE TABLE prefix_surveys_languagesettings ( surveyls_email_register text, surveyls_email_confirm_subj character varying(255), surveyls_email_confirm text, + surveyls_dateformat integer DEFAULT 1 NOT NULL, email_admin_notification_subj character varying(255), email_admin_notification text, email_admin_responses_subj character varying(255), email_admin_responses text, - surveyls_dateformat integer DEFAULT 1 NOT NULL, surveyls_numberformat integer NOT NULL DEFAULT 1 ); diff --git a/admin/update/upgrade-mssql.php b/admin/update/upgrade-mssql.php index 9870581c556..4f863feceea 100644 --- a/admin/update/upgrade-mssql.php +++ b/admin/update/upgrade-mssql.php @@ -424,8 +424,9 @@ function db_upgrade($oldversion) { modify_database("", "ALTER TABLE [prefix_surveys] ADD showwelcome CHAR(1) NULL default 'Y'"); echo $modifyoutput; flush(); modify_database("", "ALTER TABLE [prefix_surveys] ADD showprogress CHAR(1) NULL default 'Y'"); echo $modifyoutput; flush(); modify_database("", "ALTER TABLE [prefix_surveys] ADD allowjumps CHAR(1) NULL default 'N'"); echo $modifyoutput; flush(); - modify_database("", "ALTER TABLE [prefix_surveys] ADD navigationdelay tinyint default '0'"); echo $modifyoutput; flush(); + modify_database("", "ALTER TABLE [prefix_surveys] ADD navigationdelay tinyint NOT NULL default '0'"); echo $modifyoutput; flush(); modify_database("", "ALTER TABLE [prefix_surveys] ADD nokeyboard CHAR(1) NULL default 'N'"); echo $modifyoutput; flush(); + modify_database("", "ALTER TABLE [prefix_surveys] ADD alloweditaftercompletion CHAR(1) NULL default 'N'"); echo $modifyoutput; flush(); modify_database("", "CREATE TABLE [prefix_survey_permissions] ( [sid] INT NOT NULL, [uid] INT NOT NULL, @@ -464,21 +465,23 @@ function db_upgrade($oldversion) { modify_database("","EXEC sp_rename 'prefix_surveys.private','anonymized'"); echo $modifyoutput; flush(); modify_database("","ALTER TABLE [prefix_surveys] ALTER COLUMN [anonymized] char(1) NOT NULL default 'N';"); echo $modifyoutput; flush(); - - - modify_database("", "UPDATE [prefix_settings_global] SET stg_value='145' WHERE stg_name='DBVersion'"); echo $modifyoutput; flush(); modify_database("", "CREATE TABLE [prefix_failed_login_attempts] ( [id] int(11) NOT NULL AUTO_INCREMENT, [ip] varchar(37) NOT NULL, [last_attempt] varchar(20) NOT NULL, [number_attempts] int(11) NOT NULL, - PRIMARY KEY ([id]));"); echo $modifyoutput; flush(); + PRIMARY KEY ([id]) + );"); echo $modifyoutput; flush(); + + modify_database("", "ALTER TABLE [prefix_surveys_languagesettings] ADD [surveyls_numberformat] INT default 0 NOT NULL"); echo $modifyoutput; flush(); + + + modify_database("", "UPDATE [prefix_settings_global] SET stg_value='145' WHERE stg_name='DBVersion'"); echo $modifyoutput; flush(); + } - modify_database("", "ALTER TABLE [prefix_surveys_languagesettings] ADD [surveyls_numberformat] int(11) default 0 NOT NULL AFTER [surveyls_dateformat]"); echo $modifyoutput; flush(); - echo '

    Database update finished ('.date('Y-m-d H:i:s').')
    '; return true; } diff --git a/admin/update/upgrade-mssqlnative.php b/admin/update/upgrade-mssqlnative.php index 271375fc712..a31f3660772 100644 --- a/admin/update/upgrade-mssqlnative.php +++ b/admin/update/upgrade-mssqlnative.php @@ -423,6 +423,7 @@ function db_upgrade($oldversion) { modify_database("", "ALTER TABLE [prefix_surveys] ADD allowjumps CHAR(1) NULL default 'N'"); echo $modifyoutput; flush(); modify_database("", "ALTER TABLE [prefix_surveys] ADD navigationdelay tinyint NOT NULL default '0'"); echo $modifyoutput; flush(); modify_database("", "ALTER TABLE [prefix_surveys] ADD nokeyboard CHAR(1) NULL default 'N'"); echo $modifyoutput; flush(); + modify_database("", "ALTER TABLE [prefix_surveys] ADD alloweditaftercompletion CHAR(1) NULL default 'N'"); echo $modifyoutput; flush(); modify_database("", "CREATE TABLE [prefix_survey_permissions] ( [sid] INT NOT NULL, [uid] INT NOT NULL, @@ -461,20 +462,22 @@ function db_upgrade($oldversion) { modify_database("","EXEC sp_rename 'prefix_surveys.private','anonymized'"); echo $modifyoutput; flush(); modify_database("","ALTER TABLE [prefix_surveys] ALTER COLUMN [anonymized] char(1) NOT NULL default 'N';"); echo $modifyoutput; flush(); + + modify_database("", "CREATE TABLE [prefix_failed_login_attempts] ( + [id] int(11) NOT NULL AUTO_INCREMENT, + [ip] varchar(37) NOT NULL, + [last_attempt] varchar(20) NOT NULL, + [number_attempts] int(11) NOT NULL, + PRIMARY KEY ([id]) + );"); echo $modifyoutput; flush(); + + modify_database("", "ALTER TABLE [prefix_surveys_languagesettings] ADD [surveyls_numberformat] INT default 0 NOT NULL"); echo $modifyoutput; flush(); modify_database("", "UPDATE [prefix_settings_global] SET stg_value='145' WHERE stg_name='DBVersion'"); echo $modifyoutput; flush(); - modify_database("", "CREATE TABLE [prefix_failed_login_attempts] ( - [id] int(11) NOT NULL AUTO_INCREMENT, - [ip] varchar(37) NOT NULL, - [last_attempt] varchar(20) NOT NULL, - [number_attempts] int(11) NOT NULL, - PRIMARY KEY ([id]) - );"); echo $modifyoutput; flush(); } - modify_database("", "ALTER TABLE [prefix_surveys_languagesettings] ADD [surveyls_numberformat] int(11) default 0 NOT NULL AFTER [surveyls_dateformat]"); echo $modifyoutput; flush(); echo '

    Database update finished ('.date('Y-m-d H:i:s').')
    '; return true; diff --git a/admin/update/upgrade-mysql.php b/admin/update/upgrade-mysql.php index 3402e60bf78..a782ae88567 100644 --- a/admin/update/upgrade-mysql.php +++ b/admin/update/upgrade-mysql.php @@ -408,6 +408,7 @@ function db_upgrade($oldversion) { modify_database("", "ALTER TABLE `prefix_surveys` ADD `allowjumps` char(1) default 'N'"); echo $modifyoutput; flush(); modify_database("", "ALTER TABLE `prefix_surveys` ADD `navigationdelay` tinyint(2) default '0'"); echo $modifyoutput; flush(); modify_database("", "ALTER TABLE `prefix_surveys` ADD `nokeyboard` char(1) default 'N'"); echo $modifyoutput; flush(); + modify_database("", "ALTER TABLE `prefix_surveys` ADD `alloweditaftercompletion` char(1) default 'N'"); echo $modifyoutput; flush(); modify_database("", "CREATE TABLE `prefix_survey_permissions` ( `sid` int(10) unsigned NOT NULL, `uid` int(10) unsigned NOT NULL, @@ -562,9 +563,7 @@ function db_upgrade($oldversion) { modify_database("","ALTER TABLE `prefix_user_in_groups` DROP INDEX `user_in_groups_idx1`"); echo $modifyoutput; flush(); modify_database("","ALTER TABLE `prefix_user_in_groups` ADD PRIMARY KEY (`ugid`, `uid`)"); echo $modifyoutput; flush(); - - modify_database("", "UPDATE `prefix_settings_global` SET `stg_value`='145' WHERE stg_name='DBVersion'"); echo $modifyoutput; flush(); - + modify_database("", "ALTER TABLE `prefix_surveys_languagesettings` ADD `surveyls_numberformat` int(11) NOT NULL DEFAULT 0 AFTER `surveyls_dateformat`"); echo $modifyoutput; flush(); modify_database("", "CREATE TABLE `prefix_failed_login_attempts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ip` varchar(37) NOT NULL, @@ -573,12 +572,9 @@ function db_upgrade($oldversion) { PRIMARY KEY (`id`) ) ENGINE=$databasetabletype CHARACTER SET utf8 COLLATE utf8_unicode_ci;"); echo $modifyoutput; flush(); - - - + modify_database("", "UPDATE `prefix_settings_global` SET `stg_value`='145' WHERE stg_name='DBVersion'"); echo $modifyoutput; flush(); } - modify_database("", "ALTER TABLE `prefix_surveys_languagesettings` ADD `surveyls_numberformat` int(11) NOT NULL DEFAULT 0 AFTER `surveyls_dateformat`"); echo $modifyoutput; flush(); echo '

    Database update finished ('.date('Y-m-d H:i:s').')
    '; return true; diff --git a/admin/update/upgrade-postgres.php b/admin/update/upgrade-postgres.php index 14ed2699a4c..05e0cb4734b 100644 --- a/admin/update/upgrade-postgres.php +++ b/admin/update/upgrade-postgres.php @@ -250,6 +250,7 @@ function db_upgrade($oldversion) { modify_database("", "ALTER TABLE prefix_surveys ADD allowjumps CHAR(1) NULL default 'N'"); echo $modifyoutput; flush(); modify_database("", "ALTER TABLE prefix_surveys ADD navigationdelay smallint NOT NULL default '0'"); echo $modifyoutput; flush(); modify_database("", "ALTER TABLE prefix_surveys ADD nokeyboard char(1) default 'N'"); echo $modifyoutput; flush(); + modify_database("", "ALTER TABLE prefix_surveys ADD alloweditaftercompletion char(1) default 'N'"); echo $modifyoutput; flush(); modify_database("", "CREATE TABLE prefix_survey_permissions ( sid integer DEFAULT 0 NOT NULL, uid integer DEFAULT 0 NOT NULL, @@ -284,9 +285,6 @@ function db_upgrade($oldversion) { modify_database("","ALTER TABLE prefix_surveys RENAME COLUMN private TO anonymized;"); echo $modifyoutput; flush(); modify_database("","ALTER TABLE prefix_surveys ALTER COLUMN anonymized TYPE char(1) Default 'N' NOT NULL ;"); echo $modifyoutput; flush(); - - modify_database("", "UPDATE prefix_settings_global SET stg_value='145' WHERE stg_name='DBVersion'"); echo $modifyoutput; flush(); - modify_database("", "CREATE TABLE prefix_failed_login_attempts ( id integer NOT NULL AUTO_INCREMENT, ip character varying(37) NOT NULL, @@ -294,10 +292,10 @@ function db_upgrade($oldversion) { number_attempts integer NOT NULL );"); echo $modifyoutput; flush(); modify_database("", "ALTER TABLE ONLY prefix_failed_login_attempts ADD CONSTRAINT prefix_failed_login_attempts_pkey PRIMARY KEY (\"id\");"); echo $modifyoutput; flush(); - - + modify_database("", "ALTER TABLE prefix_surveys_languagesettings ADD surveyls_numberformat integer default 0 NOT NULL"); echo $modifyoutput; flush(); + + modify_database("", "UPDATE prefix_settings_global SET stg_value='145' WHERE stg_name='DBVersion'"); echo $modifyoutput; flush(); } - modify_database("", "ALTER TABLE prefix_surveys_languagesettings ADD surveyls_numberformat integer default 0 NOT NULL AFTER surveyls_dateformat"); echo $modifyoutput; flush(); echo '

    Database update finished ('.date('Y-m-d H:i:s').')
    '; diff --git a/index.php b/index.php index 2e5edda040d..5ff1adf20d8 100644 --- a/index.php +++ b/index.php @@ -655,8 +655,12 @@ { //check if tokens actually haven't been already used $areTokensUsed = usedTokens(db_quote(trim(strip_tags(returnglobal('token'))))); - - $tkquery = "SELECT * FROM ".db_table_name('tokens_'.$surveyid)." WHERE token='".db_quote($token)."' AND (completed = 'N' or completed='')"; + // check if token actually does exist + // check also if it is allowed to change survey after completion + if ($thissurvey['alloweditaftercompletion'] == 'Y' ) { + $tkquery = "SELECT * FROM ".db_table_name('tokens_'.$surveyid)." WHERE token='".db_quote($token)."' "; + } else { + $tkquery = "SELECT * FROM ".db_table_name('tokens_'.$surveyid)." WHERE token='".db_quote($token)."' AND (completed = 'N' or completed='')"; $tkresult = db_execute_num($tkquery); //Checked $tokendata = $tkresult->FetchRow(); if ($tkresult->RecordCount()==0 || $areTokensUsed) @@ -681,7 +685,13 @@ } if ($tokensexist == 1 && isset($token) && $token && db_tables_exist($dbprefix.'tokens_'.$surveyid)) //check if token is in a valid time frame { + + // check also if it is allowed to change survey after completion + if ($thissurvey['alloweditaftercompletion'] == 'Y' ) { + $tkquery = "SELECT * FROM ".db_table_name('tokens_'.$surveyid)." WHERE token='".db_quote($token)."' "; +} else { $tkquery = "SELECT * FROM ".db_table_name('tokens_'.$surveyid)." WHERE token='".db_quote($token)."' AND (completed = 'N' or completed='')"; +} $tkresult = db_execute_assoc($tkquery); //Checked $tokendata = $tkresult->FetchRow(); if ((trim($tokendata['validfrom'])!='' && $tokendata['validfrom']>date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i:s", $timeadjust)) || @@ -922,12 +932,12 @@ function loadanswers() $clienttoken=$value; $token=$value; } - elseif ($column == "saved_thisstep") + elseif ($column == "saved_thisstep" && $thissurvey['alloweditaftercompletion'] != 'Y' ) { $_SESSION['step']=$value; $thisstep=$value-1; } - elseif ($column =='lastpage' && isset($_GET['token'])) + elseif ($column =='lastpage' && isset($_GET['token']) && $thissurvey['alloweditaftercompletion'] != 'Y' ) { if ($value<1) $value=1; $_SESSION['step']=$value; @@ -2409,7 +2419,13 @@ function buildsurveysession() //check if tokens actually haven't been already used $areTokensUsed = usedTokens(db_quote(trim(strip_tags(returnglobal('token'))))); //check if token actually does exist - $tkquery = "SELECT COUNT(*) FROM ".db_table_name('tokens_'.$surveyid)." WHERE token='".db_quote(trim(strip_tags(returnglobal('token'))))."' AND (completed = 'N' or completed='')"; + // check also if it is allowed to change survey after completion (patch by johannes.klug@silverage.de) + if ($thissurvey['alloweditaftercompletion'] == 'Y' ) { + $tkquery = "SELECT COUNT(*) FROM ".db_table_name('tokens_'.$surveyid)." WHERE token='".db_quote(trim(strip_tags(returnglobal('token'))))."' "; + } else { + $tkquery = "SELECT COUNT(*) FROM ".db_table_name('tokens_'.$surveyid)." WHERE token='".db_quote(trim(strip_tags(returnglobal('token'))))."' AND (completed = 'N' or completed='')"; + } + $tkresult = db_execute_num($tkquery); //Checked list($tkexist) = $tkresult->FetchRow(); if (!$tkexist || $areTokensUsed)