pg-ldap-sync 0.4.0 → 0.5.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3630b9ed2307ae5d629896016d302f8ccfee7e324ca963b2ba6dfe1cee612351
4
- data.tar.gz: f2065307ea2d61d6e2498e604c3d2105248380a27039601808be6b24579ef586
3
+ metadata.gz: 62fea7bb7d0ed64a4ccb20bae815fd3f5412fb5d594d5a5aa54c8062da2ec401
4
+ data.tar.gz: db9d4ff658763c76efc0bcf7d6713b02476d2902df9c2a9ee42de77172bf8b7c
5
5
  SHA512:
6
- metadata.gz: 449792e68c3cf512209e42231b134fec4a090bb873473e4db844eb50a3f9be87cd23c07676bd80ffbf604774f6a72d1d7b508cee13d8f703577c19a4312d9975
7
- data.tar.gz: 2bbe1be11834f35b361dc0a255cd8e02323aa2f000940efcec6e695bfa5e2653ff940c883cd6264462afda36d8125913ac012c7e89d760440345d67cd48bddd5
6
+ metadata.gz: b56eafdd8955a818d78d65e34916109255b64ff8b0c48d1c6c5ab4d3b6588c0221166dfd5428f36332ea20aede3b22f8fa52122aaaaf3493dd802a56a07c0504
7
+ data.tar.gz: eb4216d46013a6dd84189ed7ffa913e2cf635bd5ea57a33137f930c5731fe5f8712abe50a0b68a5e55936a427a4a57497630412f99bc53f3ade352acf53b6a13
checksums.yaml.gz.sig CHANGED
Binary file
@@ -1,6 +1,18 @@
1
1
  name: CI
2
2
 
3
- on: [push, pull_request]
3
+ on:
4
+ workflow_dispatch:
5
+ schedule:
6
+ - cron: "0 1 2 * *" # At 01:00 on the second day of each month - https://crontab.guru/#0_1_2_*_*
7
+ push:
8
+ branches:
9
+ - master
10
+ tags:
11
+ - "*.*.*"
12
+ pull_request:
13
+ types: [opened, synchronize]
14
+ branches:
15
+ - "*"
4
16
 
5
17
  jobs:
6
18
  job_test_gem:
@@ -11,23 +23,23 @@ jobs:
11
23
  include:
12
24
  - os: windows
13
25
  ruby: "head"
14
- PGVERSION: 15.1-1-windows-x64
15
- PGVER: "15"
26
+ PGVERSION: 17.0-1-windows-x64
27
+ PGVER: "17"
16
28
  - os: windows
17
29
  ruby: "2.4"
18
30
  PGVERSION: 9.4.26-1-windows-x64
19
31
  PGVER: "9.4"
20
32
  - os: ubuntu
21
33
  ruby: "head"
22
- PGVER: "15"
34
+ PGVER: "17"
23
35
  - os: ubuntu
24
36
  os_ver: "20.04"
25
37
  ruby: "2.3"
26
38
  PGVER: "9.3"
27
39
  - os: macos
28
40
  ruby: "head"
29
- PGVERSION: 15.1-1-osx
30
- PGVER: "15"
41
+ PGVERSION: 17.0-1-osx
42
+ PGVER: "17"
31
43
 
32
44
  runs-on: ${{ matrix.os }}-${{ matrix.os_ver || 'latest' }}
33
45
  env:
@@ -73,6 +85,7 @@ jobs:
73
85
  wget https://get.enterprisedb.com/postgresql/postgresql-$PGVERSION-binaries.zip && \
74
86
  sudo mkdir -p /Library/PostgreSQL && \
75
87
  sudo unzip postgresql-$PGVERSION-binaries.zip -d /Library/PostgreSQL/$PGVER && \
