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

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

Total release size: 10.6 MB

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

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

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

Download URL pyrepscan-0.7.4-cp39-cp39-manylinux2014_x86_64.whl
Size 853.4 kB
Tags CPython 3.9 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
f56c73e7decd9587a5428f2f00ffba10dc1123743a4f74909a23caf03852b2ed
BLAKE2b-256 checksum
How to use checksums
7ba09596bb30b794c5603f29d495496171c7facb5b43c318f24e80b5225f0890
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.0

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

Download URL pyrepscan-0.7.4-cp39-cp39-macosx_10_7_x86_64.whl
Size 754.8 kB
Tags CPython 3.9 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
4406498a457cb447c10a63c8879f3b66eb324f5a0331efeaff05610a2043ac52
BLAKE2b-256 checksum
How to use checksums
32966d6bcb27d30cd2c02fd01df6fdbb6714357aaa41fa51819664fdf5d8744d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.0

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

Download URL pyrepscan-0.7.4-cp38-none-win_amd64.whl
Size 1.0 MB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
1d705af3010a7e301b1b55c7fb0fc309a774a8cc27b86b3e3e4497e075d36a79
BLAKE2b-256 checksum
How to use checksums
4065dd109d21019f0ec8ff99e6b049c457a3535247f28efd912292aca1431556
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.0

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

Download URL pyrepscan-0.7.4-cp38-cp38-manylinux2014_x86_64.whl
Size 853.3 kB
Tags CPython 3.8 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
370a51658e99ba981cc23f6e3b5c1829128f34612a8cd9e69e25df1b65ed1417
BLAKE2b-256 checksum
How to use checksums
9384dd04d826e6f06442a73a18bc04e75db61e87d0efc8fd85ade0364cfc5526
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.0

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

Download URL pyrepscan-0.7.4-cp38-cp38-macosx_10_7_x86_64.whl
Size 754.7 kB
Tags CPython 3.8 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
64325b50974011b0cb0089e963e2fcb3e936afeb3105db69ad9acc173e8caecc
BLAKE2b-256 checksum
How to use checksums
e6c8d643fe9b5e97a11bd72fb2a390a771eb03890d159174c7b728254619e0fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.0

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

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

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

Download URL pyrepscan-0.7.4-cp37-cp37m-manylinux2014_x86_64.whl
Size 852.8 kB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
ab545cdbd70062ace959ffb7865e0f5ed153dc48df3cb266439acb993b60826f
BLAKE2b-256 checksum
How to use checksums
18f1d485e99ad4f5ae6635b4d748538aa7a2360be446ac549980f025c826ceb5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.0

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

Download URL pyrepscan-0.7.4-cp37-cp37m-macosx_10_7_x86_64.whl
Size 754.2 kB
Tags CPython 3.7 CPython 3.7 pymalloc macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
dfbfc72e8a7dc156e9321a398f6e770194dd99cdc636278fbf28b2d1152047a4
BLAKE2b-256 checksum
How to use checksums
dfc6a2f9dfa379921a5f2de744c4c37812dcd312fbf0a0b1bc6cbbb18938990c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.0

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

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

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

Download URL pyrepscan-0.7.4-cp36-cp36m-manylinux2014_x86_64.whl
Size 852.7 kB
Tags CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
2341782d056680f71caaa78f8be854cdc3be9c8782d0c85aa21321c209eca279
BLAKE2b-256 checksum
How to use checksums
59d2ae5a531563a9ed63325dc7d6c487a6a0db39471a89c954a36c1c07ad74cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.0

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

Download URL pyrepscan-0.7.4-cp36-cp36m-macosx_10_7_x86_64.whl
Size 754.2 kB
Tags CPython 3.6 CPython 3.6 pymalloc macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
635aa24e353caf83c4b69659a9ec730d29ffdc398a1c790a2137e03982774245
BLAKE2b-256 checksum
How to use checksums
028a80345a77e78d8f2ff455987728a0aaaa3e351d8500dd58b5c12b61ea1e18
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.0

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

0.8.0

12 release files

This release

0.7.4 This release

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