
Research
/Security News
Malicious npm Packages Target WhatsApp Developers with Remote Kill Switch
Two npm packages masquerading as WhatsApp developer libraries include a kill switch that deletes all files if the phone number isn’t whitelisted.
A package for validating file paths across different operating systems and storage services.
The File Path Validator (FPV) library is a robust solution for validating and cleaning file paths to ensure compliance with platform-specific naming restrictions and length limits. FPV supports both operating systems and cloud storage providers, enabling seamless path validation across diverse environments.
Many cloud storage providers strive to enforce compliance with OS-specific rules, but not all do so reliably. For instance, Google Drive syncs with Windows, requiring paths to meet Windows-specific rules, yet lacks strict enforcement on its end. FPV can bridge this gap, offering cross-platform path validation ahead of time to avoid runtime failures.
(From Logan - Creator of FPV):
"At my company, we often generate file paths for clients from a mix of disjointed data sources. This can result in messy file path strings that may fail at the storage provider or OS level. FPV ensures our paths are flagged with actionable error messages early on.For those who prefer automation, FPV's cleaning functionality can attempt to fix paths proactively. Whether you're debugging paths manually or streamlining cleanup, FPV has been a game-changer for us. I hope you find it equally helpful!"
Install the FPV library via pip:
pip install file-path-validator
Each class inherits from FPV_Base
, defining unique validation and cleaning rules tailored to the platform or provider while leveraging the library's core functionality.
FPV provides several configuration options for fine-grained control:
auto_clean
: Attempts to clean paths before validation. If issues remain unresolved after cleaning, an error is raised. Defaults to False
.auto_validate
: Automatically validates the path or parts upon modification. Defaults to True
.relative
: Determines if the path is treated as relative (True
) or absolute (False
). Some service classes enforce a specific behavior (e.g., macOS paths are always relative).file_added
: Explicitly specify if the path includes a file. The library avoids assumptions about the last path part, requiring this flag for clarity.sep
: Specifies the path separator (e.g., "/"
for POSIX, "\\"
for Windows). Service classes provide defaults but allow overrides.from FPV import FPV_Windows
def dynamic_path_demo():
# Instantiate the validator
validator = FPV_Windows("C:\\", relative=False)
# Add parts dynamically
validator.add_part("NewFolder")
validator.add_part("AnotherFolder")
validator.add_part("file.txt", is_file=True)
# Validate the dynamic path
try:
validator.validate()
print("Path is valid:", validator.get_full_path())
except ValueError as e:
print("Validation Error:", e)
# Review issues and actions
print("Issues Log:", validator.get_logs()["issues"])
print("Actions Log:", validator.get_logs()["actions"])
dynamic_path_demo()
get_logs()["issues"]
or methods like get_issues_for_part(index)
for targeted inspection.get_logs()["actions"]
or get_pending_actions_for_part(index)
for a step-by-step cleaning recipe.Example:
issues = validator.get_logs()["issues"]
actions = validator.get_logs()["actions"]
# Apply actions manually if needed
for action in actions:
print(f"Action: {action['reason']} - Details: {action['details']}")
from FPV import FPV_Windows
example_path = "C:/ Broken/ **path/to/||file . txt"
validator = FPV_Windows(example_path, relative=True, sep='/')
try:
# Validate the path
validator.validate()
print("Path is valid!")
except ValueError as e:
print("Validation Error:", e)
# Clean the path
cleaned_path = validator.clean()
print("Cleaned Path:", cleaned_path)
Wrap cleaning and validation calls in a try-except
block to gracefully handle exceptions:
try:
cleaned_path = validator.clean()
print("Cleaned Path:", cleaned_path)
except ValueError as e:
print("Cleaning Error:", e)
FPV includes a high-performance REST API built with Quart (async Flask-compatible framework) for easy integration into web applications and microservices.
# Method 1: Using the provided script
python run_api.py
# Method 2: Direct execution
python FPV/API/api.py
The server starts on http://localhost:8000
Base URL: http://localhost:8000/api/v1
POST /isValid
)Validates a file path according to the specified service's rules.
curl -X POST "http://localhost:8000/api/v1/isValid" \
-H "Content-Type: application/json" \
-d '{
"service": "dropbox",
"path": "/Documents/test.txt",
"file_added": true
}'
Response:
{
"success": true,
"is_valid": true,
"issues": [],
"logs": {"actions": [], "issues": []},
"error": null
}
POST /clean
)Cleans a file path by applying platform-specific fixes.
curl -X POST "http://localhost:8000/api/v1/clean" \
-H "Content-Type: application/json" \
-d '{
"service": "windows",
"path": "C:\\Test<Folder>\\file*.txt",
"relative": false,
"file_added": true
}'
Response:
{
"success": true,
"cleaned_path": "C:\\TestFolder\\file.txt",
"logs": {
"actions": [
{
"type": "action",
"category": "INVALID_CHAR",
"subtype": "MODIFY",
"details": {
"original": "Test<Folder>",
"new_value": "TestFolder",
"index": 1
},
"reason": "Removed invalid characters."
}
],
"issues": []
},
"error": null
}
For applications like ByteWave that need to build paths incrementally with real-time validation:
POST /path/add
)Adds one or more path parts to an existing path with incremental validation.
curl -X POST "http://localhost:8000/api/v1/path/add" \
-H "Content-Type: application/json" \
-d '{
"service": "windows",
"base_path": "C:\\Users\\golde",
"parts": ["Documents"],
"errors": [],
"validate": true,
"relative": false,
"file_added": false
}'
Response:
{
"success": true,
"updated_path": "C:\\Users\\golde\\Documents",
"new_errors": [],
"all_errors": [],
"path_parts": ["C:", "Users", "golde", "Documents"],
"error": null
}
POST /path/remove
)Removes a path part and updates the error state accordingly.
curl -X POST "http://localhost:8000/api/v1/path/remove" \
-H "Content-Type: application/json" \
-d '{
"service": "windows",
"base_path": "C:\\Users\\golde\\Documents",
"part_index": 2,
"errors": [],
"relative": false,
"file_added": false
}'
Response:
{
"success": true,
"updated_path": "C:\\Users\\Documents",
"remaining_errors": [],
"removed_part": "golde",
"path_parts": ["C:", "Users", "Documents"],
"error": null
}
POST /path/build
)Builds a complete path step by step with full validation tracking.
curl -X POST "http://localhost:8000/api/v1/path/build" \
-H "Content-Type: application/json" \
-d '{
"service": "dropbox",
"root_path": "/",
"path_parts": ["Documents", "Work", "Reports", "Q4_Report.pdf"],
"relative": true,
"file_added": true
}'
Response:
{
"success": true,
"final_path": "/Documents/Work/Reports/Q4_Report.pdf",
"all_errors": [],
"step_errors": [
{
"step": 1,
"part": "Documents",
"issues": []
},
{
"step": 2,
"part": "Work",
"issues": []
},
{
"step": 3,
"part": "Reports",
"issues": []
},
{
"step": 4,
"part": "Q4_Report.pdf",
"issues": []
}
],
"path_parts": ["", "Documents", "Work", "Reports", "Q4_Report.pdf"],
"error": null
}
/isValid
, /clean
)Parameter | Type | Required | Default | Description |
---|---|---|---|---|
service | string | Yes | - | Service/platform name (windows, macos, linux, dropbox, box, egnyte, onedrive, sharepoint, sharefile) |
path | string | Yes | - | File path to validate/clean |
relative | boolean | No | true | Whether the path is relative (true) or absolute (false) |
file_added | boolean | No | false | Whether the path includes a file |
sep | string | No | platform default | Path separator (e.g., "/", "\") |
/path/add
ParametersParameter | Type | Required | Default | Description |
---|---|---|---|---|
service | string | Yes | - | Service/platform name |
base_path | string | Yes | - | Current path to add parts to |
parts | array | Yes | - | Array of path parts to add |
errors | array | No | [] | Current error state |
validate | boolean | No | true | Whether to validate new parts |
relative | boolean | No | true | Whether the path is relative |
file_added | boolean | No | false | Whether the path includes a file |
sep | string | No | platform default | Path separator |
/path/remove
ParametersParameter | Type | Required | Default | Description |
---|---|---|---|---|
service | string | Yes | - | Service/platform name |
base_path | string | Yes | - | Current path to remove part from |
part_index | integer | Yes | - | Index of part to remove (0-based) |
errors | array | No | [] | Current error state |
relative | boolean | No | true | Whether the path is relative |
file_added | boolean | No | false | Whether the path includes a file |
sep | string | No | platform default | Path separator |
/path/build
ParametersParameter | Type | Required | Default | Description |
---|---|---|---|---|
service | string | Yes | - | Service/platform name |
root_path | string | Yes | - | Root path to start from |
path_parts | array | Yes | - | Array of path parts to add sequentially |
relative | boolean | No | true | Whether the path is relative |
file_added | boolean | No | false | Whether the path includes a file |
sep | string | No | platform default | Path separator |
import requests
# Validate a path
response = requests.post("http://localhost:8000/api/v1/isValid", json={
"service": "dropbox",
"path": "/Documents/test.txt",
"file_added": True
})
result = response.json()
print(f"Path is valid: {result['is_valid']}")
# Clean a path
response = requests.post("http://localhost:8000/api/v1/clean", json={
"service": "windows",
"path": "C:\\Test<Folder>\\file*.txt",
"relative": False,
"file_added": True
})
result = response.json()
print(f"Cleaned path: {result['cleaned_path']}")
The dynamic path building endpoints are specifically designed for applications like ByteWave that need to build paths incrementally:
🚀 Performance Advantages:
💡 Use Cases:
🔧 Implementation Strategy:
# ByteWave can maintain minimal state:
class PathBuilder:
def __init__(self, service="windows"):
self.service = service
self.path_parts = []
self.errors = []
def add_part(self, part):
# Call /path/add API
# Update local state
# Return new errors only
pass
def remove_part(self, index):
# Call /path/remove API
# Update local state
# Return remaining errors
pass
The API is optimized for high-throughput scenarios:
validate()
: Validates the entire path. Raises ValueError
if issues are found unless raise_error=False
is explicitly set.clean()
: Cleans the path to meet compliance rules, applying fixes from the action log. Raises errors for unresolved issues if raise_error=True
.We welcome contributions! Please adhere to the following:
Thank you for helping improve FPV! 🎉
FAQs
A package for validating file paths across different operating systems and storage services.
We found that file-path-validator demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
/Security News
Two npm packages masquerading as WhatsApp developer libraries include a kill switch that deletes all files if the phone number isn’t whitelisted.
Research
/Security News
Socket uncovered 11 malicious Go packages using obfuscated loaders to fetch and execute second-stage payloads via C2 domains.
Security News
TC39 advances 11 JavaScript proposals, with two moving to Stage 4, bringing better math, binary APIs, and more features one step closer to the ECMAScript spec.