G - generated new user R - registered new user L - logged old user I - incoming old user =cut

main::_log("last request hash='$main::COOKIES{'_lh'}' ID_user=$main::COOKIES{'_ID_user'} ID_session='$main::COOKIES{'_ID_session'}'");
undef $main::COOKIES{'_lh'};

my %env=@_;

my $max_cnt=10;

if ($TOM::Net::HTTP::UserAgent::table[$main::UserAgent]{'USRM_disable'})
{
        main::_log("this is robot, deleting USRM from COOKIES, deleting USRM");
        %main::USRM=();
        undef $main::COOKIES{'_ID_user'} if $main::COOKIES{'_ID_user'};
        undef $main::COOKIES{'_ID_session'} if $main::COOKIES{'_ID_session'};
        $t->close();
        return 1;
}

main::_log("USRM configured for hostname='$tom::H_cookie' in domain='$tom::H'");

# toto je priznak toho ze pouzivam USRM, pokial je niekde v logu
# prazdne miesto, znamena to ze nebezi USRM
$main::USRM{'logged'}="N";

my $loc;

# DAVAT SI POZOR NA TO ZE DATA
# $main::USRM{reqtime}
# $main::USRM{host_sub}
# $main::USRM{rqs}
# sa netykaju sucasneho requestu ale toho posledneho

#foreach (sort keys %main::COOKIES){main::_log("C:$_=".$main::COOKIES{$_});}
#foreach (sort keys %main::USRM){if ($_ ne "xdata"){main::_log("U:$_=".$main::USRM{$_})}}

