@@ -51,9 +51,9 @@ def index_results_by_secret(results: Iterable[dict]) -> dict:
5151 return indexed_results
5252
5353
54- def change_state (hostname , old_result : dict , new_result : dict ) -> None :
54+ def change_state (hostname , old_result : dict , new_result : dict , verify : bool | str = True ) -> None :
5555 """Change the state of the alert to match the existing result using the GitHub API to update the alert."""
56- g = GitHub (hostname = hostname )
56+ g = GitHub (hostname = hostname , verify = verify )
5757
5858 repo_name = new_result ["repo" ]
5959
@@ -83,7 +83,7 @@ def change_state(hostname, old_result: dict, new_result: dict) -> None:
8383
8484
8585def resolve_duplicates (
86- indexed_results : dict , matching_secrets_lookup : dict , hostname : str
86+ indexed_results : dict , matching_secrets_lookup : dict , hostname : str , verify : bool | str = True
8787) -> None :
8888 """Resolve duplicates by matching on a new secret type and updating the state of the alert to match the existing result."""
8989 for repo , repo_results in indexed_results .items ():
@@ -107,7 +107,7 @@ def resolve_duplicates(
107107 LOG .info (f"State mismatch, updating state: { new_result ['state' ]} != { old_result ['state' ]} " )
108108
109109 if old_result ["state" ] != "pattern_edited" :
110- change_state (hostname , old_result , new_result )
110+ change_state (hostname , old_result , new_result , verify = verify )
111111
112112
113113def add_args (parser : argparse .ArgumentParser ) -> None :
@@ -145,6 +145,18 @@ def add_args(parser: argparse.ArgumentParser) -> None:
145145 required = False ,
146146 help = "GitHub Enterprise hostname (defaults to github.com)" ,
147147 )
148+ parser .add_argument (
149+ "--ca-cert-bundle" ,
150+ "-C" ,
151+ type = str ,
152+ required = False ,
153+ help = "Path to CA certificate bundle in PEM format (e.g. for self-signed server certificates)"
154+ )
155+ parser .add_argument (
156+ "--no-verify-tls" ,
157+ action = "store_true" ,
158+ help = "Do not verify TLS connection certificates (warning: insecure)"
159+ )
148160 parser .add_argument (
149161 "--debug" , "-d" , action = "store_true" , help = "Enable debug logging"
150162 )
@@ -174,6 +186,16 @@ def main() -> None:
174186 name = args .name
175187 state = args .state
176188 hostname = args .hostname
189+ verify = True
190+
191+ if args .ca_cert_bundle :
192+ verify = args .ca_cert_bundle
193+
194+ if args .no_verify_tls :
195+ verify = False
196+ LOG .warning ("Disabling TLS verification. This is insecure and should not be used in production" )
197+ import urllib3
198+ urllib3 .disable_warnings (urllib3 .exceptions .InsecureRequestWarning )
177199
178200 if not GitHub .check_name (args .name , scope ):
179201 raise ValueError ("Invalid name: %s for %s" , args .name , scope )
@@ -187,15 +209,15 @@ def main() -> None:
187209 matching_secrets_lookup = {k : v for k , v in matching_secrets }
188210
189211 # find secret scanning alerts
190- results = list_secret_scanning_alerts (name , scope , hostname , state = state , since = since , include_secret = True )
212+ results = list_secret_scanning_alerts (name , scope , hostname , state = state , since = since , include_secret = True , verify = verify )
191213 if not results :
192214 LOG .info ("No secret scanning alerts found" )
193215 return
194216
195217 # index results by secret and type for easy lookup
196218 indexed_results = index_results_by_secret (results )
197219
198- resolve_duplicates (indexed_results , matching_secrets_lookup , hostname )
220+ resolve_duplicates (indexed_results , matching_secrets_lookup , hostname , verify = verify )
199221
200222
201223if __name__ == "__main__" :
0 commit comments