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

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

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

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

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

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

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

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

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

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

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

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

Download URL pyrepscan-0.9.0-cp38-cp38-macosx_10_7_x86_64.whl
Size 918.0 kB
Tags CPython 3.8 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
8851c39b52ae060145c99b79a727c50e017a26b296aa0a43135b7ec8ea8578b9
BLAKE2b-256 checksum
How to use checksums
83dc020a5aec82ae8dc8ec0529d45764b387d3be77ae38276d8897c17cebfe00
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/0.9.4

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

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

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

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

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

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

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

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

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

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

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

Download URL pyrepscan-0.9.0-cp36-cp36m-macosx_10_7_x86_64.whl
Size 917.3 kB
Tags CPython 3.6 CPython 3.6 pymalloc macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
866ea3d8384c8ec98e5aaa6c92df7dfa7760aca20dccd5b5afe1d7bd10122993
BLAKE2b-256 checksum
How to use checksums
c4912c6c601ccc0c676125af9aa6be90a620555c3bfe27b35fbb9b539d224b9d
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

This release

0.9.0 This release

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