pg-ldap-sync 0.3.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e6ea134d34a9ff15f8e16aacb27ee545ff22a23500097e7474256c666bc4eff
4
- data.tar.gz: 32aedf90f32b328497bee8df9d01943b073a6faaf6f3f4c0336b2e90f0d779cc
3
+ metadata.gz: a08af19305647e9c74adbf8d4354f826d95eea24e3ac9d362e1f32df2e347f2e
4
+ data.tar.gz: b07f7ef2e6eee98529979b8b935dcf0d1a5b5e29535ba499824b36cfb71ebbca
5
5
  SHA512:
6
- metadata.gz: 8ac395dee24a267cbab7c89ca277cb57f7bccfbdbff4f48ee6d9db2dc6f740c442df9127831658e6aa52fdbe708f853741f3b727061a7ae4c6814343ddecbc73
7
- data.tar.gz: 14e0858af1c20fd488ba0ec9beb1bc5c71492e2f8904a97821612a09a2b5f4cf4def1e27631392cb4f1f88710f76564e74f9f5dd736ffd2dbf301b73725f057a
6
+ metadata.gz: ab386f3df54231fd962696446d38ce9cf2fa0bdef9bd383b9e9af72a96eb67527be1bb7ddf09133f80fd92a5e2868e5d07269a87bf0b45d648c732b5ae643017
7
+ data.tar.gz: 05631b8dea00b093943017f425cb82dd64edb2323afda113bafee01235368c1526f2386236de84979654c2c495c102ff1e7f441a1538199581730772d5845721
checksums.yaml.gz.sig CHANGED
Binary file
@@ -0,0 +1,81 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ job_test_gem:
7
+ name: Test built gem
8
+ strategy:
9
+ fail-fast: false
10
+ matrix:
11
+ include:
12
+ - os: windows
13
+ ruby: "head"
14
+ PGVERSION: 15.1-1-windows-x64
15
+ PGVER: "15"
16
+ - os: windows
17
+ ruby: "2.4"
18
+ PGVERSION: 9.4.26-1-windows-x64
19
+ PGVER: "9.4"
20
+ - os: ubuntu
21
+ ruby: "head"
22
+ PGVER: "15"
23
+ - os: ubuntu
24
+ os_ver: "20.04"
25
+ ruby: "2.3"
26
+ PGVER: "9.3"
27
+ - os: macos
28
+ ruby: "head"
29
+ PGVERSION: 15.1-1-osx
30
+ PGVER: "15"
31
+
32
+ runs-on: ${{ matrix.os }}-${{ matrix.os_ver || 'latest' }}
33
+ env:
34
+ PGVERSION: ${{ matrix.PGVERSION }}
35
+ PGVER: ${{ matrix.PGVER }}
36
+
37
+ steps:
38
+ - uses: actions/checkout@v3
39
+ - name: Set up Ruby
40
+ uses: ruby/setup-ruby@v1
41
+ with:
42
+ ruby-version: ${{ matrix.ruby }}
43
+
44
+ - name: Download PostgreSQL Windows
45
+ if: matrix.os == 'windows'
46
+ run: |
47
+ Add-Type -AssemblyName System.IO.Compression.FileSystem
48
+ function Unzip {
49
+ param([string]$zipfile, [string]$outpath)
50
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
51
+ }
52
+
53
+ $(new-object net.webclient).DownloadFile("http://get.enterprisedb.com/postgresql/postgresql-$env:PGVERSION-binaries.zip", "postgresql-binaries.zip")
54
+ Unzip "postgresql-binaries.zip" "."
55
+ echo "$pwd/pgsql/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
56
+ echo "PGUSER=$env:USERNAME" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
57
+ echo "PGPASSWORD=" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
58
+ md temp
59
+ icacls temp /grant "Everyone:(OI)(CI)F" /T
60
+
61
+ - name: Download PostgreSQL Ubuntu
62
+ if: matrix.os == 'ubuntu'
63
+ run: |
64
+ echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main $PGVER" | sudo tee -a /etc/apt/sources.list.d/pgdg.list
65
+ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
66
+ sudo apt-get -y update
67
+ sudo apt-get -y --allow-downgrades install postgresql-$PGVER libpq5=$PGVER* libpq-dev=$PGVER*
68
+ echo /usr/lib/postgresql/$PGVER/bin >> $GITHUB_PATH
69
+
70
+ - name: Download PostgreSQL Macos
71
+ if: matrix.os == 'macos'
72
+ run: |
73
+ wget https://get.enterprisedb.com/postgresql/postgresql-$PGVERSION-binaries.zip && \
74
+ sudo mkdir -p /Library/PostgreSQL && \
75
+ sudo unzip postgresql-$PGVERSION-binaries.zip -d /Library/PostgreSQL/$PGVER && \
76
+ echo /Library/PostgreSQL/$PGVER/bin >> $GITHUB_PATH
77
+
78
+ - run: bundle install
79
+
80
+ - name: Run specs
81
+ run: bundle exec rake test
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## 0.5.0 / 2023-08-24
2
+
3
+ * Add Kerberos and NTLM authentication support
4
+ * Fix retrieval of groups with over 1500 users in Active Directory server. #45
5
+
6
+
7
+ ## 0.4.0 / 2022-12-02
8
+
9
+ * Support groups with over 1500 users in Active Directory server. #32
10
+ * Retrieve only necessary attributes from LDAP server.
11
+ * Add error text to exception, so that it's visible even if nothing is logged.
12
+ * Fix compatibility with PostgreSQL-15
13
+ * Require ruby-2.3+
14
+
15
+
1
16
  ## 0.3.0 / 2022-01-18
