Newbie questions about Pliant

Newbie questions about Pliant

sessions for non-logged in users

uvar data type works if a user is logged in.
registration and logging in is sometimes annoying for users,
can you recommend the best approach for having sessions for
anonymous users ?
Message posted by maybe Boris Reitman on 2005/05/30 06:13:32
Hi, I would like to add a shopping cart ability to my flower website,
http://sendflowers.tv which is written in pliant.  
I thought that I could use a 'uvar' to keep track of the items selected 
by the user.  However, uvar works only if the user has a username
and is logged in.  I could automatically create a new user every time an anonymous
user clicks on "add to shopping cart" link, but this way I will have 
an ever growing database of users, and I would have to think of a scheme
to rotate the user names intelligently.  Is there an alternative clean way 
to implement sessions for anonymous users, with pliant ?   

Thanks,
Boris
Message posted by maybe Boris Reitman on 2005/05/30 19:42:54
Can uvar work with a data structure ? For example,

type Basket
  field List:BasketItem items
  field Str tmp

uvar Basket basket
uvar Str tmpstr

---

it doesn't seem to work -- i am trying to write into variable 'tmpstr'
and it works, the changes are remembered.  But, 
writing into 'basket:tmp' doesn't seem to remember anything.
Message posted by hubert.tonneau on 2005/05/30 20:29:29
> type Basket
>   field List:BasketItem items
>   field Str tmp

You cannot have 'List' 'Array' 'Dictionary' in a database, only 'Set'

type Basket
  field Set:BasketItem items
  field Str tmp
Message posted by maybe Boris Reitman on 2005/05/31 02:07:17
The behaviour of this is that rec:a and rec:b don't remember the values,
but 'v' does.  Am I missing something ? 

uvar_example.pli:
---------8<-----------
submodule "/pliant/protocol/http/uvar.pli"

type Record
  field Str a b

public
  uvar Str v <- "initial value"
  uvar Record rec

--------->8-----------

uvar_set.page:
---------8<-----------
module "uvar_example.pli"

var Str value
input "Value: " value
page button "Set values"
  v := value
  rec a := value
  rec b := value
  reload_page
--------->8-----------

uvar_get.page:
---------8<-----------
module "uvar_example.pli"

text "Got v = " + v; eol
text "Got rec:a = " + rec:a; eol
text "Got rec:b = " + rec:b; eol
--------->8-----------

Message posted by maybe Boris Reitman on 2005/05/31 03:45:00
note: making Record public doesn't fix the problem.
Message posted by hubert.tonneau on 2005/05/31 05:16:29
> The behaviour of this is that rec:a and rec:b don't remember the values,
> but 'v' does.

Here is where the problem lies:
uvar Record rec

Just remember that Pliant datas are stores in a virtual tree.
In case of 'uvar' they are stored in a real tree in 'session' field (it has
'Anything' real data type) of 'User2' record of 'user_database2' defined
in /pliant/fullpliant/user.pli

Now the problem is that your code never creates the 'rec' record, so it's
fields 'a' and 'b' are also never created because fields of a record are
created when the record is created in case the underlying data structure is
'Anything'.

I'll see if I can make 'uvar' smarter so that it detects that whan you have
is a record, as opposed to scalar of 'Set', and automatically create fields
in such a case.
Message posted by maybe Boris Reitman on 2005/06/01 01:06:24
I have tried to do:

type Record
  field Str a b 
uvar Set:Record set_of_records

and indeed, it works!  I can modify it, and it remembers the changes 
without any problem. 
For now I will be using uvar in this way,
until it gets improved.

Thanks!
Boris
Message posted by hubert.tonneau on 2005/06/01 08:04:10
> uvar Set:Record set_of_records
>
> and indeed, it works!  I can modify it, and it remembers the changes

The reason is that you now create records explicitely, so the fields are
properly created when the record is created.
Message posted by boris_reitman on 2005/08/06 17:24:41
Hello,

I have created code to generate users of the form 'guestXX'.  I plan to
use this code to implement sessions for the shopping cart.  On my website,
when a user clicks on a button "Add-to-basket", he must automatically
receive a guest session, without the need to register.  I really like
pliant's "uvar", which works only for logged in users, and thought
that I should issue users a session automatically, so that uvar will work for them.
Now that I have a way to create users programmatically, I need to figure out
how to log them in.  So my question is, given a user X how can I have my .page
automatically log him in, without user interaction ? 

