added a NO_SESSION event for when a login session does not exist
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 7 Dec 2005 18:32:24 +0000 (18:32 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 7 Dec 2005 18:32:24 +0000 (18:32 +0000)
Event.pm now takes arbitrary parameters

added a osrfCacheSetExpire method for manually setting the cache expire
time of an object after the object has already been cached

git-svn-id: svn://svn.open-ils.org/ILS/trunk@2267 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/c-apps/oils_auth.c
Open-ILS/src/c-apps/oils_constants.h
Open-ILS/src/extras/ils_events.xml
Open-ILS/src/perlmods/OpenILS/Application/AppUtils.pm
Open-ILS/src/perlmods/OpenILS/Event.pm
OpenSRF/src/libstack/osrf_cache.c
OpenSRF/src/libstack/osrf_cache.h

index ecaa1fd..aae8285 100644 (file)
@@ -34,7 +34,10 @@ int osrfAppInitialize() {
                "Completes the authentication process.  Returns an object like so: "
                "{authtoken : <token>, authtime:<time>}, where authtoken is the login "
                "tokena and authtime is the number of seconds the session will be active"
-               "PARAMS(username, md5sum( seed + password ), type )", 2, 0 );
+               "PARAMS(username, md5sum( seed + password ), type, org_id ) "
+               "type can be one of 'opac' or 'staff' and it defaults to 'staff' "
+               "org_id is the location at which the login should be considered "
+               "active for login timeout purposes"     , 2, 0 );
 
        osrfAppRegisterMethod( 
                MODULENAME, 
@@ -50,6 +53,15 @@ int osrfAppInitialize() {
                "Destroys the given login session "
                "PARAMS( authToken )",  1, 0 );
 
+       osrfAppRegisterMethod(
+               MODULENAME,
+               "open-ils.auth.session.reset_timeout",
+               "oilsAuthResetTimeout",
+               "Resets the login timeout for the given session "
+               "Returns an ILS Event with payload = session_timeout of session "
+               "is found, otherwise returns the NO_SESSION event"
+               "PARAMS( authToken )", 1, 0 );
+
        return 0;
 }
 
@@ -228,7 +240,12 @@ oilsEvent* oilsAuthHandleLoginOK(
                        "%s%s", OILS_AUTH_CACHE_PRFX, authToken ); 
 
        oilsFMSetString( userObj, "passwd", "" );
-       osrfCachePutObject( authKey, userObj, timeout ); 
+       jsonObject* cacheObj = jsonParseString("{\"authtime\": %lf}", timeout);
+       jsonObjectSetKey( cacheObj, "userobj", jsonObjectClone(userObj));
+
+       //osrfCachePutObject( authKey, userObj, timeout ); 
+       osrfCachePutObject( authKey, cacheObj, timeout ); 
+       jsonObjectFree(cacheObj);
        osrfLogInternal("oilsAuthComplete(): Placed user object into cache");
        jsonObject* payload = jsonParseString(
                "{ \"authtoken\": \"%s\", \"authtime\": %lf }", authToken, timeout );
@@ -294,16 +311,19 @@ int oilsAuthSessionRetrieve( osrfMethodContext* ctx ) {
        OSRF_METHOD_VERIFY_CONTEXT(ctx); 
 
        char* authToken = jsonObjectGetString( jsonObjectGetIndex(ctx->params, 0));
-       jsonObject* userObj = NULL;
+       jsonObject* cacheObj = NULL;
 
        if( authToken ){
-               char* key = va_list_to_string("%s%s", OILS_AUTH_CACHE_PRFX, authToken ); /**/
-               userObj = osrfCacheGetObject( key ); /**/
+               osrfLogDebug("Retrieving auth session: %s", authToken);
+               char* key = va_list_to_string("%s%s", OILS_AUTH_CACHE_PRFX, authToken ); 
+               cacheObj = osrfCacheGetObject( key ); 
+               if(cacheObj) {
+                       osrfAppRespondComplete( ctx, jsonObjectGetKey( cacheObj, "userobj"));
+                       jsonObjectFree(cacheObj);
+               }
                free(key);
        }
 
-       osrfAppRespondComplete( ctx, userObj );
-       jsonObjectFree(userObj);
        return 0;
 }
 