2
17
 
3
18
  * Add config option :bothcase_name .
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in pg_ldap_sync.gemspec
4
4
  gemspec
5
+
6
+ group :development do
7
+ gem "debug"
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/Rakefile CHANGED
@@ -2,6 +2,8 @@
2
2
  require "bundler/gem_tasks"
3
3
  require "rake/testtask"
4
4
 
5
+ CLEAN.include "temp"
6
+
5
7
  Rake::TestTask.new(:test) do |t|
6
8
  t.libs << "test"
7
9
  t.libs << "lib"
@@ -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,7 +1,12 @@
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 has to be defined manally before
4
- # pg_ldap_sync can run.
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;
9
+ #
5
10
 
6
11
  # Connection parameters to LDAP server
7
12
  # see also: http://net-ldap.rubyforge.org/Net/LDAP.html#method-c-new
@@ -60,4 +65,5 @@ pg_groups:
60
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')
61
66
  # Options for CREATE RULE statements
62
67
  create_options: NOLOGIN IN ROLE ldap_groups
68
+ # Options for GRANT <role> TO <group> statements
63
69
  grant_options:
@@ -52,13 +52,18 @@ class Application
52
52
 
53
53
  def search_ldap_users
54
54
  ldap_user_conf = @config[:ldap_users]
55
+ name_attribute = ldap_user_conf[:name_attribute]
55
56
 
56
57
  users = []
57
- res = @ldap.search(:base => ldap_user_conf[:base], :filter => ldap_user_conf[:filter]) do |entry|
58
- name = entry[ldap_user_conf[:name_attribute]].first
58
+ res = @ldap.search(
59
+ base: ldap_user_conf[:base],
60
+ filter: ldap_user_conf[:filter],
61
+ attributes: [name_attribute, :dn]
62
+ ) do |entry|
63
+ name = entry[name_attribute].first
59
64
 
60
65
  unless name
61
- log.warn "user attribute #{ldap_user_conf[:name_attribute].inspect} not defined for #{entry.dn}"
66
+ log.warn "user attribute #{name_attribute.inspect} not defined for #{entry.dn}"
62
67
  next
63
68
  end
64
69
  log.info "found user-dn: #{entry.dn}"
@@ -85,17 +90,56 @@ class Application
85
90
  return users
86
91
  end
87
92
 