Btw, my function to create users is as follows,


method page create_auto_username -> id
  arg_rw HtmlPage page ; arg Str id
  implicit page
    id := "guest" + string:(random 10)
    if not (exists user:id)
      user create id
      user:id name := id
      var Str line_id := "1"
      user:id:right create line_id
      user:id:right:line_id right := "everybody"
      user_secret_database:data:user create id
      user_secret_database:data:user:id password_md5 := string_md5_hexa_signature ""

Now, i need a function 'auto_login_username' that takes as input
username an password and makes it so that pliant thinks that current
session is in a logged in state.

Can you give suggestion on how to write such a function ?
Can you explain how pliant sessions keep state ? Is it by clients ip and port ?
It is not via cookies, is it ? 

Thanks,
Boris
Message posted by hubert.tonneau on 2005/08/06 17:37:07
> So my question is, given a user X how can I have my .page
> automatically log him in, without user interaction ?

It's not possible because login is client side handled.
All the server can do is reject a request with not authorized return code,
so the browser will pop up the login window, then retry the same request
with the login informations provided in the HTTP header.
Then each subsequent requests to the same site will contain the loggin
informations.

Commercial sites establish sessions using cookies.
Message posted by boris_reitman on 2005/08/06 17:44:11
Ok,

Then how can I have a 'uvar' command that can work for my custom needs ?
Do I need to implement another type, 'svar' for session ? 
Message posted by hubert.tonneau on 2005/08/06 17:47:51
Yes, you need to implement the all thing:
. a database for storing per session datas (including cleanup of too old sessions)
. a mechanism to get session ID using cookie
. some 'uvar' like metas to hide the complexity
Message posted by boris_reitman on 2005/08/06 17:56:44
how would i send a cookie ? should i be adding something 
to the http_request object ?
Message posted by hubert.tonneau on 2005/08/06 18:00:47
First try to figure out how it must be sent and will be received at HTTP level,
then we'll find how to do that with Pliant HTTP server.
Message posted by boris_reitman on 2005/08/06 18:20:05
Here is something I found:

First Example transaction sequence:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Client requests a document, and receives in the response:

  Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT

When client requests a URL in path "/" on this server, it sends:

  Cookie: CUSTOMER=WILE_E_COYOTE

Client requests a document, and receives in the response:

  Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/

When client requests a URL in path "/" on this server, it sends:

  Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001

Client receives:

  Set-Cookie: SHIPPING=FEDEX; path=/foo

When client requests a URL in path "/" on this server, it sends:

  Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001

When client requests a URL in path "/foo" on this server, it sends:

  Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001; SHIPPING=FEDEX


Second Example transaction sequence:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Assume all mappings from above have been cleared.

Client receives:

  Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/

When client requests a URL in path "/" on this server, it sends:

  Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001

Client receives:

  Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammo

When client requests a URL in path "/ammo" on this server, it sends:

  Cookie: PART_NUMBER=RIDING_ROCKET_0023; PART_NUMBER=ROCKET_LAUNCHER_0001

    NOTE: There are two name/value pairs named "PART_NUMBER" due to 
the inheritance of the "/" mapping in addition to the "/ammo" mapping. 

Message posted by boris_reitman on 2005/08/06 18:25:08
So we need to send HTTP header,

Set-Cookie: SID=unique_identifier; path=/

when the "add-to-cart" button is pressed.   When a client will 
request a subsequent page,  he will send HTTP header

Cookie: SID=same_unique_identifier 
Message posted by hubert.tonneau on 2005/08/06 21:18:38
In order to change the HTTP header, you can try to use 'replace_content'
function at the beginning of your .page

In order to retrieve the HTTP request details, you can scan the list
http_request:query_log

Good luck.
Message posted by maybe alex zinine on 2005/08/13 17:04:51
Hello!
Do I have to set a cookie using html meta, or I can send HTTP header directly?
Can I modify HTTP header with replace_content function? Thank You.
Message posted by hubert.tonneau on 2005/08/13 17:11:00
> Do I have to set a cookie using html meta, or I can send HTTP header directly?

Assuming that cookie must be send in HTML header, you cannot use Pliant
'html' instruction to send it.

> Can I modify HTTP header with replace_content function?

