From 9917a9882eff675567007194661df57450016c89 Mon Sep 17 00:00:00 2001 From: Jeffrey Armstrong Date: Fri, 6 May 2022 12:53:08 -0400 Subject: Login and session tracking now works via Gemini. Need to restrict operations in Gemini based on request auth levels still. --- captain/requtils.f90 | 73 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 51 insertions(+), 22 deletions(-) (limited to 'captain/requtils.f90') diff --git a/captain/requtils.f90 b/captain/requtils.f90 index 620170a..03fe869 100644 --- a/captain/requtils.f90 +++ b/captain/requtils.f90 @@ -41,8 +41,9 @@ implicit none contains pure function success_code(req) - use http, only: HTTP_SUCCESS => HTTP_CODE_SUCCESS - use server_response, only: request, GEMINI_SUCCESS => GEMINI_CODE_SUCCESS + use http_codes, only: HTTP_SUCCESS => HTTP_CODE_SUCCESS + use gemini_codes, only: GEMINI_SUCCESS => GEMINI_CODE_SUCCESS + use server_response, only: request implicit none class(request), intent(in)::req @@ -57,8 +58,9 @@ contains end function success_code pure function notfound_code(req) - use http, only: HTTP_FAIL => HTTP_CODE_NOTFOUND - use server_response, only: request, GEMINI_FAIL => GEMINI_CODE_PERMFAIL + use http_codes, only: HTTP_FAIL => HTTP_CODE_NOTFOUND + use gemini_codes, only: GEMINI_FAIL => GEMINI_CODE_PERMFAIL + use server_response, only: request implicit none class(request), intent(in)::req @@ -73,8 +75,9 @@ contains end function notfound_code pure function notpermitted_code(req) - use http, only: HTTP_UNAUTHORIZED => HTTP_CODE_UNAUTHORIZED - use server_response, only: request, GEMINI_UNAUTHORIZED => GEMINI_CODE_BAD_REQUEST + use http_codes, only: HTTP_UNAUTHORIZED => HTTP_CODE_UNAUTHORIZED + use gemini_codes, only: GEMINI_UNAUTHORIZED => GEMINI_CODE_BAD_REQUEST + use server_response, only: request implicit none class(request), intent(in)::req @@ -285,19 +288,31 @@ contains end function request_static - function build_link(link, label, gemini_mode) result(res) + function build_link(link, label, gemini_mode, session_token) result(res) + use server_response, only: gemini_session_link_url implicit none character(*), intent(in)::link, label logical, intent(in)::gemini_mode + + ! Passed in to prepend a session identifier in gemini + character(len=:), pointer, intent(in), optional::session_token character(len=:), pointer::res + character(len=:), pointer::gemlink integer::nl if(gemini_mode) then - nl = len_trim(link) + len_trim(label) + len('=> ') + if(present(session_token)) then + gemlink => gemini_session_link_url(link, session_token) + else + gemlink => gemini_session_link_url(link, null()) + end if + + nl = len_trim(gemlink) + len_trim(label) + len('=> ') + allocate(character(len=nl)::res) - res = '=> '//trim(link)//' '//trim(label) + res = '=> '//trim(gemlink)//' '//trim(label) else @@ -530,7 +545,7 @@ contains end function generate_simple_pager - function render_jobs_links(jobs, startindex, stopindex, gemini_mode, link_prefix) result(res) + function render_jobs_links(jobs, startindex, stopindex, gemini_mode, link_prefix, session_token) result(res) use captain_db implicit none @@ -538,11 +553,16 @@ contains integer, intent(in), optional::startindex, stopindex logical, intent(in)::gemini_mode character(*), intent(in), optional::link_prefix + character(len=:), intent(in), pointer, optional::session_token character(len=:), pointer::res integer::nsize, i, first, last character(len=16)::int_text character(len=(2*PLAYER_NAME_LENGTH + 64))::link + + character(len=:), pointer::link_pointer + character(len=:), pointer::internal_session_token + character(PLAYER_NAME_LENGTH)::player, instruction character(1)::nl = new_line(' ') character(64)::int_link_prefix @@ -553,6 +573,12 @@ contains int_link_prefix = " " end if + if(present(session_token)) then + internal_session_token => session_token + else + internal_session_token => null() + end if + if(.not. associated(jobs)) then allocate(character(len=32)::res) res = "None Yet" @@ -585,13 +611,17 @@ contains write(int_text, '(I8)') jobs(i)%id if(gemini_mode) then - link = "=> "//trim(int_link_prefix)//"jobs/"// & - trim(adjustl(int_text))//".gmi "// & - trim(get_status_utf8(jobs(i)%status))//" Job "// & - trim(adjustl(int_text))//" - "//trim(instruction) + + link_pointer => build_link(trim(int_link_prefix)//"jobs/"//trim(adjustl(int_text))//".gmi", & + trim(get_status_utf8(jobs(i)%status))//" Job "// & + trim(adjustl(int_text))//" - "//trim(instruction), & + .true., internal_session_token) - res = trim(res)//nl//nl//trim(link) + res = trim(res)//nl//nl//link_pointer + deallocate(link_pointer) + else + res = trim(res)//nl//'
  • ' end select - - link = '

    '// & - trim(get_status_utf8(jobs(i)%status))//" Job "// & - trim(adjustl(int_text))//" - "//trim(instruction)// & - '

    ' + link_pointer => build_link(trim(int_link_prefix)//'jobs/'//trim(adjustl(int_text))//'.html', & + trim(get_status_utf8(jobs(i)%status))//" Job "// & + trim(adjustl(int_text))//" - "//trim(instruction), & + .false., internal_session_token) - res = trim(res)//nl//trim(link)//nl//"

    " + res = trim(res)//nl//"

    "//link_pointer//'

    '//nl//"

    " + deallocate(link_pointer) endif select case(jobs(i)%status) -- cgit v1.2.3