#if ((keys %main::COOKIES) != 0)
#if (((keys %main::COOKIES) != 0) && ($main::FORM{cookies} ne "GET"))
if ($main::COOKIES{'_lt'})
{
        main::_log("here is standard cookies supported");
        if ($main::COOKIES{'_ID_user'}) # MAM HASH? (ak ano, tak som zjavne zucastneny v USRM)
        {

# check if user is in memcached

if ($TOM::CACHE_memcached && $memcached)
{
        my $cache=$Ext::CacheMemcache::cache->get(
                'namespace' => "a301_online",
                'key' => $tom::H_cookie.':'.$main::COOKIES{_ID_user}
        );
        %main::USRM=%{$cache} if $cache;
}
# or check if the user is in online table
if (!$main::USRM{'ID_user'})
{
        my $sql=qq{
                SELECT
                        user_online.ID_session,
                        user_online.logged,
                        user_online.datetime_login,
                        user_online.datetime_request,
                        user_online.requests,
                        user_online.IP,
                        user_online.domain,
                        user_online.user_agent,
                        user_online.cookies,
                        user_online.session,
                        user.*
                FROM
                        `TOM`.`a301_user_online` AS user_online
                LEFT JOIN `TOM`.`a301_user` AS user ON
                (
                        user.ID_user = user_online.ID_user
                )
                WHERE
                        user_online.ID_user=?
                LIMIT 1
        };
        my %sth0=TOM::Database::SQL::execute($sql,'bind'=>[$main::COOKIES{'_ID_user'}],'quiet'=>1,'-slave'=>0);
        %main::USRM=$sth0{'sth'}->fetchhash();
}
if ($main::USRM{'ID_user'}) # yes, user is online
{
        main::_log("user '$main::COOKIES{_ID_user}' is online");
        $main::USRM{'ID_user'}=$main::COOKIES{'_ID_user'} unless $main::USRM{'ID_user'};

# fix unicode in session
utf8::decode($main::USRM{'session'}) unless utf8::is_utf8($main::USRM{'session'});

                                # overenie pravosti prihlasenia
                                my @ref=($main::USRM{'IP'},$main::ENV{'REMOTE_ADDR'});
                                $ref[0]=~s|^(.*)\.(\d+)$|$1|;
                                $ref[1]=~s|^(.*)\.(\d+)$|$1|;
                                if (
                                        ($main::USRM{'ID_session'} eq $main::COOKIES{'_ID_session'})
#                                       &&($ref[0] eq $ref[1])
#                                       &&($main::USRM{HTTP_USER_AGENT} eq $main::ENV{HTTP_USER_AGENT})
                                )
                                {

main::_log("verified '$main::USRM{'ID_session'}' '$main::USRM{'IP'}'='$ref[0].*'");

# naplnim obsah USRM{cookies}
my %hash;foreach (sort keys %main::COOKIES){$_=~/^_/ && do {$hash{$_}=$main::COOKIES{$_};next}};
$main::USRM{'cookies'}=CVML::structure::serialize(%hash);

if ($TOM::CACHE_memcached)
{
        $Ext::CacheMemcache::cache->set(
                'namespace' => "a301_online",
                'key' => $tom::H_cookie.':'.$main::COOKIES{_ID_user},
                'value' => {
                        %main::USRM,
                        'domain' => $tom::H,
                        'datetime_request' => $main::time_current,
                        'cookies' => $main::USRM{'cookies'},
                        'user_agent' => $main::ENV{'HTTP_USER_AGENT'},
                        'requests' => $main::USRM{'requests'}+1,
                        'status' => 'Y'
                },
                'expiration' => '1H'
        );
}

        if (!$TOM::CACHE_memcached || !$memcached)
        {
                # UPDATE online
                TOM::Database::SQL::execute(qq{
                        UPDATE
                                TOM.a301_user_online
                        SET
                                domain=?,
                                datetime_request=FROM_UNIXTIME($main::time_current),
                                cookies=?,
                                user_agent=?,
                                requests=requests+1,
                                status='Y'
                        WHERE
                                ID_user=?
                        LIMIT 1
                },'quiet'=>1,
                'bind'=>[$tom::H,$main::USRM{'cookies'},$main::ENV{'HTTP_USER_AGENT'},$main::COOKIES{'_ID_user'}]);
        }
}
else # divna ID_session ktora nesuhlasi
{
        my $var;
        my $bad;
        if ($main::USRM{'ID_session'} ne $main::COOKIES{'_ID_session'}){$var.=" ID_session:( "};
        if ($main::USRM{'user_agent'} ne $main::ENV{'HTTP_USER_AGENT'}){$var.=" AGENT:( ";$bad=1;}
        if ($ref[0] ne $ref[1]){$var.=" IP:( ";$bad=1;}

if (($main::USRM{'logged'} eq "Y")||($bad))
{
        main::_log("not verified ID_user='$main::COOKIES{_ID_user}' '$var'");
        # ZNICIM JEHO COOKIES!!!
        # (mozno slo len o dvojity request/2requesty v tom istom case)
        $main::USRM_flag="O";
        if (($main::USRM{reqtime}+5) < $tom::time_current)
        {
                main::_log("destroy cookies");
                # staci vyprazdnit, tomahawk sa uz o DELETE postara sam
                foreach (keys %main::COOKIES){$main::COOKIES{$_}=""}; 
        }
        %main::USRM=(); # vyprazdnenie
}
else
{

                }
        }
}

# user prisiel na stranku po nejakom case, toto je teda jeho request
# bez platnej session, uz nieje v online tabulke
else
{
        main::_log("I'm not online, finding in user table");

# activize user when deactivated
App::301::functions::user_get($main::COOKIES{'_ID_user'});

my $sql=qq{
        SELECT
                *
        FROM
                TOM.a301_user
        WHERE
                ID_user=? AND
                hostname=?
        LIMIT 1
};
my %sth_u=TOM::Database::SQL::execute($sql,'bind'=>[$main::COOKIES{'_ID_user'},$tom::H_cookie],'quiet'=>1,'-slave'=>1);
%main::USRM=$sth_u{'sth'}->fetchhash();

if ($main::USRM{'ID_user'})
{
        main::_log("I'm in users");

use DateTime;
my $dt_now=DateTime->now;
$main::USRM{'datetime_last_login'}=~/^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$/;
my $dt_old=DateTime->new(
        year   => $1,
        month  => $2,
        day    => $3,
        hour   => $4,
        minute => $5
);
#my $dt_diff=$dt_now-$dt_old;

#main::_log("go online user '$main::USRM{'ID_user'}' from '$main::USRM{'datetime_last_login'}' (".($dt_diff->year)."-".($dt_diff->month).") with '$main::USRM{'requests_all'}' requests",3,"a301",2);
main::_log("[$tom::H] returned user '$main::USRM{'ID_user'}' last logged '$main::USRM{'datetime_last_login'}' with '$main::USRM{'requests_all'}' requests",3,"a301",2);
##############################################################
if ($main::USRM{'autolog'} eq "Y") # lognutie iba ak ide o autolog
{
        $main::USRM{'logged'}="Y";
        $main::USRM_flag="L";
}
else
{
        $main::USRM{'logged'}="N";
        $main::USRM_flag="I";
}

##############################################################
$main::USRM{'ID_session'}=TOM::Utils::vars::genhash(32);# vygenerujem hash session
$main::COOKIES{'_ID_session'}=$main::USRM{'ID_session'}; # a priradim ho

# PRIPRAVA DAT PRE $main::USRM
$main::USRM{'cookies'}="";

# vypraznim page_code posledneho requestu
# pretoze toto je nova session
undef $main::COOKIES_save{'lh'};

# foreach (sort keys %main::COOKIES) # {$_=~/^_/ && do {$main::USRM{'cookies'}.="<VAR id=\"".$_."\">".$main::COOKIES{$_}."</VAR>\n";next}}

# INSERT DO ONLINE
main::_log("insert into user_online");

TOM::Database::SQL::execute(qq{
        UPDATE
                TOM.a301_user
        SET
                datetime_last_login = FROM_UNIXTIME($main::time_current)
        WHERE
                ID_user=?
                AND hostname=?
        LIMIT 1
},'bind'=>[$main::COOKIES{'_ID_user'},$tom::H_cookie],'quiet'=>1,'-slave'=>1);

if (!$main::USRM{'login'})
{
        main::_log("move saved cookies and session");

$main::USRM{'cookies'}=$main::USRM{'saved_cookies'};
$main::USRM{'session'}=$main::USRM{'saved_session'};

        TOM::Database::SQL::execute(qq{
                REPLACE INTO TOM.a301_user_online
                (
                        ID_user,
                        ID_session,
                        domain,
                        logged,
                        datetime_login,
                        datetime_request,
                        requests,
                        IP,
                        user_agent,
                        cookies,
                        session
                )
                VALUES
                (
                        ?,
                        ?,
                        ?,
                        ?,
                        FROM_UNIXTIME($main::time_current),
                        FROM_UNIXTIME($main::time_current),
                        '1',
                        ?,
                        ?,
                        ?,
                        ?
                )
        },'bind'=>[
                $main::COOKIES{'_ID_user'},
                $main::COOKIES{'_ID_session'},
                $tom::H,
                $main::USRM{'logged'},
                $main::ENV{'REMOTE_ADDR'},
                $main::ENV{'HTTP_USER_AGENT'},
                $main::USRM{'saved_cookies'},
                $main::USRM{'saved_session'}
        ]);
}
else
{
        TOM::Database::SQL::execute(qq{
                REPLACE INTO TOM.a301_user_online
                (
                        ID_user,
                        ID_session,
                        domain,
                        logged,
                        datetime_login,
                        datetime_request,
                        requests,
                        IP,
                        user_agent
                )
                VALUES
                (
                        ?,
                        ?,
                        ?,
                        ?,
                        FROM_UNIXTIME($main::time_current),
                        FROM_UNIXTIME($main::time_current),
                        '1',
                        ?,
                        ?
                )
        },'bind'=>[
                $main::COOKIES{'_ID_user'},
                $main::COOKIES{'_ID_session'},
                $tom::H,
                $main::USRM{'logged'},
                $main::ENV{'REMOTE_ADDR'},
                $main::ENV{'HTTP_USER_AGENT'}
        ]);
}

}
else # NENASIEL SOM SA ANI V OLD
{
        main::_log("this user not exists");
        main::_log("user '$main::COOKIES{_ID_user}' not exists, cleaning cookies",4,"a301",2);

        $main::USRM_flag="O";
        # ok, falosny users zaznam, nasleduje destrukcia cookies
        # staci vyprazdnit, tomahawk sa uz o DELETE postara sam
        foreach (keys %main::COOKIES){$main::COOKIES{$_}=""};
        %main::USRM=();
        # IDEM VYTVARAT NOVEHO USERA, ALEBO TO TERAZ NECHAM TAK?
        # ZATIAL NECHAVAM TAK. POKIAL NEJDE O ZASKODNIKA TAK PRI DALSOM REQUESTE SA VYTVORI NOVY USER UPLNE V PORIADKU
        # TATO SITUACIA BY PRAKTICKY NEMALA NIKDY NASTAT
}

        }
}
else # mam cookies, ale nemam ID_user, idem sa registrovat
{
        main::_log("missing ID_user");

# NAJPRV SA POZRIEM CI TENTO USER SA NEPOKUSA OPAKOVANE
# ZISKAVAT ID_user. AK ANO, ZAMEDZIME TOMU

my $db0=$main::DB{'main'}->Query(" SELECT COUNT(*) AS cnt FROM TOM.a300_online WHERE host='$tom::H_cookie' AND rqs=1 AND IP='$ENV{REMOTE_ADDR}' AND HTTP_USER_AGENT='$ENV{HTTP_USER_AGENT}' AND logtime>".($main::time_current-600)." "); if (my %db0_line=$db0->fetchhash()) { if ($db0_line{cnt}>=$max_cnt) { my $msg="Too many ($db0_line{cnt}>=$max_cnt) identical registered users from IP='$ENV{REMOTE_ADDR}' HTTP_USER_AGENT='$ENV{HTTP_USER_AGENT}' in last 10 minutes. Potentially robot grabber"; # pub.log ako error main::_log("$msg",1); # pub.warn.log local main::_log("$msg",4,"pub.warn"); # pub.warn.log master main::_log("[$tom::H]$msg",4,"pub.warn",2) if ($tom::H ne $tom::Hm); # pub.warn.log global main::_log("[$tom::H]$msg",4,"pub.warn",1); $t->close(); return 1; } } =cut

# GENERUJEM NOVY HASH A OVERUJEM CI UZ NEEXISTUJE
my $var=App::301::functions::user_newhash();
$main::COOKIES{'_ID_user'}=$var;

# OK, VYTVORIL SOM NOVY HASH, ZAPISUJEM
# TOTO JE TEDA AUTOREGISTRACIA NOVEHO USERA
main::_log("generujem ID_user=".$var." a zapisujem do users");

TOM::Database::SQL::execute(qq{
        INSERT INTO TOM.a301_user
        (
                ID_user,
                posix_owner,
                hostname,
                datetime_register,
                datetime_last_login,
                status
        )
        VALUES
        (
                ?,
                ?,
                ?,
                FROM_UNIXTIME($main::time_current),
                FROM_UNIXTIME($main::time_current),
                'Y'
        )
},'bind'=>[$var,$var,$tom::H_cookie],'quiet'=>1);

$main::COOKIES{'_ID_session'}=TOM::Utils::vars::genhash(32); # vygenerujem hash session
main::_log("insert into online ID_session:$main::COOKIES{'_ID_session'}");

main::_log("new user '$var' with session '$main::COOKIES{'_ID_session'}' (IP='$main::ENV{'REMOTE_ADDR'}' UserAgent='$main::UserAgent_name' referer='$main::ENV{'HTTP_REFERER'}' ref_type='$main::ENV{'REF_TYPE'}' query_string='$main::ENV{'QUERY_STRING_FULL'}')",3,"a301",2);

$main::USRM{'cookies'}=CVML::structure::serialize(%main::COOKIES);

# save info about new user registration (from where is comming?)
$main::ENV{'REF_TYPE'}='direct' if $main::ENV{'REF_TYPE'} eq "onsite"; # ugly hotfix
$main::USRM{'session'}=CVML::structure::serialize(
        'USRM_G' =>
        {
                'ref_type' => $main::ENV{'REF_TYPE'},
                'referer' => $main::ENV{'HTTP_REFERER'},
                'time' => $main::time_current,
                # utm sources
                'utm_medium' => $main::ENV{'REF_TYPE'},
                'utm_source' => $main::FORM{'utm_source'},
                'utm_campaign' => $main::FORM{'utm_campaign'},
                'utm_content' => $main::FORM{'utm_content'},
                'utm_term' => $main::FORM{'utm_term'},
        },
        'USRM_S' =>
        {
                'ref_type' => $main::ENV{'REF_TYPE'},
                'referer' => $main::ENV{'HTTP_REFERER'},
                'time' => $main::time_current,
                # utm sources
                'utm_medium' => $main::ENV{'REF_TYPE'},
                'utm_source' => $main::FORM{'utm_source'},
                'utm_campaign' => $main::FORM{'utm_campaign'},
                'utm_content' => $main::FORM{'utm_content'},
                'utm_term' => $main::FORM{'utm_term'},
        }
);

TOM::Database::SQL::execute(qq{
        INSERT INTO TOM.a301_user_online
        (
                ID_user,
                ID_session,
                domain,
                logged,
                datetime_login,
                datetime_request,
                requests,
                IP,
                user_agent,
                cookies,
                session
        )
        VALUES
        (
                ?,
                ?,
                ?,
                ?,
                FROM_UNIXTIME($main::time_current),
                FROM_UNIXTIME($main::time_current),
                '1',
                ?,
                ?,
                ?,
                ?
        )
},'bind'=>[
        $main::COOKIES{'_ID_user'},
        $main::COOKIES{'_ID_session'},
        $tom::H,
        $main::USRM{'logged'},
        $main::ENV{'REMOTE_ADDR'},
        $main::ENV{'HTTP_USER_AGENT'},
        $main::USRM{'cookies'},
        $main::USRM{'session'}
],'quiet'=>1);



TOM::Database::SQL::execute(qq{
        UPDATE TOM.a301_user
        SET
                saved_session=?
        WHERE
                ID_user=?
        LIMIT 1
},'bind'=>[$main::USRM{'session'},$main::COOKIES{'_ID_user'}],'quiet'=>1);

                # PRIDAT EXPORT DO $main::USRM
                # je to tu vobec potreba?
                # v tomto pripade urcite nebude user logged, budem potom
                # teda priamo v tomto requeste potrebovat data $main::USRM???
                ##############################################################
                $main::USRM{'ID_user'}=$main::COOKIES{'_ID_user'}; # ID_user usera
                $main::USRM{'ID_session'}=$main::COOKIES{'_ID_session'}; # Idhash pre session usera
                $main::USRM_flag="G";
                ##############################################################
        }
}
else
{
        main::_log("none cookies IP:$main::ENV{REMOTE_ADDR} agent=$main::ENV{HTTP_USER_AGENT} cookies=$main::ENV{HTTP_COOKIE}");
}





        # get session datas from online table in CVML
        # save it into cvml object
        my $cvml=new CVML('data'=>$main::USRM{'session'});
        main::_log("loading session='$main::USRM{'session'}'") if $debug;
        # save backup copy of session, to compare it at end of request
        $main::USRM{'session_save'}=$main::USRM{'session'};
        # remove all session data
        undef $main::USRM{'session'};
        # control CVML session datas as object
        $App::301::session::serialize=0; # don't serialize into database now!
        # fill session hash with datas from CVML
        tie %{$main::USRM{'session'}}, 'App::301::session'; # create empty tie hash
        %{$main::USRM{'session'}}=%{$cvml->{'hash'}}; # fill tie hash
        # setup AB testing if not set already
        if (!$main::USRM{'session'}{'AB'})
        {
                my @ab=('A','B');
                $main::USRM{'session'}{'AB'}=$ab[int(rand(2))];
        }
        # create new session referer info
        if ($main::USRM_flag eq "G")
        {
#               %{$main::USRM{'session'}{'USRM_S'}}=%{$main::USRM{'session'}{'USRM_G'}};
        }
        elsif ($main::USRM_flag eq "L" || $main::USRM_flag eq "I")
        {
                $main::USRM{'session'}{'USRM_S'}={};
                $main::USRM{'session'}{'USRM_S'}{'ref_type'} = $main::ENV{'REF_TYPE'};
                $main::USRM{'session'}{'USRM_S'}{'referer'} = $main::ENV{'HTTP_REFERER'};
                $main::USRM{'session'}{'USRM_S'}{'time'} = $main::time_current;
        }
        # override session referer info
        if ($main::FORM{'utm_medium'} || $main::FORM{'ref'})
        {
                # setup override incoming info for this session (for example clicked to banner in already existing session)
                $main::USRM{'session'}{'USRM_S'}{'ref_type'} = $main::ENV{'REF_TYPE'};
                $main::USRM{'session'}{'USRM_S'}{'referer'} = $main::ENV{'HTTP_REFERER'};
                $main::USRM{'session'}{'USRM_S'}{'time'} = $main::time_current;
                $main::USRM{'session'}{'USRM_S'}{'utm_medium'} = $main::FORM{'utm_medium'} || $main::FORM{'ref'};
                $main::USRM{'session'}{'USRM_S'}{'utm_source'} = $main::FORM{'utm_source'};
                $main::USRM{'session'}{'USRM_S'}{'utm_campaign'} = $main::FORM{'utm_campaign'};
                $main::USRM{'session'}{'USRM_S'}{'utm_content'} = $main::FORM{'utm_content'};
                $main::USRM{'session'}{'USRM_S'}{'utm_term'} = $main::FORM{'utm_term'};
        }
        $App::301::session::serialize=1;

foreach (keys %main::USRM)
{
        main::_log("USRM $_='$main::USRM{$_}'") if $debug;
};

foreach (keys %main::COOKIES)
{
        main::_log("COOKIES $_='$main::COOKIES{$_}'") if $debug;
}

foreach (keys %{$main::USRM{'session'}})
{
        main::_log("USRM-SESSION $_='".$main::USRM{'session'}{$_}."'") if $debug;
}

        main::_log("main::USRM_flag='$main::USRM_flag'");
        $t->close();
        return 1;
}



sub archive { my $ID_user=shift; my %env=@_; return undef unless $ID_user;

TOM::Database::SQL::execute(qq{
        INSERT IGNORE INTO TOM.a301_user_session
        (
                ID_user,
                IP,
                datetime_session_begin,
                datetime_session_end,
                requests_all,
                saved_cookies,
                saved_session
        )
        SELECT
                ID_user,
                IP,
                datetime_login,
                datetime_request,
                requests,
                cookies,
                session
        FROM
                TOM.a301_user_online
        WHERE
                ID_user='$ID_user'
        LIMIT 1
},'quiet'=>1);

if ($env{'reset'})
{
        TOM::Database::SQL::execute(qq{
                UPDATE
                        TOM.a301_user_online
                SET
                        datetime_login=datetime_request,
                        requests=0
                WHERE
                        ID_user='$ID_user'
                LIMIT 1
        },'quiet'=>1);
}

        return 1;
}

sub online_clone { my $ID_user=shift; my $ID_user2=shift; my %env=@_; return undef unless $ID_user; return undef unless $ID_user2;

TOM::Database::SQL::execute(qq{
        INSERT IGNORE INTO TOM.a301_user_online
        (
                ID_user,
                ID_session,
                domain,
                logged,
                datetime_login,
                datetime_request,
                requests,
                IP,
                user_agent,
                cookies,
                session,
                status
        )
        SELECT
                '$ID_user2',
                ID_session,
                domain,
                logged,
                datetime_login,
                datetime_request,
                requests,
                IP,
                user_agent,
                cookies,
                session,
                status
        FROM
                TOM.a301_user_online
        WHERE
                ID_user='$ID_user'
        LIMIT 1
},'quiet'=>1);

        return 1;
}

1;


If published informations are not helpfull, something is missing or wrong, please report. Thanx for contribution.
This content is generated from file 'http://svn.cyclone3.org/trunk/frame/_addons/App/301/session.pm'

AddThis Social Bookmark Button RSS

User Comments