Yes, provided you do it early enough so that the Pliant stream buffer (default
size is 4K) has not flushed yet.
Message posted by maybe alex zinine on 2005/08/13 18:08:16
So how i can modify HTTP header? I would like to set cookie!
I can to set cookie with replace_content:

cookie_str = "<META HTTP-EQUIV="set-cookie....
replace_content "</head>" cockie_str+"</head>"

Message posted by maybe alex zinine on 2005/08/13 18:11:17
May be i can to set cookie with method request send_header?
Message posted by hubert.tonneau on 2005/08/13 18:55:19
You could try something like this (untested):
replace_content "[lf]Server: Pliant" "[lf]Set-Cookie: SID=unique_identifier; path=/[lf]Server: Pliant"

Message posted by maybe alex zinine on 2005/08/14 10:16:19
Hello
This is no working version! I can to set a cookie with META and can to check up this cookie, but i can't check up my cookie with 
replace_content    
Message posted by hubert.tonneau on 2005/08/14 10:45:48
> This is no working version! I can to set a cookie with META and can to check up this cookie, but i can't check up my cookie with 
replace_content

Ok, sorry about that.

The explaination is that in the answer, we have an unencoded stream:
http_request stream
containing the HTTP answer header, and then we create an encoded stream:
http_request answer_stream
or (it's the same)
http_stream
to store the Zlib encoded page content.

Now, the existing 'replace_content' is hacking the output buffer of
http_stream
which does not contain the HTTP answer header, so if we want to hack the
HTTP answer header, we have to define:

method p replace_http_header replace with -> status
  arg_rw HtmlPage p ; arg Str replace with ; arg Status status
  var Pointer:Stream stream :> p:http_request stream
  var Address start := stream stream_write_buf
  var Address cur := stream stream_write_cur
  var Address stop := stream stream_write_stop
  if (cast stop Int).-.(cast cur Int) >= with:len-replace:len
    var Address a := memory_search start (cast cur Int).-.(cast start Int) replace:characters replace:len
    if a<>null
      memory_move (a translate Byte replace:len) (a translate Byte with:len) (cast cur Int).-.(cast a Int)-replace:len
      memory_copy with:characters a with:len
      stream stream_write_cur := cur translate Byte with:len-replace:len
      return success
  status := failure

then

replace_http_header "[lf]Server: Pliant" "[lf]Set-Cookie: SID=123; path=/[lf]Server: Pliant"

will work just fine.

Message posted by hubert.tonneau on 2005/08/14 10:51:57
Here is some sample code to demonstrate all of this:

module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"

method p replace_http_header replace with -> status
  arg_rw HtmlPage p ; arg Str replace with ; arg Status status
  var Pointer:Stream stream :> p:http_request stream
  var Address start := stream stream_write_buf
  var Address cur := stream stream_write_cur
  var Address stop := stream stream_write_stop
  if (cast stop Int).-.(cast cur Int) >= with:len-replace:len
    var Address a := memory_search start (cast cur Int).-.(cast start Int) replace:characters replace:len
    if a<>null
      memory_move (a translate Byte replace:len) (a translate Byte with:len) (cast cur Int).-.(cast a Int)-replace:len
      memory_copy with:characters a with:len
      stream stream_write_cur := cur translate Byte with:len-replace:len
      return success
  status := failure

para
  bold (text "Query header:") ; eol
  var Pointer:Arrow a :> http_request:query_log first
  while a<>null
    text (a map Str) ; eol
    a :> http_request:query_log next a

para
  bold (text "HTTP answer header:") ; eol
  var Pointer:Stream s :> http_request stream
  (var Str txt) set s:stream_write_buf (cast s:stream_write_cur Int) .-. (cast s:stream_write_buf Int) false
  text txt

para
  bold (text "HTML answer:") ; eol
  var Pointer:Stream s :> http_stream
  (var Str txt) set s:stream_write_buf (cast s:stream_write_cur Int) .-. (cast s:stream_write_buf Int) false
  text txt

button "set the cookie"
  text "set cookie: "+(shunt (replace_http_header "[lf]Server: Pliant" "[lf]Set-Cookie: SID=1234; path=/[lf]Server: Pliant")=success "ok" "failed") ; eol

button "reload"
  reload_page
Message posted by maybe alex zinine on 2005/08/14 10:58:10
OK! this is working version! Thank You very much!
Message posted by alex zinine on 2005/08/30 18:58:02
Hello! Do pliant has a 'mod' function?
How I can use it?
For example, 
  4 mod 3 = 1
  20 mod 10 = 0
  2 mod 3 = 2

Thank you!
Message posted by hubert.tonneau on 2005/08/30 20:18:12
mod is '%'

console 4%3 eol
Message posted by maybe Boris Reitman on 2005/09/02 15:20:04
test
Message posted by maybe Boris Reitman on 2005/09/02 15:21:55
Was having trouble posting a large message. Splitting it now.

Thank you Hubert for your help.

This implements an anonymous session mechanism.
The new keyword 'svar' is just like 'uvar' but uses cookies
to keep state.  

There is code that can be reused between uvar and svar,
but I didn't know how to refer to a data-type or a function
that is not exported by uvar.

File: cookie.pli
-------------------8<--------------------------------------------------
module "/pliant/protocol/http/server.pli"
module "/pliant/protocol/http/style/default.style"
module "/pliant/language/stream.pli"
module "/pliant/language/unsafe.pli"

method p replace_http_header replace with -> status
  arg_rw HtmlPage p ; arg Str replace with ; arg Status status
  var Pointer:Stream stream :> p:http_request stream
  var Address start := stream stream_write_buf
  var Address cur := stream stream_write_cur
  var Address stop := stream stream_write_stop
  if (cast stop Int).-.(cast cur Int) >= with:len-replace:len
    var Address a := memory_search start (cast cur Int).-.(cast start Int) replace:characters replace:len
    if a<>null
      memory_move (a translate Byte replace:len) (a translate Byte with:len) (cast cur Int).-.(cast a Int)-replace:len
      memory_copy with:characters a with:len
      stream stream_write_cur := cur translate Byte with:len-replace:len
      return success
  status := failure

method page set_cookie cookie_name cookie_value path
  arg_rw HtmlPage page ; arg Str cookie_name cookie_value path
  implicit page 
    replace_http_header "[lf]Server: Pliant" "[lf]Set-Cookie: " + cookie_name + "=" + cookie_value + "; path=" + path + "[lf]Server: Pliant"

method page get_cookie -> getting_cook 
  arg HtmlPage page ; arg Str getting_cook
  implicit page
    var Pointer:Arrow a :> http_request:query_log first
    var Str string := "Cookie: SID="
    getting_cook := ""
    while a<>null 
      if ((a map Str) 0 7) = "Cookie:" 
        getting_cook := (a map Str) #8 search ";" -1)
        getting_cook := (getting_cook string:len getting_cook:len - string:len)
      a :> http_request:query_log next a
      
export '. set_cookie'
export '. get_cookie'
-----------------8<--------------------------------
Message posted by maybe Boris Reitman on 2005/09/02 15:23:09
File: svar.pli
-------------->8-----------------------------------
module "/pliant/language/compiler.pli"
module "/pliant/fullpliant/user.pli"
module "/pliant/protocol/http/server.pli"
submodule "/pliant/appli/database.pli"
module "/pliant/appli/database/prototype.pli"
module "/pliant/language/data/string_cast.pli"
module "cookie.pli"
module "/pliant/util/crypto/intn.pli"

type DataConstant
  field Arrow value

DataInterface_ maybe DataConstant

method dd type d -> t
  oarg DataConstant dd ; arg Data_ d ; arg_R Type t
  t :> entry_type dd:value

method dc get d adr type -> status
  oarg DataConstant dc ; arg Data_ d ; arg Address adr ; arg Type type ; arg Status status
  var Pointer:Type t :> entry_type dc:value
  if type=t
    type copy_instance dc:value adr
    status := success
  else
    var Str s := to_string dc:value t "db"
    status := from_string adr type s "db"

type UserVariable
  field Str module
  field Str variable
  field Link:Type type
  field Link:DataConstant default

(gvar Database:UserDatabase2 session_database) load "/some_path_change_me/session.pdb" mount "/some_path_change_me/session_db"

function gen_new_session_id -> new_id
  arg Str new_id
  constant MAX_SESSIONS 10000
  var Int rand_int := random (MAX_SESSIONS-1)
  var Int count := 0
  new_id := "guest" + string:rand_int
  while (exists session_database:data:user:new_id)
    if count = MAX_SESSIONS 
      return ""
    if session_database:data:user:new_id:to:seconds < datetime:seconds - 24*3600
      session_database:data:user delete new_id 
    else
      count := count + 1
      rand_int := (rand_int + 1) % MAX_SESSIONS
      new_id := "guest" + string:rand_int
Message posted by maybe Boris Reitman on 2005/09/02 15:24:42
File: svar.pli
-------------->8-----------------------------------
module "/pliant/language/compiler.pli"
module "/pliant/fullpliant/user.pli"
module "/pliant/protocol/http/server.pli"
submodule "/pliant/appli/database.pli"
module "/pliant/appli/database/prototype.pli"
module "/pliant/language/data/string_cast.pli"
module "cookie.pli"
module "/pliant/util/crypto/intn.pli"

type DataConstant
  field Arrow value

DataInterface_ maybe DataConstant

method dd type d -> t
  oarg DataConstant dd ; arg Data_ d ; arg_R Type t
  t :> entry_type dd:value

method dc get d adr type -> status
  oarg DataConstant dc ; arg Data_ d ; arg Address adr ; arg Type type ; arg Status status
  var Pointer:Type t :> entry_type dc:value
  if type=t
    type copy_instance dc:value adr
    status := success
  else
    var Str s := to_string dc:value t "db"
    status := from_string adr type s "db"

type UserVariable
  field Str module
  field Str variable
  field Link:Type type
  field Link:DataConstant default

(gvar Database:UserDatabase2 session_database) load "/some_path_change_me/session.pdb" mount "/some_path_change_me/session_db"

function gen_new_session_id -> new_id
  arg Str new_id
  constant MAX_SESSIONS 10000
  var Int rand_int := random (MAX_SESSIONS-1)
  var Int count := 0
  new_id := "guest" + string:rand_int
  while (exists session_database:data:user:new_id)
    if count = MAX_SESSIONS 
      return ""
    if session_database:data:user:new_id:to:seconds < datetime:seconds - 24*3600
      session_database:data:user delete new_id 
    else
      count := count + 1
      rand_int := (rand_int + 1) % MAX_SESSIONS
      new_id := "guest" + string:rand_int

function svar_map page uv d
  arg_rw HtmlPage page ; arg UserVariable uv ; arg_rw Data_ d
  var Str uname := page:get_cookie
  if uname=""
    var Str guest_cook := gen_new_session_id
    page set_cookie "SID" guest_cook "/"
  var Data:(Set Set:Anything) session :> session_database:data:user:uname:session
  if not (exists session)
    session_database:data:user create uname
    session_database:data:user:uname:to := datetime
    session :> session_database:data:user:uname:session
  var (Pointer Data:Anything) data :>> addressof:d map Data:Anything
  data :> (session uv:module) uv:variable
  if d:adr=null # FIXME: should be: not exists:data
    session create uv:module
    (session uv:module) create uv:variable
    data :> (session uv:module) uv:variable
    if (exists uv:default)
      d:base:sem request
      d:interface set d uv:default:value (entry_type uv:default:value)
      d:base:sem release

function active_type uv access e
  arg UserVariable uv ; arg Int access ; arg_rw Expression e
  if e:size<>1 or not (e:0 cast HtmlPage)
    return
  e suckup e:0
  var Link:Argument a :> argument local (Data uv:type)
  e add (instruction (the_function svar_map HtmlPage UserVariable Data_) e:0:result (argument mapped_constant UserVariable uv) a)
  e set_result a access_read+access_write

meta svar e
  if e:size<2 or (e:0 constant Type)=null
    return
  var Pointer:Type t :> (e:0 constant Type) map Type
  var Link:DataConstant default :> null map DataConstant
  var Int stop := e:size
  if e:size>=4 and e:(e:size-2):ident="<-" and (e:(e:size-1) constant t)<>null
    default :> new DataConstant
    default value := e:(e:size-1) constant t
    stop -= 2
  for (var Int i) 1 stop-1
    if not e:i:is_pure_ident
      return
  for (var Int i) 1 stop-1
    var Link:UserVariable uv :> new UserVariable
    uv module := e:external_module:name
    uv variable := e:i ident
    uv type :> t
    uv default :> default
    e define ". "+e:i:ident addressof:uv e:module:actual
  e set_void_result

export svar
---------------------8<------------------------------------
Message posted by hubert.tonneau on 2005/09/02 16:06:12
Can you email me svar.pli as an attached file for inclusion in Pliant release 94.
Message posted by maybe Marcus on 2005/09/02 16:16:27
Also, it would be nice if it came with some short documentation on how to use it.

BTW, I've had some problems with the pliantdocs server HD. Our system administrators
are currently recovering the data in it. Hopefully by Tuesday next week I will 
put the pliantdocs site back online.
Message posted by maybe Boris Reitman on 2005/09/02 16:40:38
File: basket.pli
---------------8<----------------------------
submodule "svar.pli"
module "/pliant/language/unsafe.pli"
submodule "/pliant/appli/database.pli"
module "/pliant/language/compiler.pli"

public
type BasketItem
  field Str network code
  field Float price
  field Int quantity <- 1
  field Str id

svar Set:BasketItem basket 

method basket add_item network code -> basket_item
  arg_rw Data:(Set:BasketItem) basket ; arg Str network code
  arg Data:BasketItem basket_item
  var Str id := generate_id
  basket create id
  basket:id:id := network + code
  basket:id:network := network 
  basket:id:code := code
  basket_item :> basket:id
----------------------->8-------------------

then in my view_basket.page file i do:
module "basket.pli"

and i have 'basket' global variable available there:

          each basket_item basket
            cell 
                text basket:id:code 

Message posted by maybe Boris Reitman on 2006/06/16 23:30:24
I have launched a pliant-based website: http://www.broadwayflorists.com
which features a shopping cart application in pliant.

I have modified the svar code to support forcing a session id.
This is needed when switching from http:// browsing of the store items
into the secure https:// mode, when user is heading to "checkout".  
All session data must be preserved during this switch.  The patch is
here,

http://aristotle.hypervolume.com/~boris/pliant/boris.reitman/pliant/patches/020_svar.patch

and the final version is here,

  http://aristotle.hypervolume.com/~boris/pliant/boris.reitman/pliant/patches/final/svar.pli

to force a session id, pass the "session" option, and query current session id
with "get_session_id" method on the page object. Example:

  goto_url "https://secure.domain.com/checkout.html" options "session [dq]"+get_session_id+"[dq]"
Message posted by hubert.tonneau on 2006/06/18 17:34:30
I'm offline for 15 days, starting the book about computing culture, so please
sorry about me not providing any answer to the forum in the next couple of weeks.
Message posted by maybe Boris Reitman on 2006/10/02 23:36:20
Hubert,
As you have requested, I have updated the session code to make
the id more obscure.  I decided not to use random string, but instead,
md5sum of a bounded random integer in order to limit the number of sessions,
and to allow them to be recycled.  Currently I am limiting to 10,000 sessions.

You can find the patches here:

  http://aristotle.hypervolume.com/~boris/pliant/boris.reitman/pliant/patches/

And the final svar.pli version here:

  http://aristotle.hypervolume.com/~boris/pliant/boris.reitman/pliant/patches/final/svar.pli

If you have no further comments, please include the updated version in the next release of pliant.
Thanks,
Boris 
Message posted by hubert.tonneau on 2006/10/03 01:13:39
I'm afraid your new session scheme to be just as weak as the previous one :-(
Message posted by maybe Boris Reitman on 2006/10/03 02:16:38
What do you suggest I should do ?
Message posted by hubert.tonneau on 2006/10/03 03:32:44
First, the session ID should be a long enough unpredictable string,
then, you need a LRU (least recently used) mechanism to discard starved sessions.
Message posted by maybe Boris Reitman on 2006/10/04 01:24:26
I have updated above urls, check it out.  Question: I was able to initialize 
the database at global scope, without the init function.  
It seemed to work even if I compile into a dump file, and load it later.
So, in which case do I need an init function and in which don't ?

Also, do I need to use semaphores in my issue_session function ?
I need to make sure that between the time that I generate a random string
in gen_new_session_id and the time I create a db record (create_session function),
no one else will mess with the database.

Thanks,
Boris
Message posted by maybe Boris Reitman on 2006/10/09 06:14:00
I added a semaphore, since I may have experienced some problems because lack 
of it. 
Message posted by maybe Boris Reitman on 2006/10/15 08:49:49
sorry, there are bugs with that code, wait for update.