<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.geeklog.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=THEMike</id>
		<title>GeeklogWiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.geeklog.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=THEMike"/>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/Special:Contributions/THEMike"/>
		<updated>2026-04-06T16:47:07Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.5</generator>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Using_Mercurial&amp;diff=4752</id>
		<title>Using Mercurial</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Using_Mercurial&amp;diff=4752"/>
				<updated>2008-11-14T08:06:36Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: /* Windows Users - Secret Sauce (if you have commit rights) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[http://www.selenic.com/mercurial/ Mercurial] is a distributed version control system (DVCS). The differences to a &amp;quot;traditional&amp;quot; centralized VCS (like CVS or Subversion) include:&lt;br /&gt;
&lt;br /&gt;
* Users get a self-contained repository that they can commit changes to, even when being offline.&lt;br /&gt;
* Changes can be pushed back to the parent repository or even to other repositories.&lt;br /&gt;
&lt;br /&gt;
Having used CVS since its inception, Geeklog switched to Mercurial after the release of Geeklog 1.5.1. This switch was preceded by an successful experiment using Mercurial during the 2008 [[Google Summer of Code]]. The distributed model did fit this scenario nicely, as each of our students was working on a separate feature. So they had a local repository to check in to (giving them all the benefits of a version control system). Once a feature or part of a feature was done, it could be pushed back to the parent repository. And in the meantime, it was easy to let other people, e.g. their mentor or interested members of the Geeklog community, pull the changes from the student's repository to show things off or get help on a problem.&lt;br /&gt;
&lt;br /&gt;
== Installing Mercurial ==&lt;br /&gt;
&lt;br /&gt;
Installation instructions are provided for [http://www.selenic.com/mercurial/wiki/index.cgi/WindowsInstall Windows], [http://www.selenic.com/mercurial/wiki/index.cgi/UnixInstall Mac OS X], and [http://www.selenic.com/mercurial/wiki/index.cgi/UnixInstall Linux]&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Geeklog's Mercurial repository is available from this URL:&lt;br /&gt;
&lt;br /&gt;
: http://project.geeklog.net/cgi-bin/hgwebdir.cgi/geeklog/&lt;br /&gt;
&lt;br /&gt;
This repository was converted from the CVS repository right after the release of [http://www.geeklog.net/article.php/geeklog-1.5.1 Geeklog 1.5.1].&lt;br /&gt;
&lt;br /&gt;
To create a copy of that repository, simply do&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone http://project.geeklog.net/cgi-bin/hgwebdir.cgi/geeklog/ geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where the last &amp;quot;geeklog&amp;quot; is just a directory name for the local copy (and can be changed at will). This will give you a fully working local repository that you can commit changes to.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The same URL can also be used to browse the repository online. Simply visit that URL with your web browser.&lt;br /&gt;
&lt;br /&gt;
=== SSH Setup ===&lt;br /&gt;
&lt;br /&gt;
For ssh access, you need an account on the server. So this is only of interest for the core developers and SoC students.&lt;br /&gt;
&lt;br /&gt;
You can clone the repository via SSH like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone ssh://username@cvs.geeklog.net//cvsroot/hg/geeklog geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where &amp;quot;username&amp;quot; is your login name and the &amp;quot;geeklog&amp;quot; at the end of the command line is again simply a name for your local directory.&lt;br /&gt;
&lt;br /&gt;
Please note the slightly odd path syntax with the two slashes after &amp;lt;tt&amp;gt;cvs.geeklog.net&amp;lt;/tt&amp;gt; - those are required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pushing back ==&lt;br /&gt;
&lt;br /&gt;
Being able to push changes back to the repository again requires an account on the server. You can either do&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push ssh://username@cvs.geeklog.net//cvsroot/hg/geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or, to make your life easier, set the &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; repository in the &amp;lt;tt&amp;gt;.hg/hgrc&amp;lt;/tt&amp;gt; file of your local repository like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[paths]&lt;br /&gt;
default-push = ssh://username@cvs.geeklog.net//cvsroot/hg/geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Again, in the ssh: URLs above, replace &amp;quot;username&amp;quot; with your login name)&lt;br /&gt;
&lt;br /&gt;
=== Trust and Notifications ===&lt;br /&gt;
&lt;br /&gt;
Changes pushed back into the central repository will trigger an email sent to the geeklog-cvs mailing list. However, that email will only be sent after the following additional steps:&lt;br /&gt;
&lt;br /&gt;
# log into your account on cvs.geeklog.net&lt;br /&gt;
# in your home directory, create a file named &amp;lt;tt&amp;gt;.hgrc&amp;lt;/tt&amp;gt;&lt;br /&gt;
# enter this as the file's content:&lt;br /&gt;
&amp;lt;pre&amp;gt;[trusted]&lt;br /&gt;
users = geeklog2&lt;br /&gt;
groups = users&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will also get rid of warnings like&lt;br /&gt;
: remote: Not trusting file (...) from untrusted user geeklog2, group users&lt;br /&gt;
when pushing back changes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GSoC Repository ==&lt;br /&gt;
&lt;br /&gt;
The repository used during the 2008 Google Summer of Code is still available from&lt;br /&gt;
&lt;br /&gt;
: http://project.geeklog.net/cgi-bin/hgwebdir.cgi/gsoc-2008/&lt;br /&gt;
&lt;br /&gt;
Note that both the URL and the repository name have changed (formerly &amp;lt;tt&amp;gt;Geeklog-SoC&amp;lt;/tt&amp;gt;). You can still use your local copies of that repository - you only need to update the &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; setting to the new address and name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Best practices ==&lt;br /&gt;
&lt;br /&gt;
Since we're all new to Mercurial, this is something we will have to establish as we go along. For starters, the [http://www.selenic.com/mercurial/wiki/ Mercurial Wiki] has a page on [http://www.selenic.com/mercurial/wiki/index.cgi/WorkingPractices Working Practices] that we may want to adopt.&lt;br /&gt;
&lt;br /&gt;
=== Use a clean incoming repository ===&lt;br /&gt;
&lt;br /&gt;
Pull changes to a local &amp;quot;incoming&amp;quot; repository but don't work on that repository. Cloning that repository locally is a cheap operation and allows you to easily create multiple copies if necessary, e.g. when working on different features in parallel.&lt;br /&gt;
&lt;br /&gt;
Push directly from your working repositories, then sync back by pulling the changes back down via your incoming repository.&lt;br /&gt;
&lt;br /&gt;
=== Merging ===&lt;br /&gt;
&lt;br /&gt;
If you attempt to push changes to the main repository and receive the error:&lt;br /&gt;
 pushing to ssh://username@cvs.geeklog.net//cvsroot/geeklog/Geeklog-SoC&lt;br /&gt;
 searching for changes&lt;br /&gt;
 abort: push creates new remote heads!&lt;br /&gt;
 (did you forget to merge? use push -f to force)&lt;br /&gt;
Simply pull from the main repository, &amp;quot;hg heads&amp;quot; to see the revision numbers, &amp;quot;hg merge [rev number]&amp;quot; to merge your changes, then commit the changes, and push back to the main repository.&lt;br /&gt;
&lt;br /&gt;
Also: Don't try to push newly added files while you still have uncommited changes lying around (or you will end up with the above). In that case, it may make sense to make a fresh clone (fast + cheap if you use an &amp;quot;incoming&amp;quot; repository!), add the new files there, then push from the fresh copy.&lt;br /&gt;
&lt;br /&gt;
=== Username ===&lt;br /&gt;
&lt;br /&gt;
When committing a change, the username associated with that change will be your local username (login, etc.) - ''not'' the name of your account on the server.&lt;br /&gt;
&lt;br /&gt;
For a consistent username, add your preferred username to your local &amp;lt;tt&amp;gt;.hgrc&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;username = John Doe &amp;lt;john@example.com&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
The email address is optional.&lt;br /&gt;
&lt;br /&gt;
''(More tips and tricks to be added here)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Undoing Changes ==&lt;br /&gt;
&lt;br /&gt;
To undo changes you made, use one of the following, depending on circumstances:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;hg revert&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;to revert changes made before a commit. This will also undo &amp;lt;tt&amp;gt;hg add&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;hg remove&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* &amp;lt;tt&amp;gt;hg rollback&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;to revert changes that have been commited to the local repository but not been pushed to another repository yet. You can only rollback the last hg command.&lt;br /&gt;
* &amp;lt;tt&amp;gt;hg backout&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;to revert changes after they have been commited ''and'' pushed.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;hg backout&amp;lt;/tt&amp;gt; will actually add a new change to the current branch that reverts your previous change. I.e. your change will ''not'' be removed from the repository. Unless you've accidentally committed something super-secret, that's usually fine. Mistakes happen - no need to sweat it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
The [http://www.selenic.com/mercurial/wiki/ Mercurial Wiki] is a good place to search for information. For starters, however, [http://hgbook.red-bean.com/ Distributed revision control with Mercurial] aka &amp;quot;the hg book&amp;quot; is a much better place to start. This book is available for download under the Open Publication License.&lt;br /&gt;
&lt;br /&gt;
Here's the entirely subjective &amp;quot;The Impatient's Guide to the HG Book&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
* Chapter 1: Introduction&amp;lt;br&amp;gt;Skip if you already know about VCS and DVCS&lt;br /&gt;
* Chapter 2: A tour of Mercurial: the basics&amp;lt;br&amp;gt;Everything from section 2.2 on is '''recommended reading'''. The essential things you need to know to use Mercurial.&lt;br /&gt;
* Chapter 3: A tour of Mercurial: merging work&amp;lt;br&amp;gt;Title says it all - '''recommended reading'''&lt;br /&gt;
* Chapter 4: Behind the scenes&amp;lt;br&amp;gt;Feel free to skip&lt;br /&gt;
* Chapter 5: Mercurial in daily use&amp;lt;br&amp;gt;Despite the title, this chapter seems more confusing than helpful - skip&lt;br /&gt;
* Chapter 6: Collaborating with other people&amp;lt;br&amp;gt;Section 6.2 is '''recommended reading''' once you've mastered the basics&lt;br /&gt;
* Chapter 7: File names and pattern matching&amp;lt;br&amp;gt;Nothing surprising here - skip&lt;br /&gt;
* Chapter 8: Managing releases and branchy development&amp;lt;br&amp;gt;Advanced topic but useful&lt;br /&gt;
* Chapter 9: Finding and ﬁxing your mistakes&amp;lt;br&amp;gt;Very useful (but skip sections 9.5 and 9.6)&lt;br /&gt;
* You can effectively stop reading after Chapter 9.&lt;br /&gt;
* Appendix A may be useful as a reference.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Windows Users - Secret Sauce (if you have commit rights) ==&lt;br /&gt;
&lt;br /&gt;
I'm using command line Mercurial (I don't like the windows explorer performance hit of the tortoise system). But this works for me, after much messing around.&lt;br /&gt;
&lt;br /&gt;
  # Clone the main Geeklog repository, as above. (geeklog-hg)&lt;br /&gt;
  # Clone your local copy of Geeklog to give yourself a clean working environment. (geeklog-hg-mine)&lt;br /&gt;
  # Clone your clean working environment ;-) (geeklog-hg-dev)&lt;br /&gt;
  # Update /path/to/geeklog-hg/.hg/hgrc to match bellow&lt;br /&gt;
  # Update /documents and settings/[your user]/mercurial.ini to match the other bellow&lt;br /&gt;
&lt;br /&gt;
And that works.&lt;br /&gt;
&lt;br /&gt;
For hgrc:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[paths]&lt;br /&gt;
default = ssh://[your username]@cvs.geeklog.net//cvsroot/hg/geeklog&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For mercurial.ini:&lt;br /&gt;
&lt;br /&gt;
[ui]&lt;br /&gt;
ssh = c:/path/to/putty/plink.exe -ssh -v -l [your username] -pw [your password]&lt;br /&gt;
username = [your name] &amp;lt;[your email address]&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So I develop in geeklog-hg-dev, then I winmerge my changes back into geeklog-hg-mine to make sure I never accidentally commit localsettings (paths etc) or hacks, debugs. Then I commit to geeklog-hg-mine, then back to geeklog-hg when that's ready, then push up to master. Complex hey? ;-)&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Using_Mercurial&amp;diff=4751</id>
		<title>Using Mercurial</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Using_Mercurial&amp;diff=4751"/>
				<updated>2008-11-14T08:05:22Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: /* Windows Users - Secret Sauce (if you have commit rights) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[http://www.selenic.com/mercurial/ Mercurial] is a distributed version control system (DVCS). The differences to a &amp;quot;traditional&amp;quot; centralized VCS (like CVS or Subversion) include:&lt;br /&gt;
&lt;br /&gt;
* Users get a self-contained repository that they can commit changes to, even when being offline.&lt;br /&gt;
* Changes can be pushed back to the parent repository or even to other repositories.&lt;br /&gt;
&lt;br /&gt;
Having used CVS since its inception, Geeklog switched to Mercurial after the release of Geeklog 1.5.1. This switch was preceded by an successful experiment using Mercurial during the 2008 [[Google Summer of Code]]. The distributed model did fit this scenario nicely, as each of our students was working on a separate feature. So they had a local repository to check in to (giving them all the benefits of a version control system). Once a feature or part of a feature was done, it could be pushed back to the parent repository. And in the meantime, it was easy to let other people, e.g. their mentor or interested members of the Geeklog community, pull the changes from the student's repository to show things off or get help on a problem.&lt;br /&gt;
&lt;br /&gt;
== Installing Mercurial ==&lt;br /&gt;
&lt;br /&gt;
Installation instructions are provided for [http://www.selenic.com/mercurial/wiki/index.cgi/WindowsInstall Windows], [http://www.selenic.com/mercurial/wiki/index.cgi/UnixInstall Mac OS X], and [http://www.selenic.com/mercurial/wiki/index.cgi/UnixInstall Linux]&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Geeklog's Mercurial repository is available from this URL:&lt;br /&gt;
&lt;br /&gt;
: http://project.geeklog.net/cgi-bin/hgwebdir.cgi/geeklog/&lt;br /&gt;
&lt;br /&gt;
This repository was converted from the CVS repository right after the release of [http://www.geeklog.net/article.php/geeklog-1.5.1 Geeklog 1.5.1].&lt;br /&gt;
&lt;br /&gt;
To create a copy of that repository, simply do&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone http://project.geeklog.net/cgi-bin/hgwebdir.cgi/geeklog/ geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where the last &amp;quot;geeklog&amp;quot; is just a directory name for the local copy (and can be changed at will). This will give you a fully working local repository that you can commit changes to.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The same URL can also be used to browse the repository online. Simply visit that URL with your web browser.&lt;br /&gt;
&lt;br /&gt;
=== SSH Setup ===&lt;br /&gt;
&lt;br /&gt;
For ssh access, you need an account on the server. So this is only of interest for the core developers and SoC students.&lt;br /&gt;
&lt;br /&gt;
You can clone the repository via SSH like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone ssh://username@cvs.geeklog.net//cvsroot/hg/geeklog geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where &amp;quot;username&amp;quot; is your login name and the &amp;quot;geeklog&amp;quot; at the end of the command line is again simply a name for your local directory.&lt;br /&gt;
&lt;br /&gt;
Please note the slightly odd path syntax with the two slashes after &amp;lt;tt&amp;gt;cvs.geeklog.net&amp;lt;/tt&amp;gt; - those are required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pushing back ==&lt;br /&gt;
&lt;br /&gt;
Being able to push changes back to the repository again requires an account on the server. You can either do&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push ssh://username@cvs.geeklog.net//cvsroot/hg/geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or, to make your life easier, set the &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; repository in the &amp;lt;tt&amp;gt;.hg/hgrc&amp;lt;/tt&amp;gt; file of your local repository like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[paths]&lt;br /&gt;
default-push = ssh://username@cvs.geeklog.net//cvsroot/hg/geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Again, in the ssh: URLs above, replace &amp;quot;username&amp;quot; with your login name)&lt;br /&gt;
&lt;br /&gt;
=== Trust and Notifications ===&lt;br /&gt;
&lt;br /&gt;
Changes pushed back into the central repository will trigger an email sent to the geeklog-cvs mailing list. However, that email will only be sent after the following additional steps:&lt;br /&gt;
&lt;br /&gt;
# log into your account on cvs.geeklog.net&lt;br /&gt;
# in your home directory, create a file named &amp;lt;tt&amp;gt;.hgrc&amp;lt;/tt&amp;gt;&lt;br /&gt;
# enter this as the file's content:&lt;br /&gt;
&amp;lt;pre&amp;gt;[trusted]&lt;br /&gt;
users = geeklog2&lt;br /&gt;
groups = users&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will also get rid of warnings like&lt;br /&gt;
: remote: Not trusting file (...) from untrusted user geeklog2, group users&lt;br /&gt;
when pushing back changes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GSoC Repository ==&lt;br /&gt;
&lt;br /&gt;
The repository used during the 2008 Google Summer of Code is still available from&lt;br /&gt;
&lt;br /&gt;
: http://project.geeklog.net/cgi-bin/hgwebdir.cgi/gsoc-2008/&lt;br /&gt;
&lt;br /&gt;
Note that both the URL and the repository name have changed (formerly &amp;lt;tt&amp;gt;Geeklog-SoC&amp;lt;/tt&amp;gt;). You can still use your local copies of that repository - you only need to update the &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; setting to the new address and name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Best practices ==&lt;br /&gt;
&lt;br /&gt;
Since we're all new to Mercurial, this is something we will have to establish as we go along. For starters, the [http://www.selenic.com/mercurial/wiki/ Mercurial Wiki] has a page on [http://www.selenic.com/mercurial/wiki/index.cgi/WorkingPractices Working Practices] that we may want to adopt.&lt;br /&gt;
&lt;br /&gt;
=== Use a clean incoming repository ===&lt;br /&gt;
&lt;br /&gt;
Pull changes to a local &amp;quot;incoming&amp;quot; repository but don't work on that repository. Cloning that repository locally is a cheap operation and allows you to easily create multiple copies if necessary, e.g. when working on different features in parallel.&lt;br /&gt;
&lt;br /&gt;
Push directly from your working repositories, then sync back by pulling the changes back down via your incoming repository.&lt;br /&gt;
&lt;br /&gt;
=== Merging ===&lt;br /&gt;
&lt;br /&gt;
If you attempt to push changes to the main repository and receive the error:&lt;br /&gt;
 pushing to ssh://username@cvs.geeklog.net//cvsroot/geeklog/Geeklog-SoC&lt;br /&gt;
 searching for changes&lt;br /&gt;
 abort: push creates new remote heads!&lt;br /&gt;
 (did you forget to merge? use push -f to force)&lt;br /&gt;
Simply pull from the main repository, &amp;quot;hg heads&amp;quot; to see the revision numbers, &amp;quot;hg merge [rev number]&amp;quot; to merge your changes, then commit the changes, and push back to the main repository.&lt;br /&gt;
&lt;br /&gt;
Also: Don't try to push newly added files while you still have uncommited changes lying around (or you will end up with the above). In that case, it may make sense to make a fresh clone (fast + cheap if you use an &amp;quot;incoming&amp;quot; repository!), add the new files there, then push from the fresh copy.&lt;br /&gt;
&lt;br /&gt;
=== Username ===&lt;br /&gt;
&lt;br /&gt;
When committing a change, the username associated with that change will be your local username (login, etc.) - ''not'' the name of your account on the server.&lt;br /&gt;
&lt;br /&gt;
For a consistent username, add your preferred username to your local &amp;lt;tt&amp;gt;.hgrc&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;username = John Doe &amp;lt;john@example.com&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
The email address is optional.&lt;br /&gt;
&lt;br /&gt;
''(More tips and tricks to be added here)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Undoing Changes ==&lt;br /&gt;
&lt;br /&gt;
To undo changes you made, use one of the following, depending on circumstances:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;hg revert&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;to revert changes made before a commit. This will also undo &amp;lt;tt&amp;gt;hg add&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;hg remove&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* &amp;lt;tt&amp;gt;hg rollback&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;to revert changes that have been commited to the local repository but not been pushed to another repository yet. You can only rollback the last hg command.&lt;br /&gt;
* &amp;lt;tt&amp;gt;hg backout&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;to revert changes after they have been commited ''and'' pushed.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;hg backout&amp;lt;/tt&amp;gt; will actually add a new change to the current branch that reverts your previous change. I.e. your change will ''not'' be removed from the repository. Unless you've accidentally committed something super-secret, that's usually fine. Mistakes happen - no need to sweat it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
The [http://www.selenic.com/mercurial/wiki/ Mercurial Wiki] is a good place to search for information. For starters, however, [http://hgbook.red-bean.com/ Distributed revision control with Mercurial] aka &amp;quot;the hg book&amp;quot; is a much better place to start. This book is available for download under the Open Publication License.&lt;br /&gt;
&lt;br /&gt;
Here's the entirely subjective &amp;quot;The Impatient's Guide to the HG Book&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
* Chapter 1: Introduction&amp;lt;br&amp;gt;Skip if you already know about VCS and DVCS&lt;br /&gt;
* Chapter 2: A tour of Mercurial: the basics&amp;lt;br&amp;gt;Everything from section 2.2 on is '''recommended reading'''. The essential things you need to know to use Mercurial.&lt;br /&gt;
* Chapter 3: A tour of Mercurial: merging work&amp;lt;br&amp;gt;Title says it all - '''recommended reading'''&lt;br /&gt;
* Chapter 4: Behind the scenes&amp;lt;br&amp;gt;Feel free to skip&lt;br /&gt;
* Chapter 5: Mercurial in daily use&amp;lt;br&amp;gt;Despite the title, this chapter seems more confusing than helpful - skip&lt;br /&gt;
* Chapter 6: Collaborating with other people&amp;lt;br&amp;gt;Section 6.2 is '''recommended reading''' once you've mastered the basics&lt;br /&gt;
* Chapter 7: File names and pattern matching&amp;lt;br&amp;gt;Nothing surprising here - skip&lt;br /&gt;
* Chapter 8: Managing releases and branchy development&amp;lt;br&amp;gt;Advanced topic but useful&lt;br /&gt;
* Chapter 9: Finding and ﬁxing your mistakes&amp;lt;br&amp;gt;Very useful (but skip sections 9.5 and 9.6)&lt;br /&gt;
* You can effectively stop reading after Chapter 9.&lt;br /&gt;
* Appendix A may be useful as a reference.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Windows Users - Secret Sauce (if you have commit rights) ==&lt;br /&gt;
&lt;br /&gt;
I'm using command line Mercurial (I don't like the windows explorer performance hit of the tortoise system). But this works for me, after much messing around.&lt;br /&gt;
&lt;br /&gt;
  # Clone the main Geeklog repository, as above. (geeklog-hg)&lt;br /&gt;
  # Clone your local copy of Geeklog to give yourself a clean working environment. (geeklog-hg-mine)&lt;br /&gt;
  # Clone your clean working environment ;-) (geeklog-hg-dev)&lt;br /&gt;
  # Update /path/to/geeklog-hg/.hg/hgrc to match bellow&lt;br /&gt;
  # Update /documents and settings/[your user]/mercurial.ini to match the other bellow&lt;br /&gt;
&lt;br /&gt;
And that works.&lt;br /&gt;
&lt;br /&gt;
For hgrc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = ssh://[your username]@cvs.geeklog.net//cvsroot/hg/geeklog&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For mercurial.ini:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ui]&lt;br /&gt;
ssh = c:/path/to/putty/plink.exe -ssh -v -l [your username] -pw [your password]&lt;br /&gt;
username = [your name] &amp;lt;[your email address]&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So I develop in geeklog-hg-dev, then I winmerge my changes back into geeklog-hg-mine to make sure I never accidentally commit localsettings (paths etc) or hacks, debugs. Then I commit to geeklog-hg-mine, then back to geeklog-hg when that's ready, then push up to master. Complex hey? ;-)&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Using_Mercurial&amp;diff=4750</id>
		<title>Using Mercurial</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Using_Mercurial&amp;diff=4750"/>
				<updated>2008-11-14T08:01:07Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[http://www.selenic.com/mercurial/ Mercurial] is a distributed version control system (DVCS). The differences to a &amp;quot;traditional&amp;quot; centralized VCS (like CVS or Subversion) include:&lt;br /&gt;
&lt;br /&gt;
* Users get a self-contained repository that they can commit changes to, even when being offline.&lt;br /&gt;
* Changes can be pushed back to the parent repository or even to other repositories.&lt;br /&gt;
&lt;br /&gt;
Having used CVS since its inception, Geeklog switched to Mercurial after the release of Geeklog 1.5.1. This switch was preceded by an successful experiment using Mercurial during the 2008 [[Google Summer of Code]]. The distributed model did fit this scenario nicely, as each of our students was working on a separate feature. So they had a local repository to check in to (giving them all the benefits of a version control system). Once a feature or part of a feature was done, it could be pushed back to the parent repository. And in the meantime, it was easy to let other people, e.g. their mentor or interested members of the Geeklog community, pull the changes from the student's repository to show things off or get help on a problem.&lt;br /&gt;
&lt;br /&gt;
== Installing Mercurial ==&lt;br /&gt;
&lt;br /&gt;
Installation instructions are provided for [http://www.selenic.com/mercurial/wiki/index.cgi/WindowsInstall Windows], [http://www.selenic.com/mercurial/wiki/index.cgi/UnixInstall Mac OS X], and [http://www.selenic.com/mercurial/wiki/index.cgi/UnixInstall Linux]&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Geeklog's Mercurial repository is available from this URL:&lt;br /&gt;
&lt;br /&gt;
: http://project.geeklog.net/cgi-bin/hgwebdir.cgi/geeklog/&lt;br /&gt;
&lt;br /&gt;
This repository was converted from the CVS repository right after the release of [http://www.geeklog.net/article.php/geeklog-1.5.1 Geeklog 1.5.1].&lt;br /&gt;
&lt;br /&gt;
To create a copy of that repository, simply do&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone http://project.geeklog.net/cgi-bin/hgwebdir.cgi/geeklog/ geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where the last &amp;quot;geeklog&amp;quot; is just a directory name for the local copy (and can be changed at will). This will give you a fully working local repository that you can commit changes to.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The same URL can also be used to browse the repository online. Simply visit that URL with your web browser.&lt;br /&gt;
&lt;br /&gt;
=== SSH Setup ===&lt;br /&gt;
&lt;br /&gt;
For ssh access, you need an account on the server. So this is only of interest for the core developers and SoC students.&lt;br /&gt;
&lt;br /&gt;
You can clone the repository via SSH like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone ssh://username@cvs.geeklog.net//cvsroot/hg/geeklog geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where &amp;quot;username&amp;quot; is your login name and the &amp;quot;geeklog&amp;quot; at the end of the command line is again simply a name for your local directory.&lt;br /&gt;
&lt;br /&gt;
Please note the slightly odd path syntax with the two slashes after &amp;lt;tt&amp;gt;cvs.geeklog.net&amp;lt;/tt&amp;gt; - those are required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pushing back ==&lt;br /&gt;
&lt;br /&gt;
Being able to push changes back to the repository again requires an account on the server. You can either do&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push ssh://username@cvs.geeklog.net//cvsroot/hg/geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or, to make your life easier, set the &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; repository in the &amp;lt;tt&amp;gt;.hg/hgrc&amp;lt;/tt&amp;gt; file of your local repository like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[paths]&lt;br /&gt;
default-push = ssh://username@cvs.geeklog.net//cvsroot/hg/geeklog&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Again, in the ssh: URLs above, replace &amp;quot;username&amp;quot; with your login name)&lt;br /&gt;
&lt;br /&gt;
=== Trust and Notifications ===&lt;br /&gt;
&lt;br /&gt;
Changes pushed back into the central repository will trigger an email sent to the geeklog-cvs mailing list. However, that email will only be sent after the following additional steps:&lt;br /&gt;
&lt;br /&gt;
# log into your account on cvs.geeklog.net&lt;br /&gt;
# in your home directory, create a file named &amp;lt;tt&amp;gt;.hgrc&amp;lt;/tt&amp;gt;&lt;br /&gt;
# enter this as the file's content:&lt;br /&gt;
&amp;lt;pre&amp;gt;[trusted]&lt;br /&gt;
users = geeklog2&lt;br /&gt;
groups = users&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will also get rid of warnings like&lt;br /&gt;
: remote: Not trusting file (...) from untrusted user geeklog2, group users&lt;br /&gt;
when pushing back changes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GSoC Repository ==&lt;br /&gt;
&lt;br /&gt;
The repository used during the 2008 Google Summer of Code is still available from&lt;br /&gt;
&lt;br /&gt;
: http://project.geeklog.net/cgi-bin/hgwebdir.cgi/gsoc-2008/&lt;br /&gt;
&lt;br /&gt;
Note that both the URL and the repository name have changed (formerly &amp;lt;tt&amp;gt;Geeklog-SoC&amp;lt;/tt&amp;gt;). You can still use your local copies of that repository - you only need to update the &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; setting to the new address and name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Best practices ==&lt;br /&gt;
&lt;br /&gt;
Since we're all new to Mercurial, this is something we will have to establish as we go along. For starters, the [http://www.selenic.com/mercurial/wiki/ Mercurial Wiki] has a page on [http://www.selenic.com/mercurial/wiki/index.cgi/WorkingPractices Working Practices] that we may want to adopt.&lt;br /&gt;
&lt;br /&gt;
=== Use a clean incoming repository ===&lt;br /&gt;
&lt;br /&gt;
Pull changes to a local &amp;quot;incoming&amp;quot; repository but don't work on that repository. Cloning that repository locally is a cheap operation and allows you to easily create multiple copies if necessary, e.g. when working on different features in parallel.&lt;br /&gt;
&lt;br /&gt;
Push directly from your working repositories, then sync back by pulling the changes back down via your incoming repository.&lt;br /&gt;
&lt;br /&gt;
=== Merging ===&lt;br /&gt;
&lt;br /&gt;
If you attempt to push changes to the main repository and receive the error:&lt;br /&gt;
 pushing to ssh://username@cvs.geeklog.net//cvsroot/geeklog/Geeklog-SoC&lt;br /&gt;
 searching for changes&lt;br /&gt;
 abort: push creates new remote heads!&lt;br /&gt;
 (did you forget to merge? use push -f to force)&lt;br /&gt;
Simply pull from the main repository, &amp;quot;hg heads&amp;quot; to see the revision numbers, &amp;quot;hg merge [rev number]&amp;quot; to merge your changes, then commit the changes, and push back to the main repository.&lt;br /&gt;
&lt;br /&gt;
Also: Don't try to push newly added files while you still have uncommited changes lying around (or you will end up with the above). In that case, it may make sense to make a fresh clone (fast + cheap if you use an &amp;quot;incoming&amp;quot; repository!), add the new files there, then push from the fresh copy.&lt;br /&gt;
&lt;br /&gt;
=== Username ===&lt;br /&gt;
&lt;br /&gt;
When committing a change, the username associated with that change will be your local username (login, etc.) - ''not'' the name of your account on the server.&lt;br /&gt;
&lt;br /&gt;
For a consistent username, add your preferred username to your local &amp;lt;tt&amp;gt;.hgrc&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;username = John Doe &amp;lt;john@example.com&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
The email address is optional.&lt;br /&gt;
&lt;br /&gt;
''(More tips and tricks to be added here)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Undoing Changes ==&lt;br /&gt;
&lt;br /&gt;
To undo changes you made, use one of the following, depending on circumstances:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;hg revert&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;to revert changes made before a commit. This will also undo &amp;lt;tt&amp;gt;hg add&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;hg remove&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* &amp;lt;tt&amp;gt;hg rollback&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;to revert changes that have been commited to the local repository but not been pushed to another repository yet. You can only rollback the last hg command.&lt;br /&gt;
* &amp;lt;tt&amp;gt;hg backout&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;to revert changes after they have been commited ''and'' pushed.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;hg backout&amp;lt;/tt&amp;gt; will actually add a new change to the current branch that reverts your previous change. I.e. your change will ''not'' be removed from the repository. Unless you've accidentally committed something super-secret, that's usually fine. Mistakes happen - no need to sweat it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
The [http://www.selenic.com/mercurial/wiki/ Mercurial Wiki] is a good place to search for information. For starters, however, [http://hgbook.red-bean.com/ Distributed revision control with Mercurial] aka &amp;quot;the hg book&amp;quot; is a much better place to start. This book is available for download under the Open Publication License.&lt;br /&gt;
&lt;br /&gt;
Here's the entirely subjective &amp;quot;The Impatient's Guide to the HG Book&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
* Chapter 1: Introduction&amp;lt;br&amp;gt;Skip if you already know about VCS and DVCS&lt;br /&gt;
* Chapter 2: A tour of Mercurial: the basics&amp;lt;br&amp;gt;Everything from section 2.2 on is '''recommended reading'''. The essential things you need to know to use Mercurial.&lt;br /&gt;
* Chapter 3: A tour of Mercurial: merging work&amp;lt;br&amp;gt;Title says it all - '''recommended reading'''&lt;br /&gt;
* Chapter 4: Behind the scenes&amp;lt;br&amp;gt;Feel free to skip&lt;br /&gt;
* Chapter 5: Mercurial in daily use&amp;lt;br&amp;gt;Despite the title, this chapter seems more confusing than helpful - skip&lt;br /&gt;
* Chapter 6: Collaborating with other people&amp;lt;br&amp;gt;Section 6.2 is '''recommended reading''' once you've mastered the basics&lt;br /&gt;
* Chapter 7: File names and pattern matching&amp;lt;br&amp;gt;Nothing surprising here - skip&lt;br /&gt;
* Chapter 8: Managing releases and branchy development&amp;lt;br&amp;gt;Advanced topic but useful&lt;br /&gt;
* Chapter 9: Finding and ﬁxing your mistakes&amp;lt;br&amp;gt;Very useful (but skip sections 9.5 and 9.6)&lt;br /&gt;
* You can effectively stop reading after Chapter 9.&lt;br /&gt;
* Appendix A may be useful as a reference.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Windows Users - Secret Sauce (if you have commit rights) ==&lt;br /&gt;
&lt;br /&gt;
I'm using command line Mercurial (I don't like the windows explorer performance hit of the tortoise system). But this works for me, after much messing around.&lt;br /&gt;
&lt;br /&gt;
  1. Clone the main Geeklog repository, as above. (geeklog-hg)&lt;br /&gt;
  1. Clone your local copy of Geeklog to give yourself a clean working environment. (geeklog-hg-mine)&lt;br /&gt;
  1. Clone your clean working environment ;-) (geeklog-hg-dev)&lt;br /&gt;
  1. Update /path/to/geeklog-hg/.hg/hgrc to match bellow&lt;br /&gt;
  1. Update /documents and settings/[your user]/mercurial.ini to match the other bellow&lt;br /&gt;
&lt;br /&gt;
And that works.&lt;br /&gt;
&lt;br /&gt;
For hgrc:&lt;br /&gt;
&lt;br /&gt;
[paths]&lt;br /&gt;
default = ssh://[your username]@cvs.geeklog.net//cvsroot/hg/geeklog&lt;br /&gt;
&lt;br /&gt;
For mercurial.ini:&lt;br /&gt;
[ui]&lt;br /&gt;
ssh = c:/path/to/putty/plink.exe -ssh -v -l [your username] -pw [your password]&lt;br /&gt;
username = [your name] &amp;lt;[your email address]&amp;gt;&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Proposed_Roadmap&amp;diff=4683</id>
		<title>Proposed Roadmap</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Proposed_Roadmap&amp;diff=4683"/>
				<updated>2008-06-30T18:06:19Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a proposed roadmap for the continued development of Geeklog 1.x following a planned and structured approach:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.1 - Maintenance ==&lt;br /&gt;
This is a '''bug fix only''' maintenance release.&lt;br /&gt;
&lt;br /&gt;
=== Release Date ===&lt;br /&gt;
July 28th 2008&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.2 - GSoC 2008 ==&lt;br /&gt;
This release rolls in the Google Summer of Code 2008 features:&lt;br /&gt;
&lt;br /&gt;
=== Feature List ===&lt;br /&gt;
* [[SoC_improving comments_2008|Improving the comments]]&lt;br /&gt;
* etc&lt;br /&gt;
&lt;br /&gt;
=== Timeline / Release Schedule ===&lt;br /&gt;
# Code Freeze (bug fixes only) - 28th September 2008&lt;br /&gt;
# Request Translations - 6th October 2008&lt;br /&gt;
# Beta Release 1 - 31st October 2008&lt;br /&gt;
# Beta Release 2 - 14th November 2008&lt;br /&gt;
# Release Candidate 1 - 1st December 2008&lt;br /&gt;
# Final Release - 22nd December 2008&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.3 - Maintenance ==&lt;br /&gt;
This is a '''bug fix only''' maintenance release.&lt;br /&gt;
&lt;br /&gt;
=== Release Date ===&lt;br /&gt;
January 30th 2009&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.4 - ??? ==&lt;br /&gt;
=== Timeline ===&lt;br /&gt;
# Final Scope Agreed - January 30th 2009&lt;br /&gt;
# Code Freeze (bug fixes only) - 27th March 2009&lt;br /&gt;
# Request Translations - 6th April 2009&lt;br /&gt;
# Beta Release 1 - 27th April 2009&lt;br /&gt;
# Beta Release 2 - 11th May 2009&lt;br /&gt;
# Release Candidate 1 - 25th May 2009&lt;br /&gt;
# Final Release - 8th June 2009&lt;br /&gt;
=== Release Date ===&lt;br /&gt;
June 8th 2009&lt;br /&gt;
&lt;br /&gt;
''Note:'' These dates are &amp;quot;too late&amp;quot; for Google Summer of code clean start. and there is no time for a maintenance release, so we'd have to sandbox it...&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.5 - Maintenance? ==&lt;br /&gt;
=== Release Date ===&lt;br /&gt;
July 27th 2009&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.6 - GSoC 2009 ==&lt;br /&gt;
Geeklog Summer of Code if we don't get into, or Google doesn't run, a 2009 summer of code.&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Proposed_Roadmap&amp;diff=4682</id>
		<title>Proposed Roadmap</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Proposed_Roadmap&amp;diff=4682"/>
				<updated>2008-06-30T18:02:54Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a proposed roadmap for the continued development of Geeklog 1.x following a planned and structured approach:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.1 - Maintenance ==&lt;br /&gt;
This is a '''bug fix only''' maintenance release.&lt;br /&gt;
&lt;br /&gt;
=== Release Date ===&lt;br /&gt;
July 28th 2008&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.2 - GSoC 2008 ==&lt;br /&gt;
This release rolls in the Google Summer of Code 2008 features:&lt;br /&gt;
&lt;br /&gt;
=== Feature List ===&lt;br /&gt;
* [[SoC_improving comments_2008|Improving the comments]]&lt;br /&gt;
* etc&lt;br /&gt;
&lt;br /&gt;
=== Timeline / Release Schedule ===&lt;br /&gt;
# Code Freeze (bug fixes only) - 28th September 2008&lt;br /&gt;
# Request Translations - 6th October 2008&lt;br /&gt;
# Beta Release 1 - 31st October 2008&lt;br /&gt;
# Beta Release 2 - 14th November 2008&lt;br /&gt;
# Release Candidate 1 - 1st December 2008&lt;br /&gt;
# Final Release - 22nd December 2008&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.3 - Maintenance ==&lt;br /&gt;
This is a '''bug fix only''' maintenance release.&lt;br /&gt;
&lt;br /&gt;
=== Release Date ===&lt;br /&gt;
January 30th 2009&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.4 - ??? ==&lt;br /&gt;
=== Timeline ===&lt;br /&gt;
# Final Scope Agreed - January 30th 2009&lt;br /&gt;
# Code Freeze (bug fixes only) - 27th March 2009&lt;br /&gt;
# Request Translations - 6th April 2009&lt;br /&gt;
# Beta Release 1 - 27th April 2009&lt;br /&gt;
# Beta Release 2 - 11th May 2009&lt;br /&gt;
# Release Candidate 1 - 25th May 2009&lt;br /&gt;
# Final Release - 8th June 2009&lt;br /&gt;
&lt;br /&gt;
''Note:'' These dates are &amp;quot;too late&amp;quot; for Google Summer of code clean start. and there is no time for a maintenance release, so we'd have to sandbox it...&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Proposed_Roadmap&amp;diff=4681</id>
		<title>Proposed Roadmap</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Proposed_Roadmap&amp;diff=4681"/>
				<updated>2008-06-30T17:56:04Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a proposed roadmap for the continued development of Geeklog 1.x following a planned and structured approach:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.1 - Maintenance ==&lt;br /&gt;
This is a '''bug fix only''' maintenance release.&lt;br /&gt;
&lt;br /&gt;
=== Release Date ===&lt;br /&gt;
July 28th 2008&lt;br /&gt;
&lt;br /&gt;
== Geeklog 1.5.2 - GSoC 2008 ==&lt;br /&gt;
This release rolls in the Google Summer of Code 2008 features:&lt;br /&gt;
&lt;br /&gt;
=== Feature List ===&lt;br /&gt;
* [[SoC_improving comments_2008|Improving the comments]]&lt;br /&gt;
* etc&lt;br /&gt;
&lt;br /&gt;
=== Release Schedule ===&lt;br /&gt;
# Code Freeze (bug fixes only) 28th September 2008&lt;br /&gt;
# Request Translations - 6th October 2008&lt;br /&gt;
# Beta Release 1 - 31st October 2008&lt;br /&gt;
# Beta Release 2 - 14th November 2008&lt;br /&gt;
# Release Candidate 1 - 1st December 2008&lt;br /&gt;
# Final Release - 22nd December 2008&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Geeklog_Documentation&amp;diff=4680</id>
		<title>Geeklog Documentation</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Geeklog_Documentation&amp;diff=4680"/>
				<updated>2008-06-30T17:49:05Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: Added link to roadmap&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Logo.gif]]&lt;br /&gt;
&lt;br /&gt;
== Geeklog Documentation ==&lt;br /&gt;
&lt;br /&gt;
# [[Introduction]]&lt;br /&gt;
# [[Installation]]&lt;br /&gt;
# [[Administration]]&lt;br /&gt;
# [[Users Documentation]]&lt;br /&gt;
# [[Programmers/Developers Documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Complete Table of Contents]]&lt;br /&gt;
&lt;br /&gt;
[[Proposed Roadmap]]&lt;br /&gt;
&lt;br /&gt;
Note: This is the start page for the [[Restructuring the Geeklog Documentation|restructuring]] effort, so expect lots of broken links. Please help us fix and update the documentation. Thank you!&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=SoC_geeklog2_syndication_api&amp;diff=4488</id>
		<title>SoC geeklog2 syndication api</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=SoC_geeklog2_syndication_api&amp;diff=4488"/>
				<updated>2008-03-03T15:05:03Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Incentive ==&lt;br /&gt;
It should be reasonably clear to any web savvy user or developer that Syndication is an essential aspect of any web software these days. The Geeklog2 engine needs a powerful, flexible syndication engine that can be used by all other plugins to provide inbound and outbound syndication feeds.&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
* Develop a fully object oriented PHP5 implementation of the Geeklog 1.x syndication classes for reading/writing arbitrary feeds.&lt;br /&gt;
* Develop a Geeklog2 Plugin which provides a full API wrapper to the Syndication classes for creation and maintenance of outbound and inbound feeds&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Medium''&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x's syndication framework is quite nice (even if I do say so myself!) and provides a good basic PHP4 OO implementation of the basic feed handling code. This needs turning into fully object oriented PHP5 (there are some refinements PHP5 allows that the current code misses. This is the easy part.&lt;br /&gt;
&lt;br /&gt;
The harder part is defining what the interface from Geeklog 2 is and how it works, and working with the Geeklog2 framework, which only a couple of engineers are really up to speed with. Figuring this out from scratch will be the challenge to get something &amp;quot;right first time&amp;quot; to avoid the need to radically over-haul and replace the syndication framework at a later stage.&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4487</id>
		<title>SoC geeklog2 spam solution</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4487"/>
				<updated>2008-03-03T15:04:45Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Incentive ==&lt;br /&gt;
&lt;br /&gt;
The internet contains nearly as much Spam as it does HTML. A new generation of web applications must start out from their infancy iron-clad with defences against Spam. Geeklog2 is no exception. The objective of this project is to develop a plugin for the Geeklog2 system to provide spam filtering.&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Implement a Geeklog2 plugin to provide an API for spam filtering&lt;br /&gt;
* Include an extensible framework (like SpamX) for extending the abilities of the spam filter&lt;br /&gt;
* Include modules to support key anti-spam systems including&lt;br /&gt;
** LinkSleeve&lt;br /&gt;
** Akismet&lt;br /&gt;
** Project Honey Pot&lt;br /&gt;
** SWOT&lt;br /&gt;
** Local blacklists&lt;br /&gt;
** Bad Behaviour&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Medium''&lt;br /&gt;
&lt;br /&gt;
The SpamX approach, with the full OO world of PHP5 seems to be a good base approach, and we have code to talk to the above listed key anti-spam projects largely available. However, ensuring this is a performant, scaleable, extensible, maintainable and well implemented solution may pose some challenges.&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
[http://www.linksleeve.org/ LinkSleeve]&lt;br /&gt;
[http://akismet.com/ Akismet]&lt;br /&gt;
[http://www.projecthoneypot.org/ Project Honey Pot]&lt;br /&gt;
[http://swot.fuckingbrit.com/ SWOT]&lt;br /&gt;
[http://www.bad-behavior.ioerror.us/ Bad Behaviour]&lt;br /&gt;
[[Spamx_Plugin|SpamX Plugin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4486</id>
		<title>SoC geeklog2 spam solution</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4486"/>
				<updated>2008-03-03T15:03:47Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: /* Objective */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Incentive ==&lt;br /&gt;
