Skip to main content

Logo

A Git Repository Secrets Scanner written in Rust

license Python Build PyPi

Table of Contents

About The Project

PyRepScan is a python library written in Rust. The library uses git2-rs for repository parsing and traversing, regex for regex pattern matching and crossbeam for concurrency. The library was written to achieve high performance and python bindings.

Built With

Performance

CPU

Library Time Peak Memory
PyRepScan 8.74s 1,149,152 kb
gitleaks 1118s 1,146,300 kb

Installation

pip3 install PyRepScan

Documentation

class GitRepositoryScanner:
    def __init__(
      self,
    ) -> None

This class holds all the added rules for fast reuse.

def add_content_rule(
    self,
    name: str,
    pattern: str,
    whitelist_patterns: typing.List[str],
    blacklist_patterns: typing.List[str],
) -> None

The add_content_rule function adds a new rule to an internal list of rules that could be reused multiple times against different repositories. The same name can be used multiple times and would lead to results which can hold the same name. Content rule means that the regex pattern would be tested against the content of the files.

  • name - The name of the rule so it can be identified.
  • pattern - The regex pattern (Rust Regex syntax) to match against the content of the commited files.
  • whitelist_patterns - A list of regex patterns (Rust Regex syntax) to match against the content of the committed file to filter in results. Only one of the patterns should be matched to pass through the result. There is an OR relation between the patterns.
  • blacklist_patterns - A list of regex patterns (Rust Regex syntax) to match against the content of the committed file to filter out results. Only one of the patterns should be matched to omit the result. There is an OR relation between the patterns.
def add_file_path_rule(
    self,
    name: str,
    pattern: str,
) -> None

The add_file_path_rule function adds a new rule to an internal list of rules that could be reused multiple times against different repositories. The same name can be used multiple times and would lead to results which can hold the same name. File name rule means that the regex pattern would be tested against the file paths.

  • name - The name of the rule so it can be identified.
  • pattern - The regex pattern (Rust Regex syntax) to match against the file paths of the commited files.
def add_file_extension_to_skip(
    self,
    file_extension: str,
) -> None

The add_file_extension_to_skip function adds a new file extension to the filtering phase to reduce the amount of inspected files and to increase the performance of the scan.

  • file_extension - A file extension, without a leading dot, to filter out from the scan.
def add_file_path_to_skip(
    self,
    file_path: str,
) -> None

The add_file_path_to_skip function adds a new file path pattern to the filtering phase to reduce the amount of inspected files and to increase the performance of the scan. Every file path that would include the file_path substring would be left out of the scanned files.

  • file_path - If the inspected file path would include this substring, it won't be scanned. This parameter is a free text.
def scan(
    self,
    repository_path: str,
    branch_glob_pattern: typing.Optional[str],
    from_timestamp: typing.Optional[int],
) -> typing.List[typing.Dict[str, str]]

The scan function is the main function in the library. Calling this function would trigger a new scan that would return a list of matches. The scan function is a multithreaded operation, that would utilize all the available core in the system. The results would not include the file content but only the regex matching group. To retrieve the full file content one should take the results['oid'] and to call get_file_content function.

  • repository_path - The git repository folder path.
  • branch_glob_pattern - A glob pattern to filter branches for the scan. If None is sent, defaults to *.
  • from_timestamp - A UTC timestamp (Int) that only commits that were created after this timestamp would be included in the scan. If None is sent, defaults to 0.

A sample result would look like this:

{
    'rule_name': 'First Rule',
    'author_email': 'author@email.email',
    'author_name': 'Author Name',
    'commit_id': '1111111111111111111111111111111111111111',
    'commit_message': 'The commit message',
    'commit_time': '2020-01-01T00:00:00e',
    'file_path': 'full/file/path',
    'file_oid': '47d2739ba2c34690248c8f91b84bb54e8936899a',
    'match': 'The matched group',
}
def scan_from_url(
    self,
    url: str,
    repository_path: str,
    branch_glob_pattern: typing.Optional[str],
    from_timestamp: typing.Optional[int],
) -> typing.List[typing.Dict[str, str]]

