SitePoint Sponsor

User Tag List

Page 1 of 2 12 LastLast
Results 1 to 25 of 32
  1. #1
    Quality not quantity. bo5ton's Avatar
    Join Date
    Oct 2003
    Location
    Australia
    Posts
    654
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    Cookies and Sessions as a back up

    Hi,
    I'm trying to create a script that works with cookies and sessions, i'm not sure if this is possible.

    This is what i've got at the moment, but the session side of it doesn't seem to work. Basically I want the session to remember a chosen theme, should the user have cookies disabled.

    PHP Code:
    <?php

    session_start
    ();

    $theme "";

    if empty(
    $_COOKIE['themeChoice']) {
        if (isset (
    $_GET['theme']) == "blue") {
            
    $_SESSION['theme'] = 'blue';
        } elseif (isset(
    $_GET['setTheme']) == "red") {
            
    $_SESSION['theme'] = 'red';
        }
    }

    $_SESSION['theme'] = $theme;

    //checks if setTheme in address bar or cookie has been set
    if (isset ($_GET['setTheme']) || isset($_COOKIE['themeChoice']) || isset($_SESSION['theme'])) {
        
    //if either value is blue
        
    if (($_GET['setTheme'] == "blue") || ($_COOKIE['themeChoice'] == "blue") || ($_SESSION['theme'] == 'blue')) {
            
    //set theme variable to blue
            
    $theme "blue";
        
    //if either value is red
        
    } elseif (($_GET['setTheme'] == "red") || ($_COOKIE['themeChoice'] == "red") || ($_SESSION['theme'] == 'red')) {
        
    //set theme variable to red
            
    $theme "red";
        }
    //if theme is already set and user has opted to change their current theme
    if ($theme == "blue" && isset($_GET['changeTheme'])) {
            
    $theme "red";
    } elseif (
    $theme == "red" && isset($_GET['changeTheme'])) {
        
    $theme "blue"
    }
    //set cookie for theme for next visit
    setcookie("themeChoice",$themetime()+3600*7);
    }
        
    //if the variable is empty (user hasn't come from choicePage nor has a cookie set) go to choicePage
    if ($theme == ""){
    header("Location:sessionchoicePage.php");


    ?>
    And here is the html...
    HTML Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    <html class="no-js">
    
    <head>
    
    	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    	
    	<link rel="stylesheet" type="text/css" media="all" href="css/<?php echo $theme; ?>.css" /> 
    
    	<title>Insert title here</title>
    	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
    
    </head>
    
    <body>
    
    	<div id="main">
    		<div id="vertical"></div>
    		<div id="logo">
    			<img src="images/<?php echo $theme; ?>/logo.png">
    			
    		</div>
    		
    	</div>
    
    	<p><a href="sessionindex.php?changeTheme">Choose a New Theme</a></p>
    	
    	<script type="text/javascript">
    		$("html").removeClass("no-js");
    	</script>
    
    </body>
    
    </html>
    Any ideas? This is one of my first goes at PHP so please be nice.

  2. #2
    Quality not quantity. bo5ton's Avatar
    Join Date
    Oct 2003
    Location
    Australia
    Posts
    654
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    I think my first question was a little complicated. Here it is simplified. How do I get the session to remember the variable?
    First Page:
    PHP Code:
    <?php

    session_start
    ();

        if ((
    $_GET['setTheme']) == "blue") {
            
    $_SESSION['theme'] = "blue";
        } elseif ((
    $_GET['setTheme']) == "red") {
            
    $_SESSION['theme'] = "red";
        }
        
        
    $theme $_SESSION['theme'];
        
        
    ?>
        
    <a href="remember.php">test</a>
    Goes to:
    PHP Code:
    <p><?php


    echo $_SESSION["theme"]?></p>
    But this doesn't echo out the colour depending on what what in the address bar on the previous page.

  3. #3
    SitePoint Evangelist Tapan's Avatar
    Join Date
    May 2005
    Location
    India
    Posts
    555
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)
    Hi,

    Your session setting code seems fine, I think you need to put session_start(); before echo also. So it would be like:

    PHP Code:
    <p><?php
    session_start
    ();
    echo 
    $_SESSION["theme"]
    ?></p>
    Hope this helps.

    Thanks.

  4. #4
    SitePoint Wizard bronze trophy Immerse's Avatar
    Join Date
    Mar 2006
    Location
    Netherlands
    Posts
    1,661
    Mentioned
    7 Post(s)
    Tagged
    1 Thread(s)
    It's quite possible - depending on your PHP configuration - that sessions aren't working because you've disabled cookies (and sessions - by default - require cookies to work).
    It is possible to propagate a session by passing th PHPSESSID in your URLs, but that just opens up a new attack vector on your site.

    To be honest, IMO if people turn cookies off, including first-party cookies, then they simply can't have a theme chooser

    @Tapan: session_start() should go before any output. So your example would be better like this:
    PHP Code:
    <?php session_start(); ?>
    <p>
    <?php echo $_SESSION["theme"]; ?>
    </p>

    // or:

    <?php 
    session_start
    (); 
    echo 
    '<p>' $_SESSION["theme"] . '</p>';
    ?>
    Or even:

  5. #5
    SitePoint Evangelist Tapan's Avatar
    Join Date
    May 2005
    Location
    India
    Posts
    555
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by Immerse View Post
    It's quite possible - depending on your PHP configuration - that sessions aren't working because you've disabled cookies (and sessions - by default - require cookies to work).
    It is possible to propagate a session by passing th PHPSESSID in your URLs, but that just opens up a new attack vector on your site.

    To be honest, IMO if people turn cookies off, including first-party cookies, then they simply can't have a theme chooser

    @Tapan: session_start() should go before any output. So your example would be better like this:
    PHP Code:
    <?php session_start(); ?>
    <p>
    <?php echo $_SESSION["theme"]; ?>
    </p>

    // or:

    <?php 
    session_start
    (); 
    echo 
    '<p>' $_SESSION["theme"] . '</p>';
    ?>
    Or even:
    hi,

    ya my bad, copied his code quickly and pasted

    thanks.

  6. #6
    Quality not quantity. bo5ton's Avatar
    Join Date
    Oct 2003
    Location
    Australia
    Posts
    654
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by Immerse View Post
    It's quite possible - depending on your PHP configuration - that sessions aren't working because you've disabled cookies (and sessions - by default - require cookies to work).
    It is possible to propagate a session by passing th PHPSESSID in your URLs, but that just opens up a new attack vector on your site.

    To be honest, IMO if people turn cookies off, including first-party cookies, then they simply can't have a theme chooser
    I think you're probably right. I guess I could just have a theme for those that don't choose one. But the thing is I have a script that redirects the user if they haven't chosen a theme, which is set by cookies. Like so:

    PHP Code:
    if ($theme == ""){ 
    header("Location:sessionchoicePage.php"); 
    }  

    ?> 
    Perhaps there is a way that when the user first chooses a theme, I can keep that ?setTheme=blue in the url for each wordpress page?

  7. #7
    SitePoint Wizard bronze trophy Immerse's Avatar
    Join Date
    Mar 2006
    Location
    Netherlands
    Posts
    1,661
    Mentioned
    7 Post(s)
    Tagged
    1 Thread(s)
    You could certainly do that, but it'll be difficult to tack that onto all the links in your site.

    I wonder, how many people actually disable first party cookies? Is it really worth all the hassle you're going through now to try to support it?
    Don't get me wrong though, I think it's very commendable of you

  8. #8
    Foozle Reducer ServerStorm's Avatar
    Join Date
    Feb 2005
    Location
    Burlington, Canada
    Posts
    2,699
    Mentioned
    89 Post(s)
    Tagged
    2 Thread(s)
    @bos5ton

    For persistent type of data long-term storage I like to write it to the database as serialzed content. This way if a user deletes the cookies or the PHP server disposes of a users SESSION then their settings are still safe and remembered.

    Then when a user visits, I check if their Session has the data if so I use it; otherwise I query the database to see if there is any saved session data and return and use this data also populating the SESSION with data so I minimize the calls to the DB. This way you can give the user more consistent permanency and you don't have to worry about the cookies and SESSION saved states as much.

    Regards,
    Steve
    ictus==""

  9. #9
    Quality not quantity. bo5ton's Avatar
    Join Date
    Oct 2003
    Location
    Australia
    Posts
    654
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by Immerse View Post
    You could certainly do that, but it'll be difficult to tack that onto all the links in your site.

    I wonder, how many people actually disable first party cookies? Is it really worth all the hassle you're going through now to try to support it?
    Don't get me wrong though, I think it's very commendable of you
    It probably isn't worth it no. Especially my target audience, I'm not sure many of them would even know about cookies. I'll just put a warning on the theme choice page saying something like, "Why do you keep seeing this page? Because you haven't got cookies on!" - or something to that extent. Thanks for your reply.

    Quote Originally Posted by ServerStorm View Post
    @bos5ton

    For persistent type of data long-term storage I like to write it to the database as serialzed content. This way if a user deletes the cookies or the PHP server disposes of a users SESSION then their settings are still safe and remembered.

    Then when a user visits, I check if their Session has the data if so I use it; otherwise I query the database to see if there is any saved session data and return and use this data also populating the SESSION with data so I minimize the calls to the DB. This way you can give the user more consistent permanency and you don't have to worry about the cookies and SESSION saved states as much.

    Regards,
    Steve
    This sounds good, but way to complicated for my current PHP abilities. I don't have much of any idea about databases either. If you could point me towards a tutorial regarding this method, I'd be happy to take a look. Otherwise I can't imagine myself working it out!
    Thanks for your reply.

  10. #10
    Foozle Reducer ServerStorm's Avatar
    Join Date
    Feb 2005
    Location
    Burlington, Canada
    Posts
    2,699
    Mentioned
    89 Post(s)
    Tagged
    2 Thread(s)
    @bo5ton

    It really is not that tough. Here is what I recommend... pick up Rudy Limeback's (r937) Sitepoint book 'Simply SQL' as it is a great starter book but will give you the basics on working with SQL.

    Next I would learn how to use PDO (
    http://www.php.net/manual/en/book.pdo.php)

    Then learn how to use PHP serialize command
    PHP Code:

    $session_data 
    null;
    $session_data $_SESSION;
    $ready_for_db_session serialize($session_data);
    // Insert in table in database 
    My table in a database for this can be as simple as:
    Code:
    CREATE TABLE `serialized_data` (
      `id` int(11) NOT NULL auto_increment,
      `serialized_data` text,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=latin1$$


    I then might have a user2serialized_data table where I link the user_id to the serialized_data id.
    Code:
     //got $user_id when user logged in
     $sql ="
     SELECT
       serialized_data
     FROM
    Code:
      
       serialized_data
    INNER
      JOIN user2serialized_data as u2sd
        ON  u2sd.user_id = $user_id;"
    


    You retrieve this data and then run unserialize($serialized_data);

    Then when a user logs in I get the user_id and go through to process that I described in my earlier post.

    Hope this helps clarify it a little.

    Regards,
    Steve


    ictus==""

  11. #11
    SitePoint Wizard bronze trophy Immerse's Avatar
    Join Date
    Mar 2006
    Location
    Netherlands
    Posts
    1,661
    Mentioned
    7 Post(s)
    Tagged
    1 Thread(s)
    But... logging in without cookie support?

    That would mean session id's in URLs. I thought it was generally decided that that was bad, wasn't it?

  12. #12
    Foozle Reducer ServerStorm's Avatar
    Join Date
    Feb 2005
    Location
    Burlington, Canada
    Posts
    2,699
    Mentioned
    89 Post(s)
    Tagged
    2 Thread(s)
    @Immerse

    Yes that is bad, but what I was thinking but did not say is that when logging into a form the username and password would be held in $_POST. The action would post to a page that has the hash check with the SALT + USERNAME + PASSWORD hashed to verify. This way data never has to travel in the $_GET.

    Using SSL (https) is also essential for important areas like logging in and handling of sensitive form and database data. Nowadays I do not do logins that are not secured by a Cert. Even for fun pet projects I generate my own, and the users of these systems know that they have to agree that they want to proceed when the browser challenges the validity of the self-made certificate. Even stolen email addresses are too important nowadays to not protect.

    Steve
    ictus==""

  13. #13
    SitePoint Zealot Sogo7's Avatar
    Join Date
    May 2011
    Posts
    129
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)
    Was wondering...

    IF a users browser is set to refuse all cookies, does the browser apply that rule to the Client Side LocalStorage facility as well?
    Lovelogic.net Personal Projects Pit - Spammers welcome

  14. #14
    Foozle Reducer ServerStorm's Avatar
    Join Date
    Feb 2005
    Location
    Burlington, Canada
    Posts
    2,699
    Mentioned
    89 Post(s)
    Tagged
    2 Thread(s)
    Quote Originally Posted by Sogo7 View Post
    Was wondering...

    IF a users browser is set to refuse all cookies, does the browser apply that rule to the Client Side LocalStorage facility as well?
    Yes, but SESSION cookies are stored on the server whether or not the user has set the browser to refuse all cookies, so cookies can never really be totally turned off. It is very very hard to spoof a SESSION the hashing algorithm is advanced making it difficult, so hackers use easy vectors to get at what they want. Client side cookies are quite easy to spoof and to use in evil ways so, for that reason I never use them.

    Steve
    ictus==""

  15. #15
    SitePoint Wizard bronze trophy Immerse's Avatar
    Join Date
    Mar 2006
    Location
    Netherlands
    Posts
    1,661
    Mentioned
    7 Post(s)
    Tagged
    1 Thread(s)
    Sessions are stored on the server, the session cookie is stored in the browser.
    It contains the session id, which PHP matches (on every request) to the session stored on the server.

    No local cookies, no session.

    Blocking cookies does block localStorage, in Chrome at least.

  16. #16
    om nom nom nom Stomme poes's Avatar
    Join Date
    Aug 2007
    Location
    Netherlands
    Posts
    10,233
    Mentioned
    47 Post(s)
    Tagged
    1 Thread(s)
    There's always evercookies.

    I'm more and more happy that NoScript offers selective disabling of various HTML5 thingies like canvas and WebGL.

  17. #17
    Foozle Reducer ServerStorm's Avatar
    Join Date
    Feb 2005
    Location
    Burlington, Canada
    Posts
    2,699
    Mentioned
    89 Post(s)
    Tagged
    2 Thread(s)
    Quote Originally Posted by Immerse View Post
    Sessions are stored on the server, the session cookie is stored in the browser.
    It contains the session id, which PHP matches (on every request) to the session stored on the server.

    No local cookies, no session.

    Blocking cookies does block localStorage, in Chrome at least.
    Ahh didn't know that ... I guess that because I persist the users data in the database I can lay it out for them but based on what you are saying that is potentially a whole lot of connections to my db, because this process has to happen on each page request. Yuk! Still works though.
    ictus==""

  18. #18
    Foozle Reducer ServerStorm's Avatar
    Join Date
    Feb 2005
    Location
    Burlington, Canada
    Posts
    2,699
    Mentioned
    89 Post(s)
    Tagged
    2 Thread(s)
    Quote Originally Posted by Stomme poes View Post
    There's always evercookies.

    I'm more and more happy that NoScript offers selective disabling of various HTML5 thingies like canvas and WebGL.
    That is a neat recommendation Stomme poes
    ictus==""

  19. #19
    Quality not quantity. bo5ton's Avatar
    Join Date
    Oct 2003
    Location
    Australia
    Posts
    654
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    Thanks for the replies guys. I'll definitely have to think about it.
    Only thing is that readers won't actually log in to choose their theme, it will just depend on the cookie from when they last visited the site.
    I don't know if that changes your answer or not.
    Cheers.

  20. #20
    Non-Member bronze trophy
    Join Date
    Nov 2009
    Location
    Keene, NH
    Posts
    3,760
    Mentioned
    23 Post(s)
    Tagged
    0 Thread(s)
    If ALL they're setting is the theme - use the cookie. Someone wants custom themes, they need cookies... OH WELL.

    Honestly I think people have been WAY too paranoid about the "evil cookies" because of all the hype, not realizing that 90% of the fun and useful websites out there wouldn't work at ALL without them. PERIOD. Someone wants to be a paranoid tin-foil hat whacko and disable them completely, they get what's coming to them; a crippled Internet where you can't log into ANYTHING...

    .... including these forums.

    Much of it can be blamed on tech article writers who are experts at writing, not tech -- so they go for the sensational "cookies are evil" hype without even understanding what a cookie is, what good it serves, and how it really causes little if any REAL harm unless again, you're a card carrying member of the tinfoil hat brigade where the government is beaming secret messages to your brain with their evil microwave towers.

    As I've told more than one person who THINKS they're tech saavy, taking technical advice from the pages of Forbes is like taking financial advice from Popular Electronics.

  21. #21
    om nom nom nom Stomme poes's Avatar
    Join Date
    Aug 2007
    Location
    Netherlands
    Posts
    10,233
    Mentioned
    47 Post(s)
    Tagged
    1 Thread(s)
    where the government is beaming secret messages to your brain with their evil microwave towers.
    it's not the government, man, it's, like, the corporations


  22. #22
    Foozle Reducer ServerStorm's Avatar
    Join Date
    Feb 2005
    Location
    Burlington, Canada
    Posts
    2,699
    Mentioned
    89 Post(s)
    Tagged
    2 Thread(s)
    bo5ton,

    This thread may be getting a little 'long in the tooth' for you and likely from all the examples you have figured out what you need to do, However given that the user's theme will be based on what they last chose during one time they were logged in, and didn't have cookie support disabled, and didn't clear their cookie cache after their visit then it is simply:

    PHP Code:
    <?php  
    session_start
    ();
    if(
    $_SESSION["theme"]){
      
    // Do your theme stuff
    } else {
      
    // Do default theme stuff because the session cookie does not exist
    }
    ?>
    Steve
    ictus==""

  23. #23
    Quality not quantity. bo5ton's Avatar
    Join Date
    Oct 2003
    Location
    Australia
    Posts
    654
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by ServerStorm View Post
    bo5ton,

    This thread may be getting a little 'long in the tooth' for you and likely from all the examples you have figured out what you need to do, However given that the user's theme will be based on what they last chose during one time they were logged in, and didn't have cookie support disabled, and didn't clear their cookie cache after their visit then it is simply:

    PHP Code:
    <?php  
    session_start
    ();
    if(
    $_SESSION["theme"]){
      
    // Do your theme stuff
    } else {
      
    // Do default theme stuff because the session cookie does not exist
    }
    ?>
    Steve
    That's pretty much what i figured. However, as you can see in my first post, I was able to set the theme by getting the cookie or via the url($_GET) functions to = $theme; - But I'm not sure if I can do the same with ($_SESSION["theme"]) = $theme - should this work ok?

    As I first have to set the theme before I can see if it is set already. Something like:

    PHP Code:
    if ($_GET['setTheme'] == "blue") {
    (
    $_SESSION['theme'] == "blue"
    } elseif ($_GET['setTheme'] == "red") {
    (
    $_SESSION['theme'] == "red"

    And then can I set the $theme variable depending on that session?

    PHP Code:
    ($_SESSION["theme"]) = $theme
    Thanks for all your replies guys. If I can't get it to work, those without cookie enabled will just have to miss out on a fantastic new site!

  24. #24
    Quality not quantity. bo5ton's Avatar
    Join Date
    Oct 2003
    Location
    Australia
    Posts
    654
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)
    Well, I can't get it to work it seems. Even doing a small test I can't get it to remember the theme chosen i.e. when i navigate away and back again, it resets.
    Here's my small test:

    Page to choose theme:

    PHP Code:
    <?php

    session_start
    ();

        if ((
    $_GET['setTheme']) == "blue") {
            
    $_SESSION['theme'] = "blue";
        } elseif ((
    $_GET['setTheme']) == "red") {
            
    $_SESSION['theme'] = "red";
        }
        
        
    ?>
        
    <a href="remember.php">test</a>
    Page to show theme, both first time(which works) and when navigate away and come back (which doesn't work):

    PHP Code:
    <?php  
    session_start
    ();
    if(
    $_SESSION['theme'] == "blue"){
      
    $theme "blue";
    } else {
      
    $theme "red";
    }
    ?>

    <a href="#"><?php echo $theme?></a>
    Almost ready to give up.

  25. #25
    Foozle Reducer ServerStorm's Avatar
    Join Date
    Feb 2005
    Location
    Burlington, Canada
    Posts
    2,699
    Mentioned
    89 Post(s)
    Tagged
    2 Thread(s)
    Hi Bo5ton

    Please try the following...

    I am providing you with a very simple Session wrapper class. It doesn't change that you can not retrieve the stored theme value but does make handling a little easier. You will copy this into a file called Session.php, and for now store it next to the test.php that you will soon create.

    Session Wrapper Class:

    PHP Code:
    <?php
    /**
    * A wrapper around PHP's session functions
    * <code>
    * $session = new Session();
    * $session->set('message','Theme is Red!');
    * echo ( $session->get('message'); // Displays 'Theme is Red!'
    * </code>
    * @access public
    */

    class Session {
        
    /**
        * Session constructor<br />
        * Starts the session with session_start()
        * <b>Note:</b> that if the session has already started, session_start()
        * does nothing
        * @access public 
       */
        
    public function __construct() {
            
    session_start();
        }
            
      
    /**
        * Sets a session variable
        * @param string name of variable
        * @param mixed value of variable 
       * @return void
        * @access public 
       */
        
    public function set ($name,$value) {
            
    $_SESSION[$name]=$value;
        }   
      
    /**
        * Fetches a session variable
        * @param string name of variable
        * @return mixed value of session variable
        * @access public
        */ 
       
    public function get ($name) {
            if ( isset ( 
    $_SESSION[$name] ) ) 
               return 
    $_SESSION[$name];
            else
                return 
    false;
        }
        
    /**
        * Deletes a session variable
        * @param string name of variable
        * @return boolean
        * @access public
        */    
    public function del ($name) {
            if ( isset ( 
    $_SESSION[$name] ) ) {
                unset ( 
    $_SESSION[$name] );
                return 
    true;
            } else {
                return 
    false;
            }
        }
    /**
        * Destroys the whole session
        * @return void
       * @access public
        */
        
    public function destroy () {
            
    $_SESSION = array();
            
    session_destroy();
        }
    }
    ?>
    in a test php file do this:

    Test.php:

    PHP Code:
    <?php
    require_once('Session.php');
    $o_Session null;
    $o_Session = new Session();
    //$o_Session->del('theme'); /* <-- Uncomment this to delete the session */

    //set cookie expiration to 1 hour ago; therefor deleting it.
    //setcookie ('theme', '', time() - 3600); /* <-- Uncomment this to delete the cookie */

    /*
     * Get Session theme and the theme cookie
     */
    $theme null;
    $theme $o_Session->get('theme');
    $theme_cookie null;
    $theme_cookie $_COOKIE['theme'];
    if(!
    $theme_cookie){
      
    $o_Session->set('theme''red'); //set session  
     
    $time null;
     
    $time time() + 60*60*24*1000;
     
    setcookie('theme'$theme$time); //set cookie with appropriate parameters}
    ?>
    <html>
      <head></head>
      <body>
        <?php
         
    switch($theme_cookie){
           case 
    'red' :
             echo 
    '<div style="background-color: red">This is a red div</div>';
             break;
           case 
    'blue':
             echo 
    '<div style="background-color:blue">This is a blue div</div>';
              break;
            default: 
    //Will get this if cookies turned off or have been deleted
               
    echo '<div style="background-color:green">This is the default colour</div>';
         }   
    ?>
      </body>
    </html>
    What do you get when you run the test.php page then close your browser, open it again and run?
    ictus==""


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •