This file adapted from @Tomasino's example project

import os

import string

import random

from urllib.parse import parse_qs

allowedCerts={

"" : ""

}

def get_client_cert(cert_reqd = False, restricted_auth = False):

TLS_CLIENT_HASH = os.getenv('TLS_CLIENT_HASH')

if (TLS_CLIENT_HASH is None) and (cert_reqd):

Client hasn't provided client cert, so prompt for one

show_header_cert_required()

elif (restricted_auth == True and TLS_CLIENT_HASH not in allowedCerts.values()):

Reject login if we are restricting to allowed certificates

show_wrong_cert()

return TLS_CLIENT_HASH

def show_wrong_cert():

print("61 Cert not authorized\r\n")

def get_query_string(unparsed = False):

qStr = os.getenv('QUERY_STRING')

if (qStr == None) or (unparsed) :

return qStr

return parse_qs(qStr)

def show_header_ok():

print("20 text/gemini; charset=utf-8", end = "\r\n")

def temp_redirect(url):

print(f"30 {url} ", end = "\r\n")

def show_header_cert_required():

print("60 text/gemini; charset=utf-8", end = "\r\n")

quit()

def show_query_string_required(msg):

print("10 " + msg, end = "\r\n")

quit()

def get_path_info():

return os.getenv("PATH_INFO")

def read_file(fullPath):

#TODO: error handling for file path

contents = ""

with open(fullPath) as f:

contents = f.read()

return contents

def id_generator(size=12, chars=string.ascii_uppercase + string.digits):

return ''.join(random.choice(chars) for _ in range(size))


Source