93
+ def retrieve_array_attribute(entry, attribute_name)
94
+ array = entry[attribute_name]
95
+ if array.empty?
96
+ # Possibly an attribute, which must be retrieved in several ranges
97
+
98
+ ranged_attr = entry.attribute_names.find { |n| n =~ /\A#{Regexp.escape(attribute_name)};range=/ }
99
+ if ranged_attr
100
+ entry_dn = entry.dn
101
+
102
+ loop do
103
+ array += entry[ranged_attr]
104
+ log.debug "retrieved attribute range #{ranged_attr.inspect} of dn #{entry_dn}"
105
+
106
+ if ranged_attr =~ /;range=\d+\-\*\z/
107
+ break
108
+ end
109
+
110
+ attribute_with_range = ranged_attr.to_s.gsub(/;range=.*/, ";range=#{array.size}-*")
111
+ entry = @ldap.search(
112
+ base: entry_dn,
113
+ scope: Net::LDAP::SearchScope_BaseObject,
114
+ attributes: attribute_with_range).first
115
+
116
+ ranged_attr = entry.attribute_names.find { |n| n =~ /\A#{Regexp.escape(attribute_name)};range=/ }
117
+ end
118
+ end
119
+ else
120
+ # Values already received -> No ranged attribute
121
+ end
122
+ return array
123
+ end
124
+
88
125
  def search_ldap_groups
89
126
  ldap_group_conf = @config[:ldap_groups]
127
+ name_attribute = ldap_group_conf[:name_attribute]
128
+ member_attribute = ldap_group_conf[:member_attribute]
90
129
 
91
130
  groups = []
92
- res = @ldap.search(:base => ldap_group_conf[:base], :filter => ldap_group_conf[:filter]) do |entry|
93
- name = entry[ldap_group_conf[:name_attribute]].first
131
+ res = @ldap.search(
132
+ base: ldap_group_conf[:base],
133
+ filter: ldap_group_conf[:filter],
134
+ attributes: [name_attribute, member_attribute, :dn]
135
+ ) do |entry|
136
+ name = entry[name_attribute].first
94
137
 
95
138
  unless name
96
- log.warn "user attribute #{ldap_group_conf[:name_attribute].inspect} not defined for #{entry.dn}"
139
+ log.warn "user attribute #{name_attribute.inspect} not defined for #{entry.dn}"
97
140
  next
98
141
  end
142
+
99
143
  log.info "found group-dn: #{entry.dn}"
100
144
 
101
145
  names = if ldap_group_conf[:bothcase_name]
@@ -107,7 +151,8 @@ class Application
107
151
  end
108
152
 
109
153
  names.each do |n|
110
- groups << LdapRole.new(n, entry.dn, entry[ldap_group_conf[:member_attribute]])
154
+ group_members = retrieve_array_attribute(entry, member_attribute)
155
+ groups << LdapRole.new(n, entry.dn, group_members)
111
156
  end
112
157
  entry.each do |attribute, values|
113
158
  log.debug " #{attribute}:"
@@ -123,7 +168,7 @@ class Application
123
168
  PgRole = Struct.new :name, :member_names
124
169
 
125
170
  # List of default roles taken from https://www.postgresql.org/docs/current/predefined-roles.html
126
- 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 ]
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]
127
172
 
128
173
  def search_pg_users
129
174
  pg_users_conf = @config[:pg_users]
@@ -316,8 +361,26 @@ class Application
316
361
  def start!
317
362
  read_config_file(@config_fname)
318
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
+
319
382
  # gather LDAP users and groups
320
- @ldap = Net::LDAP.new @config[:ldap_connection]
383
+ @ldap = Net::LDAP.new ldap_conf
321
384
  ldap_users = uniq_names search_ldap_users
322
385
  ldap_groups = uniq_names search_ldap_groups
323
386
 
@@ -348,14 +411,14 @@ class Application
348
411
 
349
412
  # Determine exitcode
350
413
  if log.had_errors?
351
- raise ErrorExit, 1
414
+ raise ErrorExit.new(1, log.first_error)
352
415
  end
353
416
  end
354
417
 
