Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
a free software web application written in PHP designed to upload files, show links to uploaded files, shortern URLs, & list the previous shortened URLs; and now also creates text posts and lists the posts for display as perma-links
<?php
// powered by pacificpelican.us/cms
// This program is a free software web application written in PHP. It is designed to upload files, show links to uploaded files, shortern URLs, & list the previous shortened URLs.
// Be sure to put your setup data into the CONFIGURATION section below before uploading this file to your server.
// info links:
// http://pacificarchives.sf3am.com/cms / pacificpelicancms@lovebirdsconsulting.com
// Copyright 2010-2011 Daniel J. McKeown / Oct. 26, 2011 / http://danieljmckeown.com
// http://pacificpelican.us / http://lovebirdsconsulting.com / http://djmblog.com
// __
// Check out the Neener band site for free downloads of our music and band news:
// http://blogs.sf3am.com/neener
// //
// The version 0.0.9 series of pacificpelican.us/cms is in memory of Striker and Ava the parakeets:
// http://updates.sf3am.com/dan/status/142/
//
//
// LICENSE SECTION
//
// pacificpelican.us/cms is free software; you may freely modify it and distribute it
// pacificpelican.us/cms is offered in the hope that it will be useful but without warranty or guarantee
//
// pacificpelican.us/cms is licensed under the GNU General Public License (GPL) version 2, or later:
// http://www.gnu.org/licenses/gpl.html
//
//
// end of LICENSE SECTION
//
//
// --------> -------------------------------------------------------------------
// This is the CONFIGURATION section
//
$passcode00 = "ghana2014goal"; // Change this password to what you want--you will use it when you use the "upload photo," create post, and "shortern URL" tools
//
$subdir = ""; // $subdir should be assigned as subdirectory (if any) of your server that this index.php is installed on
// (w/ trailing slash:e.g. "files/pacificpelican/")
//
// Leave $subdir empty if this index.php sits at the root of your domain
//
// You also want to make sure that you have a directory called "libary" in the same directory this index.php file is in
// Also, the "library" directory should have a subdirectory called "images" for the program to upload into
// In addition, the "library" directory should have a subdirectory called "links" for the program to store data
// In addition, the "library" directory should have a subdirectory called "posts" for the program to store text files
// Also required is a blank file named "urls.txt" in the "library/links/" directory
//
// Optionally you may add a "style.css" CSS file to this directory to specify a style for your site
// This program outputs a page with divs w/ classes and IDs
//
// end of CONFIGURATION section
// -------------------------------------------------------------------
//
// This $version0 variable indicates the version of pacificpelican CMS (formerly known as Corvisart photo manager)
$version0 = "0.0.9.9.3";
// **dev version**
// Automatically find out what the site's base URL is and assign it to $sitebase
$sitebase = ($_SERVER['SERVER_NAME']);
//
// The URL redirection script (only runs for page requests with the parameter r [e.g. /?r=ID])
if ($_GET["r"]) {
$querynumber = ($_GET["r"]);
if (!($fl = fopen("library/links/urls.txt", "r"))) {
die();
}
$counter = 0;
while ($line = fgets($fl, 4096)) {
$line = trim($line);
$urlarray[$counter] = $line;
$counter++;
if (strrpos("$line", "##$querynumber")) {
$xth = "##$querynumber";
$line1 = str_replace("$xth", "", "$line");
// use a 301 signal (moved permanently) to redirect the URL
header("HTTP/1.1 301 Moved Permanently");
header("Location: $line1");
exit();
}
}
fclose($linkdata);
}
// end of The URL redirection script (for requests via the parameter r)
if ($_GET["p"]) {
$postfilename = ($_GET["p"]);
$fileid = "library/posts/$postfilename";
$handler = fopen($fileid, "r");
$myfile = $fileid;
$lines = file($myfile);
$countplus = 3;
for($i=count($lines);$i>0;$i--){
// echo $lines[$i];
$filecontentsp[$countplus] = $lines[$i];
$countplus--;
}
$maintext = "$filecontentsp[3]";
$i = 0;
$countplus = 0;
$thelimit = 6;
$thelimit = count($filecontentsp);
while ($i < $thelimit) {
$filecontentsp[$i] = $lines[$i];
$countplus++;
$i++;
}
fclose($handler);
$quotetitle = $filecontentsp[1];
$quotelesstitle = str_replace("\"" , "", $quotetitle);
}
?>
<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml">
<?php
echo "<head>";
echo "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />";
$kingofpain = "$sitebase" . "$subdir";
if ($subdir == "") {
$titlename = $kingofpain;
}
else {
$titlename = "$sitebase/$subdir";
}
if ($_GET["photo"]) {
$photoname1 = ($_GET["photo"]);
echo "<title>$photoname1 | $sitebase photo sharing</title>";
$canonical = "http://$sitebase/$subdir?photo=$photoname1";
echo "<link rel='canonical' href='http://$sitebase/$subdir?photo=$photoname1' />";
}
else
{
if ($_GET["links"]) {
echo "<title>$titlename link list</title>";
}
if ($_GET["library"]) {
echo "<title>$titlename file list</title>";
}
if ($_GET["urlshortener"]) {
echo "<title>$titlename URL shortener</title>";
}
if ($_GET["uploadtool"]) {
echo "<title>$titlename upload page</title>";
}
if ($_GET["writer"]) {
echo "<title>$titlename post writing page</title>";
}
if ($_GET["textfiles"]) {
echo "<title>$titlename posts list</title>";
}
if ($_GET["p"]) {
echo "<title>$quotelesstitle | $titlename</title>";
}
else {
echo "<title>$titlename</title>";
}
}
echo "<link href='style.css' rel='stylesheet' type='text/css'>";
echo "</head>";
echo "<body>";
echo "<div class='globalcontent' id='megalayer'>";
echo "<div class='menus' id='titlebar'>";
echo "<h1><a href='http://$sitebase'>$sitebase</a> <a href='.'>content</a></h1>";
echo "</div>";
// This assignment finds out the current URL and names it $url0
$url0 = (!empty($_SERVER['HTTPS'])) ? "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] : "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
// This section initializes several key variables
$urldir = "library/images/"; // This assumes that a directory ./library/images/ exists already
$sky = $sitebase;
$url1 = $url0 . $urldir;
$url1b = $urldir;
$imagedir = "library/images/";
$imagedir01 = "/library/images/";
$imagedir00 = "";
$baselocation = ".";
$infofile = "library/links/urls.txt";
// End of the variable initialization section
echo "<div class='top1' id='menu1'>";
echo "<li id='mainpage'><a href='$baselocation'>Main Page</a></li>";
if (!($_GET["photo"])) {
if (!($_GET["p"])) {
echo "<li id='uploadphoto'><a href='index.php?uploadtool=on'>Upload a Photo</a></li>";
// echo "<li id='photolibrary'><a href='index.php?library=on'>Old Photo Library</a></li>";
echo "<li id='photolibrary2'><a href='index.php?filelist=on'>Photo Library</a></li>";
echo "<li id='urlshortener'><a href='index.php?urlshortener=on'>URL shortener</a></li>";
echo "<li id='linklist'><a href='index.php?links=on'>Link List</a></li>";
echo "<li id='textcreatorlink'><a href='index.php?writer=on'>Create Post</a></li>";
echo "<li id='textcreatorlink0'><a href='index.php?textfiles=list'>Posts List</a></li>";
}
}
echo "<br />";
echo "</div>";
echo "<div class='corecontent' id='corelayer'>";
// photo perma-link section; called only if there is a photo paramter
if ($_GET["photo"])
{
$photoname = $_GET["photo"];
if ((strpos($photoname, "jpg") !== false) || (strpos($photoname, "JPG") !== false)) {
$photoplace = $urldir . $photoname;
if ($photoplace) {
if (strpos($_GET["photo"], '..') !== false) {
echo "ARBITRARY FILE VIEWING NOT AVAILABLE";
}
else {
echo "<img src='$photoplace' width='864' /><br /><a href='$photoplace' title='view the image directly'>view full size</a>";
}
}
} // end of if ((strpos($photoname, "jpg") !== false)
else {
$filename = $_GET["photo"];
$photoplace = $urldir . $filename;
echo "<a href='$photoplace' title='view the file directly'>link to the file</a>";
}
}
// end of photo perma-link section
// upload section; called only if there is an uploadtool paramter
if ($_GET["uploadtool"]) {
echo "<div class='mainfocus' id='uploadfile1'>";
echo "<h2>Upload a photo to library</h2>";
echo "<form enctype='multipart/form-data' action='$url0' method='POST'>";
// echo "<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"3000000\" />";
echo "file to upload: <input name='userfile' type='file' />";
echo "password: <input name='pcode' type='password' />";
echo "<input name='sky' type='hidden' value='$sky' />";
echo" <input type='submit' value='Upload' />";
echo "</form>";
echo "</div>";
$uploadfile1 = $url0 . $imagedir . basename($_FILES['userfile']['name']);
$uploadfile01 = $imagedir . basename($_FILES['userfile']['name']);
if (($_POST["pcode"] == $passcode00) && ($_POST["sky"] == $sky)) {
echo "<div class='ulresult' id='eerrorornot'>";
echo "<br />UL place: $uploadfile01";
$tmpp = ($_FILES["userfile"]["tmp_name"]);
echo "<br /><br />";
echo "tmp name: ";
echo $tmpp;
$fs0 = ($_FILES['userfile']['tmp_name']);
echo $fs0;
echo "<br /><br />";
if (move_uploaded_file($fs0, "$uploadfile01"))
{
echo "File uploaded.\n";
}
else {
echo "ERROR\n";
}
echo "<br /><br />";
echo "</div>";
}
}
// end of upload section
if ($_POST["pcode"]) {
if ($_POST["pcode"] != $passcode00) {
echo "<div class='errordata' id='pwerror'>";
echo "<br /><br />";
echo "PASSWORD ERROR";
echo "<br /><br />";
echo "</div>";
}
}
// This is the library section
$sdf = "on";
if (!($_GET["photo"])) {
if (($_GET["library"]) == $sdf) {
echo "<h2>File List</h2>";
$fpile = array();
$xc = 2;
$xc--;
$xc--;
if ($flh = (opendir("$urldir"))) {
while (false !== ($file = readdir($flh))) {
if ($file != "." && $file != "..") {
$fpile[$xc] = $file;
$xc++;
}
}
closedir($flh);
}
$limiter = 10;
if ($_GET["count"]) {
$limiter = ($_GET["count"]);
}
$filetotal = count($fpile);
if ($limiter > $filetotal) {
$limiter = $filetotal + 1;
}
$xc = 2;
$enufcheck = 1;
while ($limiter >= 0) {
$currentphoto = $fpile[$limiter];
$linkfront = "$url0&photo=$currentphoto";
if ($enufcheck > 2) {
echo "<a href='$linkfront'>$currentphoto</a>";
echo "<br />";
}
$limiter = $limiter - 1;
$enufcheck = $enufcheck + 1;
}
echo "<br /><a href='?library=on&count=10'>last 10</a> | <a href='?library=on&count=50'>last 50</a> | ";
echo "<a href='?library=on&count=100'>last 100</a> | <a href='?library=on&count=500'>last 500</a><br />";
} // end of if (($_GET["library"]) == $sdf)
}
// End of the library section
// Start of the URL shortener form
if ($_GET["urlshortener"])
{
// Use a form to check password and take in the URL that the user wants to shorten
echo "<h2>Shorten a link</h2>";
$url04 = "?urlshortener=on";
echo "<form enctype='multipart/form-data' action='$url04' method='POST'>";
echo "URL: <input name='userurl' type='text' size='90' />";
echo "password: <input name='pcode' type='password' />";
echo "<input name='sky' type='hidden' value='$sky' />";
echo "<input type='submit' value='Upload' />";
echo "</form>";
if (($_POST["pcode"] == $passcode00) && (($_POST["sky"]) == $sky)) {
if (!($fl = fopen("$infofile", "r"))) {
die("Cannot open file");
}
$counter = 0;
while ($line = fgets($fl, 4096)) {
$line = trim($line);
$urlarray[$counter] = $line;
$counter++;
}
$goodcount = $counter;
echo "<div class='ulresult' id='eerrorornot2'>";
echo "<br />uploading.....";
$urllist = fopen("library/links/urls.txt", "a") or die("can't open file");
$newurl0 = ($_POST["userurl"]);
$newurl = "$newurl0" . "##" . "$goodcount" . "\n";
echo "adding URL";
if ($subdir == "") {
$destination = "$sitebase" . "/" . "?r=$goodcount";
}
else {
$destination = "$sitebase" . "/" . "$subdir" . "?r=$goodcount";
}
echo "<br /><p><a href='http://$destination'>Your shortened URL:</a> http://$destination</p>";
fwrite($urllist, $newurl);
fclose($urllist);
echo "<br /><br />";
echo "</div>";
}
}
// end of the URL shortener form
// Start of the URL redirector (the other, semi-deprecated on that uses the u parameter instead of the default r parameter and JavaScript instead of http 301)
if ($_GET["u"])
{
$querynumber = ($_GET["u"]);
$linkdata = fopen("library/links/urls.txt", "r");
if (!($fl = fopen("$infofile", "r"))) {
die("Cannot open file");
}
$counter = 0;
while ($line = fgets($fl, 4096)) {
$line = trim($line);
$urlarray[$counter] = $line;
$counter++;
if (strrpos("$line", "##$querynumber")) {
echo "found the url....redirecting.....";
$xth = "##$querynumber";
$line1 = str_replace("$xth", "", "$line");
echo "<script>";
echo "location.replace('$line1');";
echo "</script>";
exit();
}
// Look up the u parameter to find the full URL link
}
fclose($linkdata);
}
if ($_GET["t"]) { // The old text file perma-link viewer
$postfilename = ($_GET["t"]);
$fileid = "library/posts/$postfilename";
$handler = fopen($fileid, "r");
$filecontents = fread($handler, filesize($fileid));
fclose($handler);
echo "<p>$filecontents</p>";
}
if ($_GET["p"]) { // The new text file perma-link viewer
// echo "<p>$filecontentsp[0]</p>";
echo "<div class='postdata' id='posttitle'><p>$filecontentsp[1]</p></div>";
echo "<div class='postdata' id='postauthor'><p>$filecontentsp[2]</p></div>";
echo "<div class='postdata' id='postdate'><p>$filecontentsp[3]</p></div>";
echo "<div class='postdata' id='postcontent'><p>$filecontentsp[4]</p>";
$result = count($filecontentsp);
$left = $result - 4;
$wherenow = 5 - $result;
$highcount = 5;
// while ($left > 0)
while ($wherenow < 0)
{
echo "<p>$filecontentsp[$highcount]</p>";
$left--;
$highcount++;
$wherenow++;
}
echo "</div>";
}
if ($_GET["textfiles"]) { // This section lists the text files
// open the text library directory
$postdirectory = opendir("library/posts");
$postdirectoryloc = "library/posts";
$postarray[] = scandir("$postdirectoryloc");
// close the directory
closedir($postdirectory);
// count posts in directory array
$postcount = count($postarray);
// sort function
sort($postarray);
$pieces = scandir($postdirectoryloc);
echo "<br /><h2>Text file list</h2><br />";
foreach($pieces as $currentpost) {
if (!($currentpost == ".")) {
if (!($currentpost == "..")) {
echo "<a href='?p=$currentpost'>$currentpost</a> | (<a href='library/posts/$currentpost'>raw text file</a>)<br />";
// $countpostlist++;
}
}
}
} // end of section that lists the text files
if ($_GET["filelist"]) { // new photo/file list section
// open the text library directory
$postdirectory = opendir("library/images");
$postdirectoryloc = "library/images";
$postarray[] = scandir("$postdirectoryloc");
// close the directory
closedir($postdirectory);
// count posts in directory array
$postcount = count($postarray);
// sort function
sort($postarray);
$pieces = scandir($postdirectoryloc);
echo "<h2>Photo/File list</h2><br />";
foreach($pieces as $currentpost) {
if (!($currentpost == ".")) {
if (!($currentpost == "..")) {
echo "<a href='?photo=$currentpost'>$currentpost</a> | (<a href='library/images/$currentpost'>direct link to file</a>)<br />";
// $countpostlist++;
}
}
}
} // end of new photo/file list section
if ($_GET["writer"]) { // The form that creates a new text file
echo "<div class='composer' id='writelayer'>";
echo "<h2>Create a text file</h2>";
echo "<p>";
echo "<form name='textinput' action='index.php' method='post' id='textinputform'>";
echo "title: <input type='text' name='texttitle' id='titleinput' />";
echo "author: <input type='text' name='writername' id='writerinput' />";
echo "<br />";
echo "<textarea cols='100' rows='40' name='textcontent' id='textcontentinput'>";
echo "</textarea>";
echo "<br />";
echo "password: <input name='pcode' type='password' />";
echo "<br />";
echo "<input type='submit' value='Post' id='postbutton' />";
echo "</form>";
echo "</p>";
echo "</div>";
echo "<br />";
}
if ($_POST["textcontent"]) {
echo "Text submitted.";
if ($_POST["pcode"]) {
if ($_POST["pcode"] != $passcode00) {
echo "<div class='errordata' id='pwerror'>";
echo "<br /><br />";
echo "PASSWORD ERROR";
echo "<br /><br />";
echo "</div>";
}
if ($_POST["pcode"] == $passcode00) {
$postcontents = ($_POST["textcontent"]);
$post = ($_POST["textcontent"]);
if ($_POST["texttitle"]) {
$postname = ($_POST["texttitle"]);
$author = ($_POST["writername"]);
}
else {
$postname = substr($postcontents, 0, 33) . "...";
// $postname = the 1st 20 characters of $postcontents + "...";
$author = ($_POST["writername"]);
echo "<br /><br />";
}
if (!($_POST["writername"])) {
$author = "Anonymous";
}
// GET a timestamp
$timestmp = date("F j, Y, g:i a");
// $nowstamp = date("YmdHiS");
$nowstamp = date("YmdHi") . "sa" . rand(1, 7772727);
// $newfilename = "library/posts/year-month-day-hour-minute-second-random" . ".txt";
$newfilename = "library/posts/" . "$nowstamp" . ".txt";
$totalfilecontents = "$postname<br />author:$author<br />created:$timestmp<br />$postcontents";
$namebanner = "$sitebase\n";
$nameline = "\"$postname\"\n";
// $nameline = "$postname\n";
$authorline = "by $author\n";
$timeline = "$timestmp\n";
$contentsline = "$postcontents\n";
// OPEN/CREATE a new text file in library/posts/
$fl = fopen($newfilename, 'w') or die("can't open file");
// WRITE to the text file
fwrite($fl, $namebanner);
fwrite($fl, $nameline);
fwrite($fl, $authorline);
fwrite($fl, $timeline);
fwrite($fl, $contentsline);
// CLOSE the text file
fclose($fl);
$permalinkpiece = "$nowstamp" . ".txt";
echo "Your text file has been created. <br /><a href='?p=$permalinkpiece'>Link to the post</a>.<br />";
echo "<br /><br />";
echo "title: $postname<br />";
echo "author: $author<br />";
echo "created: $timestmp<br />";
echo "contents: $postcontents<br />";
}
}
}
if ($_GET["links"]) {
$querynumber = ($_GET["u"]);
$linkdata = fopen("library/links/urls.txt", "r");
$totaldata = fread($linkdata, filesize($infofile));
$items = count(totaldata);
fclose($linkdata);
if (!($fl = fopen("$infofile", "r"))) {
die("Cannot open file");
}
$counter = 0;
while ($line = fgets($fl, 4096)) {
$line = trim($line);
$urlarray[$counter] = $line;
$counter++;
}
echo "<div class='linkzone' id='listing'>";
echo "<h2>Links</h2>";
$totalup = count($urlarray);
$counter2 = 0;
if ($_GET["count"]) {
$limiter = ($_GET["count"]);
while ($limiter > 0) {
$current = $urlarray[$counter2];
$xth = "##$counter2";
$current1 = str_replace("$xth", "", "$current");
echo "<p><a href='$current1'>$current1</a></p>";
$limiter--;
$counter2++;
}
}
else {
while ($counter > $counter2) {
$current = $urlarray[$counter2];
$xth = "##$counter2";
$current1 = str_replace("$xth", "", "$current");
if ($subdir == "") {
$oklink = "http://$kingofpain/?r=$counter2";
}
else {
$oklink = "http://$sitebase/$subdir" . "?r=$counter2";
}
echo "<p><a href='$current1'>$current1</a> : $oklink</p>";
$counter2++;
}
}
echo "</div>";
echo "<br /><br /> ";
}
// end of the URL redirector
echo "<div class='credits0' id='corvisartlink'>";
$photoname2 = $photoname1;
$cleanname = str_replace("-", " ", "$photoname2");
$cleanname1 = str_replace("_", " ", "$cleanname");
$cleanname2 = str_replace(".jpg", " ", "$cleanname1");
$cleanname3 = str_replace(".png", " ", "$cleanname2");
echo "<br />";
if ($_GET["photo"]) {
echo "<h2>$cleanname3 </h2>";
echo "<p><a href='$canonical'>perma-link</a></p>";
}
echo "</div>";
echo "</div>"; // end of div id='corelayer'
echo "<div class='credits1' id='lovebirdslink2'>";
echo "powered by <a href='http://pacificpelican.us/cms'>pacificpelican.us/cms</a> $version0 from <a href='http://lovebirdsconsulting.com/'>lovebirdsconsulting.com</a>";
echo "</div>";
echo "</div>"; // end of megalayer
?>
</body>
</html>
Owner

