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 rayon for concurrency. The library was written to achieve high performance and python bindings.

Built With

Performance

CPU

Library Time Peak Memory
PyRepScan 4s 501,708 kb
gitleaks 507s 823,016 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.8.0

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

Total release size: 12.2 MB

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

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

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

Download URL pyrepscan-0.8.0-cp39-cp39-manylinux2014_x86_64.whl
Size 1.1 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
60b0d619cc0536b0529a99a0587b9564e4125b428727ecf6acc974be1732b2c2
BLAKE2b-256 checksum
How to use checksums
791c7a850e6aba5bd54514fd49194684c26fb20d45dacc0afa96ec87fec19c40
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

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

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

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

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

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

Download URL pyrepscan-0.8.0-cp38-cp38-manylinux2014_x86_64.whl
Size 1.1 MB
Tags CPython 3.8 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
c97154a7f3318e1db707511a13ed8cf553bc572ce9cbe059f71ac284387db35f
BLAKE2b-256 checksum
How to use checksums
38fce142662c73da52bf57bc9057f3437fd1e2ec5b1e624226f605ce89c2edbd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

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

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

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

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

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

Download URL pyrepscan-0.8.0-cp37-cp37m-manylinux2014_x86_64.whl
Size 1.1 MB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
32f05b23e34d4a3ea7faf970e1c7348e3e84257702ffd9b4ea44794b3c571939
BLAKE2b-256 checksum
How to use checksums
899f846a280dde5a847476260fb1729adbbd2d1d580988abe61c15feb25297f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

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

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

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

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

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

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

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

Download URL pyrepscan-0.8.0-cp36-cp36m-macosx_10_7_x86_64.whl
Size 937.2 kB
Tags CPython 3.6 CPython 3.6 pymalloc macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
edf8c49710c0b3f9628ad736bad0df4d0d148fc2fc5c80d914fa8b3cc33bf95f
BLAKE2b-256 checksum
How to use checksums
50a176fff355c7a429bb9a084b69b6824ab4b5ce701ad123d44e6bd9b7170e64
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

0.9.1

12 release files

0.9.0

12 release files

This release

0.8.0 This release

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