355
418
  def self.run(argv)
356
419
  s = self.new
357
420
  s.config_fname = '/etc/pg_ldap_sync.yaml'
358
- s.log = Logger.new($stdout, @error_counters)
421
+ s.log = Logger.new($stdout)
359
422
  s.log.level = Logger::ERROR
360
423
 
361
424
  OptionParser.new do |opts|
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ class Hash
4
+ # transform_keys was added in ruby-2.5
5
+ def transform_keys
6
+ map do |k, v|
7
+ [yield(k), v]
8
+ end.to_h
9
+ end unless method_defined? :transform_keys
10
+ end
@@ -2,23 +2,27 @@ require 'logger'
2
2
 
3
3
  module PgLdapSync
4
4
  class Logger < ::Logger
5
- def initialize(io, counters)
5
+ def initialize(io)
6
6
  super(io)
7
7
  @counters = {}
8
8
  end
9
9
 
10
- def add(severity, *args)
11
- @counters[severity] ||= 0
12
- @counters[severity] += 1
10
+ def add(severity, *args, &block)
13
11
  super
12
+ return unless [Logger::FATAL, Logger::ERROR].include?(severity)
13
+ @counters[severity] ||= block ? block.call : args.first
14
14
  end
15
15
 
16
16
  def had_logged?(severity)
17
- @counters[severity] && @counters[severity] > 0
17
+ !!@counters[severity]
18
18
  end
19
19
 
20
20
  def had_errors?
21
21
  had_logged?(Logger::FATAL) || had_logged?(Logger::ERROR)
22
22
  end
23
+
24
+ def first_error
25
+ @counters[Logger::FATAL] || @counters[Logger::ERROR]
26
+ end
23
27
  end
24
28
  end
@@ -1,3 +1,3 @@
1
1
  module PgLdapSync
2
- VERSION = "0.3.0"
2
+ VERSION = "0.5.0"
3
3
  end
data/lib/pg_ldap_sync.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "pg_ldap_sync/application"
2
+ require "pg_ldap_sync/compat"
2
3
  require "pg_ldap_sync/version"
3
4
 
4
5
  module PgLdapSync
@@ -8,7 +9,8 @@ module PgLdapSync
8
9
  class ApplicationExit < RuntimeError
9
10
  attr_reader :exitcode
10
11
 
11
- def initialize(exitcode)
12
+ def initialize(exitcode, error=nil)
13
+ super(error)
12
14
  @exitcode = exitcode
13
15
  end
14
16
  end
data/pg-ldap-sync.gemspec CHANGED
@@ -19,12 +19,12 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
  spec.rdoc_options = %w[--main README.md --charset=UTF-8]
22
- spec.required_ruby_version = ">= 2.4"
22
+ spec.required_ruby_version = ">= 2.3"
23
23
 
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_development_dependency "ruby-ldapserver", "~> 0.7"
28
28
  spec.add_development_dependency "minitest", "~> 5.0"
29
29
  spec.add_development_dependency "bundler", ">= 1.16", "< 3.0"