&lt;br /&gt;
The internet contains nearly as much Spam as it does HTML. A new generation of web applications must start out from their infancy iron-clad with defences against Spam. Geeklog2 is no exception. The objective of this project is to develop a plugin for the Geeklog2 system to provide spam filtering.&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Implement a Geeklog2 plugin to provide an API for spam filtering&lt;br /&gt;
* Include an extensible framework (like SpamX) for extending the abilities of the spam filter&lt;br /&gt;
* Include modules to support key anti-spam systems including&lt;br /&gt;
** LinkSleeve&lt;br /&gt;
** Akismet&lt;br /&gt;
** Project Honey Pot&lt;br /&gt;
** SWOT&lt;br /&gt;
** Local blacklists&lt;br /&gt;
** Bad Behaviour&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Medium''&lt;br /&gt;
&lt;br /&gt;
The SpamX approach, with the full OO world of PHP5 seems to be a good base approach, and we have code to talk to the above listed key anti-spam projects largely available. However, ensuring this is a performant, scaleable, extensible, maintainable and well implemented solution may pose some challenges.&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
[http://www.linksleeve.org/ LinkSleeve]&lt;br /&gt;
[http://akismet.com/ Akismet]&lt;br /&gt;
[http://www.projecthoneypot.org/ Project Honey Pot]&lt;br /&gt;
[http://swot.fuckingbrit.com/ SWOT]&lt;br /&gt;
[http://www.bad-behavior.ioerror.us/ Bad Behaviour]&lt;br /&gt;
[[Spamx_Plugin|SpamX Plugin]]&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4485</id>
		<title>SoC geeklog2 spam solution</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4485"/>
				<updated>2008-03-03T15:03:06Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: /* Further Reading */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Incentive ==&lt;br /&gt;
&lt;br /&gt;
The internet contains nearly as much Spam as it does HTML. A new generation of web applications must start out from their infancy iron-clad with defences against Spam. Geeklog2 is no exception. The objective of this project is to develop a plugin for the Geeklog2 system to provide spam filtering.&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Implement a Geeklog2 plugin to provide an API for spam filtering&lt;br /&gt;
* Include an extensible framework (like SpamX) for extending the abilities of the spam filter&lt;br /&gt;
* Include modules to support key anti-spam systems including&lt;br /&gt;
* LinkSleeve&lt;br /&gt;
* Akismet&lt;br /&gt;
* Project Honey Pot&lt;br /&gt;
* SWOT&lt;br /&gt;
* Local blacklists&lt;br /&gt;
* Bad Behaviour&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Medium''&lt;br /&gt;
&lt;br /&gt;
The SpamX approach, with the full OO world of PHP5 seems to be a good base approach, and we have code to talk to the above listed key anti-spam projects largely available. However, ensuring this is a performant, scaleable, extensible, maintainable and well implemented solution may pose some challenges.&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
[http://www.linksleeve.org/ LinkSleeve]&lt;br /&gt;
[http://akismet.com/ Akismet]&lt;br /&gt;
[http://www.projecthoneypot.org/ Project Honey Pot]&lt;br /&gt;
[http://swot.fuckingbrit.com/ SWOT]&lt;br /&gt;
[http://www.bad-behavior.ioerror.us/ Bad Behaviour]&lt;br /&gt;
[[Spamx_Plugin|SpamX Plugin]]&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Google_Summer_of_Code&amp;diff=4484</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Google_Summer_of_Code&amp;diff=4484"/>
				<updated>2008-03-03T15:02:50Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: Create local SWOT page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is it? ==&lt;br /&gt;
&lt;br /&gt;
The [http://code.google.com/soc/ Google Summer of Code™] is a program sponsored by Google where they pay students to develop open source software. In its third incarnation  in 2007, Geeklog [[Summer of Code 2007|took part]] in the program for the first time.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Geeklog will be applying to take part in the Summer of Code 2008 again. At this point in time, however, no organizations have been selected yet. Please refer to [http://code.google.com/soc/2008/faqs.html#0.1_timeline Google's timeline] for the program for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Ideas ==&lt;br /&gt;
&lt;br /&gt;
This is a list of ideas for projects that we feel would add useful functionality to Geeklog. We are open for other ideas not listed here as long as they fit in with Geeklog's general ideas and concepts and can be done in the 3-months period of the Summer of Code program. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 1.x ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_improving comments_2008|Improving the comments]]&lt;br /&gt;
* [[SoC_webservices_revisited|Webservices revisited]]&lt;br /&gt;
* [[SoC_install_script_revisited|Install script: Plugins and Migration]]&lt;br /&gt;
* [[Soc_swot|SWOT]] ''(Spam: Web of Trust)'' ([http://swot.fuckingbrit.com/ SWOT])&lt;br /&gt;
* [[SoC_mailman|Mailman Plugin]]&lt;br /&gt;
* [[SoC_improved_search|Improved Search]]&lt;br /&gt;
* [[SoC_socialnetworking|Add Social Networking Features]]&lt;br /&gt;
* [[SoC_css_foundation_classes|Implement a theme based on the YUI CSS Foundation Libraries]]&lt;br /&gt;
* [[SoC_cross_site_publication|Cross Site Alerting and Publication API]]&lt;br /&gt;
* [[SoC_web_analytics_api|Implement Open Web Analytics]]&lt;br /&gt;
* [[SoC_core_notification_support|Core Notification Service]]&lt;br /&gt;
&lt;br /&gt;
There are also some [[SoC_more_ideas|leftover ideas]] from 2007.&lt;br /&gt;
&lt;br /&gt;
=== For Geeklog 2 ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_geeklog2_syndication_api|Geeklog2 Syndication API]]&lt;br /&gt;
* [[SoC_geeklog2_spam_solution|Geeklog2 Anti-Spam &amp;quot;Solution&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notes for Students ==&lt;br /&gt;
&lt;br /&gt;
=== Required skills ===&lt;br /&gt;
&lt;br /&gt;
Students interested in any of the above projects should have reasonable experience with PHP and some basic SQL knowledge. Being able to set up your own LAMP server (Linux, Apache, MySQL, PHP) would probably help but isn't a prerequisite.&lt;br /&gt;
&lt;br /&gt;
=== Background information ===&lt;br /&gt;
&lt;br /&gt;
Please note that there are '''two''' versions of Geeklog currently under active development but that they share little other than the name and a few contributors.&lt;br /&gt;
&lt;br /&gt;
* '''Geeklog 1.x''' (currently 1.4.1, with 1.5.0 &amp;quot;almost done&amp;quot;) is the software you may have seen running websites such as [http://www.groklaw.net/ Groklaw].&lt;br /&gt;
* '''Geeklog 2''' is &amp;quot;the next generation&amp;quot; of Geeklog and has been rewritten from the ground up. There are no released versions of Geeklog 2 yet.&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x was started back in the year 2000 and its code is still mostly procedural and it uses its own (thin) database abstraction layer. Geeklog 2, on the other hand, is fully object oriented and uses technologies such as MVC and design patterns.&lt;br /&gt;
&lt;br /&gt;
So basically, you can choose between working on a system that is in wide use already or one that uses all the latest and greatest in technology but isn't ''quite'' ready for mainstream use yet. In either case, you would be helping the Geeklog community immensely.&lt;br /&gt;
&lt;br /&gt;
=== License ===&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x has been released under the GPLv2 (GNU General Public License, version 2). All code written for Geeklog 1.x projects should also be released under that same license.&lt;br /&gt;
&lt;br /&gt;
No final decision has been made on the license for Geeklog 2. However, it will most likely ''not'' be the GPL but a license in the spirit of the BSD license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
For all questions regarding Geeklog and the Summer of Code, please email us at &amp;lt;tt&amp;gt;contact-us(AT)lists.geeklog.net&amp;lt;/tt&amp;gt; (or use [http://www.geeklog.net/profiles.php?uid=2 this web form]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4483</id>
		<title>SoC geeklog2 spam solution</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4483"/>
				<updated>2008-03-03T15:00:26Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Incentive ==&lt;br /&gt;
&lt;br /&gt;
The internet contains nearly as much Spam as it does HTML. A new generation of web applications must start out from their infancy iron-clad with defences against Spam. Geeklog2 is no exception. The objective of this project is to develop a plugin for the Geeklog2 system to provide spam filtering.&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Implement a Geeklog2 plugin to provide an API for spam filtering&lt;br /&gt;
* Include an extensible framework (like SpamX) for extending the abilities of the spam filter&lt;br /&gt;
* Include modules to support key anti-spam systems including&lt;br /&gt;
* LinkSleeve&lt;br /&gt;
* Akismet&lt;br /&gt;
* Project Honey Pot&lt;br /&gt;
* SWOT&lt;br /&gt;
* Local blacklists&lt;br /&gt;
* Bad Behaviour&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Medium''&lt;br /&gt;
&lt;br /&gt;
The SpamX approach, with the full OO world of PHP5 seems to be a good base approach, and we have code to talk to the above listed key anti-spam projects largely available. However, ensuring this is a performant, scaleable, extensible, maintainable and well implemented solution may pose some challenges.&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
[http://www.linksleeve.org/ LinkSleeve]&lt;br /&gt;
[http://akismet.com/ Akismet]&lt;br /&gt;
[http://www.projecthoneypot.org/ Project Honey Pot]&lt;br /&gt;
[http://swot.fuckingbrit.com/ SWOT]&lt;br /&gt;
[http://www.bad-behavior.ioerror.us/ Bad Behaviour]&lt;br /&gt;
[[Spamx_Plugin SpamX Plugin]]&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4482</id>
		<title>SoC geeklog2 spam solution</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4482"/>
				<updated>2008-03-03T14:50:04Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Incentive ==&lt;br /&gt;
&lt;br /&gt;
The internet contains nearly as much Spam as it does HTML. A new generation of web applications must start out from their infancy iron-clad with defences against Spam. Geeklog2 is no exception. The objective of this project is to develop a plugin for the Geeklog2 system to provide spam filtering.&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* Implement a Geeklog2 plugin to provide an API for spam filtering&lt;br /&gt;
* Include an extensible framework (like SpamX) for extending the abilities of the spam filter&lt;br /&gt;
* Include modules to support key anti-spam systems including&lt;br /&gt;
  * LinkSLV&lt;br /&gt;
  * Akismet&lt;br /&gt;
  * Project Honey Pot&lt;br /&gt;
  * SWOT&lt;br /&gt;
  * Local blacklists&lt;br /&gt;
  * Bad Behaviour&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Medium''&lt;br /&gt;
&lt;br /&gt;
The SpamX approach, with the full OO world of PHP5 seems to be a good base approach, and we have code to talk to the above listed key anti-spam projects largely available. However, ensuring this is a performant, scaleable, extensible, maintainable and well implemented solution may pose some challenges.&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4481</id>
		<title>SoC geeklog2 spam solution</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=SoC_geeklog2_spam_solution&amp;diff=4481"/>
				<updated>2008-03-03T14:46:29Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objective ==&lt;br /&gt;
&lt;br /&gt;
The internet contains nearly as much Spam as it does HTML. A new generation of web applications must start out from their infancy iron-clad with defences against Spam. Geeklog2 is no exception. The objective of this project is to develop a plugin for the Geeklog2 system to provide spam filtering.&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=SoC_geeklog2_syndication_api&amp;diff=4477</id>
		<title>SoC geeklog2 syndication api</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=SoC_geeklog2_syndication_api&amp;diff=4477"/>
				<updated>2008-03-03T09:07:27Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Incentive ==&lt;br /&gt;
It should be reasonably clear to any web savvy user or developer that Syndication is an essential aspect of any web software these days. The Geeklog2 engine needs a powerful, flexible syndication engine that can be used by all other plugins to provide inbound and outbound syndication feeds.&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
* Develop a fully object oriented PHP5 implementation of the Geeklog 1.x syndication classes for reading/writing arbitrary feeds.&lt;br /&gt;
* Develop a Geeklog2 Plugin which provides a full API wrapper to the Syndication classes for creation and maintenance of outbound and inbound feeds&lt;br /&gt;
&lt;br /&gt;
== Level of Difficulty ==&lt;br /&gt;
&lt;br /&gt;
''Medium''&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.x's syndication framework is quite nice (even if I do say so myself!) and provides a good basic PHP4 OO implementation of the basic feed handling code. This needs turning into fully object oriented PHP5 (there are some refinements PHP5 allows that the current code misses. This is the easy part.&lt;br /&gt;
&lt;br /&gt;
The harder part is defining what the interface from Geeklog 2 is and how it works, and working with the Geeklog2 framework, which only a couple of engineers are really up to speed with. Figuring this out from scratch will be the challenge to get something &amp;quot;right first time&amp;quot; to avoid the need to radically over-haul and replace the syndication framework at a later stage.&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Google_Summer_of_Code&amp;diff=4364</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Google_Summer_of_Code&amp;diff=4364"/>
				<updated>2008-02-23T12:57:13Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is it? ==&lt;br /&gt;
&lt;br /&gt;
The [http://code.google.com/soc/ Google Summer of Code™] is a program sponsored by Google where they pay students to develop open source software. In its third incarnation  in 2007, Geeklog [[Summer of Code 2007|took part]] in the program for the first time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Call For Brainstorming ==&lt;br /&gt;
&lt;br /&gt;
After last year's successful participation, we are planning to apply again in 2008. For this we need two things:&lt;br /&gt;
&lt;br /&gt;
# ideas&lt;br /&gt;
# mentors&lt;br /&gt;
&lt;br /&gt;
Please note: Projects for the SoC should be doable during the 3 months that the program runs. Ideas for smaller projects are probably better suited for Geeklog's [http://www.geeklog.net/staticpages/index.php/bounties bounty program].&lt;br /&gt;
&lt;br /&gt;
=== Ideas ===&lt;br /&gt;
&lt;br /&gt;
* [[SoC_webservices_revisited|Webservices revisited]]&lt;br /&gt;
* [[SoC_install_script_revisited|Install script: Plugins and Migration]]&lt;br /&gt;
* [[SoC_SWOT|SWOT]]&lt;br /&gt;
* [[SoC_geeklog2_syndication_api|Geeklog2 Syndication API]]&lt;br /&gt;
* [[SoC_geeklog2_spam_solution|Geeklog2 Anti-Spam &amp;quot;Solution&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
There are also some [[SoC_more_ideas|leftover ideas]] from 2007. Feel free to add some more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
For all questions regarding Geeklog and the Summer of Code, please email us at &amp;lt;tt&amp;gt;contact-us(AT)lists.geeklog.net&amp;lt;/tt&amp;gt; (or use [http://www.geeklog.net/profiles.php?uid=2 this web form]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]] [[Category:Development]]&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=StoryArchitecture&amp;diff=4160</id>
		<title>StoryArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=StoryArchitecture&amp;diff=4160"/>
				<updated>2007-01-15T12:59:01Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The main thing to understand with the Story &amp;quot;Rewrite&amp;quot; in 1.4.2 is the States a story may be in and how they interact with each other. I'd do a State Transition Network, but, no suitable diagramming tool to hand.&lt;br /&gt;
&lt;br /&gt;
Essentially, a Story (or any piece of textual content by extension) has four main states and a few minor &amp;quot;transitional&amp;quot; states:&lt;br /&gt;
&lt;br /&gt;
'''Display'''&lt;br /&gt;
The Display state is the one that is rendered. All that is needed to be done with an element of a story in Display state is to echo it to the page. It is safe to do so. It is clean and secure and HTML friendly. If there was a BBCode postmode, it would be &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; for example. Autotags have been replaced, plaintext links made clickable. All ready to go.&lt;br /&gt;
&lt;br /&gt;
'''Edit'''&lt;br /&gt;
The edit state is the one that is rendered in the edit controls. It just needs to be echo'd into a textarea tag or value attribute. It contains nothing but the edit version of a piece of text. (If there was a BBCode postmode, it would be [b]bold[/b], if HTML it would be &amp;amp;lt;b&amp;amp;gt;bold&amp;amp;lt;b&amp;amp;gt;). Autotags have not been replaced. Plaintext links are back to just text urls.&lt;br /&gt;
&lt;br /&gt;
'''Database'''&lt;br /&gt;
The state that is in the database.&lt;br /&gt;
&lt;br /&gt;
'''Rest'''&lt;br /&gt;
This is the native state of the class. There is very little work to do to move to display state. Really, only Autotags.&lt;br /&gt;
&lt;br /&gt;
The sub-modes are:&lt;br /&gt;
&lt;br /&gt;
'''Post'''&lt;br /&gt;
The result of an edit form being sent back by a $_POST operation. Stories should only be in this state for the briefest of moments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following must be true at all times:&lt;br /&gt;
&lt;br /&gt;
addslashes(Rest) === Database&lt;br /&gt;
stripslashes(Database) === Rest&lt;br /&gt;
&lt;br /&gt;
The Rest state must be AS CLOSE TO Display as possible. Only real time critical changes (Autotags) and non-reversible operations (none so far) must be required to move to the Display state. Essentially, for plaintext and html:&lt;br /&gt;
&lt;br /&gt;
PLG_Autotags(Rest) === Display&lt;br /&gt;
&lt;br /&gt;
The move from Edit to Rest must be reversible. Always. i.e.&lt;br /&gt;
EditMode(Rest) === Edit&lt;br /&gt;
and&lt;br /&gt;
LoadFromRequest(Post) === Rest&lt;br /&gt;
&lt;br /&gt;
'''Also''' The following must be true:&lt;br /&gt;
LoadFromDatabase(Database) === LoadFromRequest(Post)&lt;br /&gt;
&lt;br /&gt;
The idea being that the LoadFromRequest operation and the LoadFromDatabase operations happen as soon as data comes in from POST or database and moves to the Rest state it should be trivial to move it to Display state. Ideally, '''nothing''' should need doing, autotags is an exception. Autotags exist to provide up to the second information, and thus must be parsed on render. The work should be done in LoadFromRequest (possibly heavy duty processing to provide '''safe''' html markup that can be reversed) and EditElements which reverses that work and escapes for display in the edit fields.&lt;br /&gt;
&lt;br /&gt;
Currently, there are two postmodes HTML (including advanced editor) and plaintext. Plaintext escapes all HTML (no injections or XSS possible at all) and makes links click-able and puts line feeds into place. HTML parses HTML against an allowed list (very minimum risk) and escapes disallowed HTML, leaving it escaped (because that's the right thing to do...).&lt;br /&gt;
&lt;br /&gt;
Postmodes exist to allow formatting of text. Other common options are bbcode and wikitext, which should in my opinion be implemented the same as text and html. They should be responsible for removing security risks and providing required formatting in a safe way.&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=StripSlashes&amp;diff=4153</id>
		<title>StripSlashes</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=StripSlashes&amp;diff=4153"/>
				<updated>2007-01-11T20:10:08Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When writing a SQL statement, one must be aware that the ' character is the string delimiter.&lt;br /&gt;
&lt;br /&gt;
A common form of attack on websites is called a SQL Injection. In the case of a SQL Injection, the attacker is hoping that a naive programmer has not thought to deal with malicious entry in forms. For example, imagine you need to run the following SQL to check a login:&lt;br /&gt;
&lt;br /&gt;
SELECT uid FROM gl_users WHERE username='someusername' AND password='somepassword'&lt;br /&gt;
&lt;br /&gt;
Suppose you just took the input from a form and did nothing:&lt;br /&gt;
&lt;br /&gt;
$sql = &amp;quot;SELECT uid FROM gl_users WHERE username='$username' AND password='$password'&lt;br /&gt;
&lt;br /&gt;
A malicious user could enter &amp;quot;someusername&amp;quot; for the username, but enter &amp;quot;' OR '' = '&amp;quot; for the password, resulting in the following SQL being executed:&lt;br /&gt;
&lt;br /&gt;
SELECT uid FROM gl_users WHERE username='someusername' AND password='' OR '' = ''&lt;br /&gt;
&lt;br /&gt;
This will result in the user being logged in.&lt;br /&gt;
&lt;br /&gt;
This is is such a common problem that &amp;quot;Magic Quotes GPC was enabled.&lt;br /&gt;
&lt;br /&gt;
Slashes are also automatically added to the contents of a GET, POST or COOKIE value if the Magic Quotes GPC flag is set to true on your PHP instance. For example, if you submit a form with the example above, the result would be:&lt;br /&gt;
&lt;br /&gt;
SELECT uid FROM gl_users WHERE username='someusername' AND password='\' OR \'\' = \''&lt;br /&gt;
&lt;br /&gt;
Which would result in a failed login.&lt;br /&gt;
&lt;br /&gt;
Magic Quotes GPC becomes a problem when it comes to well coded applications, as any sensible developer will have called addslashes to escape the values prior to using them in SQL, and will use stripslashes on retrieving data from the database to put it back how it was.&lt;br /&gt;
&lt;br /&gt;
stripslashes is a common PHP function used to remove the backslash character from a string. It's companion is addslashes.&lt;br /&gt;
&lt;br /&gt;
addslashes adds slashes to a variable. It does this to escape quotes. So for example if you have a string:&lt;br /&gt;
&lt;br /&gt;
''Geeklog's API functions are rich and varied.''&lt;br /&gt;
&lt;br /&gt;
After a call to addslashes you will have&lt;br /&gt;
&lt;br /&gt;
''Geeklog\'s API functions are rich and varied.''&lt;br /&gt;
&lt;br /&gt;
Geeklog has a lot of code. It handles a lot of form posts and database save and load commands. The values fetched from the POST/GET/COOKIE arrays or from the database are passed in and out of numerous functions. Some of these expect non-escaped strings. Others expect escaped strings.&lt;br /&gt;
&lt;br /&gt;
It currently appears to be a common source of bugs that addslashes and stripslashes are called needlessly.&lt;br /&gt;
&lt;br /&gt;
It's also important to note that Geeklog has a function COM_stripslashes that calls stripslashes on the suppied variable if and only if Magic Quotes GPC is enabled.&lt;br /&gt;
&lt;br /&gt;
Now, when doing code in geeklog, the following rules should probably be followed:&lt;br /&gt;
&lt;br /&gt;
  1. When your code is to deal with a value from $_GET, $_POST or $_COOKIE immediately load it into an internal variable after calling COM_stripSlashes, this will deal correctly with the value whether or not Magic Quotes GPC is on or off.&lt;br /&gt;
  2. Immediately before using a value in SQL, addslashes to it.&lt;br /&gt;
  3. Immediately after loading a value from SQL, stripslashes on it.&lt;br /&gt;
&lt;br /&gt;
There should never be another need to call addslashes or stripslashes.&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=StripSlashes&amp;diff=4100</id>
		<title>StripSlashes</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=StripSlashes&amp;diff=4100"/>
				<updated>2006-08-12T13:29:22Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;stripslashes is a common PHP function used to remove the backslash character from a string. It's companion is addslashes.&lt;br /&gt;
&lt;br /&gt;
addslashes adds slashes to a variable. It does this to escape quotes. So for example if you have a string:&lt;br /&gt;
&lt;br /&gt;
''Geeklog's API functions are rich and varied.''&lt;br /&gt;
&lt;br /&gt;
After a call to addslashes you will have&lt;br /&gt;
&lt;br /&gt;
''Geeklog\'s API functions are rich and varied.''&lt;br /&gt;
&lt;br /&gt;
Slashes are also automatically added to the contents of a GET, POST or COOKIE value if the Magic Quotes GPC flag is set to true on your PHP instance. For example, if you submit a form with the first example above, when you examine the contents of that field server side you will get the second string despite not having done an addslashes in your code. But, '''only if Magic Quotes GPC is enabled on that server'''.&lt;br /&gt;
&lt;br /&gt;
Now, when saving text into the database we use SQL, the ' character delimits a string within a SQL, so we '''must''' addslashes to a variable (that has not already had an addslashes) before using it in a SQL string. This will mean that if we retrieve a value from the database we're going to need to do a stripslashes to get it back to normal.&lt;br /&gt;
&lt;br /&gt;
Geeklog has a lot of code. It handles a lot of form posts and database save and load commands. The values fetched from the POST/GET/COOKIE arrays or from the database are passed in and out of numerous functions. Some of these expect non-escaped strings. Others expect escaped strings.&lt;br /&gt;
&lt;br /&gt;
It currently appears to be a common source of bugs that addslashes and stripslashes are called needlessly.&lt;br /&gt;
&lt;br /&gt;
It's also important to note that Geeklog has a function COM_stripslashes that calls stripslashes on the suppied variable if and only if Magic Quotes GPC is enabled.&lt;br /&gt;
&lt;br /&gt;
I suggest the following guidelines for using these functions:&lt;br /&gt;
&lt;br /&gt;
## On loading from $_GET, $_POST or $_COOKIE call COM_StripSlashes immediately. This will only do a stripslashes if the Magic Quotes GPC flag is set in the PHP instance. Do &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''work in progress, got called away, sorry'''&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=File_Paths&amp;diff=4030</id>
		<title>File Paths</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=File_Paths&amp;diff=4030"/>
				<updated>2006-03-11T21:20:32Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beware of Relative Paths ==&lt;br /&gt;
&lt;br /&gt;
Plugins designed to work with files stored on the system are likely to suffer from security issues if they do not take great care to deal with the paths in question.&lt;br /&gt;
&lt;br /&gt;
For example, suppose your plugin prompts a user to pick a file from a list, then passes that filename through to display (log file browser?):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$filename = $_POST['filename'];&lt;br /&gt;
readfile( $_CONF['path_system'] . '/plugins/myexploitablefileplugin/files/' . $filename );&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is very vulnerable. A malicious user could inject ../../../../../etc/passwd for example, or any other file you wouldn't want to make public. Suppose you use this method to include a theme.php file with an include call? Then a user could inject anything they've managed to drop into your error.log file!&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Security_and_Common_Practices&amp;diff=4029</id>
		<title>Security and Common Practices</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Security_and_Common_Practices&amp;diff=4029"/>
				<updated>2006-03-11T21:15:28Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a collection of articles on security considerations when developing for Geeklog. They apply to core code as well as plugins and other add-ons.&lt;br /&gt;
&lt;br /&gt;
* [[Using COM_applyFilter]]&lt;br /&gt;
* [[register_globals]]&lt;br /&gt;
* [[Including lib-common.php]]&lt;br /&gt;
* [[Logging|Be careful what you log]]&lt;br /&gt;
* [[File Paths]]&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Logging&amp;diff=4028</id>
		<title>Logging</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Logging&amp;diff=4028"/>
				<updated>2006-03-11T21:14:13Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: Rewritten, still awful though.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Be careful what you log ==&lt;br /&gt;
&lt;br /&gt;
The PHP interpretter engine will parse PHP out of any file, no matter what the extension, so long as it contains a valid PHP open tag. It doesn't matter what the rest of the content of the file, so long as it has a section of wrapped in the PHP tags, it will parse and (try to) execute that block of content.&lt;br /&gt;
&lt;br /&gt;
So, if you have a jpg file, that contains &amp;lt;?php echo('hello!'); ?&amp;gt; in the middle of the binary JPEG content and your PHP interpretter is asked to open that file, that block will be parsed and executed.&lt;br /&gt;
&lt;br /&gt;
Geeklog provides several logging methods, including COM_errorLog, allowing you to log data to one of several files for the administrator to review. If someone crafts a cunning attack, they could arrange to have a block of PHP code logged into one of the core Geeklog log files, or your plugins custom log file.&lt;br /&gt;
&lt;br /&gt;
This is not an immediate problem, typically these log files are not included in any scripts. However, should the cunning attacker be extra cunning, they may be able to devise a method of tricking Geeklog, or your plugin into doing a require, require_once, include or include_once on the infected log file, resulting in the execution of their injected code.&lt;br /&gt;
&lt;br /&gt;
The fact that the web server is able to (and regularly does) write to these log files is the weak point. It gives them a location they can insert their own code to further open up the system to the full gamit of their evil desire.&lt;br /&gt;
&lt;br /&gt;
''Careful!'' remember, &amp;lt;?php ... ?&amp;gt; is not the only way of running PHP code. If enable_short_tags is set, &amp;lt;? .. ?&amp;gt; works. PHP can even be configured to use the ASP tags: &amp;lt;% ... %&amp;gt;. Or, the log files could be used to attack ASP scripts, Coldfusion scripts or anything else that is available on the server.&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Register_globals&amp;diff=4024</id>
		<title>Register globals</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Register_globals&amp;diff=4024"/>
				<updated>2006-03-11T08:40:23Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Starting with version 1.4.0, Geeklog no longer requires to have PHP's register_globals option set to &amp;quot;on&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Despite the common conception that register_globals is &amp;quot;evil&amp;quot;, it is not a security issue ''per se'', as long as you follow a few simple rules (see below). In all the years that Geeklog required register_globals to be &amp;quot;on&amp;quot;, there was only '''one''' security issue that was a result of that setting.&lt;br /&gt;
&lt;br /&gt;
On a side note, the register_globals setting will be removed from PHP 6, i.e. it will always be &amp;quot;off&amp;quot; and there will be no way to switch it back &amp;quot;on&amp;quot;. So now would be a good time to review your code for dependency on the register_globals setting ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Initialising variables ==&lt;br /&gt;
&lt;br /&gt;
The main rule to avoid problems with the register_globals setting is pretty simple:&lt;br /&gt;
&lt;br /&gt;
:''Initialise your variables!''&lt;br /&gt;
&lt;br /&gt;
The [http://www.php.net/release_4_1_0.php PHP 4.1.0 release notes] had the following example to illustrate what's bad about register_globals=on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;?php&lt;br /&gt;
if (authenticate_user()) {&lt;br /&gt;
  $authenticated = true;&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
?&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With register_globals=on, it's simple to override the authentication check by adding &amp;quot;authenticated=true&amp;quot; to the URL of this script, e.g.&lt;br /&gt;
&lt;br /&gt;
:http://www.example.com/authenticate.php?authenticated=true&lt;br /&gt;
&lt;br /&gt;
However, that problem is easily fixed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;?php&lt;br /&gt;
$authenticated = false;&lt;br /&gt;
if (authenticate_user()) {&lt;br /&gt;
  $authenticated = true;&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
?&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There. You can pass whatever you want in the URL now - initialising the $authenticated variable fixed the problem.&lt;br /&gt;
&lt;br /&gt;
This is actually a better programming style anyway, not only from a security point of view. You should adapt this style in your own interest.&lt;br /&gt;
&lt;br /&gt;
=== Switch on error reporting ===&lt;br /&gt;
&lt;br /&gt;
On your ''development system'' ('''never''' do that on a production site), it's recommended that you switch on error reporting to be made aware of issues with uninitialised variables.&lt;br /&gt;
&lt;br /&gt;
In your php.ini file, set&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;error_reporting   = E_ALL&lt;br /&gt;
display_errors         = On&lt;br /&gt;
display_startup_errors = On&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... and don't forget to restart your webserver after you've made those changes.&lt;br /&gt;
&lt;br /&gt;
Then, in Geeklog's lib-common.php, find the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;error_reporting( E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR );&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and comment it out or remove it.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Removing the error_reporting line from lib-common.php will throw up quite a few notices about uninitialised variables in the language files. Those are historic issues that can't be fixed easily but are not a security hazard. Just make sure not to repeat these design issues in your own code ...&lt;br /&gt;
&lt;br /&gt;
The notices caused by the language files will prevent you from logging in to your site, so you may want to comment out the error_reporting line only during the debugging phase of your development cycle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Use typesafe comparison operations ==&lt;br /&gt;
The content of the superglobal arrays ($_GET, $_POST, $_REQUEST etc) are all strings, as are any variables created by register_globals. As this is the case, you can secure your code further by using typesafe comparisons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($authorized === TRUE)&lt;br /&gt;
{&lt;br /&gt;
  // Only matches if $authorized contains an actual boolean true value.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hidden problems with register_globals ==&lt;br /&gt;
Register globals allows you to inject values into arrays in a non-detectable fashion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$sids[] = &amp;quot;123&amp;quot;;&lt;br /&gt;
foreach ($sids as $sid)&lt;br /&gt;
{&lt;br /&gt;
   // Delete article by sid&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the above code, a url such as:&lt;br /&gt;
somepage.php?sids[]=1&amp;amp;sids[]=2&lt;br /&gt;
&lt;br /&gt;
Will inject additional values into the arrays.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Use $_GET, $_POST, and $_REQUEST ==&lt;br /&gt;
&lt;br /&gt;
The above explained how to avoid security issues when register_globals is set to &amp;quot;on&amp;quot;. Of course, initialising your variables won't make your code work with register_globals=off.&lt;br /&gt;
&lt;br /&gt;
Values passed from user interaction, i.e. when the user clicks on a URL or submits a form, are always passed in the global $_GET and $_POST arrays. The variables you're looking for exist as named array elements in those arrays, e.g.&lt;br /&gt;
&lt;br /&gt;
* $_GET['page'] from a URL like /index.php?page=2&lt;br /&gt;
* $_POST['title'] from a form that contains a comment with a &amp;quot;title&amp;quot; field&lt;br /&gt;
&lt;br /&gt;
Note that a form usually has a method=&amp;quot;POST&amp;quot; attribute which means that the form is sent as a HTTP POST request. Consequentially, the $_GET array will be empty in such a case and all the form's values will only exist in the $_POST array.&lt;br /&gt;
&lt;br /&gt;
The $_REQUEST array contains both the contents of the $_GET and the $_POST array. This comes in handy sometimes when a certain portion of your code will have to handle something that could come in via either a GET or a POST request.&lt;br /&gt;
&lt;br /&gt;
However, the $_REQUEST should be used sparingly and with caution, as it may make it easier for an attacker to submit manipulated requests. For example, when your form handling code only looks at the $_REQUEST array, it's also possible to submit all the form's parameter through one GET request which, in some situations, is easier to send than a POST request.&lt;br /&gt;
&lt;br /&gt;
The security implications of the $_REQUEST array are only mild, though. It's recommended, however, that you write your code such that you always know whether the incoming data is in the $_GET or $_POST array, which automatically helps to improve the clarity of your code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Switching off register_globals ===&lt;br /&gt;
&lt;br /&gt;
On your development system, you should switch off register_globals in your php.ini file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;register_globals = Off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== register_long_arrays ==&lt;br /&gt;
&lt;br /&gt;
A somewhat related setting has been introduced with PHP 5: register_long_arrays, when set to &amp;quot;on&amp;quot;, re-introduces the long names of the $_GET and $_POST arrays, i.e. $HTTP_GET_VARS and $HTTP_POST_VARS. These long-named arrays are disabled by default as of PHP 5 and any code relying on them will therefore fail.&lt;br /&gt;
&lt;br /&gt;
The replacement for those, as mentioned above, are the $_GET and $_POST arrays and only those should be used. They were introduced in PHP 4.1.0, which has also been the minimum requirement for Geeklog for a while now.&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Register_globals&amp;diff=4023</id>
		<title>Register globals</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Register_globals&amp;diff=4023"/>
				<updated>2006-03-11T08:39:22Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Starting with version 1.4.0, Geeklog no longer requires to have PHP's register_globals option set to &amp;quot;on&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Despite the common conception that register_globals is &amp;quot;evil&amp;quot;, it is not a security issue ''per se'', as long as you follow a few simple rules (see below). In all the years that Geeklog required register_globals to be &amp;quot;on&amp;quot;, there was only '''one''' security issue that was a result of that setting.&lt;br /&gt;
&lt;br /&gt;
On a side note, the register_globals setting will be removed from PHP 6, i.e. it will always be &amp;quot;off&amp;quot; and there will be no way to switch it back &amp;quot;on&amp;quot;. So now would be a good time to review your code for dependency on the register_globals setting ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Initialising variables ==&lt;br /&gt;
&lt;br /&gt;
The main rule to avoid problems with the register_globals setting is pretty simple:&lt;br /&gt;
&lt;br /&gt;
:''Initialise your variables!''&lt;br /&gt;
&lt;br /&gt;
The [http://www.php.net/release_4_1_0.php PHP 4.1.0 release notes] had the following example to illustrate what's bad about register_globals=on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;?php&lt;br /&gt;
if (authenticate_user()) {&lt;br /&gt;
  $authenticated = true;&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
?&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With register_globals=on, it's simple to override the authentication check by adding &amp;quot;authenticated=true&amp;quot; to the URL of this script, e.g.&lt;br /&gt;
&lt;br /&gt;
:http://www.example.com/authenticate.php?authenticated=true&lt;br /&gt;
&lt;br /&gt;
However, that problem is easily fixed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;?php&lt;br /&gt;
$authenticated = false;&lt;br /&gt;
if (authenticate_user()) {&lt;br /&gt;
  $authenticated = true;&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
?&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There. You can pass whatever you want in the URL now - initialising the $authenticated variable fixed the problem.&lt;br /&gt;
&lt;br /&gt;
This is actually a better programming style anyway, not only from a security point of view. You should adapt this style in your own interest.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Use typesafe comparison operations ==&lt;br /&gt;
The content of the superglobal arrays ($_GET, $_POST, $_REQUEST etc) are all strings, as are any variables created by register_globals. As this is the case, you can secure your code further by using typesafe comparisons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($authorized === TRUE)&lt;br /&gt;
{&lt;br /&gt;
  // Only matches if $authorized contains an actual boolean true value.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hidden problems with register_globals ==&lt;br /&gt;
Register globals allows you to inject values into arrays in a non-detectable fashion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$sids[] = &amp;quot;123&amp;quot;;&lt;br /&gt;
foreach ($sids as $sid)&lt;br /&gt;
{&lt;br /&gt;
   // Delete article by sid&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the above code, a url such as:&lt;br /&gt;
somepage.php?sids[]=1&amp;amp;sids[]=2&lt;br /&gt;
&lt;br /&gt;
Will inject additional values into the arrays.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Switch on error reporting ===&lt;br /&gt;
&lt;br /&gt;
On your ''development system'' ('''never''' do that on a production site), it's recommended that you switch on error reporting to be made aware of issues with uninitialised variables.&lt;br /&gt;
&lt;br /&gt;
In your php.ini file, set&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;error_reporting   = E_ALL&lt;br /&gt;
display_errors         = On&lt;br /&gt;
display_startup_errors = On&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... and don't forget to restart your webserver after you've made those changes.&lt;br /&gt;
&lt;br /&gt;
Then, in Geeklog's lib-common.php, find the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;error_reporting( E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR );&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and comment it out or remove it.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Removing the error_reporting line from lib-common.php will throw up quite a few notices about uninitialised variables in the language files. Those are historic issues that can't be fixed easily but are not a security hazard. Just make sure not to repeat these design issues in your own code ...&lt;br /&gt;
&lt;br /&gt;
The notices caused by the language files will prevent you from logging in to your site, so you may want to comment out the error_reporting line only during the debugging phase of your development cycle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Use $_GET, $_POST, and $_REQUEST ==&lt;br /&gt;
&lt;br /&gt;
The above explained how to avoid security issues when register_globals is set to &amp;quot;on&amp;quot;. Of course, initialising your variables won't make your code work with register_globals=off.&lt;br /&gt;
&lt;br /&gt;
Values passed from user interaction, i.e. when the user clicks on a URL or submits a form, are always passed in the global $_GET and $_POST arrays. The variables you're looking for exist as named array elements in those arrays, e.g.&lt;br /&gt;
&lt;br /&gt;
* $_GET['page'] from a URL like /index.php?page=2&lt;br /&gt;
* $_POST['title'] from a form that contains a comment with a &amp;quot;title&amp;quot; field&lt;br /&gt;
&lt;br /&gt;
Note that a form usually has a method=&amp;quot;POST&amp;quot; attribute which means that the form is sent as a HTTP POST request. Consequentially, the $_GET array will be empty in such a case and all the form's values will only exist in the $_POST array.&lt;br /&gt;
&lt;br /&gt;
The $_REQUEST array contains both the contents of the $_GET and the $_POST array. This comes in handy sometimes when a certain portion of your code will have to handle something that could come in via either a GET or a POST request.&lt;br /&gt;
&lt;br /&gt;
However, the $_REQUEST should be used sparingly and with caution, as it may make it easier for an attacker to submit manipulated requests. For example, when your form handling code only looks at the $_REQUEST array, it's also possible to submit all the form's parameter through one GET request which, in some situations, is easier to send than a POST request.&lt;br /&gt;
&lt;br /&gt;
The security implications of the $_REQUEST array are only mild, though. It's recommended, however, that you write your code such that you always know whether the incoming data is in the $_GET or $_POST array, which automatically helps to improve the clarity of your code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Switching off register_globals ===&lt;br /&gt;
&lt;br /&gt;
On your development system, you should switch off register_globals in your php.ini file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;register_globals = Off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== register_long_arrays ==&lt;br /&gt;
&lt;br /&gt;
A somewhat related setting has been introduced with PHP 5: register_long_arrays, when set to &amp;quot;on&amp;quot;, re-introduces the long names of the $_GET and $_POST arrays, i.e. $HTTP_GET_VARS and $HTTP_POST_VARS. These long-named arrays are disabled by default as of PHP 5 and any code relying on them will therefore fail.&lt;br /&gt;
&lt;br /&gt;
The replacement for those, as mentioned above, are the $_GET and $_POST arrays and only those should be used. They were introduced in PHP 4.1.0, which has also been the minimum requirement for Geeklog for a while now.&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Using_COM_applyFilter&amp;diff=4022</id>
		<title>Using COM applyFilter</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Using_COM_applyFilter&amp;diff=4022"/>
				<updated>2006-03-11T08:34:08Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: Moved section to register_globals page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.3.9 introduced a new function, COM_applyFilter, that is used to filter parameters passed in HTTP GET and POST requests. It is strongly suggested that plugins and other add-ons make use of this function. This article explains how to use COM_applyFilter and also provides additional&lt;br /&gt;
information on how to make your scripts more secure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why parameter filtering? ==&lt;br /&gt;
&lt;br /&gt;
Whenever parameters are passed in an HTTP GET request (usually in a URL of the form script.php?parameter=value) or an HTTP POST request (usually from an input field in a form, e.g. &amp;lt;input name=&amp;quot;parameter&amp;quot; value=&amp;quot;value&amp;quot;&amp;gt;) there is a potential risk that these parameters are manipulated. With GET requests, it is easy to edit the URL and manipulated POST requests can be sent through manipulated forms or by using tools like netcat.&lt;br /&gt;
&lt;br /&gt;
It is therefore important not to trust these parameters too much!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== COM_applyFilter ==&lt;br /&gt;
&lt;br /&gt;
The COM_applyFilter function was designed to clear parameters from the most commonly used injection attempts (both SQL and JavaScript injections). So, to strip any potentially malicious content from parameters, use COM_applyFilter as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$myvalue = COM_applyFilter ($_POST['myparameter']);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, in case, of a parameter that is supposed to be numeric:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$myvalue = COM_applyFilter ($_POST['myparameter'], true);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your script should be prepared to handle the case that $myparameter is empty (or 0, for numerical parameters) after the call to COM_applyFilter. This will usually be the case when content was stripped from the parameter (unless it was empty / zero to begin with). Whether your script aborts in those cases or continues with default values instead of the empty / zeroed parameter, is up to you. Both may make sense, depending on the circumstances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A word on register_globals ==&lt;br /&gt;
&lt;br /&gt;
As can be seen in the examples above, it is recommended NOT to rely on&lt;br /&gt;
register_globals being &amp;quot;on&amp;quot; (Geeklog itself doesn't require it any more as of Geeklog 1.4.0) but to use the global $_GET and $_POST arrays instead.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The $_GET, $_POST, and $_REQUEST arrays are only available as of PHP 4.1.0, but that has been the minimum requirement for Geeklog for some time now.&lt;br /&gt;
&lt;br /&gt;
See also [[Register_globals#Use_.24_GET.2C_.24_POST.2C_and_.24_REQUEST|Use $_GET, $_POST and $_REQUEST]]&lt;br /&gt;
&lt;br /&gt;
== A bad example ==&lt;br /&gt;
&lt;br /&gt;
If possible, you should ''not'' follow Geeklog's example of testing whether a parameter is set in the $_GET or $_POST array. Instead,&lt;br /&gt;
write your code such that at any moment you know exactly where your parameters would be in case of proper execution of the script. So if you know that at a specific point in your script, parameters can only be in the $_GET array (because you are expecting to be called through an HTTP GET request), don't bother checking the $_POST array (instead, simply ignore it). Geeklog's core code contains a few bad examples where at specific points in a script it is not clear whether we came there through a GET or a POST request and thus have to test both for the proper parameters. Depending on the situation, it may make things easier for an attacker and the code is in general much harder to maintain. Don't repeat that mistake.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== When not to use COM_applyFilter ==&lt;br /&gt;
&lt;br /&gt;
Please note that you can ''not'' use COM_applyFilter on any sort of &amp;quot;free-form&amp;quot; content, such as the text of a story or things like a user's full name, since the function would strip out many special characters (such as quotes) and make the content illegible and / or useless. Instead, you should do something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$mytext = COM_stripslashes ($_POST['mytext']);&lt;br /&gt;
// do something with it, then:&lt;br /&gt;
$mytext = addslashes ($mytext);&lt;br /&gt;
DB_save ($_TABLES['mytable'], &amp;quot;mytext&amp;quot;, '$mytext');&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The COM_stripslashes function will strip any slashes that may have been added during the POST operation, if the PHP option magic_quotes_qpc is &amp;quot;on&amp;quot; (and leaves the text untouched, if it is off), thus ensuring that you get the text back exactly as it was entered by the user. You can then process the text as needed by your plugin / add-on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparing for database storage ==&lt;br /&gt;
&lt;br /&gt;
Before you store the text in the database, you should call addslashes on it to ensure that any special characters are properly escaped. This will NOT add slashes to the content in the database, it will only ensure that the text is properly stored (and in case it contains any SQL injection attempts, those would be stored as text, too, instead of being executed as part of the save operation).&lt;br /&gt;
&lt;br /&gt;
Actually, it may be a good idea to apply addslashes on ''all'' parameters that go into the database, even if they have been passed through COM_applyFilter before, just in case.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Safely identifying the current user ==&lt;br /&gt;
&lt;br /&gt;
On a side note, if you need to identify the current user, you should ''never'' rely on the user's id passed through GET or POST requests (e.g. by embedding it in a form and reading it back when the form was submitted). Instead, ''always'' use the global variable $_USER['uid']. This variable may be empty or contain 1, which indicates an anonymous user, i.e. a user that is not logged in. So you should use something like&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;if (!empty ($_USER['uid']) &amp;amp;&amp;amp; ($_USER['uid'] &amp;gt; 1)) {&lt;br /&gt;
    // this is a logged-in user&lt;br /&gt;
} else {&lt;br /&gt;
    // this is an anonymous user&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
* use COM_applyFilter on any parameters passed through an HTTP GET or POST request&lt;br /&gt;
* add &amp;quot;true&amp;quot; to the call when the parameter is supposed to be numeric&lt;br /&gt;
* be prepared for the parameter to be empty or zero afterwards&lt;br /&gt;
* don't rely on register_globals - use $_POST and $_GET instead&lt;br /&gt;
* write your script such that you know whether your parameters are in $_POST or $_GET&lt;br /&gt;
* for &amp;quot;free-form&amp;quot; content, don't use COM_applyFilter but be careful to filter it otherwise and apply addslashes before storing it in the database&lt;br /&gt;
* always rely on $_USER['uid'] to identify a user&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Using_COM_applyFilter&amp;diff=4021</id>
		<title>Using COM applyFilter</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Using_COM_applyFilter&amp;diff=4021"/>
				<updated>2006-03-11T08:32:43Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: Added typesafe comparison.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.3.9 introduced a new function, COM_applyFilter, that is used to filter parameters passed in HTTP GET and POST requests. It is strongly suggested that plugins and other add-ons make use of this function. This article explains how to use COM_applyFilter and also provides additional&lt;br /&gt;
information on how to make your scripts more secure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why parameter filtering? ==&lt;br /&gt;
&lt;br /&gt;
Whenever parameters are passed in an HTTP GET request (usually in a URL of the form script.php?parameter=value) or an HTTP POST request (usually from an input field in a form, e.g. &amp;lt;input name=&amp;quot;parameter&amp;quot; value=&amp;quot;value&amp;quot;&amp;gt;) there is a potential risk that these parameters are manipulated. With GET requests, it is easy to edit the URL and manipulated POST requests can be sent through manipulated forms or by using tools like netcat.&lt;br /&gt;
&lt;br /&gt;
It is therefore important not to trust these parameters too much!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== COM_applyFilter ==&lt;br /&gt;
&lt;br /&gt;
The COM_applyFilter function was designed to clear parameters from the most commonly used injection attempts (both SQL and JavaScript injections). So, to strip any potentially malicious content from parameters, use COM_applyFilter as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$myvalue = COM_applyFilter ($_POST['myparameter']);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, in case, of a parameter that is supposed to be numeric:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$myvalue = COM_applyFilter ($_POST['myparameter'], true);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your script should be prepared to handle the case that $myparameter is empty (or 0, for numerical parameters) after the call to COM_applyFilter. This will usually be the case when content was stripped from the parameter (unless it was empty / zero to begin with). Whether your script aborts in those cases or continues with default values instead of the empty / zeroed parameter, is up to you. Both may make sense, depending on the circumstances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A word on register_globals ==&lt;br /&gt;
&lt;br /&gt;
As can be seen in the examples above, it is recommended NOT to rely on&lt;br /&gt;
register_globals being &amp;quot;on&amp;quot; (Geeklog itself doesn't require it any more as of Geeklog 1.4.0) but to use the global $_GET and $_POST arrays instead.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The $_GET, $_POST, and $_REQUEST arrays are only available as of PHP 4.1.0, but that has been the minimum requirement for Geeklog for some time now.&lt;br /&gt;
&lt;br /&gt;
See also [[Register_globals#Use_.24_GET.2C_.24_POST.2C_and_.24_REQUEST|Use $_GET, $_POST and $_REQUEST]]&lt;br /&gt;
&lt;br /&gt;
== A bad example ==&lt;br /&gt;
&lt;br /&gt;
If possible, you should ''not'' follow Geeklog's example of testing whether a parameter is set in the $_GET or $_POST array. Instead,&lt;br /&gt;
write your code such that at any moment you know exactly where your parameters would be in case of proper execution of the script. So if you know that at a specific point in your script, parameters can only be in the $_GET array (because you are expecting to be called through an HTTP GET request), don't bother checking the $_POST array (instead, simply ignore it). Geeklog's core code contains a few bad examples where at specific points in a script it is not clear whether we came there through a GET or a POST request and thus have to test both for the proper parameters. Depending on the situation, it may make things easier for an attacker and the code is in general much harder to maintain. Don't repeat that mistake.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== When not to use COM_applyFilter ==&lt;br /&gt;
&lt;br /&gt;
Please note that you can ''not'' use COM_applyFilter on any sort of &amp;quot;free-form&amp;quot; content, such as the text of a story or things like a user's full name, since the function would strip out many special characters (such as quotes) and make the content illegible and / or useless. Instead, you should do something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$mytext = COM_stripslashes ($_POST['mytext']);&lt;br /&gt;
// do something with it, then:&lt;br /&gt;
$mytext = addslashes ($mytext);&lt;br /&gt;
DB_save ($_TABLES['mytable'], &amp;quot;mytext&amp;quot;, '$mytext');&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The COM_stripslashes function will strip any slashes that may have been added during the POST operation, if the PHP option magic_quotes_qpc is &amp;quot;on&amp;quot; (and leaves the text untouched, if it is off), thus ensuring that you get the text back exactly as it was entered by the user. You can then process the text as needed by your plugin / add-on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparing for database storage ==&lt;br /&gt;
&lt;br /&gt;
Before you store the text in the database, you should call addslashes on it to ensure that any special characters are properly escaped. This will NOT add slashes to the content in the database, it will only ensure that the text is properly stored (and in case it contains any SQL injection attempts, those would be stored as text, too, instead of being executed as part of the save operation).&lt;br /&gt;
&lt;br /&gt;
Actually, it may be a good idea to apply addslashes on ''all'' parameters that go into the database, even if they have been passed through COM_applyFilter before, just in case.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Safely identifying the current user ==&lt;br /&gt;
&lt;br /&gt;
On a side note, if you need to identify the current user, you should ''never'' rely on the user's id passed through GET or POST requests (e.g. by embedding it in a form and reading it back when the form was submitted). Instead, ''always'' use the global variable $_USER['uid']. This variable may be empty or contain 1, which indicates an anonymous user, i.e. a user that is not logged in. So you should use something like&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;if (!empty ($_USER['uid']) &amp;amp;&amp;amp; ($_USER['uid'] &amp;gt; 1)) {&lt;br /&gt;
    // this is a logged-in user&lt;br /&gt;
} else {&lt;br /&gt;
    // this is an anonymous user&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Use typesafe comparison operations ==&lt;br /&gt;
The content of the superglobal arrays ($_GET, $_POST, $_REQUEST etc) are all strings, as are any variables created by register_globals. As this is the case, you can secure your code further by using typesafe comparisons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($authorized === TRUE)&lt;br /&gt;
{&lt;br /&gt;
  // Only matches if $authorized contains an actual boolean true value.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
* use COM_applyFilter on any parameters passed through an HTTP GET or POST request&lt;br /&gt;
* add &amp;quot;true&amp;quot; to the call when the parameter is supposed to be numeric&lt;br /&gt;
* be prepared for the parameter to be empty or zero afterwards&lt;br /&gt;
* don't rely on register_globals - use $_POST and $_GET instead&lt;br /&gt;
* write your script such that you know whether your parameters are in $_POST or $_GET&lt;br /&gt;
* for &amp;quot;free-form&amp;quot; content, don't use COM_applyFilter but be careful to filter it otherwise and apply addslashes before storing it in the database&lt;br /&gt;
* always rely on $_USER['uid'] to identify a user&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Using_COM_applyFilter&amp;diff=4020</id>
		<title>Using COM applyFilter</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Using_COM_applyFilter&amp;diff=4020"/>
				<updated>2006-03-11T08:19:20Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: Added link to related section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Geeklog 1.3.9 introduced a new function, COM_applyFilter, that is used to filter parameters passed in HTTP GET and POST requests. It is strongly suggested that plugins and other add-ons make use of this function. This article explains how to use COM_applyFilter and also provides additional&lt;br /&gt;
information on how to make your scripts more secure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Why parameter filtering? ==&lt;br /&gt;
&lt;br /&gt;
Whenever parameters are passed in an HTTP GET request (usually in a URL of the form script.php?parameter=value) or an HTTP POST request (usually from an input field in a form, e.g. &amp;lt;input name=&amp;quot;parameter&amp;quot; value=&amp;quot;value&amp;quot;&amp;gt;) there is a potential risk that these parameters are manipulated. With GET requests, it is easy to edit the URL and manipulated POST requests can be sent through manipulated forms or by using tools like netcat.&lt;br /&gt;
&lt;br /&gt;
It is therefore important not to trust these parameters too much!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== COM_applyFilter ==&lt;br /&gt;
&lt;br /&gt;
The COM_applyFilter function was designed to clear parameters from the most commonly used injection attempts (both SQL and JavaScript injections). So, to strip any potentially malicious content from parameters, use COM_applyFilter as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$myvalue = COM_applyFilter ($_POST['myparameter']);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, in case, of a parameter that is supposed to be numeric:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$myvalue = COM_applyFilter ($_POST['myparameter'], true);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your script should be prepared to handle the case that $myparameter is empty (or 0, for numerical parameters) after the call to COM_applyFilter. This will usually be the case when content was stripped from the parameter (unless it was empty / zero to begin with). Whether your script aborts in those cases or continues with default values instead of the empty / zeroed parameter, is up to you. Both may make sense, depending on the circumstances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A word on register_globals ==&lt;br /&gt;
&lt;br /&gt;
As can be seen in the examples above, it is recommended NOT to rely on&lt;br /&gt;
register_globals being &amp;quot;on&amp;quot; (Geeklog itself doesn't require it any more as of Geeklog 1.4.0) but to use the global $_GET and $_POST arrays instead.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The $_GET, $_POST, and $_REQUEST arrays are only available as of PHP 4.1.0, but that has been the minimum requirement for Geeklog for some time now.&lt;br /&gt;
&lt;br /&gt;
See also [[Register_globals#Use_.24_GET.2C_.24_POST.2C_and_.24_REQUEST|Use $_GET, $_POST and $_REQUEST]]&lt;br /&gt;
&lt;br /&gt;
== A bad example ==&lt;br /&gt;
&lt;br /&gt;
If possible, you should ''not'' follow Geeklog's example of testing whether a parameter is set in the $_GET or $_POST array. Instead,&lt;br /&gt;
write your code such that at any moment you know exactly where your parameters would be in case of proper execution of the script. So if you know that at a specific point in your script, parameters can only be in the $_GET array (because you are expecting to be called through an HTTP GET request), don't bother checking the $_POST array (instead, simply ignore it). Geeklog's core code contains a few bad examples where at specific points in a script it is not clear whether we came there through a GET or a POST request and thus have to test both for the proper parameters. Depending on the situation, it may make things easier for an attacker and the code is in general much harder to maintain. Don't repeat that mistake.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== When not to use COM_applyFilter ==&lt;br /&gt;
&lt;br /&gt;
Please note that you can ''not'' use COM_applyFilter on any sort of &amp;quot;free-form&amp;quot; content, such as the text of a story or things like a user's full name, since the function would strip out many special characters (such as quotes) and make the content illegible and / or useless. Instead, you should do something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$mytext = COM_stripslashes ($_POST['mytext']);&lt;br /&gt;
// do something with it, then:&lt;br /&gt;
$mytext = addslashes ($mytext);&lt;br /&gt;
DB_save ($_TABLES['mytable'], &amp;quot;mytext&amp;quot;, '$mytext');&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The COM_stripslashes function will strip any slashes that may have been added during the POST operation, if the PHP option magic_quotes_qpc is &amp;quot;on&amp;quot; (and leaves the text untouched, if it is off), thus ensuring that you get the text back exactly as it was entered by the user. You can then process the text as needed by your plugin / add-on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparing for database storage ==&lt;br /&gt;
&lt;br /&gt;
Before you store the text in the database, you should call addslashes on it to ensure that any special characters are properly escaped. This will NOT add slashes to the content in the database, it will only ensure that the text is properly stored (and in case it contains any SQL injection attempts, those would be stored as text, too, instead of being executed as part of the save operation).&lt;br /&gt;
&lt;br /&gt;
Actually, it may be a good idea to apply addslashes on ''all'' parameters that go into the database, even if they have been passed through COM_applyFilter before, just in case.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Safely identifying the current user ==&lt;br /&gt;
&lt;br /&gt;
On a side note, if you need to identify the current user, you should ''never'' rely on the user's id passed through GET or POST requests (e.g. by embedding it in a form and reading it back when the form was submitted). Instead, ''always'' use the global variable $_USER['uid']. This variable may be empty or contain 1, which indicates an anonymous user, i.e. a user that is not logged in. So you should use something like&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;if (!empty ($_USER['uid']) &amp;amp;&amp;amp; ($_USER['uid'] &amp;gt; 1)) {&lt;br /&gt;
    // this is a logged-in user&lt;br /&gt;
} else {&lt;br /&gt;
    // this is an anonymous user&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
* use COM_applyFilter on any parameters passed through an HTTP GET or POST request&lt;br /&gt;
* add &amp;quot;true&amp;quot; to the call when the parameter is supposed to be numeric&lt;br /&gt;
* be prepared for the parameter to be empty or zero afterwards&lt;br /&gt;
* don't rely on register_globals - use $_POST and $_GET instead&lt;br /&gt;
* write your script such that you know whether your parameters are in $_POST or $_GET&lt;br /&gt;
* for &amp;quot;free-form&amp;quot; content, don't use COM_applyFilter but be careful to filter it otherwise and apply addslashes before storing it in the database&lt;br /&gt;
* always rely on $_USER['uid'] to identify a user&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Remote_Authentication&amp;diff=3050</id>
		<title>Remote Authentication</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Remote_Authentication&amp;diff=3050"/>
				<updated>2005-06-12T09:35:48Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;New in geeklog 1.3.12 is the Remote Authentication system. With Remote Authentication enabled, users can login to your site via any authorised external service and act as a regular user.&lt;br /&gt;
&lt;br /&gt;
This allows you to disable anonymous comments and make it easier for people to comment (they don't have to sign up on yet another site (yours) they can use a pre-existing central account to make comments).&lt;br /&gt;
&lt;br /&gt;
To enable Remote Authentication:&lt;br /&gt;
&lt;br /&gt;
#Set $_CONF['remoteauthentication'] = true; in config.php&lt;br /&gt;
#Set $_CONF['usersubmission'] = 0; in config.php&lt;br /&gt;
#Install one or more Authentication classes in /path/to/geeklog/system/classes/authentication (Geeklog ships with a class for Blogger.com and one for LiveJournal.com)&lt;br /&gt;
&lt;br /&gt;
With Remote Authentication enabled, the user is presented with a select box on the login screen to choose the login service. This will default to your site, but allow them to choose an external service. Users are authenticated via their remote username and password, and if they pass authentication a ''local'' account is created on your geeklog site that is slaved to that remote account. These local slave accounts can be banned, have special permissions etc just like any regular site user. The account creation process is the same as for local accounts, so all custom functions and plugin notifications are carried out as normal.&lt;br /&gt;
&lt;br /&gt;
In addition, the user is added to the group 'Remote Users' allowing you to automaticaly grant/deny specific permissions to all remote users.&lt;br /&gt;
&lt;br /&gt;
== Unique Usernames ==&lt;br /&gt;
When a new account is created, the local username for that account is set to the remote username. However, if there is already a user in the system with the same  username a call is made to custom_uniqueRemoteUsername passing in their remote username and the name of the service used to validate the user. This allows the admin to supply a custom function to ensure unique usernames for all users.&lt;br /&gt;
&lt;br /&gt;
It is not ''necessary'' to have unique usernames. This does not break the security of a local user or remote users login, as the full remote username and service are stored locally to avoid collision and internally users are identified by a unique number. However, if you want to ensure it is clear ''who'' has posted a comment or article by the name displayed, this function allows you to ensure uniqueness.&lt;br /&gt;
&lt;br /&gt;
== Disabling Services ==&lt;br /&gt;
To disable a specific service, simply remove the (servicename).auth.class.php file from /path/to/geeklog/system/classes/authentication and that remote service will no longer be available to your users.&lt;br /&gt;
&lt;br /&gt;
== Adding Services ==&lt;br /&gt;
Currently authentication modules for LiveJournal and Blogger are available. If you wish to add further services you will have to write custom modules to do so. This can be done by creating a php file named ServiceName.auth.class.php which declares a class called ServiceName with a method called authenticate. Authenticate takes username and password as arguments and should return a boolean. The class should expose an 'email' property and attempt to provide the users valid email address if this can be aquired from the remote server.&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Remote_Authentication&amp;diff=2060</id>
		<title>Remote Authentication</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Remote_Authentication&amp;diff=2060"/>
				<updated>2005-06-12T09:35:14Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;New in geeklog 1.3.12 is the Remote Authentication system. With Remote Authentication enabled, users can login to your site via any authorised external service and act as a regular user.&lt;br /&gt;
&lt;br /&gt;
This allows you to disable anonymous comments and make it easier for people to comment (they don't have to sign up on yet another site (yours) they can use a pre-existing central account to make comments).&lt;br /&gt;
&lt;br /&gt;
To enable Remote Authentication:&lt;br /&gt;
&lt;br /&gt;
##Set $_CONF['remoteauthentication'] = true; in config.php&lt;br /&gt;
##Set $_CONF['usersubmission'] = 0; in config.php&lt;br /&gt;
##Install one or more Authentication classes in /path/to/geeklog/system/classes/authentication (Geeklog ships with a class for Blogger.com and one for LiveJournal.com)&lt;br /&gt;
&lt;br /&gt;
With Remote Authentication enabled, the user is presented with a select box on the login screen to choose the login service. This will default to your site, but allow them to choose an external service. Users are authenticated via their remote username and password, and if they pass authentication a ''local'' account is created on your geeklog site that is slaved to that remote account. These local slave accounts can be banned, have special permissions etc just like any regular site user. The account creation process is the same as for local accounts, so all custom functions and plugin notifications are carried out as normal.&lt;br /&gt;
&lt;br /&gt;
In addition, the user is added to the group 'Remote Users' allowing you to automaticaly grant/deny specific permissions to all remote users.&lt;br /&gt;
&lt;br /&gt;
== Unique Usernames ==&lt;br /&gt;
When a new account is created, the local username for that account is set to the remote username. However, if there is already a user in the system with the same  username a call is made to custom_uniqueRemoteUsername passing in their remote username and the name of the service used to validate the user. This allows the admin to supply a custom function to ensure unique usernames for all users.&lt;br /&gt;
&lt;br /&gt;
It is not ''necessary'' to have unique usernames. This does not break the security of a local user or remote users login, as the full remote username and service are stored locally to avoid collision and internally users are identified by a unique number. However, if you want to ensure it is clear ''who'' has posted a comment or article by the name displayed, this function allows you to ensure uniqueness.&lt;br /&gt;
&lt;br /&gt;
== Disabling Services ==&lt;br /&gt;
To disable a specific service, simply remove the (servicename).auth.class.php file from /path/to/geeklog/system/classes/authentication and that remote service will no longer be available to your users.&lt;br /&gt;
&lt;br /&gt;
== Adding Services ==&lt;br /&gt;
Currently authentication modules for LiveJournal and Blogger are available. If you wish to add further services you will have to write custom modules to do so. This can be done by creating a php file named ServiceName.auth.class.php which declares a class called ServiceName with a method called authenticate. Authenticate takes username and password as arguments and should return a boolean. The class should expose an 'email' property and attempt to provide the users valid email address if this can be aquired from the remote server.&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Login_settings&amp;diff=2809</id>
		<title>Login settings</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Login_settings&amp;diff=2809"/>
				<updated>2005-06-12T09:21:07Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| border=1 cellspacing=0&lt;br /&gt;
!Variable&amp;lt;/th&amp;gt;&lt;br /&gt;
!Default Value&amp;lt;/th&amp;gt;&lt;br /&gt;
!Description&amp;lt;/th&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| loginrequired&lt;br /&gt;
| 0&lt;br /&gt;
| Login is required to access ''any'' part of the site. When set to 1, this overrides the following settings. When you only want to block access to certain parts of the site, set this to 0 and select from the following settings.&lt;br /&gt;
|-&lt;br /&gt;
| submitloginrequired&lt;br /&gt;
| 0&lt;br /&gt;
| When set to 1, only registered users can submit stories, links, and events&lt;br /&gt;
|-&lt;br /&gt;
| commentsloginrequired&lt;br /&gt;
| 0&lt;br /&gt;
| When set to 1, only registered users can submit comments&lt;br /&gt;
|-&lt;br /&gt;
| linksloginrequired&lt;br /&gt;
| 0&lt;br /&gt;
| When set to 1, only registered users can access the links area&lt;br /&gt;
|-&lt;br /&gt;
| pollsloginrequired&lt;br /&gt;
| 0&lt;br /&gt;
| When set to 1, only registered users can access the list of recent polls&lt;br /&gt;
|-&lt;br /&gt;
| calendarloginrequired&lt;br /&gt;
| 0&lt;br /&gt;
| When set to 1, only registered users can access the calendar&lt;br /&gt;
|-&lt;br /&gt;
| statsloginrequired&lt;br /&gt;
| 0&lt;br /&gt;
| When set to 1, only registered users can access the site stats&lt;br /&gt;
|-&lt;br /&gt;
| searchloginrequired&lt;br /&gt;
| 0&lt;br /&gt;
| When set to 1, only registered users can use the advanced search. When set to 2, the simple search is blocked for anonymous users, too.&lt;br /&gt;
|-&lt;br /&gt;
| profileloginrequired&lt;br /&gt;
| 0&lt;br /&gt;
| When set to 1, only registered users can view another user's profile&lt;br /&gt;
|-&lt;br /&gt;
| emailuserloginrequired&lt;br /&gt;
| 0&lt;br /&gt;
| When set to 1, only registered users can use the email submission form to send an email to another user&lt;br /&gt;
|-&lt;br /&gt;
| emailstoryloginrequired&lt;br /&gt;
| 0&lt;br /&gt;
| When set to 1, only registered users can email stories&lt;br /&gt;
|-&lt;br /&gt;
| remoteauthentication&lt;br /&gt;
| false&lt;br /&gt;
| When set to true, users may login with remote accounts. (See [[Remote Authentication]].)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;[[The_Geeklog_Configuration_File|Back to The Geeklog Configuration File]]&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	<entry>
		<id>http://wiki.geeklog.net/index.php?title=Administration&amp;diff=2853</id>
		<title>Administration</title>
		<link rel="alternate" type="text/html" href="http://wiki.geeklog.net/index.php?title=Administration&amp;diff=2853"/>
				<updated>2005-06-12T09:19:55Z</updated>
		
		<summary type="html">&lt;p&gt;THEMike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#[[IntroDoc|Introduction]]&lt;br /&gt;
#[[Installing Geeklog]]&lt;br /&gt;
#[[Administration]]&lt;br /&gt;
##[[Configuration]]&lt;br /&gt;
###[[The Geeklog Configuration File]]&lt;br /&gt;
###[[Remote Authentication]]&lt;br /&gt;
###[[Blocks]]&lt;br /&gt;
####[[Official Blocks|Official]]&lt;br /&gt;
#####[[Topics Block]]&lt;br /&gt;
#####[[Admins Block]]&lt;br /&gt;
#####[[User Settings &amp;amp; User Functions Block]]&lt;br /&gt;
#####[[What's New Block]]&lt;br /&gt;
#####[[Poll Block]]&lt;br /&gt;
#####[[Events Block]]&lt;br /&gt;
#####[[Older Stories Block]]&lt;br /&gt;
####[[UnOfficial Blocks|UnOfficial]]&lt;br /&gt;
#####[[Clock Block]]&lt;br /&gt;
#####[[News Block]]&lt;br /&gt;
####[[Block Types]]&lt;br /&gt;
###[[Plugins]]&lt;br /&gt;
####[[Official Plugins|Official]]&lt;br /&gt;
#####[[Static Pages Plugin]]&lt;br /&gt;
####[[UnOfficial Plugins|UnOfficial]]&lt;br /&gt;
#####[[Ban Plugin]]&lt;br /&gt;
#####[[Bookmarks Plugin]]&lt;br /&gt;
#####[[Contacts Plugin]]&lt;br /&gt;
#####[[EwikiPlugin]]&lt;br /&gt;
#####[[External Pages Plugin]]&lt;br /&gt;
#####[[FAQ Manager Plugin]]&lt;br /&gt;
#####[[Multilanguage FAQ Plugin]]&lt;br /&gt;
#####[[File Management Plugin]]&lt;br /&gt;
#####[[Forum Plugin]]&lt;br /&gt;
#####[[Geekary Plugin]]&lt;br /&gt;
#####[[GlinksPlugin]]&lt;br /&gt;
#####[[Glossary Plugin]]&lt;br /&gt;
#####[[Mailing Lists Plugin]]&lt;br /&gt;
#####[[Menu Plugin]]&lt;br /&gt;
#####[[Net Tools]]&lt;br /&gt;
#####[[Spamx Plugin]]&lt;br /&gt;
#####[[ThingsToDoPlugin]]&lt;br /&gt;
#####[[UpagePlugin|User Pages Plugin]]&lt;br /&gt;
#####[[Visitor Stats Plugin]]&lt;br /&gt;
#####[[Weather Plugin]]&lt;br /&gt;
#####[[zClassified Ads Plugin]]&lt;br /&gt;
####[[How To Install A Geeklog Plugin]] &lt;br /&gt;
###[[Themes]]&lt;br /&gt;
####[[Installing Themes]]&lt;br /&gt;
####[[Custom Themes]]&lt;br /&gt;
####[[Default Themes]]&lt;br /&gt;
####[[Other Themes]]&lt;br /&gt;
###[[Hacks]]&lt;br /&gt;
####[[Admin Toolbox]]&lt;br /&gt;
##[[Daily Administration]]&lt;br /&gt;
###[[Users and Groups]]&lt;br /&gt;
###[[Adding and Managing Content]]&lt;br /&gt;
####[[Content Types]]&lt;br /&gt;
#####[[Stories]]&lt;br /&gt;
#####[[Links]]&lt;br /&gt;
#####[[Events]]&lt;br /&gt;
#####[[Polls]]&lt;br /&gt;
####[[Editors and Admins]]&lt;br /&gt;
####[[Submission Queues]]&lt;br /&gt;
####[[Comments]]&lt;br /&gt;
###[[Geeklog Permissions]]&lt;br /&gt;
###[[Troubleshooting]]&lt;br /&gt;
##[[Quick How-Tos]]&lt;br /&gt;
##[[Security Guidelines]]&lt;br /&gt;
#[[Users Documentation]]&lt;br /&gt;
#[[Programmers/Developers Documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Geeklog_1.3x_Documentation|Main TOC]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Complete TOC]]&lt;/div&gt;</summary>
		<author><name>THEMike</name></author>	</entry>

	</feed>