55 "fmt"
66 "io"
77 "net/url"
8+ "strconv"
9+ "strings"
10+ "time"
811
912 "github.com/Emyrk/LendingBot/balancer"
1013 "github.com/Emyrk/LendingBot/src/core/email"
@@ -16,6 +19,8 @@ import (
1619var _ = userdb .SaltLength
1720var SkipAuth = false
1821
22+ var ignoredRoutes = map [string ]bool {"/logout" : true , "/dashboard/getactivitylog" : true }
23+
1924var appAuthrequiredLog = log .WithFields (log.Fields {
2025 "package" : "controllers" ,
2126 "file" : "appAuthrequiredLog" ,
@@ -88,7 +93,12 @@ func (r AppAuthRequired) Dashboard() revel.Result {
8893}
8994
9095func (r AppAuthRequired ) Logout () revel.Result {
91- DeleteCacheToken (r .Session .ID ())
96+ llog := appAuthrequiredLog .WithField ("method" , "Logout" )
97+ if err := DeleteCacheToken (r .Session .ID (), r .ClientIP , r .Session [SESSION_EMAIL ]); err != nil {
98+ llog .Error ("Error logging user[%s] out: %s" , r .Session [SESSION_EMAIL ], err .Error ())
99+ r .Response .Status = 500
100+ }
101+ delete (r .Session , SESSION_EMAIL )
92102 AppPageHitInfoLogout .Inc ()
93103 return r .Redirect (App .Index )
94104}
@@ -103,6 +113,54 @@ func (r AppAuthRequired) InfoDashboard() revel.Result {
103113 return r .RenderTemplate ("AppAuthRequired/InfoDashboard.html" )
104114}
105115
116+ func (r AppAuthRequired ) ChangeExpiry () revel.Result {
117+ llog := appAuthrequiredLog .WithField ("method" , "ChangeExpiry" )
118+
119+ data := make (map [string ]interface {})
120+
121+ sesExp , err := strconv .Atoi (r .Params .Form .Get ("sesexp" ))
122+ if err != nil {
123+ llog .Errorf ("Error parsing int user[%s] expiration: %s" , r .Session [SESSION_EMAIL ], r .Params .Form .Get ("sesexp" ))
124+ data [
JSON_ERROR ]
= "Internal error. Please contact: [email protected] " 125+ r .Response .Status = 500
126+ return r .RenderJSON (data )
127+ }
128+
129+ err = state .SetUserExpiry (r .Session [SESSION_EMAIL ], time .Duration (sesExp )* time .Millisecond )
130+ if err != nil {
131+ llog .Errorf ("Error setting user[%s] exp: %s" , r .Session [SESSION_EMAIL ], err .Error ())
132+ data [
JSON_ERROR ]
= "Internal error. Please contact: [email protected] " 133+ r .Response .Status = 500
134+ return r .RenderJSON (data )
135+ }
136+
137+ err = SetCacheDurEnd (r .Session [SESSION_EMAIL ], time .Duration (sesExp )* time .Millisecond )
138+ if err != nil {
139+ llog .Errorf ("Error setting user[%s] cache session exp: %s" , r .Session [SESSION_EMAIL ], err .Error ())
140+ data [
JSON_ERROR ]
= "Internal error. Please contact: [email protected] " 141+ r .Response .Status = 500
142+ return r .RenderJSON (data )
143+ }
144+ r .SetCookie (GetTimeoutCookie (time .Duration (sesExp ) * time .Millisecond ))
145+ return r .RenderJSON (data )
146+ }
147+
148+ func (r AppAuthRequired ) GetExpiry () revel.Result {
149+ llog := appAuthrequiredLog .WithField ("method" , "GetExpiry" )
150+
151+ data := make (map [string ]interface {})
152+
153+ dur , err := GetCacheDur (r .Session [SESSION_EMAIL ])
154+ if err != nil {
155+ llog .Errorf ("Error getting user[%s] exp: %s" , r .Session [SESSION_EMAIL ], err .Error ())
156+ data [
JSON_ERROR ]
= "Internal error. Please contact: [email protected] " 157+ r .Response .Status = 500
158+ return r .RenderJSON (data )
159+ }
160+ data ["sesexp" ] = * dur / time .Millisecond
161+ return r .RenderJSON (data )
162+ }
163+
106164func (r AppAuthRequired ) Enable2FA () revel.Result {
107165 llog := appAuthrequiredLog .WithField ("method" , "Enable2FA" )
108166
@@ -179,23 +237,23 @@ func (r AppAuthRequired) SettingsDashboardUser() revel.Result {
179237 r .ViewArgs ["verified" ] = fmt .Sprintf ("%t" , u .Verified )
180238 r .ViewArgs ["has2FA" ] = fmt .Sprintf ("%t" , u .Has2FA )
181239 r .ViewArgs ["enabled2FA" ] = fmt .Sprintf ("%t" , u .Enabled2FA )
240+ r .ViewArgs ["minSessionTime" ] = fmt .Sprintf ("%d" , CACHE_TIME_USER_SESSION_MIN / time .Minute )
241+ r .ViewArgs ["maxSessionTime" ] = fmt .Sprintf ("%d" , CACHE_TIME_USER_SESSION_MAX / time .Hour * 60 )
242+ r .ViewArgs ["currentSessionTime" ] = fmt .Sprintf ("%d" , u .SessionExpiryTime / time .Minute )
182243
183- if u .PoloniexKeys .APIKeyEmpty () {
184- r .ViewArgs ["poloniexKey" ] = ""
185- } else {
186- s , err := u .PoloniexKeys .DecryptAPIKeyString (u .GetCipherKey (state .CipherKey ))
187- if err != nil {
188- llog .Errorf ("Error decrypting Api Keys String: %s\n " , err .Error ())
189- s = ""
190- }
191- r .ViewArgs ["poloniexKey" ] = s
244+ uss , err := GetUserActiveSessions (r .Session [SESSION_EMAIL ], r .Session .ID ())
245+ if err != nil {
246+ llog .Error ("Error getting user active sessions: %s" , err .Error ())
192247 }
193-
194- if u .PoloniexKeys .SecretKeyEmpty () {
195- r .ViewArgs ["poloniexSecret" ] = ""
196- } else {
197- r .ViewArgs ["poloniexSecret" ] = ""
248+ b , err := json .Marshal (uss )
249+ if err != nil {
250+ llog .Errorf ("Error marshalling user sessions: %s" , err .Error ())
251+ b = []byte ("[]" )
198252 }
253+ if len (uss ) == 0 {
254+ b = []byte ("[]" )
255+ }
256+ r .ViewArgs ["sessions" ] = string (b )
199257
200258 AppPageHitSetSettingDashUser .Inc ()
201259 return r .RenderTemplate ("AppAuthRequired/SettingsDashboardUser.html" )
@@ -395,8 +453,31 @@ func (r AppAuthRequired) GetActivityLogs() revel.Result {
395453 return r .RenderJSON (data )
396454}
397455
456+ func (r AppAuthRequired ) DeleteSession () revel.Result {
457+ llog := appAuthrequiredLog .WithField ("method" , "DeleteSession" )
458+
459+ data := make (map [string ]interface {})
460+ //delete session
461+ if err := DeleteCacheToken (r .Params .Form .Get ("sesid" ), r .ClientIP , r .Session [SESSION_EMAIL ]); err != nil {
462+ llog .Error ("Error deleting user session: %s" , err .Error ())
463+ data [
JSON_ERROR ]
= "Server error, failed to delete session. Contact support: [email protected] ." 464+ r .Response .Status = 500
465+ return r .RenderJSON (data )
466+ }
467+ //get active sessions
468+ uss , err := GetUserActiveSessions (r .Session [SESSION_EMAIL ], r .Session .ID ())
469+ if err != nil {
470+ llog .Error ("Error getting user active sessions after delete: %s" , err .Error ())
471+ data [
JSON_ERROR ]
= "Server error, failed to delete session. Contact support: [email protected] ." 472+ r .Response .Status = 500
473+ return r .RenderJSON (data )
474+ }
475+ data ["ses" ] = uss
476+ return r .RenderJSON (data )
477+ }
478+
398479func (r AppAuthRequired ) UserDashboard () revel.Result {
399- if revel .DevMode {
480+ if revel .DevMode || strings . Contains ( revel . RunMode , "dev" ) {
400481 return r .RenderError (& revel.Error {
401482 Title : "404 Error." ,
402483 Description : "Looks like you are lost." ,
@@ -409,25 +490,32 @@ func (r AppAuthRequired) UserDashboard() revel.Result {
409490func (r AppAuthRequired ) AuthUser () revel.Result {
410491 llog := appAuthrequiredLog .WithField ("method" , "AuthUser" )
411492
412- if ! ValidCacheEmail (r .Session .ID (), r .Session [SESSION_EMAIL ]) {
413- llog .Warningf ("Warning invalid cache: [%s] sessionId:[%s]\n " , r .Session [SESSION_EMAIL ], r .Session .ID ())
493+ if ! ValidCacheEmail (r .Session .ID (), r .ClientIP , r . Session [SESSION_EMAIL ]) {
494+ llog .Warningf ("Warning invalid cache: email [%s] sessionId:[%s] url[%s] " , r .Session [SESSION_EMAIL ], r .Session .ID (), r . Request . URL )
414495 r .Session [SESSION_EMAIL ] = ""
415496 r .Response .Status = 403
416497 return r .RenderTemplate ("errors/403.html" )
417498 }
418499
419- err := SetCacheEmail (r .Session .ID (), r .Session [SESSION_EMAIL ])
500+ //must add rep
501+ if ignoredRoutes [r .Request .RequestURI ] == true {
502+ return nil
503+ }
504+
505+ AppPageAuthUser .Inc ()
506+
507+ httpCookie , err := SetCacheEmail (r .Session .ID (), r .ClientIP , r .Session [SESSION_EMAIL ])
420508 if err != nil {
421- llog .Warningf ("Warning failed to set cache: [%s] and error: %s\n " , r .Session . ID (), err .Error ())
509+ llog .Warningf ("Warning failed to set cache: email [%s] sessionId:[%s] url[%s] and error: %s" , r .Session [ SESSION_EMAIL ], r . Session . ID (), r . Request . URL , err .Error ())
422510 r .Session [SESSION_EMAIL ] = ""
423511 r .Response .Status = 403
424512 return r .RenderTemplate ("errors/403.html" )
513+ } else {
514+ r .SetCookie (httpCookie )
425515 }
516+
426517 //do not cache auth pages
427518 // r.Response.Out.Header().Set("Cache-Control", "no-cache, max-age=0, must-revalidate, no-store")
428519
429- r .SetCookie (GetTimeoutCookie ())
430-
431- AppPageAuthUser .Inc ()
432520 return nil
433521}
0 commit comments