@@ -13,6 +13,8 @@ import (
13
13
)
14
14
15
15
const MAX_CONN_PER_BROWSER = 1
16
+ // this key will be used for encryption and decdryption of tokens
17
+ var SECRET_KEY []byte = encoder .GenerateLargePrime ().Bytes ()
16
18
17
19
// handling for cookies and incrementing session cookie counter
18
20
func IncrementCounterCookies (rw http.ResponseWriter , req * http.Request ) {
@@ -68,8 +70,8 @@ func GetCounterCookieValue(req *http.Request) int {
68
70
var session_store * sessions.CookieStore
69
71
70
72
// initilize the cookiestore with secret stored in session DB
71
- func Init_SessionStore (secret string ) {
72
- session_store = sessions .NewCookieStore ([] byte ( secret ) )
73
+ func Init_SessionStore (secret [] byte ) {
74
+ session_store = sessions .NewCookieStore (secret )
73
75
}
74
76
75
77
func Get_SessionStore () * sessions.CookieStore {
@@ -82,14 +84,15 @@ func init() {
82
84
panic (errors .New ("uninitialized session_db_handle!!" ))
83
85
}
84
86
secret , err := session_db_handle .Fetch ([]byte (user .SESSION_KEY ))
85
- log .Println ("secret: " , secret , err )
87
+ log .Println ("secret fetched : " , err )
86
88
if err != nil {
87
89
// failed to fetch secret, generate a temporary secret for this instance
88
90
secret = encoder .GenerateLargePrime ().Bytes ()
89
- log .Println ("Failed to fetch secret for session_cookie, generated temporary secret: " , secret , err )
91
+ log .Println ("Failed to fetch secret for session_cookie, generated temporary secret. " , err )
90
92
}
93
+ SECRET_KEY = secret
91
94
// init one time session store using SESSION_KEY
92
- Init_SessionStore (string ( secret ) )
95
+ Init_SessionStore (secret )
93
96
94
97
}
95
98
@@ -107,14 +110,23 @@ func Set_SessionCookie(rw http.ResponseWriter, req *http.Request, session user.U
107
110
session_cookie .Values ["expirationTime" ] = session .ExpirationTime
108
111
session_cookie .Values [utils .HOME_DIR_KEY ] = user .GetHomeDir (session .Uid )
109
112
113
+ // number of api request remaining in seconds
114
+ var req_count_rem float64 = float64 (session .ExpirationTime - utils .GetUnixMilli ())/ 1000
110
115
// set maxage of the session
111
116
session_cookie .Options = & sessions.Options {
112
117
Path : "/" ,
113
- MaxAge : int (session . ExpirationTime - utils . GetUnixMilli ()) / 1000 ,
118
+ MaxAge : int (req_count_rem ) ,
114
119
}
115
120
116
- log .Println ("session cookie save: " , int (session .ExpirationTime - utils .GetUnixMilli ())/ 1000 , session_cookie )
121
+ if session .LoggedIn {
122
+ session_cookie .Values [utils .OPENAI_REQUEST_COUNT_KEY ] = (req_count_rem / 60 )* utils .USER_FACTOR
123
+ } else {
124
+ session_cookie .Values [utils .OPENAI_REQUEST_COUNT_KEY ] = (req_count_rem / 60 )* utils .GUEST_FACTOR
125
+ }
126
+
127
+ log .Println ("session cookie save: " , int (session .ExpirationTime - utils .GetUnixMilli ())/ 1000 )
117
128
return session_store .Save (req , rw , session_cookie )
129
+
118
130
}
119
131
120
132
@@ -127,6 +139,8 @@ func Delete_SessionCookie(rw http.ResponseWriter, req *http.Request, session use
127
139
session_cookie .Values ["uid" ] = session .Uid
128
140
session_cookie .Values ["sessionID" ] = session .SessionID
129
141
session_cookie .Values ["loggedIn" ] = false
142
+ delete (session_cookie .Values , utils .OPENAI_REQUEST_COUNT_KEY )
143
+ delete (session_cookie .Values , utils .OPENAI_REQUEST_LAST_ACCESS )
130
144
131
145
// set maxage of the session
132
146
session_cookie .Options = & sessions.Options {
@@ -187,6 +201,78 @@ func IsSessionExpired(req *http.Request) bool {
187
201
return false
188
202
}
189
203
204
+ func GetOpenApiRequestCount (req * http.Request ) (count float64 ) {
205
+ session_cookie , _ := session_store .Get (req , "user-session" )
206
+ val := session_cookie .Values [utils .OPENAI_REQUEST_COUNT_KEY ]
207
+ count , ok := val .(float64 );
208
+ if ! ok {
209
+ return float64 (0 )
210
+ }
211
+ return count
212
+ }
213
+
214
+ func SetOpenApiRequestCount (rw http.ResponseWriter , req * http.Request , count float64 ) (err error ) {
215
+ session_cookie , _ := session_store .Get (req , "user-session" )
216
+ session_cookie .Values [utils .OPENAI_REQUEST_COUNT_KEY ] = count
217
+ return session_store .Save (req , rw , session_cookie )
218
+ }
219
+
220
+ func GetOpenApiLastAccessTime (req * http.Request ) (lastaccesstime int64 ) {
221
+ session_cookie , _ := session_store .Get (req , "user-session" )
222
+ val := session_cookie .Values [utils .OPENAI_REQUEST_LAST_ACCESS ]
223
+ lastaccesstime , ok := val .(int64 );
224
+ if ! ok {
225
+ return utils .GetUnixMilli () - utils .DEADLINE_MINUTES * 60 * 1000
226
+ }
227
+ return lastaccesstime
228
+ }
229
+
230
+ /*
231
+ to be called whenever openAIapi request is made, to recharge the request count
232
+ based on current time lapsed, it should eb able to give n number of requests per minute,
233
+ as given by user or GUEST_FACTOR
234
+ */
235
+ func UpdateOpenApiRequestCountBalance (rw http.ResponseWriter , req * http.Request ) (err error ) {
236
+ session_cookie , _ := session_store .Get (req , "user-session" )
237
+ // recharge req_count balance in sec
238
+ current_time_mili := utils .GetUnixMilli ()
239
+ var req_count_balance_sec float64 = float64 (current_time_mili - GetOpenApiLastAccessTime (req ))/ 1000
240
+
241
+ var req_count_balance float64 = 0
242
+ var max_cap float64 = utils .GUEST_FACTOR * utils .DEADLINE_MINUTES // max num of request per minute a user can make
243
+ if Is_UserLoggedIn (req ) {
244
+ req_count_balance = GetOpenApiRequestCount (req )+ (req_count_balance_sec / 60 )* utils .USER_FACTOR
245
+ max_cap = utils .USER_FACTOR * utils .DEADLINE_MINUTES
246
+ } else {
247
+ req_count_balance = GetOpenApiRequestCount (req )+ (req_count_balance_sec / 60 )* utils .GUEST_FACTOR
248
+ max_cap = utils .GUEST_FACTOR * utils .DEADLINE_MINUTES
249
+ }
250
+ if max_cap >= req_count_balance {
251
+ session_cookie .Values [utils .OPENAI_REQUEST_COUNT_KEY ] = req_count_balance
252
+ } else {
253
+ session_cookie .Values [utils .OPENAI_REQUEST_COUNT_KEY ] = max_cap
254
+ }
255
+ // not exceeding request balance more that maxcap req per user
256
+ session_cookie .Values [utils .OPENAI_REQUEST_LAST_ACCESS ] = current_time_mili
257
+ return session_store .Save (req , rw , session_cookie )
258
+ }
259
+
260
+ func GetOpenApiAccessToken (req * http.Request ) (acc_token , secret []byte ) {
261
+ session_cookie , _ := session_store .Get (req , "user-session" )
262
+ val := session_cookie .Values [utils .ACCESS_TOKEN_KEY ]
263
+ secretval := session_cookie .Values [utils .ACCESS_SECRET_KEY ]
264
+ acc_token , _ = val .([]byte );
265
+ secret , _ = secretval .([]byte );
266
+ return acc_token , secret
267
+ }
268
+
269
+ func SetOpenApiAccessToken (rw http.ResponseWriter , req * http.Request , acc_token , secret []byte ) (err error ) {
270
+ session_cookie , _ := session_store .Get (req , "user-session" )
271
+ session_cookie .Values [utils .ACCESS_TOKEN_KEY ] = acc_token
272
+ session_cookie .Values [utils .ACCESS_SECRET_KEY ] = secret
273
+ return session_store .Save (req , rw , session_cookie )
274
+ }
275
+
190
276
func Get_SessionCookie (req * http.Request ) (session user.UserSession ) {
191
277
session .Uid = Get_Uid (req )
192
278
session .SessionID = Get_SessionID (req )
@@ -205,6 +291,7 @@ func UpdateGuestSessionCookieAge(rw http.ResponseWriter, req *http.Request, newa
205
291
206
292
if ! Is_UserLoggedIn (req ) || IsSessionExpired (req ) {
207
293
// only update age if user not logged in
294
+
208
295
maxage = newage
209
296
}
210
297
// update maxage (sec) of the session
@@ -213,7 +300,7 @@ func UpdateGuestSessionCookieAge(rw http.ResponseWriter, req *http.Request, newa
213
300
MaxAge : maxage ,
214
301
}
215
302
err = session_store .Save (req , rw , session_cookie )
216
- log .Println ("session cookie save: " , maxage , session_cookie , "Error: " , err )
303
+ log .Println ("session cookie save: " , maxage , "Error: " , err )
217
304
return err
218
305
}
219
306
@@ -244,7 +331,7 @@ func GetOrUpdateHomeDir(rw http.ResponseWriter, req *http.Request, Uid string) (
244
331
var ok bool
245
332
246
333
homedir , ok = session_cookie .Values [utils .HOME_DIR_KEY ].(string );
247
- log .Println ("previous homedir: " , homedir , ok , session_cookie )
334
+ log .Println ("previous homedir: " , homedir , ok )
248
335
// check if same uid amd valid home dir, if not generate a new homedir
249
336
if Uid != Get_Uid (req ) || ! ok || homedir == "" {
250
337
homedir = user .GetHomeDir (Uid )
0 commit comments