pg-ldap-sync 0.3.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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