The same as scan function but also clones a repository from a given URL into the provided repository path.

  • url - URL of a git repository.
  • repository_path - The path to clone the repository to
  • branch_glob_pattern - A glob pattern to filter branches for the scan. If None is sent, defaults to *.
  • from_timestamp - A UTC timestamp (Int) that only commits that were created after this timestamp would be included in the scan. If None is sent, defaults to 0.
def get_file_content(
    self,
    repository_path: str,
    file_oid: str,
) -> bytes

The get_file_content function exists to retrieve the content of a file that was previously matched. The full file content is omitted from the results to reduce the results list size and to deliver better performance.

  • repository_path - The git repository folder path.
  • file_oid - A string representing the file oid. This parameter exists in the results dictionary returned by the scan function.

Usage

import pyrepscan

grs = pyrepscan.GitRepositoryScanner()

# Adds a specific rule, can be called multiple times or none
grs.add_content_rule(
    name='First Rule',
    pattern=r'(-----BEGIN PRIVATE KEY-----)',
    whitelist_patterns=[],
    blacklist_patterns=[],
)
grs.add_file_path_rule(
    name='Second Rule',
    pattern=r'.+\.pem',
)
grs.add_file_path_rule(
    name='Third Rule',
    pattern=r'(prod|dev|stage).+key',
)

# Add file extensions to ignore during the search
grs.add_file_extension_to_skip(
    file_extension='bin',
)
grs.add_file_extension_to_skip(
    file_extension='jpg',
)

# Add file paths to ignore during the search. Free text is allowed
grs.add_file_path_to_skip(
    file_path='site-packages',
)
grs.add_file_path_to_skip(
    file_path='node_modules',
)

# Scans a repository
results = grs.scan(
    repository_path='/repository/path',
    branch_glob_pattern='*',
)

# Results is a list of dicts. Each dict is in the following format:
{
    'rule_name': 'First Rule',
    'author_email': 'author@email.email',
    'author_name': 'Author Name',
    'commit_id': '1111111111111111111111111111111111111111',
    'commit_message': 'The commit message',
    'commit_time': '2020-01-01T00:00:00e',
    'file_path': 'full/file/path',
    'file_oid': '47d2739ba2c34690248c8f91b84bb54e8936899a',
    'match': 'The matched group',
}

# Fetch the file_oid full content
file_content = grs.get_file_content(
    repository_path='/repository/path',
    file_oid='47d2739ba2c34690248c8f91b84bb54e8936899a',
)

# file_content
b'binary data'

# Creating a RulesManager directly
rules_manager = pyrepscan.RulesManager()

# For testing purposes, check your regexes pattern using check_pattern function
rules_manager.check_pattern(
    content='some content1 to check, another content2 in the same line\nanother content3 in another line\n',
    pattern=r'(content\d)',
)

# Results are the list of captured matches
[
    'content1',
    'content2',
    'content3',
]

License

Distributed under the MIT License. See LICENSE for more information.

Contact

Gal Ben David - gal@intsights.com

Project Link: https://github.com/intsights/PyRepScan

Metadata