@@ -314,6 +334,7 @@ int oilsAuthSessionDelete( osrfMethodContext* ctx ) {
        jsonObject* resp = NULL;
 
        if( authToken ) {
+               osrfLogDebug("Removing auth session: %s", authToken );
                char* key = va_list_to_string("%s%s", OILS_AUTH_CACHE_PRFX, authToken ); /**/
                osrfCacheRemove(key);
                resp = jsonNewObject(authToken); /**/
@@ -325,5 +346,39 @@ int oilsAuthSessionDelete( osrfMethodContext* ctx ) {
        return 0;
 }
 
+int oilsAuthResetTimeout( osrfMethodContext* ctx ) {
+       OSRF_METHOD_VERIFY_CONTEXT(ctx); 
+
+       jsonObject* cacheObj = NULL;
+       oilsEvent* evt = NULL;
+       double timeout;
+
+       char* authToken = jsonObjectGetString( jsonObjectGetIndex(ctx->params, 0));
+
+       if( authToken ){
+               osrfLogDebug("Resetting auth timeout for session %s", authToken);
+               char* key = va_list_to_string("%s%s", OILS_AUTH_CACHE_PRFX, authToken ); 
+               cacheObj = osrfCacheGetObject( key ); 
+
+               if(!cacheObj) {
+                       evt = oilsNewEvent(OILS_EVENT_NO_SESSION);
+               } else {
+                       timeout = jsonObjectGetNumber( jsonObjectGetKey( cacheObj, "authtime"));
+                       osrfCacheSetExpire( timeout, key );
+                       jsonObject* payload = jsonNewNumberObject(timeout);
+                       evt = oilsNewEvent2(OILS_EVENT_SUCCESS, payload);
+                       jsonObjectFree(payload);
+               }
+
+               free(key);
+       }
+
+       osrfAppRespondComplete( ctx, oilsEventToJSON(evt) );
+       oilsEventFree(evt);
+       jsonObjectFree(cacheObj);
+
+       return 0;
+}
+
 
 
index 784e128..3f832f2 100644 (file)
@@ -9,4 +9,5 @@
 #define OILS_EVENT_SUCCESS "SUCCESS"
 #define OILS_EVENT_AUTH_FAILED "LOGIN_FAILED"
 #define OILS_EVENT_PERM_FAILURE "PERM_FAILURE"
+#define OILS_EVENT_NO_SESSION "NO_SESSION"
 
index 6ecb015..f8839f4 100644 (file)
                        User login failed.  Why the login failed is not specified.
                </desc>
        </event>
+
+       <event code='1001' textcode='NO_SESSION'>
+               <desc>
+                       User login session has either timed out or does not exist.
+               </desc>
+       </event>
+
        <event code='5000' textcode='PERM_FAILURE'>
                <desc> 
                        Permission Error.  * The object returning this code shall also 
index a625f5f..d3a0a0f 100644 (file)
@@ -64,7 +64,7 @@ sub check_user_perms {
 sub check_perms {
        my( $self, $user_id, $org_id, @perm_types ) = @_;
        my $t = $self->check_user_perms( $user_id, $org_id, @perm_types );
-       return OpenILS::Event->new('PERM_FAILURE', perm => $t, permloc => $org_id ) if $t;
+       return OpenILS::Event->new('PERM_FAILURE', ilsperm => $t, ilspermloc => $org_id ) if $t;
        return undef;
 }
 
index dcb518f..8c62a99 100644 (file)
@@ -18,29 +18,17 @@ my $events = undef;
 sub new {
        my( $class, $event, %params ) = @_;
 
-       my $perm = $params{perm};
-       my $permloc = $params{permloc};
-       my $payload = $params{payload};
-
        _load_events() unless $events;
 
        if( $event ne 'SUCCESS' ) {
-               my $p = (defined $perm) ? $perm : "(none)";
-               my $pl = (defined $permloc) ? $permloc  : "(none)";
-               my $pa = (defined $payload) ? $payload : "(none)";
-               $logger->warn("Returning event object $event " . 
-                       "{ ilsperm => $p, ilspermloc => $pl, payload => $pa }");
+               $logger->info("Returning non-success event object: $event ");  
        }
 
        my $e = $events->{$event};
        throw OpenSRF::EX 
                ("No event defined with textcode: $event") unless defined $e;
 
-       my $h = { ilsevent => $e };
-       $h->{paylod}            = $payload if defined $payload;
-       $h->{ilsperm}           = $perm if defined $perm;
-       $h->{ilspermloc}        = $permloc if defined $permloc;
-       $h->{textcode}          = $event;
+       my $h = { ilsevent => $e, textcode => $event, %params };
 
        return $h;
 }
index 9c06508..a63c431 100644 (file)
@@ -84,3 +84,14 @@ int osrfCacheRemove( char* key, ... ) {
 }
 
 
+int osrfCacheSetExpire( time_t seconds, char* key, ... ) {
+       if( key ) {
+               VA_LIST_TO_STRING(key);
+               jsonObject* o = osrfCacheGetObject( VA_BUF );
+               osrfCacheRemove(VA_BUF);
+               return osrfCachePutObject( VA_BUF, o, seconds );
+       }
+       return -1;
+}
+
+
index 2159bdd..317cdd0 100644 (file)
@@ -74,5 +74,10 @@ char* osrfCacheGetString( char* key, ... );
   */
 int osrfCacheRemove( char* key, ... );
 
+/**
+ * Sets the expire time to 'seconds' for the given key
+ */
+int osrfCacheSetExpire( time_t seconds, char* key, ... );
+