sphragis 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +42 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +11 -4
- data/CLAUDE.md +50 -0
- data/README.md +6 -2
- data/Rakefile +18 -0
- data/config/brakeman.yml +43 -0
- data/demo/Gemfile +6 -0
- data/demo/Gemfile.lock +271 -0
- data/demo/app.rb +185 -0
- data/demo/config.ru +3 -0
- data/demo/views/index.erb +261 -0
- data/demo/views/preview.erb +555 -0
- data/doc/DSS_FUTURE.md +298 -0
- data/gemfiles/rails_61.gemfile +9 -0
- data/gemfiles/rails_72.gemfile +9 -0
- data/gemfiles/rails_80.gemfile +9 -0
- data/gemfiles/rails_81.gemfile +9 -0
- data/lib/sphragis/configuration.rb +2 -5
- data/lib/sphragis/pdf_signer.rb +44 -60
- data/lib/sphragis/provider_factory.rb +3 -5
- data/lib/sphragis/providers/fortify_provider.rb +32 -1
- data/lib/sphragis/providers/fortify_webcrypto_provider.rb +30 -0
- data/lib/sphragis/providers/harica_provider.rb +97 -96
- data/lib/sphragis/providers/itsme_provider.rb +31 -0
- data/lib/sphragis/version.rb +1 -1
- metadata +60 -17
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: caec4dd49336ccfbe8798f7285269be90871d5032986e352a2242b90111a597e
|
|
4
|
+
data.tar.gz: 3e2a6a7a8feaa2e9243578532e41a4f57c301ce20a58136435d6f6335824f822
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f8e03224faf76f6b4a9bdad2753c0f600616703eddb36d36fb09c96117942e8f6a44c0f88a005412f82dd2bd38d78defa7e1e810160ac62c554f117f092b5f5f
|
|
7
|
+
data.tar.gz: 3bf5ab5f54e3ab0da195df9866964a0b48e8f3e648947f56d2c8a8f0faf887cdff41706bdb78fa5d57b12c96b62601a446db8366d0cbb27e0b38bfa8d630fdf0
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
name: Ruby ${{ matrix.ruby }} / Rails ${{ matrix.rails }}
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
strategy:
|
|
14
|
+
fail-fast: false
|
|
15
|
+
matrix:
|
|
16
|
+
include:
|
|
17
|
+
- ruby: "3.2"
|
|
18
|
+
gemfile: gemfiles/rails_61.gemfile
|
|
19
|
+
rails: "6.1"
|
|
20
|
+
- ruby: "3.2"
|
|
21
|
+
gemfile: gemfiles/rails_72.gemfile
|
|
22
|
+
rails: "7.2"
|
|
23
|
+
- ruby: "3.2"
|
|
24
|
+
gemfile: gemfiles/rails_80.gemfile
|
|
25
|
+
rails: "8.0"
|
|
26
|
+
- ruby: "3.2"
|
|
27
|
+
gemfile: gemfiles/rails_81.gemfile
|
|
28
|
+
rails: "8.1"
|
|
29
|
+
|
|
30
|
+
env:
|
|
31
|
+
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
|
32
|
+
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/checkout@v4
|
|
35
|
+
|
|
36
|
+
- uses: ruby/setup-ruby@v1
|
|
37
|
+
with:
|
|
38
|
+
ruby-version: ${{ matrix.ruby }}
|
|
39
|
+
bundler-cache: true
|
|
40
|
+
|
|
41
|
+
- name: Run tests
|
|
42
|
+
run: bundle exec rake test
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.2.9
|
data/CHANGELOG.md
CHANGED
|
@@ -7,18 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.1.0] - 2026-03-01
|
|
11
|
+
|
|
10
12
|
### Added
|
|
11
13
|
- Initial release of Sphragis (Σφραγίς) - Digital PDF Signatures for Rails
|
|
12
14
|
- Multi-provider architecture supporting:
|
|
13
15
|
- Fortify WebCrypto (FREE open-source, hardware tokens)
|
|
14
16
|
- Harica (FREE for Greek academic institutions, eIDAS qualified)
|
|
15
17
|
- Itsme (template for free e-signature services)
|
|
18
|
+
- **ISO 32000-compliant PDF signing** via easy_code_sign native backend
|
|
19
|
+
- Real CMS/PKCS#7 signatures embedded in PDF (adbe.pkcs7.detached)
|
|
20
|
+
- Harica cloud path: full-document signing via rsign-api.harica.gr DSA API
|
|
21
|
+
- Local path (Fortify, Itsme): sign_bytes(hash) callback → NativeSigner embeds CMS
|
|
22
|
+
- Fully MIT-licensed dependency chain — no AGPL (HexaPDF) required
|
|
16
23
|
- Rails Engine with interactive PDF signature placement
|
|
17
24
|
- PDF.js-based viewer with drag-and-drop signature positioning
|
|
18
25
|
- Provider factory pattern for easy extension
|
|
19
26
|
- Configuration system with environment variable support
|
|
20
|
-
-
|
|
21
|
-
- Logo design inspired by ancient Greek σφραγιδόλιθοι (sealstones)
|
|
27
|
+
- CI matrix: Rails 6.1, 7.2, 8.0, 8.1
|
|
22
28
|
- Complete test suite (Minitest)
|
|
23
29
|
- RuboCop code quality checks
|
|
24
30
|
- Bundler-audit security scanning
|
|
@@ -29,8 +35,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
29
35
|
- FORTIFY_WEBCRYPTO.md for Fortify setup
|
|
30
36
|
- LICENSING_SUMMARY.md for cost breakdown
|
|
31
37
|
- MULTIPLE_PROVIDERS.md for multi-provider usage
|
|
32
|
-
- LOGO.md for branding guidelines
|
|
33
|
-
- LOGO_FILES.md for logo assets reference
|
|
34
38
|
|
|
35
39
|
## Notes
|
|
36
40
|
|
|
@@ -57,6 +61,9 @@ See README.md for details on FREE eIDAS qualified certificates.
|
|
|
57
61
|
- `Security` - Security fixes and improvements
|
|
58
62
|
- `Documentation` - Documentation changes
|
|
59
63
|
|
|
64
|
+
[Unreleased]: https://github.com/mpantel/sphragis/compare/v0.1.0...HEAD
|
|
65
|
+
[0.1.0]: https://github.com/mpantel/sphragis/releases/tag/v0.1.0
|
|
66
|
+
|
|
60
67
|
### Disclaimer
|
|
61
68
|
|
|
62
69
|
> **⚠️ EARLY DEVELOPMENT VERSION**
|
data/CLAUDE.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
Sphragis is a Ruby gem (Rails Engine) providing multi-provider PDF digital signatures. It targets Greek academic institutions (free via Harica) and commercial use (Fortify hardware tokens). Early development — provider integrations currently use simulated/placeholder implementations.
|
|
8
|
+
|
|
9
|
+
## Commands
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
bundle exec rake test # Run full test suite (Minitest)
|
|
13
|
+
bundle exec ruby -Ilib:test test/sphragis/test_pdf_signer.rb # Run single test file
|
|
14
|
+
bundle exec rubocop # Lint
|
|
15
|
+
bundle exec bundle-audit check # Security audit
|
|
16
|
+
bundle exec rake build # Build gem
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Architecture
|
|
20
|
+
|
|
21
|
+
**Rails Engine** (`Sphragis::Engine`) mounted at a user-chosen path (e.g., `/signatures`). Isolates namespace.
|
|
22
|
+
|
|
23
|
+
**Provider pattern** — all signing goes through `Providers::BaseProvider` (abstract):
|
|
24
|
+
- `FortifyProvider` — PKCS#11 hardware token signing (simulated)
|
|
25
|
+
- `FortifyWebcryptoProvider` — Fortify WebCrypto bridge REST API (simulated, most complete API sketch)
|
|
26
|
+
- `HaricaProvider` — Harica cloud CA REST API (simulated)
|
|
27
|
+
- `ItsmeProvider` — template/example provider (simulated)
|
|
28
|
+
|
|
29
|
+
Providers are lazily `require_relative`'d by `ProviderFactory.create(:name)`. The factory reads global config to build provider instances.
|
|
30
|
+
|
|
31
|
+
**Key flow**: `PdfSigner.new(path, opts)` → `ProviderFactory.create` → `provider.connect` → `provider.sign(data)` → writes `_signed.pdf` + `_signature.json` sidecar.
|
|
32
|
+
|
|
33
|
+
**Configuration**: `Sphragis.configure { |c| ... }` block populating `Sphragis::Configuration`. Defaults from ENV vars. Reset with `Sphragis.reset_configuration!` (used in test setup).
|
|
34
|
+
|
|
35
|
+
**Controller**: `DocumentsController` handles preview/view/sign/validate_placement. Preview renders PDF.js UI for drag-and-drop signature placement.
|
|
36
|
+
|
|
37
|
+
## Conventions
|
|
38
|
+
|
|
39
|
+
- `frozen_string_literal: true` on all Ruby files
|
|
40
|
+
- RuboCop with `rubocop-rails` and `rubocop-minitest` plugins
|
|
41
|
+
- Double-quoted strings (`Style/StringLiterals: double_quotes`)
|
|
42
|
+
- Max line length 120, method length 25, class length 150, AbcSize 20
|
|
43
|
+
- Tests use Minitest + Mocha for mocking; test helper resets config and creates temp PDFs via Prawn
|
|
44
|
+
- Ruby >= 3.2, Rails >= 6.1 < 8.0
|
|
45
|
+
|
|
46
|
+
## Test Setup
|
|
47
|
+
|
|
48
|
+
Tests auto-reset `Sphragis.configuration` in `setup`. `create_test_pdf` generates a 2-page PDF in `test/fixtures/`. Teardown cleans `*_signed.pdf` and `*_signature.json` artifacts.
|
|
49
|
+
|
|
50
|
+
Most provider tests configure Fortify credentials since it's the default provider. To test other providers, configure the appropriate credentials and pass `provider: :harica` (etc.) in options.
|
data/README.md
CHANGED
|
@@ -272,6 +272,9 @@ bundle exec rubocop
|
|
|
272
272
|
|
|
273
273
|
# Security audit
|
|
274
274
|
bundle exec bundle-audit check
|
|
275
|
+
|
|
276
|
+
# Static security analysis
|
|
277
|
+
bundle exec rake brakeman
|
|
275
278
|
```
|
|
276
279
|
|
|
277
280
|
## Documentation
|
|
@@ -280,6 +283,7 @@ bundle exec bundle-audit check
|
|
|
280
283
|
- [FORTIFY_WEBCRYPTO.md](doc/FORTIFY_WEBCRYPTO.md) - Fortify setup guide
|
|
281
284
|
- [LICENSING_SUMMARY.md](doc/LICENSING_SUMMARY.md) - Complete cost breakdown
|
|
282
285
|
- [MULTIPLE_PROVIDERS.md](doc/MULTIPLE_PROVIDERS.md) - Multi-provider usage
|
|
286
|
+
- [DSS_FUTURE.md](doc/DSS_FUTURE.md) - EU Digital Signature Service (future provider)
|
|
283
287
|
- [LOGO.md](doc/LOGO.md) - Logo design and branding
|
|
284
288
|
|
|
285
289
|
## Logo & Branding
|
|
@@ -310,7 +314,7 @@ See [LOGO.md](doc/LOGO.md) for design details.
|
|
|
310
314
|
|
|
311
315
|
**Planned:**
|
|
312
316
|
- 🔄 Production testing and hardening
|
|
313
|
-
- 🔄 Additional provider support
|
|
317
|
+
- 🔄 Additional provider support (DSS for institutional batch signing)
|
|
314
318
|
- 🔄 Batch signing operations
|
|
315
319
|
- 🔄 Signature verification
|
|
316
320
|
- 🔄 Audit logging
|
|
@@ -356,7 +360,7 @@ MIT License - See [LICENSE](LICENSE) for details.
|
|
|
356
360
|
|
|
357
361
|
**Sphragis is an independent open-source project.** We are NOT affiliated with, endorsed by, or sponsored by any of the third-party providers, services, or products mentioned in this documentation, including but not limited to:
|
|
358
362
|
|
|
359
|
-
- Peculiar Ventures (Fortify) • Harica • Yubico (YubiKey) • Nitrokey • ItsMe • OpenSC Project • Any certificate authorities or hardware manufacturers
|
|
363
|
+
- Peculiar Ventures (Fortify) • Harica • Yubico (YubiKey) • Nitrokey • ItsMe • OpenSC Project • EU Digital Signature Service (DSS) • European Commission • Any certificate authorities or hardware manufacturers
|
|
360
364
|
|
|
361
365
|
All trademarks and product names are property of their respective owners. This gem provides integration code only. Users are responsible for complying with third-party terms of service and any associated costs.
|
|
362
366
|
|
data/Rakefile
CHANGED
|
@@ -5,4 +5,22 @@ require "minitest/test_task"
|
|
|
5
5
|
|
|
6
6
|
Minitest::TestTask.create
|
|
7
7
|
|
|
8
|
+
# Brakeman security scanner
|
|
9
|
+
begin
|
|
10
|
+
require "brakeman"
|
|
11
|
+
|
|
12
|
+
desc "Run Brakeman security scanner"
|
|
13
|
+
task :brakeman do
|
|
14
|
+
require "brakeman"
|
|
15
|
+
result = Brakeman.run(
|
|
16
|
+
app_path: ".",
|
|
17
|
+
print_report: true,
|
|
18
|
+
config_file: "config/brakeman.yml"
|
|
19
|
+
)
|
|
20
|
+
exit Brakeman::Warnings_Found_Exit_Code if result.filtered_warnings.any?
|
|
21
|
+
end
|
|
22
|
+
rescue LoadError
|
|
23
|
+
# Brakeman not available
|
|
24
|
+
end
|
|
25
|
+
|
|
8
26
|
task default: :test
|
data/config/brakeman.yml
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Brakeman configuration for Sphragis
|
|
2
|
+
# https://brakemanscanner.org/docs/options/
|
|
3
|
+
|
|
4
|
+
# Application path (default: ".")
|
|
5
|
+
app_path: "."
|
|
6
|
+
|
|
7
|
+
# Rails engine mode
|
|
8
|
+
rails_engines: true
|
|
9
|
+
|
|
10
|
+
# Output format (can be: text, html, json, markdown, csv, tabs, etc.)
|
|
11
|
+
output_format: text
|
|
12
|
+
|
|
13
|
+
# Minimum confidence level (1-3, where 1 is low confidence, 3 is high)
|
|
14
|
+
min_confidence: 2
|
|
15
|
+
|
|
16
|
+
# Exit with error code if warnings are found
|
|
17
|
+
exit_on_warn: false
|
|
18
|
+
|
|
19
|
+
# Ignore specific warnings by fingerprint
|
|
20
|
+
# Run `brakeman -I` to add warnings to ignore
|
|
21
|
+
# ignore_file: config/brakeman.ignore
|
|
22
|
+
|
|
23
|
+
# Check specific paths
|
|
24
|
+
# path: .
|
|
25
|
+
|
|
26
|
+
# Skip certain checks
|
|
27
|
+
# skip_checks:
|
|
28
|
+
# - SQL
|
|
29
|
+
# - LinkTo
|
|
30
|
+
|
|
31
|
+
# Only run certain checks
|
|
32
|
+
# run_checks:
|
|
33
|
+
# - SQL
|
|
34
|
+
# - CrossSiteScripting
|
|
35
|
+
|
|
36
|
+
# Treat all warnings as errors for CI (optional)
|
|
37
|
+
# ensure_latest: true
|
|
38
|
+
|
|
39
|
+
# Show context around warnings
|
|
40
|
+
# limit: 100
|
|
41
|
+
|
|
42
|
+
# Rails version (auto-detected from Gemfile.lock)
|
|
43
|
+
# rails_version: 7.0
|
data/demo/Gemfile
ADDED
data/demo/Gemfile.lock
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: ..
|
|
3
|
+
specs:
|
|
4
|
+
sphragis (0.0.1)
|
|
5
|
+
pdf-reader (~> 2.0)
|
|
6
|
+
prawn (~> 2.4)
|
|
7
|
+
rails (>= 6.1, < 8.0)
|
|
8
|
+
|
|
9
|
+
GEM
|
|
10
|
+
remote: https://rubygems.org/
|
|
11
|
+
specs:
|
|
12
|
+
Ascii85 (2.0.1)
|
|
13
|
+
actioncable (7.1.5.2)
|
|
14
|
+
actionpack (= 7.1.5.2)
|
|
15
|
+
activesupport (= 7.1.5.2)
|
|
16
|
+
nio4r (~> 2.0)
|
|
17
|
+
websocket-driver (>= 0.6.1)
|
|
18
|
+
zeitwerk (~> 2.6)
|
|
19
|
+
actionmailbox (7.1.5.2)
|
|
20
|
+
actionpack (= 7.1.5.2)
|
|
21
|
+
activejob (= 7.1.5.2)
|
|
22
|
+
activerecord (= 7.1.5.2)
|
|
23
|
+
activestorage (= 7.1.5.2)
|
|
24
|
+
activesupport (= 7.1.5.2)
|
|
25
|
+
mail (>= 2.7.1)
|
|
26
|
+
net-imap
|
|
27
|
+
net-pop
|
|
28
|
+
net-smtp
|
|
29
|
+
actionmailer (7.1.5.2)
|
|
30
|
+
actionpack (= 7.1.5.2)
|
|
31
|
+
actionview (= 7.1.5.2)
|
|
32
|
+
activejob (= 7.1.5.2)
|
|
33
|
+
activesupport (= 7.1.5.2)
|
|
34
|
+
mail (~> 2.5, >= 2.5.4)
|
|
35
|
+
net-imap
|
|
36
|
+
net-pop
|
|
37
|
+
net-smtp
|
|
38
|
+
rails-dom-testing (~> 2.2)
|
|
39
|
+
actionpack (7.1.5.2)
|
|
40
|
+
actionview (= 7.1.5.2)
|
|
41
|
+
activesupport (= 7.1.5.2)
|
|
42
|
+
nokogiri (>= 1.8.5)
|
|
43
|
+
racc
|
|
44
|
+
rack (>= 2.2.4)
|
|
45
|
+
rack-session (>= 1.0.1)
|
|
46
|
+
rack-test (>= 0.6.3)
|
|
47
|
+
rails-dom-testing (~> 2.2)
|
|
48
|
+
rails-html-sanitizer (~> 1.6)
|
|
49
|
+
actiontext (7.1.5.2)
|
|
50
|
+
actionpack (= 7.1.5.2)
|
|
51
|
+
activerecord (= 7.1.5.2)
|
|
52
|
+
activestorage (= 7.1.5.2)
|
|
53
|
+
activesupport (= 7.1.5.2)
|
|
54
|
+
globalid (>= 0.6.0)
|
|
55
|
+
nokogiri (>= 1.8.5)
|
|
56
|
+
actionview (7.1.5.2)
|
|
57
|
+
activesupport (= 7.1.5.2)
|
|
58
|
+
builder (~> 3.1)
|
|
59
|
+
erubi (~> 1.11)
|
|
60
|
+
rails-dom-testing (~> 2.2)
|
|
61
|
+
rails-html-sanitizer (~> 1.6)
|
|
62
|
+
activejob (7.1.5.2)
|
|
63
|
+
activesupport (= 7.1.5.2)
|
|
64
|
+
globalid (>= 0.3.6)
|
|
65
|
+
activemodel (7.1.5.2)
|
|
66
|
+
activesupport (= 7.1.5.2)
|
|
67
|
+
activerecord (7.1.5.2)
|
|
68
|
+
activemodel (= 7.1.5.2)
|
|
69
|
+
activesupport (= 7.1.5.2)
|
|
70
|
+
timeout (>= 0.4.0)
|
|
71
|
+
activestorage (7.1.5.2)
|
|
72
|
+
actionpack (= 7.1.5.2)
|
|
73
|
+
activejob (= 7.1.5.2)
|
|
74
|
+
activerecord (= 7.1.5.2)
|
|
75
|
+
activesupport (= 7.1.5.2)
|
|
76
|
+
marcel (~> 1.0)
|
|
77
|
+
activesupport (7.1.5.2)
|
|
78
|
+
base64
|
|
79
|
+
benchmark (>= 0.3)
|
|
80
|
+
bigdecimal
|
|
81
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
82
|
+
connection_pool (>= 2.2.5)
|
|
83
|
+
drb
|
|
84
|
+
i18n (>= 1.6, < 2)
|
|
85
|
+
logger (>= 1.4.2)
|
|
86
|
+
minitest (>= 5.1)
|
|
87
|
+
mutex_m
|
|
88
|
+
securerandom (>= 0.3)
|
|
89
|
+
tzinfo (~> 2.0)
|
|
90
|
+
afm (1.0.0)
|
|
91
|
+
base64 (0.3.0)
|
|
92
|
+
benchmark (0.5.0)
|
|
93
|
+
bigdecimal (3.3.1)
|
|
94
|
+
builder (3.3.0)
|
|
95
|
+
concurrent-ruby (1.3.5)
|
|
96
|
+
connection_pool (2.5.4)
|
|
97
|
+
crass (1.0.6)
|
|
98
|
+
date (3.4.1)
|
|
99
|
+
drb (2.2.3)
|
|
100
|
+
erb (5.1.1)
|
|
101
|
+
erubi (1.13.1)
|
|
102
|
+
globalid (1.3.0)
|
|
103
|
+
activesupport (>= 6.1)
|
|
104
|
+
hashery (2.1.2)
|
|
105
|
+
i18n (1.14.7)
|
|
106
|
+
concurrent-ruby (~> 1.0)
|
|
107
|
+
io-console (0.8.1)
|
|
108
|
+
irb (1.15.2)
|
|
109
|
+
pp (>= 0.6.0)
|
|
110
|
+
rdoc (>= 4.0.0)
|
|
111
|
+
reline (>= 0.4.2)
|
|
112
|
+
logger (1.7.0)
|
|
113
|
+
loofah (2.24.1)
|
|
114
|
+
crass (~> 1.0.2)
|
|
115
|
+
nokogiri (>= 1.12.0)
|
|
116
|
+
mail (2.8.1)
|
|
117
|
+
mini_mime (>= 0.1.1)
|
|
118
|
+
net-imap
|
|
119
|
+
net-pop
|
|
120
|
+
net-smtp
|
|
121
|
+
marcel (1.1.0)
|
|
122
|
+
matrix (0.4.3)
|
|
123
|
+
mini_mime (1.1.5)
|
|
124
|
+
minitest (5.26.0)
|
|
125
|
+
multi_json (1.17.0)
|
|
126
|
+
mustermann (3.0.4)
|
|
127
|
+
ruby2_keywords (~> 0.0.1)
|
|
128
|
+
mutex_m (0.3.0)
|
|
129
|
+
net-imap (0.5.12)
|
|
130
|
+
date
|
|
131
|
+
net-protocol
|
|
132
|
+
net-pop (0.1.2)
|
|
133
|
+
net-protocol
|
|
134
|
+
net-protocol (0.2.2)
|
|
135
|
+
timeout
|
|
136
|
+
net-smtp (0.5.1)
|
|
137
|
+
net-protocol
|
|
138
|
+
nio4r (2.7.4)
|
|
139
|
+
nokogiri (1.18.10-aarch64-linux-gnu)
|
|
140
|
+
racc (~> 1.4)
|
|
141
|
+
nokogiri (1.18.10-aarch64-linux-musl)
|
|
142
|
+
racc (~> 1.4)
|
|
143
|
+
nokogiri (1.18.10-arm-linux-gnu)
|
|
144
|
+
racc (~> 1.4)
|
|
145
|
+
nokogiri (1.18.10-arm-linux-musl)
|
|
146
|
+
racc (~> 1.4)
|
|
147
|
+
nokogiri (1.18.10-arm64-darwin)
|
|
148
|
+
racc (~> 1.4)
|
|
149
|
+
nokogiri (1.18.10-x86_64-darwin)
|
|
150
|
+
racc (~> 1.4)
|
|
151
|
+
nokogiri (1.18.10-x86_64-linux-gnu)
|
|
152
|
+
racc (~> 1.4)
|
|
153
|
+
nokogiri (1.18.10-x86_64-linux-musl)
|
|
154
|
+
racc (~> 1.4)
|
|
155
|
+
pdf-core (0.10.0)
|
|
156
|
+
pdf-reader (2.15.0)
|
|
157
|
+
Ascii85 (>= 1.0, < 3.0, != 2.0.0)
|
|
158
|
+
afm (>= 0.2.1, < 2)
|
|
159
|
+
hashery (~> 2.0)
|
|
160
|
+
ruby-rc4
|
|
161
|
+
ttfunk
|
|
162
|
+
pp (0.6.3)
|
|
163
|
+
prettyprint
|
|
164
|
+
prawn (2.5.0)
|
|
165
|
+
matrix (~> 0.4)
|
|
166
|
+
pdf-core (~> 0.10.0)
|
|
167
|
+
ttfunk (~> 1.8)
|
|
168
|
+
prettyprint (0.2.0)
|
|
169
|
+
psych (5.2.6)
|
|
170
|
+
date
|
|
171
|
+
stringio
|
|
172
|
+
puma (7.1.0)
|
|
173
|
+
nio4r (~> 2.0)
|
|
174
|
+
racc (1.8.1)
|
|
175
|
+
rack (3.2.3)
|
|
176
|
+
rack-protection (4.2.1)
|
|
177
|
+
base64 (>= 0.1.0)
|
|
178
|
+
logger (>= 1.6.0)
|
|
179
|
+
rack (>= 3.0.0, < 4)
|
|
180
|
+
rack-session (2.1.1)
|
|
181
|
+
base64 (>= 0.1.0)
|
|
182
|
+
rack (>= 3.0.0)
|
|
183
|
+
rack-test (2.2.0)
|
|
184
|
+
rack (>= 1.3)
|
|
185
|
+
rackup (2.2.1)
|
|
186
|
+
rack (>= 3)
|
|
187
|
+
rails (7.1.5.2)
|
|
188
|
+
actioncable (= 7.1.5.2)
|
|
189
|
+
actionmailbox (= 7.1.5.2)
|
|
190
|
+
actionmailer (= 7.1.5.2)
|
|
191
|
+
actionpack (= 7.1.5.2)
|
|
192
|
+
actiontext (= 7.1.5.2)
|
|
193
|
+
actionview (= 7.1.5.2)
|
|
194
|
+
activejob (= 7.1.5.2)
|
|
195
|
+
activemodel (= 7.1.5.2)
|
|
196
|
+
activerecord (= 7.1.5.2)
|
|
197
|
+
activestorage (= 7.1.5.2)
|
|
198
|
+
activesupport (= 7.1.5.2)
|
|
199
|
+
bundler (>= 1.15.0)
|
|
200
|
+
railties (= 7.1.5.2)
|
|
201
|
+
rails-dom-testing (2.3.0)
|
|
202
|
+
activesupport (>= 5.0.0)
|
|
203
|
+
minitest
|
|
204
|
+
nokogiri (>= 1.6)
|
|
205
|
+
rails-html-sanitizer (1.6.2)
|
|
206
|
+
loofah (~> 2.21)
|
|
207
|
+
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
|
|
208
|
+
railties (7.1.5.2)
|
|
209
|
+
actionpack (= 7.1.5.2)
|
|
210
|
+
activesupport (= 7.1.5.2)
|
|
211
|
+
irb
|
|
212
|
+
rackup (>= 1.0.0)
|
|
213
|
+
rake (>= 12.2)
|
|
214
|
+
thor (~> 1.0, >= 1.2.2)
|
|
215
|
+
zeitwerk (~> 2.6)
|
|
216
|
+
rake (13.3.0)
|
|
217
|
+
rdoc (6.15.0)
|
|
218
|
+
erb
|
|
219
|
+
psych (>= 4.0.0)
|
|
220
|
+
tsort
|
|
221
|
+
reline (0.6.2)
|
|
222
|
+
io-console (~> 0.5)
|
|
223
|
+
ruby-rc4 (0.1.5)
|
|
224
|
+
ruby2_keywords (0.0.5)
|
|
225
|
+
securerandom (0.4.1)
|
|
226
|
+
sinatra (4.2.1)
|
|
227
|
+
logger (>= 1.6.0)
|
|
228
|
+
mustermann (~> 3.0)
|
|
229
|
+
rack (>= 3.0.0, < 4)
|
|
230
|
+
rack-protection (= 4.2.1)
|
|
231
|
+
rack-session (>= 2.0.0, < 3)
|
|
232
|
+
tilt (~> 2.0)
|
|
233
|
+
sinatra-contrib (4.2.1)
|
|
234
|
+
multi_json (>= 0.0.2)
|
|
235
|
+
mustermann (~> 3.0)
|
|
236
|
+
rack-protection (= 4.2.1)
|
|
237
|
+
sinatra (= 4.2.1)
|
|
238
|
+
tilt (~> 2.0)
|
|
239
|
+
stringio (3.1.7)
|
|
240
|
+
thor (1.4.0)
|
|
241
|
+
tilt (2.6.1)
|
|
242
|
+
timeout (0.4.3)
|
|
243
|
+
tsort (0.2.0)
|
|
244
|
+
ttfunk (1.8.0)
|
|
245
|
+
bigdecimal (~> 3.1)
|
|
246
|
+
tzinfo (2.0.6)
|
|
247
|
+
concurrent-ruby (~> 1.0)
|
|
248
|
+
websocket-driver (0.8.0)
|
|
249
|
+
base64
|
|
250
|
+
websocket-extensions (>= 0.1.0)
|
|
251
|
+
websocket-extensions (0.1.5)
|
|
252
|
+
zeitwerk (2.7.3)
|
|
253
|
+
|
|
254
|
+
PLATFORMS
|
|
255
|
+
aarch64-linux-gnu
|
|
256
|
+
aarch64-linux-musl
|
|
257
|
+
arm-linux-gnu
|
|
258
|
+
arm-linux-musl
|
|
259
|
+
arm64-darwin
|
|
260
|
+
x86_64-darwin
|
|
261
|
+
x86_64-linux-gnu
|
|
262
|
+
x86_64-linux-musl
|
|
263
|
+
|
|
264
|
+
DEPENDENCIES
|
|
265
|
+
puma
|
|
266
|
+
sinatra
|
|
267
|
+
sinatra-contrib
|
|
268
|
+
sphragis!
|
|
269
|
+
|
|
270
|
+
BUNDLED WITH
|
|
271
|
+
2.7.2
|