Release files for pyrepscan 0.9.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for pyrepscan 0.9.2
File
pyrepscan-0.9.2-cp39-none-win_amd64.whl CPython 3.9 none Windows x86-64 Details
pyrepscan-0.9.2-cp39-cp39-manylinux2014_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.17+ x86-64 Details
pyrepscan-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl CPython 3.9 CPython 3.9 macOS 10.7+ x86-64 Details
pyrepscan-0.9.2-cp38-none-win_amd64.whl CPython 3.8 none Windows x86-64 Details
pyrepscan-0.9.2-cp38-cp38-manylinux2014_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.17+ x86-64 Details
pyrepscan-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl CPython 3.8 CPython 3.8 macOS 10.7+ x86-64 Details
pyrepscan-0.9.2-cp37-none-win_amd64.whl CPython 3.7 none Windows x86-64 Details
pyrepscan-0.9.2-cp37-cp37m-manylinux2014_x86_64.whl CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.17+ x86-64 Details
pyrepscan-0.9.2-cp37-cp37m-macosx_10_7_x86_64.whl CPython 3.7 CPython 3.7 pymalloc macOS 10.7+ x86-64 Details
pyrepscan-0.9.2-cp36-none-win_amd64.whl CPython 3.6 none Windows x86-64 Details
pyrepscan-0.9.2-cp36-cp36m-manylinux2014_x86_64.whl CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.17+ x86-64 Details
pyrepscan-0.9.2-cp36-cp36m-macosx_10_7_x86_64.whl CPython 3.6 CPython 3.6 pymalloc macOS 10.7+ x86-64 Details

Total release size: 11.9 MB

Release files / pyrepscan-0.9.2-cp39-none-win_amd64.whl

Download URL pyrepscan-0.9.2-cp39-none-win_amd64.whl
Size 1.0 MB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
3c03520545900c4d010e8050b253930b4f04d2a600aecc5d1ed9ad16a13e67bd
BLAKE2b-256 checksum
How to use checksums
06d6db64b333c30d695980be69e3a6b6b21382506b83a430a2c82727fcf31812
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release files / pyrepscan-0.9.2-cp39-cp39-manylinux2014_x86_64.whl

Download URL pyrepscan-0.9.2-cp39-cp39-manylinux2014_x86_64.whl
Size 1.0 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
3cb5fd613e6cae82356276ce18f639d48c8c7568a1f14587115bd3beb11377cc
BLAKE2b-256 checksum
How to use checksums
cf912163adea1959c78d1fb3ba86b0f9f9488e6a90f6b74bb5846557b6fb38d6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release files / pyrepscan-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl

Download URL pyrepscan-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl
Size 921.7 kB
Tags CPython 3.9 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
e4d640f13a5c05616a79b66398ecec328880b7c8f853b6896250fc12a4f10c09
BLAKE2b-256 checksum
How to use checksums
b982be744c0763a6e0450ebf72c8963279aade5db9cc6d0dceee4a3a4a817ece
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release files / pyrepscan-0.9.2-cp38-none-win_amd64.whl

Download URL pyrepscan-0.9.2-cp38-none-win_amd64.whl
Size 1.0 MB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
b80e76d42eac49ed79d8de41910c6aa1c05e5e0cc4ddc5d1fc5032e17fa5f5e5
BLAKE2b-256 checksum
How to use checksums
33282f6a5954ea3136fbd49a0749c5ebc4faca175dbc8fd693e3c5237fd49a61
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release files / pyrepscan-0.9.2-cp38-cp38-manylinux2014_x86_64.whl

Download URL pyrepscan-0.9.2-cp38-cp38-manylinux2014_x86_64.whl
Size 1.0 MB
Tags CPython 3.8 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
56335ed324cee937747102a266b268964a32daec7160bbcfc288be961e670a8b
BLAKE2b-256 checksum
How to use checksums
7ae3ab6bc0921086cffdb99b3e1154bece2aa840bb5d2bc4d65abbd9b25142e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release files / pyrepscan-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl

Download URL pyrepscan-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl
Size 921.8 kB
Tags CPython 3.8 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
d8a91b8361b9ad8411212f98441e58c4904396d9f3e9f320bd7a8ed170534fcd
BLAKE2b-256 checksum
How to use checksums
727e8e62a20eb4f877be884937439607247514357cbcb9367d2de840499f4b38
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release files / pyrepscan-0.9.2-cp37-none-win_amd64.whl