88
+ sudo mv /Library/PostgreSQL/$PGVER/pgsql/* /Library/PostgreSQL/$PGVER/ && \
76
89
  echo /Library/PostgreSQL/$PGVER/bin >> $GITHUB_PATH
77
90
 
78
91
  - run: bundle install
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 0.5.1 / 2025-03-22
2
+
3
+ * Add dependent gems for compat with ruby-3.5
4
+ * Add predefined roles for compat with PostgreSQL-16 and 17
5
+
6
+
7
+ ## 0.5.0 / 2023-08-24
8
+
9
+ * Add Kerberos and NTLM authentication support to LDAP connection
10
+ * Fix retrieval of groups with over 1500 users in Active Directory server. #45
11
+
12
+
1
13
  ## 0.4.0 / 2022-12-02
2
14
 
3
15
  * Support groups with over 1500 users in Active Directory server. #32
data/Gemfile CHANGED
@@ -5,5 +5,4 @@ gemspec
5
5
 
6
6
  group :development do
7
7
  gem "debug"
8
- gem "ruby-ldapserver", git: "https://github.com/larskanis/ruby-ldapserver/"
9
8
  end
data/README.md CHANGED
@@ -20,16 +20,18 @@ It is meant to be started as a cron job.
20
20
 
21
21
  ## FEATURES:
22
22
 
23
+ * User+group creation, deletion and changes in memberships are synchronized from LDAP to PostgreSQL
24
+ * Nested groups/roles supported
23
25
  * Configurable per YAML config file
24
26
  * Can use Active Directory as LDAP-Server
25
- * Nested groups/roles supported
26
27
  * Set scope of considered users/groups on LDAP and PG side
27
28
  * Test mode which doesn't do any changes to the DBMS
28
29
  * Both LDAP and PG connections can be secured by SSL/TLS
30
+ * NTLM and Kerberos authentication to LDAP server
29
31
 
30
32
  ## REQUIREMENTS:
31
33
 
32
- * Ruby-2.0+, JRuby-1.2+
34
+ * Ruby-2.0+
33
35
  * LDAP-v3 server
34
36
  * PostgreSQL-server v9.0+
35
37
 
@@ -70,6 +72,11 @@ Run in modify-mode:
70
72
  pg_ldap_sync -c my_config.yaml -vv
71
73
  ```
72
74
 
75
+ It is recommended to avoid granting permissions to synchronized users on the PostgreSQL server, but to grant permissions to groups instead.
76
+ This is because `DROP USER` statements invoked when a user leaves otherwise fail due to depending objects.
77
+ `DROP GROUP` equally fails if there are depending objects, but groups are typically more stable and removed rarely.
78
+
79
+
73
80
  ## TEST:
74
81
  There is a small test suite in the `test` directory that runs against an internal LDAP server and a PostgreSQL server. Ensure `pg_ctl`, `initdb` and `psql` commands are in the `PATH` like so:
75
82
  ```sh
data/appveyor.yml CHANGED
@@ -1,4 +1,4 @@
1
- image: Visual Studio 2019
1
+ image: Visual Studio 2022
2
2
 
3
3
  init:
4
4
  - set PATH=C:/Ruby%ruby_version%/bin;c:/Program Files/Git/cmd;c:/Windows/system32;C:/Windows/System32/WindowsPowerShell/v1.0
@@ -21,7 +21,8 @@ test_script:
21
21
 
22
22
  environment:
23
23
  matrix:
24
+ # ruby-3.3.6 currently fails installing stringio-3.1.5.gem
25
+ # - ruby_version: "33-x64"
26
+ # PGVER: 16
24
27
  - ruby_version: "27-x64"
25
- PGVER: 13
26
- - ruby_version: "24"
27
- PGVER: 10
28
+ PGVER: 11
@@ -5,13 +5,26 @@
5
5
  # Connection parameters to LDAP server
6
6
  # see also: http://net-ldap.rubyforge.org/Net/LDAP.html#method-c-new
7
7
  ldap_connection:
8
- host: localhost
8
+ host: ldapserver
9
9
  port: 389
10
10
  auth:
11
11
  method: :simple
12
12
  username: CN=username,OU=!Serviceaccounts,OU=company,DC=company,DC=de
13
13
  password: secret
14
14
 
15
+ # or GSSAPI / Kerberos authentication:
16
+ auth:
17
+ method: :gssapi
18
+ hostname: ldapserver.company.de
19
+ servicename: ldap # optional, defaults to "ldap"
20
+
21
+ # or GSS-SPNEGO / NTLM authentication
22
+ auth:
23
+ method: :gss_spnego
24
+ username: 'myuser'
25
+ password: 'secret'
26
+ domain: 'company.de' # optional
27
+
15
28
  # Search parameters for LDAP users which should be synchronized
16
29
  ldap_users:
17
30
  base: OU=company,OU=company,DC=company,DC=de
@@ -51,4 +64,5 @@ pg_groups:
51
64
  filter: NOT rolcanlogin AND NOT rolsuper
52
65
  # Options for CREATE RULE statements
53
66
  create_options: NOLOGIN
67
+ # Options for GRANT <role> TO <group> statements
54
68
  grant_options:
@@ -1,9 +1,11 @@
1
1
  # With this sample config the distinction between LDAP-synchronized
2
- # groups/users from is done by the membership to ldap_user and
3
- # ldap_group. These two roles have to be defined manally before
4
- # pg_ldap_sync can run:
5
- # CREATE GROUP ldap_group;
6
- # CREATE USER ldap_user;
2
+ # groups/users from manually created PostgreSQL users is done by the
3
+ # membership in ldap_user and ldap_group.
4
+ # These two roles have to be defined manally before pg_ldap_sync can
5
+ # run and all synchronized users/groups will become member of them
6
+ # later on:
7
+ # CREATE GROUP ldap_groups;
8
+ # CREATE USER ldap_users;
7
9
  #
8
10
 
9
11
  # Connection parameters to LDAP server
@@ -63,4 +65,5 @@ pg_groups:
63
65
  filter: oid IN (SELECT pam.member FROM pg_auth_members pam JOIN pg_roles pr ON pr.oid=pam.roleid WHERE pr.rolname='ldap_groups')
64
66
  # Options for CREATE RULE statements
65
67
  create_options: NOLOGIN IN ROLE ldap_groups
68
+ # Options for GRANT <role> TO <group> statements
66
69
  grant_options:
@@ -103,7 +103,7 @@ class Application
103
103
  array += entry[ranged_attr]
104
104
  log.debug "retrieved attribute range #{ranged_attr.inspect} of dn #{entry_dn}"
105
105
 
106
- if ranged_attr =~ /;range=\d\-\*\z/
106
+ if ranged_attr =~ /;range=\d+\-\*\z/
107
107
  break
108
108
  end
109
109
 
@@ -168,7 +168,7 @@ class Application
168
168
  PgRole = Struct.new :name, :member_names
169
169
 
170
170
  # List of default roles taken from https://www.postgresql.org/docs/current/predefined-roles.html
171
- PG_BUILTIN_ROLES = %w[ pg_read_all_data pg_write_all_data pg_read_all_settings pg_read_all_stats pg_stat_scan_tables pg_monitor pg_database_owner pg_signal_backend pg_read_server_files pg_write_server_files pg_execute_server_program pg_checkpoint]
171
+ PG_BUILTIN_ROLES = %w[ pg_read_all_data pg_write_all_data pg_read_all_settings pg_read_all_stats pg_stat_scan_tables pg_monitor pg_database_owner pg_signal_backend pg_read_server_files pg_write_server_files pg_execute_server_program pg_checkpoint pg_create_subscription pg_maintain pg_use_reserved_connections ]
172
172
 
173
173
  def search_pg_users
174
174
  pg_users_conf = @config[:pg_users]
@@ -361,8 +361,26 @@ class Application
361
361
  def start!
362
362
  read_config_file(@config_fname)
363
363
 
364
+ ldap_conf = @config[:ldap_connection]
365
+ auth_meth = ldap_conf.dig(:auth, :method).to_s
366
+ if auth_meth == "gssapi"
367
+ begin
368
+ require 'net/ldap/auth_adapter/gssapi'
369
+ rescue LoadError => err
370
+ raise "#{err}\nTo use GSSAPI authentication please run:\n gem install net-ldap-auth_adapter-gssapi"
371
+ end
372
+ elsif auth_meth == "gss_spnego"
373
+ begin
374
+ require 'net-ldap-gss-spnego'
375
+ # This doesn't work since this file is defined in net-ldap as a placeholder:
376
+ # require 'net/ldap/auth_adapter/gss_spnego'
377
+ rescue LoadError => err
378
+ raise "#{err}\nTo use GSSAPI authentication please run:\n gem install net-ldap-gss-spnego"
379
+ end
380
+ end
381
+
364
382
  # gather LDAP users and groups
365
- @ldap = Net::LDAP.new @config[:ldap_connection]
383
+ @ldap = Net::LDAP.new ldap_conf
366
384
  ldap_users = uniq_names search_ldap_users
367
385
  ldap_groups = uniq_names search_ldap_groups
368
386
 
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  class Hash
4
+ # transform_keys was added in ruby-2.5
4
5
  def transform_keys
5
6
  map do |k, v|
6
7
  [yield(k), v]
@@ -1,3 +1,3 @@
1
1
  module PgLdapSync
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.1"
3
3
  end
data/pg-ldap-sync.gemspec CHANGED
@@ -24,7 +24,10 @@ Gem::Specification.new do |spec|
24
24
  spec.add_runtime_dependency "net-ldap", "~> 0.16"
25
25
  spec.add_runtime_dependency "kwalify", "~> 0.7"
26
26
  spec.add_runtime_dependency "pg", ">= 0.14", "< 2.0"
27
- spec.add_development_dependency "ruby-ldapserver", "~> 0.3"
27
+ spec.add_runtime_dependency "logger", "~> 1.0"
28
+ spec.add_runtime_dependency "ostruct", "~> 0.1" # workaround missing dependency in net-ldap-0.19.0
29
+ spec.add_runtime_dependency "base64", "~> 0.1" # workaround missing dependency in net-ldap-0.19.0
30
+ spec.add_development_dependency "ruby-ldapserver", "~> 0.7"
28
31
  spec.add_development_dependency "minitest", "~> 5.0"
29
32
  spec.add_development_dependency "bundler", ">= 1.16", "< 3.0"
30
33
  spec.add_development_dependency "rake", "~> 13.0"
data.tar.gz.sig CHANGED
@@ -1,4 +1 @@
1
- j"gjy1D�FDb�:떙uqWg��a1�?5FE{�{E�_��Ld��+*���:�]��\h�W ��{�?��
2
- �8_���v���-))Z�x7�T_���X�^���c��&���V��Ѿ�dM�E��c��a�ⰨZ��bL��Ȓ@�
3
- �n�r8 _@��BR���[^�zP���6�����&|��QF~=%+�C���q
4
- ��غ�Գ.<FG=}��q�1�?�EE��
1
+ �����J1 ���}qR6�!����[F'�uӪ��_nwn�ӽwN�S��.�V
metadata CHANGED
@@ -1,18 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg-ldap-sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lars Kanis
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain:
11
10
  - |
12
11
  -----BEGIN CERTIFICATE-----
13
- MIIETTCCArWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
14
- L0RDPWdyZWl6LXJlaW5zZG9yZi9EQz1kZTAeFw0yMjAyMTQxMzMwNTZaFw0yMzAy
15
- MTQxMzMwNTZaMCgxJjAkBgNVBAMMHWxhcnMvREM9Z3JlaXotcmVpbnNkb3JmL0RD
12
+ MIIEBDCCAmygAwIBAgIBAzANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
13
+ L0RDPWdyZWl6LXJlaW5zZG9yZi9EQz1kZTAeFw0yNDEyMjkxOTU2NTZaFw0yNTEy
14
+ MjkxOTU2NTZaMCgxJjAkBgNVBAMMHWxhcnMvREM9Z3JlaXotcmVpbnNkb3JmL0RD
16
15
  PWRlMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAwum6Y1KznfpzXOT/
17
16
  mZgJTBbxZuuZF49Fq3K0WA67YBzNlDv95qzSp7V/7Ek3NCcnT7G+2kSuhNo1FhdN
18
17
  eSDO/moYebZNAcu3iqLsuzuULXPLuoU0GsMnVMqV9DZPh7cQHE5EBZ7hlzDBK7k/
@@ -21,21 +20,19 @@ cert_chain:
21
20
  JMNDFsmHK/6Ji4Kk48Z3TyscHQnipAID5GhS1oD21/WePdj7GhmbF5gBzkV5uepd
22
21
  eJQPgWGwrQW/Z2oPjRuJrRofzWfrMWqbOahj9uth6WSxhNexUtbjk6P8emmXOJi5
23
22
  chQPnWX+N3Gj+jjYxqTFdwT7Mj3pv1VHa+aNUbqSPpvJeDyxRIuo9hvzDaBHb/Cg
24
- 9qRVcm8a96n4t7y2lrX1oookY6bkBaxWOMtWlqIprq8JZXM9AgMBAAGjgYEwfzAJ
25
- BgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUOIdbSMr3VFrTCO9/cTM0
26
- 0exHzBcwIgYDVR0RBBswGYEXbGFyc0BncmVpei1yZWluc2RvcmYuZGUwIgYDVR0S
27
- BBswGYEXbGFyc0BncmVpei1yZWluc2RvcmYuZGUwDQYJKoZIhvcNAQELBQADggGB
28
- AFWP7F/y3Oq3NgrqUOnjKOeDaBa7AqNhHS+PZg+C90lnJzMgOs4KKgZYxqSQVSab
29
- SCEmzIO/StkXY4NpJ4fYLrHemf/fJy1wPyu+fNdp5SEEUwEo+2toRFlzTe4u4LdS
30
- QC636nPPTMt8H3xz2wf/lUIUeo2Qc95Qt2BQM465ibbG9kmA3c7Sopx6yOabYOAl
31
- KPRbOSEPiWYcF9Suuz8Gdf8jxEtPlnZiwRvnYJ+IHMq3XQCJWPpMzdDMbtlgHbXE
32
- vq1zOTLMSYAS0UB3uionR4yo1hLz60odwkCm7qf0o2Ci/5OjtB0a89VuyqRU2vUJ
33
- QH95WBjDJ6lCCW7J0mrMPnJQSUFTmufsU6jOChvPaCeAzW1YwrsP/YKnvwueG7ip
34
- VOdW6RitjtFxhS7evRL0201+KUvLz12zZWWjOcujlQs64QprxOtiv/MiisKb1Ng+
35
- oL1mUdzB8KrZL4/WbG5YNX6UTtJbIOu9qEFbBAy4/jtIkJX+dlNoFwd4GXQW1YNO
36
- nA==
23
+ 9qRVcm8a96n4t7y2lrX1oookY6bkBaxWOMtWlqIprq8JZXM9AgMBAAGjOTA3MAkG
24
+ A1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQ4h1tIyvdUWtMI739xMzTR
25
+ 7EfMFzANBgkqhkiG9w0BAQsFAAOCAYEAoZZWzNV2XXaoSmvyamSSN+Wt/Ia+DNrU
26
+ 2pc3kMEqykH6l1WiVPszr6HavQ//2I2UcSRSS5AGDdiSXcfyFmHtMBdtJHhTPcn7
27
+ 4DLliB0szpvwG+ltGD8PI8eWkLaTQeFzs+0QCTavgKV+Zw56Q0J5zZvHHUMrLkUD
28
+ qhwKjdTdkrRTn9Sqi0BrIRRZGTUDdrt8qoWm35aES5arKZzytgrRD/kXfFW2LCg0
29
+ FzgTKibR4/3g8ph94kQLg/D2SMlVPkQ3ECi036mZxDC2n8V6u3rDkG5923wmrRZB
30
+ J6cqz475Q8HYORQCB68OPzkWMfC7mBo3vpSsIqRoNs1FE4FJu4FGwZG8fBSrDC4H
31
+ bZe+GtyS3e2SMjgT65zp35gLO9I7MquzYN9P6V2u1iBpTycchk5z9R1ghxzZSBT8
32
+ DrkJ9tVlPQtJB0LqT0tvBap4upnwT1xYq721b5dwH6AF4Pi6iz/dc5vnq1/MH8bV
33
+ 8VbbBzzeE7MsvgkP3sHlLmY8PtuyViJ8
37
34
  -----END CERTIFICATE-----
38
- date: 2022-12-02 00:00:00.000000000 Z
35
+ date: 2025-03-22 00:00:00.000000000 Z
39
36
  dependencies:
40
37
  - !ruby/object:Gem::Dependency
41
38
  name: net-ldap
@@ -85,20 +82,62 @@ dependencies:
85
82
  - - "<"
86
83
  - !ruby/object:Gem::Version
87
84
  version: '2.0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: logger
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '1.0'
92
+ type: :runtime
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '1.0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: ostruct
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '0.1'
106
+ type: :runtime
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '0.1'
113
+ - !ruby/object:Gem::Dependency
114
+ name: base64
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '0.1'
120
+ type: :runtime
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '0.1'
88
127
  - !ruby/object:Gem::Dependency
89
128
  name: ruby-ldapserver
90
129
  requirement: !ruby/object:Gem::Requirement
91
130
  requirements:
92
131
  - - "~>"
93
132
  - !ruby/object:Gem::Version
94
- version: '0.3'
133
+ version: '0.7'
95
134
  type: :development
96
135
  prerelease: false
97
136
  version_requirements: !ruby/object:Gem::Requirement
98
137
  requirements:
99
138
  - - "~>"
100
139
  - !ruby/object:Gem::Version
101
- version: '0.3'
140
+ version: '0.7'
102
141
  - !ruby/object:Gem::Dependency
103
142
  name: minitest
104
143
  requirement: !ruby/object:Gem::Requirement
@@ -161,7 +200,6 @@ dependencies:
161
200
  - - "~>"
162
201
  - !ruby/object:Gem::Version
163
202
  version: '1.4'
164
- description:
165
203
  email:
166
204
  - lars@greiz-reinsdorf.de
167
205
  executables:
@@ -194,7 +232,6 @@ homepage: https://github.com/larskanis/pg-ldap-sync
194
232
  licenses:
195
233
  - MIT
196
234
  metadata: {}
197
- post_install_message:
198
235
  rdoc_options:
199
236
  - "--main"
200
237
  - README.md
@@ -212,8 +249,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
212
249
  - !ruby/object:Gem::Version
213
250
  version: '0'
214
251
  requirements: []
215
- rubygems_version: 3.3.7
216
- signing_key:
252
+ rubygems_version: 3.6.2
217
253
  specification_version: 4
218
254
  summary: Use LDAP permissions in PostgreSQL
219
255
  test_files: []
metadata.gz.sig CHANGED
Binary file