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.1

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.1
File
pyrepscan-0.9.1-cp39-none-win_amd64.whl CPython 3.9 none Windows x86-64 Details
pyrepscan-0.9.1-cp39-cp39-manylinux2014_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.17+ x86-64 Details
pyrepscan-0.9.1-cp39-cp39-macosx_10_7_x86_64.whl CPython 3.9 CPython 3.9 macOS 10.7+ x86-64 Details
pyrepscan-0.9.1-cp38-none-win_amd64.whl CPython 3.8 none Windows x86-64 Details
pyrepscan-0.9.1-cp38-cp38-manylinux2014_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.17+ x86-64 Details
pyrepscan-0.9.1-cp38-cp38-macosx_10_7_x86_64.whl CPython 3.8 CPython 3.8 macOS 10.7+ x86-64 Details
pyrepscan-0.9.1-cp37-none-win_amd64.whl CPython 3.7 none Windows x86-64 Details
pyrepscan-0.9.1-cp37-cp37m-manylinux2014_x86_64.whl CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.17+ x86-64 Details
pyrepscan-0.9.1-cp37-cp37m-macosx_10_7_x86_64.whl CPython 3.7 CPython 3.7 pymalloc macOS 10.7+ x86-64 Details
pyrepscan-0.9.1-cp36-none-win_amd64.whl CPython 3.6 none Windows x86-64 Details
pyrepscan-0.9.1-cp36-cp36m-manylinux2014_x86_64.whl CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.17+ x86-64 Details
pyrepscan-0.9.1-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.1-cp39-none-win_amd64.whl

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

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

Download URL pyrepscan-0.9.1-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
85247ba518e751ba6688abd6810f56ca7cca72bde10a42e421024c6633cb23b0
BLAKE2b-256 checksum
How to use checksums
6e0e10597bb45642786ca8be8a30558eb7de316368475da7072cdb325c6ab698
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

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

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

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

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

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

Download URL pyrepscan-0.9.1-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
53bdb7e8840b1a769ce3c232b477531a958604ac6aebe5f29f564ae3cbafe858
BLAKE2b-256 checksum
How to use checksums
7054536ab1b4a3df9ab36b0b5c590a13b6fb897e27e909d86e54809a509f6524
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

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

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

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

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

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

Download URL pyrepscan-0.9.1-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
e8fe9bb808a18cbaf30ccec40cb0b3533b2204aaf169966e7cb152d733edc619
BLAKE2b-256 checksum
How to use checksums
dc999f9b806e1bd050994e36a72b90d8c27623eaf0c9bac8cf262205981f3b28
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

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

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

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

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

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

Download URL pyrepscan-0.9.1-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
8f717d7db357622ed2d340de0739970674efd8e9ec5062fe4e9c1f35980f15ff
BLAKE2b-256 checksum
How to use checksums
c4df9cc89d4caa043289b8554b6b93422ff2aced65f05a06a20143902962fd06
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

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

Download URL pyrepscan-0.9.1-cp36-cp36m-macosx_10_7_x86_64.whl
Size 922.6 kB
Tags CPython 3.6 CPython 3.6 pymalloc macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
7751d9f3d0aca77472b3c7f6991ca921c763208f98a03799eca8ca59d577f853
BLAKE2b-256 checksum
How to use checksums
7ff2e6f8d4c18c06c9660f26a9a51b0d53112d190eb6b93cdbe2160636d6c4a5
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

0.9.2

12 release files

This release

0.9.1 This release

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