diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -5,5 +5,12 @@ style: regex
# ignore all of cache except for the .keep file
^cache/[^.]
+# ignore .htaccess because we only want .htaccess.example in the repo
+^\.htaccess$
+
+# ignore inc/config.inc because we only want inc/config.inc.example in
+# the repo
+^inc/config\.inc$
+
# ignore common unwanted suffixes
(~|\.orig|\.rej)$
diff --git a/.htaccess.example b/.htaccess.example
new file mode 100644
--- /dev/null
+++ b/.htaccess.example
@@ -0,0 +1,16 @@
+# The following would be used to enable friendly pastebin-style
+# URLs. To enable support for these URLs in slate_permutate, set
+# $clean_urls = TRUE in inc/config.inc.
+
+RewriteEngine on
+
+# If you are serving this out of your home directory, there's a good chance you'll have to uncomment and edit one of the lines below:
+
+# For http://csx.calvin.edu/slate_permutate:
+# RewriteBase /slate_permutate
+
+# For http://ohnopub.net/~ohnobinki/slate_permutate:
+# RewriteBase /~ohnobinki/slate_permutate
+
+RewriteCond %{QUERY_STRING} ^(.*)?$
+RewriteRule ^([0-9]+)$ process.php?s=$1&%1 [L]
diff --git a/inc/class.page.php b/inc/class.page.php
--- a/inc/class.page.php
+++ b/inc/class.page.php
@@ -1,5 +1,15 @@
trackingcode = '' . "\n"
. $this->trackingcode;
- page::session_start();
+ self::session_start();
if($immediate
&& $ntitle != "NOHEAD")
$this->head();
@@ -161,13 +171,19 @@ class page
public function showSavedScheds($session)
{
+ global $clean_urls;
+
echo '
';
if (isset($session['saved']) && count($session['saved']) > 0)
{
+ $process_php_s = 'process.php?s=';
+ if ($clean_urls)
+ $process_php_s = '';
+
echo '
Saved Schedules:
';
foreach($session['saved'] as $key => $name)
{
- echo '
#' . $key . ":\n "
+ echo '
#' . $key . ":\n "
. htmlentities($name)
. '
edit'
. '
delete'
@@ -285,6 +301,58 @@ class page
/**
* \brief
+ * Perform a redirect.
+ *
+ * By consolidating all redirects here, we're hopefully able to do
+ * it in a somewhat compliant and portablish way ;-).
+ *
+ * This function does not return. It calls exit().
+ *
+ * \param $dest
+ * A URL relative to the slate_permutate root. For example,
+ * 'input.php' or '44' (for clean urls, for example).
+ * \param $http_code
+ * The redirection code to use, if any. For example, this can be
+ * used to implement ``permanent'' redirects if necessary.
+ */
+ public static function redirect($dest, $http_code = NULL)
+ {
+ if ($http_code)
+ header('HTTP/1.1 ' . $http_code);
+
+ $uri = '';
+
+ $host = '';
+ if (isset($_SERVER['SERVER_NAME']))
+ $host = $_SERVER['SERVER_NAME'];
+ if (isset($_SERvER['HTTP_HOST']))
+ $host = $_SERVER['HTTP_HOST'];
+
+ if (strlen($host))
+ {
+ $proto = 'http';
+ $port = NULL;
+ if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] != 80)
+ {
+ if ($_SERVER['SERVER_PORT'] == 443 || !empty($_SERVER['HTTPS']))
+ $proto .= 's';
+ if ($_SERVER['SERVER_PORT'] != 433)
+ $port = $_SERVER['SERVER_PORT'];
+ }
+
+ $uri = $proto . '://' . $host;
+ if ($port !== NULL)
+ $uri .= ':' . $port;
+ $uri .= dirname($_SERVER['REQUEST_URI']) . '/';
+ }
+
+ header('Location: ' . $uri . $dest);
+
+ exit();
+ }
+
+ /**
+ * \brief
* Get the current school profile handle.
*/
public function get_school()
diff --git a/inc/config.inc.example b/inc/config.inc.example
new file mode 100644
--- /dev/null
+++ b/inc/config.inc.example
@@ -0,0 +1,28 @@
+
+ *
+ * This file is a part of slate_permutate.
+ *
+ * slate_permutate is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * slate_permutate is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with slate_permutate. If not, see
.
+ */
+
+/**
+ * \brief
+ * Use clean URLs for saved schedules. Default: FALSE.
+ *
+ * Before setting this to TRUE, make sure that you have read and
+ * understood ../.htaccess.example and copied it to ../.htaccess .
+ */
+/* $clean_urls = FALSE; */
diff --git a/inc/schedule_store.inc b/inc/schedule_store.inc
--- a/inc/schedule_store.inc
+++ b/inc/schedule_store.inc
@@ -101,7 +101,11 @@ function schedule_store_retrieve($schedu
return NULL;
$schedule_id = (int)$schedule_id;
- $schedule_serialized = file_get_contents($schedule_store['dir'] . DIRECTORY_SEPARATOR . $schedule_id);
+ $schedule_file_name = $schedule_store['dir'] . DIRECTORY_SEPARATOR . $schedule_id;
+ if (!file_exists($schedule_file_name))
+ return NULL;
+
+ $schedule_serialized = file_get_contents($schedule_file_name);
if ($schedule_serialized === FALSE)
return NULL;
diff --git a/input.php b/input.php
--- a/input.php
+++ b/input.php
@@ -48,7 +48,7 @@ var sectionsOfClass = Array();
$school = $inputPage->get_school();
if ($school && (!empty($_REQUEST['school']) || $school['id'] != 'default'))
$_SESSION['school_chosen'] = TRUE;
-if ($_REQUEST['selectschool'] == 1
+if (!empty($_REQUEST['selectschool'])
|| $school['id'] == 'default' && !isset($_SESSION['school_chosen']))
{
?>
diff --git a/process.php b/process.php
--- a/process.php
+++ b/process.php
@@ -62,13 +62,17 @@ if (isset($_GET['debug']))
if(!$DEBUG)
{
- if(isset($_GET['s']))
+ $s = FALSE;
+ if (isset($_GET['s']))
+ $s = $_GET['s'];
+
+ if($s !== FALSE)
{
- $savedSched = schedule_store_retrieve($schedule_store, $_GET['s']);
+ $savedSched = schedule_store_retrieve($schedule_store, $s);
if ($savedSched)
$savedSched->writeoutTables();
else
- Page::show_404('Unable to find a saved schedule with an ID of ' . $_GET['s'] . '.');
+ page::show_404('Unable to find a saved schedule with an ID of ' . $s . '.');
}
elseif(isset($_GET['del']))
{
@@ -80,11 +84,21 @@ if(!$DEBUG)
unset($_SESSION['saved'][(int)$_GET['del']]);
}
- header('Location: input.php');
+ page::redirect('input.php');
+ exit;
+ }
+ elseif (!isset($_POST['postData']))
+ {
+ page::redirect('input.php');
exit;
}
else
{
+ /*
+ * we probably have input from the user and should interpret
+ * it as a schedule to permutate. Then we should redirect the
+ * user to the canonical URL for that schedule.
+ */
$allClasses = new Schedule($_POST['postData']['name']);
foreach($_POST['postData'] as $class)
@@ -114,12 +128,11 @@ if(!$DEBUG)
if ($schedule_id != NULL)
$_SESSION['saved'][$schedule_id] = $allClasses->getName();
- /*
- * writeoutTables() needs to know $schedule_id, so it
- * has to be called after we save the schedule. See
- * schedule_store_store().
- */
- $allClasses->writeoutTables();
+ $process_php_s = '';
+ if (!$clean_urls)
+ $process_php_s = 'process.php?s=';
+ page::redirect($process_php_s . $schedule_id);
+ exit;
}
}
else
diff --git a/styles/general.css b/styles/general.css
--- a/styles/general.css
+++ b/styles/general.css
@@ -153,7 +153,7 @@ td.center {
-webkit-border-radius: 5px;
border: 1px solid #999;
text-align: center!important;
-// background: #92a689!important;
+/* background: #92a689!important; */
background: #EEE;
cursor:default;