30
30
  spec.add_development_dependency "rake", "~> 13.0"
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,35 +1,39 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg-ldap-sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lars Kanis
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDLjCCAhagAwIBAgIBCTANBgkqhkiG9w0BAQsFADA9MQ4wDAYDVQQDDAVrYW5p
14
- czEXMBUGCgmSJomT8ixkARkWB2NvbWNhcmQxEjAQBgoJkiaJk/IsZAEZFgJkZTAe
15
- Fw0yMTA0MDcxMzQzNTZaFw0yMjA0MDcxMzQzNTZaMD0xDjAMBgNVBAMMBWthbmlz
16
- MRcwFQYKCZImiZPyLGQBGRYHY29tY2FyZDESMBAGCgmSJomT8ixkARkWAmRlMIIB
17
- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApop+rNmg35bzRugZ21VMGqI6
18
- HGzPLO4VHYncWn/xmgPU/ZMcZdfj6MzIaZJ/czXyt4eHpBk1r8QOV3gBXnRXEjVW
19
- 9xi+EdVOkTV2/AVFKThcbTAQGiF/bT1n2M+B1GTybRzMg6hyhOJeGPqIhLfJEpxn
20
- lJi4+ENAVT4MpqHEAGB8yFoPC0GqiOHQsdHxQV3P3c2OZqG+yJey74QtwA2tLcLn
21
- Q53c63+VLGsOjODl1yPn/2ejyq8qWu6ahfTxiIlSar2UbwtaQGBDFdb2CXgEufXT
22
- L7oaPxlmj+Q2oLOfOnInd2Oxop59HoJCQPsg8f921J43NCQGA8VHK6paxIRDLQID
23
- AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUvgTdT7fe
24
- x17ugO3IOsjEJwW7KP4wDQYJKoZIhvcNAQELBQADggEBAGCQhS4TBqUG1bSY5gw5
25
- emj2GNePHFNlXTZ/W0/7FlnXQz/LyBZeYmy4AIHcdY0w9xsu3bPNGk8kLBkHgK3Y
26
- l/yWiUK0NYRI3K3yI2EoTfrHPDT8XIgBPeUUGv5Nje+SUYMQWsfYWKo3+vLEG64a
27
- n1xP+1+g2Za39WCS5LwnDWMiIk47NnxR9yXErKd0Iau/Q/IarYsHFX6kWWmlMoln
28
- W1lMomCcOJFwIPnsy6aqq7YfS0YcqyHjcvs1h5k3zPaIRWhoPlQivniMVMa3Txh+
29
- NEF/4atY64rruzkyfxGEcrFFOHJIkWnWQjRGaiZdgULxf7ira2gEFvV/ZtamqJWF
30
- c+I=
13
+ MIIEBDCCAmygAwIBAgIBAjANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
14
+ L0RDPWdyZWl6LXJlaW5zZG9yZi9EQz1kZTAeFw0yMzAyMTUxNzQxMTVaFw0yNDAy
15
+ MTUxNzQxMTVaMCgxJjAkBgNVBAMMHWxhcnMvREM9Z3JlaXotcmVpbnNkb3JmL0RD
16
+ PWRlMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAwum6Y1KznfpzXOT/
17
+ mZgJTBbxZuuZF49Fq3K0WA67YBzNlDv95qzSp7V/7Ek3NCcnT7G+2kSuhNo1FhdN
18
+ eSDO/moYebZNAcu3iqLsuzuULXPLuoU0GsMnVMqV9DZPh7cQHE5EBZ7hlzDBK7k/
19
+ 8nBMvR0mHo77kIkapHc26UzVq/G0nKLfDsIHXVylto3PjzOumjG6GhmFN4r3cP6e
20
+ SDfl1FSeRYVpt4kmQULz/zdSaOH3AjAq7PM2Z91iGwQvoUXMANH2v89OWjQO/NHe
21
+ JMNDFsmHK/6Ji4Kk48Z3TyscHQnipAID5GhS1oD21/WePdj7GhmbF5gBzkV5uepd
22
+ eJQPgWGwrQW/Z2oPjRuJrRofzWfrMWqbOahj9uth6WSxhNexUtbjk6P8emmXOJi5
23
+ chQPnWX+N3Gj+jjYxqTFdwT7Mj3pv1VHa+aNUbqSPpvJeDyxRIuo9hvzDaBHb/Cg
24
+ 9qRVcm8a96n4t7y2lrX1oookY6bkBaxWOMtWlqIprq8JZXM9AgMBAAGjOTA3MAkG
25
+ A1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQ4h1tIyvdUWtMI739xMzTR
26
+ 7EfMFzANBgkqhkiG9w0BAQsFAAOCAYEAQAcuTARfiiVUVx5KURICfdTM2Kd7LhOn
27
+ qt3Vs4ANGvT226LEp3RnQ+kWGQYMRb3cw3LY2TNQRPlnZxE994mgjBscN4fbjXqO
28
+ T0JbVpeszRZa5k1goggbnWT7CO7yU7WcHh13DaSubY7HUpAJn2xz9w2stxQfN/EE
29
+ VMlnDJ1P7mUHAvpK8X9j9h7Xlc1niViT18MYwux8mboVTryrLr+clATUkkM3yBF0
30
+ RV+c34ReW5eXO9Tr6aKTxh/pFC9ggDT6jOxuJgSvG8HWJzVf4NDvMavIas4KYjiI
31
+ BU6CpWaG5NxicqL3BERi52U43HV08br+LNVpb7Rekgve/PJuSFnAR015bhSRXe5U
32
+ vBioD1qW2ZW9tXg8Ww2IfDaO5a1So5Xby51rhNlyo6ATj2NkuLWZUKPKHhAz0TKm
33
+ Dzx/gFSOrRoCt2mXNgrmcAfr386AfaMvCh7cXqdxZwmVo7ILZCYXck0pajvubsDd
34
+ NUIIFkVXvd1odFyK9LF1RFAtxn/iAmpx
31
35
  -----END CERTIFICATE-----