Download URL pyrepscan-0.9.2-cp37-none-win_amd64.whl
Size 1.0 MB
Tags CPython 3.7 Windows x86-64
SHA-256 checksum
How to use checksums
11f94c4390d3aca756b17ad1c0dc18f417c06c48aa2bf9f910d7f70514e6fad4
BLAKE2b-256 checksum
How to use checksums
f502d2f67480bbb0ca3e6e12653e6a67de1916c667175a8db7a37b4694e44af0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release files / pyrepscan-0.9.2-cp37-cp37m-manylinux2014_x86_64.whl

Download URL pyrepscan-0.9.2-cp37-cp37m-manylinux2014_x86_64.whl
Size 1.0 MB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
5bbc0248ae6014f40ac6a8eef1e8a9963d8b307afe3016cacad6c516caa5f9c6
BLAKE2b-256 checksum
How to use checksums
620b5e11e0b03f2b302546175b59cc20f41ec86ca2b00854defffa66d0724d95
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release files / pyrepscan-0.9.2-cp37-cp37m-macosx_10_7_x86_64.whl

Download URL pyrepscan-0.9.2-cp37-cp37m-macosx_10_7_x86_64.whl
Size 921.8 kB
Tags CPython 3.7 CPython 3.7 pymalloc macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
54e5f4e8f7341b594c31bafebb802f622a2f4cfb56e85ff1a49f6195da380a15
BLAKE2b-256 checksum
How to use checksums
ac9bcfabed1dc6a37a23b502095462d82696f9c9596eb9c7b7cad6e7a8e88b92
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release files / pyrepscan-0.9.2-cp36-none-win_amd64.whl

Download URL pyrepscan-0.9.2-cp36-none-win_amd64.whl
Size 1.0 MB
Tags CPython 3.6 Windows x86-64
SHA-256 checksum
How to use checksums
c02e5489a19d104ff1646f29295d28f35950f06e85ba6746a996139d9edfa0ba
BLAKE2b-256 checksum
How to use checksums
dd1766b39e157a934933556815e873c30128d52d9e3b9e03006a164055d988cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release files / pyrepscan-0.9.2-cp36-cp36m-manylinux2014_x86_64.whl

Download URL pyrepscan-0.9.2-cp36-cp36m-manylinux2014_x86_64.whl
Size 1.0 MB
Tags CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
1ebf19ad654b3ef724fa643f45b2a94017fb6a379e86e357a5b332269ace4206
BLAKE2b-256 checksum
How to use checksums
88650154ded74e31452f0cb93f156d3b08ccae468f0ea3d8be8bc484ab1b8a21
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release files / pyrepscan-0.9.2-cp36-cp36m-macosx_10_7_x86_64.whl

Download URL pyrepscan-0.9.2-cp36-cp36m-macosx_10_7_x86_64.whl
Size 921.7 kB
Tags CPython 3.6 CPython 3.6 pymalloc macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
be895b6c37713663f1bf7dc7925679930b86b4cb14aa5d7d7a51af1f92bd2fd2
BLAKE2b-256 checksum
How to use checksums
b30d7b84c69bb2303adc027548160a9408034bfb1a8ca5ee1dccaf7fc4308bd7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

Release history Release notifications | RSS feed

0.9.6

9 release files

0.9.5

6 release files

0.9.4

7 release files

0.9.3

6 release files

This release

0.9.2 This release

12 release files

0.9.1

12 release files

0.9.0

12 release files

0.8.0

12 release files

0.7.4

12 release files

0.7.2

12 release files

0.7.1

9 release files

0.7.0

9 release files

0.6.1

1 release file

0.6.0

1 release file

0.5.2

1 release file

0.5.1

1 release file

0.5.0

1 release file

0.4.1

1 release file

0.4.0

1 release file

0.3.1

1 release file

0.3.0

1 release file

0.2.2

1 release file

0.2.1

1 release file

0.2.0

1 release file

0.1.4

1 release file

0.1.3

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1.0

9 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page