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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/workflows/ci.yml +81 -0
- data/CHANGELOG.md +15 -0
- data/Gemfile +4 -0
- data/README.md +9 -2
- data/Rakefile +2 -0
- data/config/sample-config.yaml +15 -1
- data/config/sample-config2.yaml +9 -3
- data/lib/pg_ldap_sync/application.rb +74 -11
- data/lib/pg_ldap_sync/compat.rb +10 -0
- data/lib/pg_ldap_sync/logger.rb +9 -5
- data/lib/pg_ldap_sync/version.rb +1 -1
- data/lib/pg_ldap_sync.rb +3 -1
- data/pg-ldap-sync.gemspec +2 -2
- data.tar.gz.sig +0 -0
- metadata +34 -28
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a08af19305647e9c74adbf8d4354f826d95eea24e3ac9d362e1f32df2e347f2e
|
4
|
+
data.tar.gz: b07f7ef2e6eee98529979b8b935dcf0d1a5b5e29535ba499824b36cfb71ebbca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
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
|
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
data/config/sample-config.yaml
CHANGED
@@ -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:
|
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:
|
data/config/sample-config2.yaml
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
# With this sample config the distinction between LDAP-synchronized
|
2
|
-
# groups/users from is done by the
|
3
|
-
#
|
4
|
-
# pg_ldap_sync can
|
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(
|
58
|
-
|
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 #{
|
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(
|
93
|
-
|
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 #{
|
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
|
-
|
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
|
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,
|
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
|
421
|
+
s.log = Logger.new($stdout)
|
359
422
|
s.log.level = Logger::ERROR
|
360
423
|
|
361
424
|
OptionParser.new do |opts|
|
data/lib/pg_ldap_sync/logger.rb
CHANGED
@@ -2,23 +2,27 @@ require 'logger'
|
|
2
2
|
|
3
3
|
module PgLdapSync
|
4
4
|
class Logger < ::Logger
|
5
|
-
def initialize(io
|
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
|
-
|
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
|
data/lib/pg_ldap_sync/version.rb
CHANGED
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.
|
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.
|
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.
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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:
|
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.
|
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.
|
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.
|
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.
|
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
|