# # # # auth_access_code_util.cfv # access code utilities for temporary URL handling upon forget your password and password reset. # # # # # # # get_is_valid_temporary_url_access_code_time() # # # subroutine(get_is_valid_temporary_url_access_code_time( int access_code_creation_time), ( # Returns true for is_valid if the acces_code has not been expired # or false otherwise. int current_time = now(); int expires_time = access_code_creation_time + (3600 * 24); # Expires 24 hours after creation time bool is_valid = (current_time < expires_time); # Return is_valid; )); # # # # create_temporary_url_access_code() # # # subroutine(create_temporary_url_access_code( string user_node_name), ( debug_message("\n\n#### create_temporary_url_access_code() \n\n"); # This creates and returns a new access_code for the given user_node_name # and saves all relevant data in system.cfg string timestamp = now(); string access_code = get_token() . md5_digest(user_node_name . timestamp); debug_message("#### access_code via get_token(): " . access_code . "\n"); # Save access_code in system.temporary_user_access_codes}{user_node_name} "system.temporary_user_access_codes." . user_node_name = ""; node n = "system.temporary_user_access_codes." . user_node_name; n{"user_node_name"} = user_node_name; n{"access_code"} = access_code; n{"access_code_creation_time"} = timestamp; save_node("system"); # Return access_code; )); # # # # delete_temporary_url_access_code() # # # subroutine(delete_temporary_url_access_code( string user_node_name), ( if (?("system.temporary_user_access_codes." . user_node_name)) then ( delete_node("system.temporary_user_access_codes." . user_node_name); save_node("system"); ); )); # # # # get_temporary_url_access_code_info() # # # subroutine(get_temporary_url_access_code_info( string access_code), ( debug_message("\n\n#### get_temporary_url_access_code_info() \n\n"); # This returns a node with info about the given access_code # bool is_valid: true if the access code exists and has not yet expired # string user_node_name: the user node name if the access code exists # This checks if the access code exists and is not expired. # It returns the user_node_name if the access_code exists in system.cfg # and is not yet expired, otherwise it returns an empty string bool is_valid = false; string user_node_name; node info = new_node(); # # Check if this is a valid access_code # if (?("system.temporary_user_access_codes")) then ( node temporary_user_access_codes = "system.temporary_user_access_codes"; node item; int access_code_creation_time = 0; bool is_valid = false; foreach item temporary_user_access_codes ( if (@item{"access_code"} eq access_code) then ( # Found item with given access_code, check if it is still valid user_node_name = @item{"user_node_name"}; access_code_creation_time = @item{"access_code_creation_time"}; is_valid = get_is_valid_temporary_url_access_code_time(access_code_creation_time); last; ); ); ); @info{"is_valid"} = is_valid; @info{"user_node_name"} = user_node_name; # Return info; )); # # # # delete_expired_user_access_codes() # # # subroutine(delete_expired_user_access_codes, ( # This does some houskeeping by deleting expired # temporary_user_access_codes in system.cfg if (?("system.temporary_user_access_codes") and (num_subnodes("system.temporary_user_access_codes") > 0)) then ( node temporary_user_access_codes = "system.temporary_user_access_codes"; node users = "users"; string user_node_name; int access_code_creation_time = 0; node item; bool is_valid; bool is_modified = false; foreach item temporary_user_access_codes ( is_valid = false; user_node_name = @item{"user_node_name"}; access_code_creation_time = @item{"access_code_creation_time"}; # if user does not anymore exist or if expired if (!users?{user_node_name} or !get_is_valid_temporary_url_access_code_time(access_code_creation_time)) then ( # Delete the access_code delete_node(item); is_modified = true; ); ); # Save system.cfg is_modified if (is_modified) then ( save_node("system"); ); ); ));