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

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

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

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

Download URL pyrepscan-0.7.2-cp39-cp39-manylinux2014_x86_64.whl
Size 848.9 kB
Tags CPython 3.9 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
c9276cb063db3e789e22c639f76b7d63081d43706138b760ce191f6f3586333a
BLAKE2b-256 checksum
How to use checksums
e316d85361191ba6423d7a713292330c5224f7164362a7252263e77996425113
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.8.3

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

Download URL pyrepscan-0.7.2-cp39-cp39-macosx_10_7_x86_64.whl
Size 748.2 kB
Tags CPython 3.9 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
e3cc45007cdbe97097e94e724c1542ce9ba25bf159d34196efaa7efc031bb44e
BLAKE2b-256 checksum
How to use checksums
325a0207f0ce86e1da7368c7def6e2431fdb8b724982e7acc786c9f783de0470
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.8.3

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

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

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

Download URL pyrepscan-0.7.2-cp38-cp38-manylinux2014_x86_64.whl
Size 848.9 kB
Tags CPython 3.8 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
2abaa2da8be7e6b711b8061b98a65515ab8d4409ac2d376fe028a8251175b266
BLAKE2b-256 checksum
How to use checksums
273a9347eeeb0330e4b09b35b1f281027176d0cc25ba7d89b9d4a1242546ae15
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.8.3

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

Download URL pyrepscan-0.7.2-cp38-cp38-macosx_10_7_x86_64.whl
Size 748.2 kB
Tags CPython 3.8 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
a535e0a9e83169433efab07350da7f7f67d5b6ecb424b3f4be7e874a0c6c6588
BLAKE2b-256 checksum
How to use checksums
650a9db1e63badbeff635fec6a8598afd6b6e3477762320d4d85b4a4353c87b2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.8.3

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

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

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

Download URL pyrepscan-0.7.2-cp37-cp37m-manylinux2014_x86_64.whl
Size 848.9 kB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
1491c61ba2882a48237a69d7f217d19d2aa8b0f26b7809adaa5a51714264c97e
BLAKE2b-256 checksum
How to use checksums
92b39fe44cc6d5aed3b5e1914a18026961c71d31cd2522747deb588f13f797ee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.8.3

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

Download URL pyrepscan-0.7.2-cp37-cp37m-macosx_10_7_x86_64.whl
Size 748.1 kB
Tags CPython 3.7 CPython 3.7 pymalloc macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
c90704747900f8be36f2dfa8222eaf7b9a9c097a36d10012d618fcb0ce9972fe
BLAKE2b-256 checksum
How to use checksums
9b688bd7e080cefebb0dcc75d6e45cdc06a7a1c0057a0cfdafda07df36579d56
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.8.3

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

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

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

Download URL pyrepscan-0.7.2-cp36-cp36m-manylinux2014_x86_64.whl
Size 849.0 kB
Tags CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
a5f3d501753c31d5cf4dad6fa1658deeac19a674667aa9356e71d3269ca22e4c
BLAKE2b-256 checksum
How to use checksums
9451a42081f04fae1f20906999efcc25212fab4b2f3982a0cb8cea34908b472a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.8.3

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

Download URL pyrepscan-0.7.2-cp36-cp36m-macosx_10_7_x86_64.whl
Size 748.4 kB
Tags CPython 3.6 CPython 3.6 pymalloc macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
6202d132251c959669f6f15e5bb7b9a09424c47be6a6f984dcd8f3ce07212fc8
BLAKE2b-256 checksum
How to use checksums
aecf30a90292c4e2f68f11f8cc79d4c382d9c42892a8c137085377dd6356e4a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.8.3

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

0.7.4

12 release files

This release

0.7.2 This release

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