32
- date: 2022-01-18 00:00:00.000000000 Z
36
+ date: 2023-08-24 00:00:00.000000000 Z
33
37
  dependencies:
34
38
  - !ruby/object:Gem::Dependency
35
39
  name: net-ldap
@@ -85,14 +89,14 @@ dependencies:
85
89
  requirements:
86
90
  - - "~>"
87
91
  - !ruby/object:Gem::Version
88
- version: '0.3'
92
+ version: '0.7'
89
93
  type: :development
90
94
  prerelease: false
91
95
  version_requirements: !ruby/object:Gem::Requirement
92
96
  requirements:
93
97
  - - "~>"
94
98
  - !ruby/object:Gem::Version
95
- version: '0.3'
99
+ version: '0.7'
96
100
  - !ruby/object:Gem::Dependency
97
101
  name: minitest
98
102
  requirement: !ruby/object:Gem::Requirement
@@ -155,7 +159,7 @@ dependencies:
155
159
  - - "~>"
156
160
  - !ruby/object:Gem::Version
157
161
  version: '1.4'
158
- description:
162
+ description:
159
163
  email:
160
164
  - lars@greiz-reinsdorf.de
161
165
  executables:
@@ -164,6 +168,7 @@ extensions: []
164
168
  extra_rdoc_files: []
165
169
  files:
166
170
  - ".autotest"
171
+ - ".github/workflows/ci.yml"
167
172
  - ".gitignore"
168
173
  - ".travis.yml"
169
174
  - CHANGELOG.md
@@ -179,6 +184,7 @@ files:
179
184
  - exe/pg_ldap_sync
180
185
  - lib/pg_ldap_sync.rb
181
186
  - lib/pg_ldap_sync/application.rb
187
+ - lib/pg_ldap_sync/compat.rb
182
188
  - lib/pg_ldap_sync/logger.rb
183
189
  - lib/pg_ldap_sync/version.rb
184
190
  - pg-ldap-sync.gemspec
@@ -186,7 +192,7 @@ homepage: https://github.com/larskanis/pg-ldap-sync
186
192
  licenses:
187
193
  - MIT
188
194
  metadata: {}
189
- post_install_message:
195
+ post_install_message:
190
196
  rdoc_options:
191
197
  - "--main"
192
198
  - README.md
@@ -197,15 +203,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
197
203
  requirements:
198
204
  - - ">="
199
205
  - !ruby/object:Gem::Version
200
- version: '2.4'
206
+ version: '2.3'
201
207
  required_rubygems_version: !ruby/object:Gem::Requirement
202
208
  requirements:
203
209
  - - ">="
204
210
  - !ruby/object:Gem::Version
205
211
  version: '0'
206
212
  requirements: []
207
- rubygems_version: 3.3.3
208
- signing_key:
213
+ rubygems_version: 3.4.6
214
+ signing_key:
209
215
  specification_version: 4
210
216
  summary: Use LDAP permissions in PostgreSQL
211
217
  test_files: []
metadata.gz.sig CHANGED
Binary file