pacificpelican commented Apr 8, 2011

known issues for http://pacificpelican.us/cms version 0.0.9.7
via http://pacificarchives.sf3am.com/cms/known-issues/ (4/8/2011)

-in some views a nested main content div with unique ID should be added for styling purposes

-some sort of +1 problem with the URL shortener: the first URL shortened (http://example.com/?r=0) does not work; after the first one however the URL redirecting works fine

-also (in relation to the previous issue) the link list returns an error when there are no shortened URLs

-canonical URLs should (maybe) find and remove any “www.” from themselves

-the link list just lists all the links no matter how many; it can use the “count” parameter (hidden feature) but the count starts at the oldest URL and thus does not list the latest if there is a large number

-the file list offers a UI to set the “count” parameter, and this works somewhat, but the order of the files listed is somewhat unpredictable

-in PHP 4.4 [which is deprecated and is not advisable to use anyway] the URL shortener takes in data, and the link list works as expected, but the URL redirecting function fails and the browser just lands on a messed up version of the app page instead of the destination URL

Send your bug reports to pacificpelicancms -at– lovebirdsconsulting.com

Owner

pacificpelican commented Apr 19, 2011

from the development blog at http://pacificarchives.sf3am.com/cms/

pacificpelican.us/cms is still in alpha form, but another release is here. This one, 0.0.9.8, offers a basic text post creation functionality and a few bugfixes.

As you may know, pacificpelican.us/cms is free software--it is a URL shortening, text file creation, and photo/file management script written in PHP and released under the GNU General Public License, version 2 or later.

changes for 0.0.9.8

-added simple text file creation capability

-added post list for viewing text file content

-added simplistic perma-link view for text file content

-changed DTD from HTML 4 to HTML5

-created corecontent div to enclose all info between the menu and the footer (w/r/t "known issues" for 0.0.9.7)

-layout and spacing improvements

Owner

pacificpelican commented Apr 19, 2011

pacificpelican.us/cms has a new alpha version: 0.0.9.9.

This version contains a few bugfixes:

-text post perma-links have an improved view (p GET parameter) that include post titles; they now display on multiple lines via an array

-post list now includes a link to the raw text file

Owner

pacificpelican commented Apr 29, 2011

"0.0.9.9.1"; // bugfixes release; plus newly rebuilt Photo Library; spaces eliminated
// dev version
http://djmblog.com/pacificpelicanus-cms-version-00991

Owner

pacificpelican commented Apr 29, 2011

0.0.9.9.2 dev version: moved up version variable declaration; shortened a long line; eliminated a blank line; eliminated most of the menu list (all except "Main Page") on photo, file, and text perma-links so the top of the page is less cluttered
UPDATED the post with the code from 0.0.9.9.2
http://djmblog.com/pacificpelicanus-cms-version-00991

Owner

pacificpelican commented Oct 31, 2011

New version 0.0.9.9.3 eliminates a few blank spaces on the index.php and updates the password the the current one in the readme.txt:
http://pacificarchives.sf3am.com/cms/2011/10/26/pacificpelican-uscms-version-0-0-9-9-3/
All current outstanding "known issues" are resolved; for bug reports updates and where to send your bugs: http://pacificarchives.sf3am.com/cms/known-issues/

Owner

pacificpelican commented Apr 5, 2012

pacificpelican.us/cms now has a GitHub repo:
https://github.com/pacificpelican/pacificpelican.us-CMS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment