schleuder 2.2.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.
Files changed (45) hide show
  1. data.tar.gz.sig +0 -0
  2. data/LICENSE +339 -0
  3. data/README +32 -0
  4. data/bin/schleuder +96 -0
  5. data/bin/schleuder-fix-gem-dependencies +30 -0
  6. data/bin/schleuder-init-setup +37 -0
  7. data/bin/schleuder-migrate-v2.1-to-v2.2 +205 -0
  8. data/bin/schleuder-newlist +384 -0
  9. data/contrib/check-expired-keys.rb +59 -0
  10. data/contrib/mutt-schleuder-colors.rc +10 -0
  11. data/contrib/mutt-schleuder-resend.vim +24 -0
  12. data/contrib/smtpserver.rb +76 -0
  13. data/ext/default-list.conf +146 -0
  14. data/ext/default-members.conf +7 -0
  15. data/ext/list.conf.example +14 -0
  16. data/ext/schleuder.conf +62 -0
  17. data/lib/schleuder.rb +49 -0
  18. data/lib/schleuder/archiver.rb +46 -0
  19. data/lib/schleuder/crypt.rb +188 -0
  20. data/lib/schleuder/errors.rb +5 -0
  21. data/lib/schleuder/list.rb +177 -0
  22. data/lib/schleuder/list_config.rb +146 -0
  23. data/lib/schleuder/log/listlogger.rb +56 -0
  24. data/lib/schleuder/log/outputter/emailoutputter.rb +118 -0
  25. data/lib/schleuder/log/outputter/metaemailoutputter.rb +50 -0
  26. data/lib/schleuder/log/schleuderlogger.rb +23 -0
  27. data/lib/schleuder/mail.rb +861 -0
  28. data/lib/schleuder/mailer.rb +26 -0
  29. data/lib/schleuder/member.rb +69 -0
  30. data/lib/schleuder/plugin.rb +54 -0
  31. data/lib/schleuder/processor.rb +363 -0
  32. data/lib/schleuder/schleuder_config.rb +72 -0
  33. data/lib/schleuder/storage.rb +84 -0
  34. data/lib/schleuder/utils.rb +80 -0
  35. data/lib/schleuder/version.rb +3 -0
  36. data/man/schleuder-newlist.8 +191 -0
  37. data/man/schleuder.8 +400 -0
  38. data/plugins/README +20 -0
  39. data/plugins/manage_keys_plugin.rb +113 -0
  40. data/plugins/manage_members_plugin.rb +152 -0
  41. data/plugins/manage_self_plugin.rb +26 -0
  42. data/plugins/resend_plugin.rb +35 -0
  43. data/plugins/version_plugin.rb +12 -0
  44. metadata +178 -0
  45. metadata.gz.sig +2 -0
data/plugins/README ADDED
@@ -0,0 +1,20 @@
1
+ Writing Plugins for Schleuder
2
+ ----------------------------
3
+
4
+ There are a few rules which any Plugin must follow to work (correctly):
5
+
6
+ - Name the file: <your_name>_plugin.rb (use underscores!)
7
+ - Name the class: YourNamePlugin
8
+ - module Schleuder
9
+ - Inherit from Plugin
10
+ - Implement two instance-methods:
11
+ - match(mail)
12
+ Is executed to determine whether process() should be executed. Needs to
13
+ take one argument (a Schleuder::Mail-object) and to return true or false.
14
+ - process(mail)
15
+ Is executed if match() returned true. Manipulate the taken
16
+ Schleuder::Mail-object here.
17
+ - use reply(origmail, your_message) to send a message to the sending
18
+ list-member and prevent normal distribution.
19
+
20
+ For examples see other Plugins.
@@ -0,0 +1,113 @@
1
+ module Schleuder
2
+ class ManageKeysPlugin < Plugin
3
+ def initialize
4
+ @plugin_type = :request
5
+ end
6
+
7
+ def list_keys(mail, value)
8
+ Schleuder.log.debug 'LIST-KEY requested'
9
+ listkeys(mail)
10
+ end
11
+
12
+ def add_key(mail, value)
13
+ Schleuder.log.debug 'ADD-KEY requested'
14
+ addkey(mail, mail.body)
15
+ end
16
+
17
+ def del_key(mail, value)
18
+ Schleuder.log.debug 'DEL-KEY requested'
19
+ # TODO: implement callback to sender with Hash to prevent replay
20
+ # attacks.
21
+ # Split at slash to work around some people's habit to include the
22
+ # bitlength and key-type ("2048R/DEADBEEF"). If there's no slash this
23
+ # won't do no harm. We need to force the string'iness to avoid nil's,
24
+ # though.
25
+ val = value.split('/').last.to_s
26
+ msg = "The DEL-KEY-keyword is deprecated and will be removed some day in the future. Please use DELETE-KEY instead.".fmt
27
+ msg << delkey(mail, val)
28
+ msg
29
+ end
30
+
31
+ def delete_key(mail, value)
32
+ Schleuder.log.debug 'DELETE-KEY requested'
33
+ delkey(mail, value.split('/').last)
34
+ end
35
+
36
+ def send_key(mail, value)
37
+ Schleuder.log.debug 'SEND-KEY requested'
38
+ val = value.split('/').last
39
+ msg = "The SEND-KEY-keyword is deprecated and will be removed some day in the future. Please use GET-KEY instead.".fmt
40
+ msg << getkey(mail, val)
41
+ msg
42
+ end
43
+
44
+ def get_key(mail, value)
45
+ Schleuder.log.debug 'GET-KEY requested'
46
+ val = value.split('/').last
47
+ getkey(mail, val)
48
+ end
49
+
50
+ private
51
+
52
+ def listkeys(mail)
53
+ m = ""
54
+ mail.crypt.list_keys.each do |k|
55
+ if not (trust = [:revoked, :expired, :disabled, :invalid].grep(k.trust)).empty?
56
+ m << "*Warning*: Key is #{trust.join(' and ')}!\n"
57
+ end
58
+ m << "#{k.to_s}"
59
+ if (exp = k.subkeys.first.expires) > Time.utc(1971, 1, 1, 1)
60
+ if exp < Time.now
61
+ m << "Expired at #{exp}.\n"
62
+ else
63
+ m << "Expires at #{exp}.\n"
64
+ end
65
+ end
66
+ m << "\n"
67
+ end
68
+ m
69
+ end
70
+
71
+ def addkey(mail, key)
72
+ m = ""
73
+ res = mail.crypt.add_key(key)
74
+ res.imports.each do |i|
75
+ if i.status == 1
76
+ action = "imported"
77
+ else
78
+ action = "not imported"
79
+ end
80
+ m << "#{mail.crypt.get_key(i.fpr).to_s}\n--> #{action}\n\n"
81
+ end
82
+ m << "\nImportResult.inspect:\n=> #{res.inspect}"
83
+ m
84
+ end
85
+
86
+ def delkey(mail, req)
87
+ unless (key = mail.crypt.get_key(req)).first
88
+ msg = "Failed to lookup key (#{req}) that should be deleted. Reason: #{key[1].capitalize}."
89
+ Schleuder.log.debug msg
90
+ return "--> #{msg}\n\n"
91
+ end
92
+ Schleuder.log.debug "Key to be deleted: #{key.inspect}"
93
+ res = mail.crypt.delete_key(key.first)
94
+ if res == true
95
+ action = "Key deleted."
96
+ else
97
+ action = "Key not deleted.\nException: #{res.to_s}"
98
+ end
99
+ "#{key.to_s}\n--> #{action}\n\n"
100
+ end
101
+
102
+ def getkey(mail, req)
103
+ keyblock = mail.crypt.export(req)
104
+ if keyblock.empty?
105
+ "#{req}\n\n--> No matching key present.\n"
106
+ else
107
+ "#{mail.crypt.list_keys(req).to_s.gsub(/^pub /, "\npub ")}\n\n#{keyblock}\n"
108
+ end
109
+ end
110
+
111
+ end
112
+ end
113
+
@@ -0,0 +1,152 @@
1
+ module Schleuder
2
+ class ManageMembersPlugin < Plugin
3
+ def initialize
4
+ @plugin_type = :request
5
+ end
6
+
7
+ def get_members(mail, value)
8
+ # TODO: deprecation-notice
9
+ Schleuder.log.debug 'GET-MEMBERS requested'
10
+ get_membersfile
11
+ end
12
+
13
+ def save_members(mail, value)
14
+ # TODO: deprecation-notice
15
+ Schleuder.log.debug 'SAVE-MEMBERS requested'
16
+ if mail.body.strip.empty?
17
+ "Error, empty input. You need to write the members list yaml-formatted into the body."
18
+ else
19
+ Schleuder.list.members = YAML.load(mail.body)
20
+ "Saving was successful.\n\nCurrent members.conf:\n\n#{get_membersfile}\n"
21
+ end
22
+ end
23
+
24
+ def add_member(mail, value)
25
+ Schleuder.log.debug 'ADD-MEMBER requested'
26
+ addmember(mail, value, mail.body)
27
+ end
28
+
29
+ def delete_member(mail, value)
30
+ Schleuder.log.debug 'DELETE-MEMBER requested'
31
+ deletemember(mail, value)
32
+ end
33
+
34
+ def list_members(mail, value)
35
+ Schleuder.log.debug 'LIST-MEMBERS requested'
36
+ listmembers(mail)
37
+ end
38
+
39
+ def get_member(mail, value)
40
+ Schleuder.log.debug 'GET-MEMBER requested'
41
+ getmember(mail, value)
42
+ end
43
+
44
+ def listmembers(mail)
45
+ msg = ''
46
+ msg << "Default mime-setting for this list: #{Schleuder.list.config.default_mime.downcase}.\n"
47
+ msg << "\nAdmins for this list:\n\n#{_list_members(Schleuder.list.config.admins)}"
48
+ msg << "\n\nMembers:\n\n#{_list_members(Schleuder.list.members)}"
49
+ msg
50
+ end
51
+
52
+ def _list_members(members)
53
+ members.collect { |member|
54
+ res = member.email.dup
55
+ res << " (mime: #{member.mime.downcase})" if member.mime && !member.mime.downcase.eql?(Schleuder.list.config.default_mime.downcase)
56
+ res << " :: #{_list_keys(member)}\n\n"
57
+ }.join('')
58
+ end
59
+
60
+ def _list_keys(member)
61
+ result = ''
62
+ key, msg = member.key(false) # also get a potentially expired key -> will
63
+ # also inform about multiple keys on the list
64
+ # that might not me the case otherwise
65
+ if key
66
+ if key.trust.eql?(:expired)
67
+ result << "*Warning*: Key expired! "
68
+ elsif key.trust.eql?(:revoked)
69
+ result << "*Warning*: Key revoked! "
70
+ end
71
+ result << member.key_descr
72
+ else
73
+ result << "*Warning*: #{msg}"
74
+ end
75
+ result
76
+ end
77
+
78
+ def addmember(mail, string, key)
79
+ email, mime = string.split(' ')
80
+ mem = Member.new({:email => email})
81
+ mem.mime = mime if mime
82
+ # TODO: test if address already subscribed
83
+ Schleuder.list.members = Schleuder.list.members << mem
84
+ msg = "#{mem}\n--> Member saved.\n\n"
85
+ if key
86
+ mail.crypt.add_key(key).imports.each do |i|
87
+ msg << "#{mail.crypt.key_descr(mail.crypt.get_key(i.fpr))}\n"
88
+ if i.status.eql? 1
89
+ msg << "--> Key imported.\n\n"
90
+ else
91
+ msg << "--> Key *not* imported (no error, maybe already present?).\n\n"
92
+ end
93
+ end
94
+ msg << "\n"
95
+ end
96
+ msg << "Updated members-list:\n\n#{_list_members(mail)}"
97
+ msg
98
+ end
99
+
100
+ def deletemember(mail, string)
101
+ msg = ''
102
+ members = Schleuder.list.members.dup
103
+ members.delete_if {|mem| mem.email.eql?(string)}
104
+ if members.eql? Schleuder.list.members
105
+ msg << "Member #{string} not found"
106
+ else
107
+ if Schleuder.list.members = members
108
+ msg << "Member #{string} deleted.\n"
109
+ else
110
+ msg = "Something failed. Please ask the maintainer of this list to figure out what\nhappened (e.g. by mailing to #{Schleuder.list.owner_addr}).\n"
111
+ end
112
+ end
113
+ msg << "\nUpdated members-list:\n\n#{_list_members(mail)}\n"
114
+ msg
115
+ end
116
+
117
+ def getmember(mail, string)
118
+ Schleuder.log.debug "string: #{string.inspect}"
119
+ msg = ''
120
+ member = Schleuder.list.find_member_by_email string
121
+ unless member
122
+ return "Member #{string} not found.\n"
123
+ end
124
+ msg << "Email: #{member.email}\nMime: "
125
+ if member.mime
126
+ msg << member.mime.downcase
127
+ else
128
+ msg << "#{Schleuder.list.config.default_mime.downcase} (list-default)"
129
+ end
130
+ msg << "\n\n"
131
+ keys = mail.crypt.list_keys(member.email)
132
+ if keys.empty?
133
+ msg << "*Warning*: No key!\n\n"
134
+ else
135
+ if keys.size > 1
136
+ msg << "*Warning*: Multiple keys!\n\n"
137
+ end
138
+ msg << "Key(s):\n\n"
139
+ keys.each do |key|
140
+ msg << "#{key.to_s}Fingerprint: #{key.subkeys.first.fpr}\n\n"
141
+ end
142
+ end
143
+ msg
144
+ end
145
+
146
+ private
147
+ def get_membersfile
148
+ File.read(Schleuder.list.members_file)
149
+ end
150
+ end
151
+ end
152
+
@@ -0,0 +1,26 @@
1
+ module Schleuder
2
+ class ManageSelfPlugin < Plugin
3
+ def initialize
4
+ @plugin_type = :request
5
+ end
6
+
7
+ def unsubscribe(mail, foo)
8
+ Schleuder.log.debug 'UNSUBSCRIBE requested'
9
+ msg = ''
10
+
11
+ key = Plugin.signing_key(mail)
12
+ member = Schleuder.list.find_member_by_key(key) || Schleuder.list.find_admin_by_key(key)
13
+
14
+ members = Schleuder.list.members.dup
15
+ members.delete_if {|mem| mem.email.eql?(member.email)}
16
+
17
+ if Schleuder.list.members = members
18
+ msg << "Your address #{member.email} hast been unsubscribed.\n"
19
+ else
20
+ msg = "Something failed. Please ask the maintainer of this list to figure out what\nhappened (e.g. by mailing to #{Schleuder.list.owner_addr}).\n"
21
+ end
22
+ msg
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ module Schleuder
2
+ class ResendPlugin < Plugin
3
+ def initialize
4
+ @plugin_type = :list
5
+ end
6
+
7
+ def resend(mail, value)
8
+ store_address(mail, value, false)
9
+ end
10
+
11
+ def resend_encrypted_only(mail, value)
12
+ store_address(mail, value, true)
13
+ end
14
+
15
+ def store_address(mail, value, encrypted_only)
16
+ if mail.to.to_a.include? Schleuder.list.request_addr
17
+ msg = "The resend-command may only be used in message sent over the list, not messages sent to the request-address."
18
+ Schleuder.log.warn msg
19
+ return msg.fmt
20
+ end
21
+ if Utils.emailaddress? value
22
+ m = Member.new({'email' => value})
23
+ if encrypted_only
24
+ m.encrypted_only = true
25
+ end
26
+ mail.resend_to << m
27
+ else
28
+ Schleuder.log.warn "Skipping invalid email address given with resend-keyword: #{value}"
29
+ mail.metadata[:error] << "Invalid address given: '#{value}'."
30
+ end
31
+ mail
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,12 @@
1
+ module Schleuder
2
+ class VersionPlugin < Plugin
3
+ def initialize
4
+ @plugin_type = :request
5
+ end
6
+
7
+ def get_version(mail, value)
8
+ require 'schleuder/version'
9
+ "This list runs on schleuder v#{Schleuder::VERSION}.\n\nFor documentation see <http://schleuder.nadir.org/documentation.html>"
10
+ end
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: schleuder
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - paz
9
+ - ng
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain:
13
+ - !binary |-
14
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUROakNDQWg2Z0F3SUJB
15
+ Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJCTVJNd0VRWURWUVFEREFwelky
16
+ aHMKWlhWa1pYSXlNUlV3RXdZS0NaSW1pWlB5TEdRQkdSWUZibUZrYVhJeEV6
17
+ QVJCZ29Ka2lhSmsvSXNaQUVaRmdOdgpjbWN3SGhjTk1USXdOakEyTVRreE5E
18
+ STBXaGNOTVRNd05qQTJNVGt4TkRJMFdqQkJNUk13RVFZRFZRUUREQXB6Clky
19
+ aHNaWFZrWlhJeU1SVXdFd1lLQ1pJbWlaUHlMR1FCR1JZRmJtRmthWEl4RXpB
20
+ UkJnb0praWFKay9Jc1pBRVoKRmdOdmNtY3dnZ0VpTUEwR0NTcUdTSWIzRFFF
21
+ QkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDaEdydW9ObnEzSXI3ZApGZCtrdEcw
22
+ dE1abG0yWlNPa3VITzVRUnJnWUxnYkJocFRFZjhpNkFqem9WTDBBSUMrdU1N
23
+ Vlk5aUU2ZnphS1VECkI3U3ZOdGNjSHNrWDZ6SFVWVnRTcUY5VnBiUW9tV3Bj
24
+ azBpQnF3UUl3NHZFTGUyaVorL1pVTEtJSkkvQlk0M3kKdFg3T3JhOGl6U3lQ
25
+ R2N1NkUxZnI1UEpJNmlnRm5sRWdzL2pDalAvSllIZi9mNDlmbkl6QUpnTzBR
26
+ N1lOTkpWcgpSMFpxbTFIYllFMnQrUnRvbVQyamdDakJ0RjQyaFg4K2dCNHlW
27
+ NW5lZGZIS3laZkQ2emQ3ZG9QRS9wZHRwbjgwCkJyUlFiSFhsRVBEQ2FkSEgw
28
+ MTNqN29MN0I1ZkpsSGVqWDZQRmZQdGVwcTNhZERRL08zbEZ2emZIdUpVR2pF
29
+ TzUKUVhwN2w1K2ZBZ01CQUFHak9UQTNNQWtHQTFVZEV3UUNNQUF3SFFZRFZS
30
+ ME9CQllFRklHMUc1UHhBMWxOL0JVWQprb212bHRzT1dDVGVNQXNHQTFVZER3
31
+ UUVBd0lFc0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWtrTDRWWVhPCmlI
32
+ YzQ5bHFrMU9FL2IzWFZYWGdiQlZ1aHhvTkpYZC9oSjRlTmVxbVpydWMrZDlX
33
+ bEJIYTlVVFRGZ3JmUkxOcmsKSkRaSnc5Y3E5NmI0TmxsaG54Q2xpZ21SZXQ0
34
+ RkpmYWVtYS9naTZZN0lWRmZMUG5nVVhDUGN1SUNGOXBKd05HcwpLSUVndEE1
35
+ TmNVMitJZFpLekowRnBoV3pIRlRpVytMd1Uyb0lTTEhwTXhXZVhZSXNLTW9x
36
+ MjM4U3k3Y1l3emQ3CnZhZEhrZHMzNTRsbU4vajNhYW1kTXJyeHUyOTlvdTh1
37
+ am9IbGcxK3IxNjlsa2J1VHdXbEI2RlVXT1J3emhvMWIKOFlJWWRpT29jUHdm
38
+ Zi9BZ3l3UVdGZDRGV2VNV0xQeXRkK1VndzZCSmZSSXY2VC9OTVJKWWRIUDJW
39
+ M1RTUVJyTApSYXNUTTVlUzIrK3EwQT09Ci0tLS0tRU5EIENFUlRJRklDQVRF
40
+ LS0tLS0K
41
+ date: 2012-06-06 00:00:00.000000000 Z
42
+ dependencies:
43
+ - !ruby/object:Gem::Dependency
44
+ name: gpgme
45
+ requirement: &9959680 !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - =
49
+ - !ruby/object:Gem::Version
50
+ version: 1.0.8
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: *9959680
54
+ - !ruby/object:Gem::Dependency
55
+ name: highline
56
+ requirement: &9957020 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.6.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: *9957020
65
+ - !ruby/object:Gem::Dependency
66
+ name: log4r
67
+ requirement: &9955820 !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: 1.1.9
73
+ type: :runtime
74
+ prerelease: false
75
+ version_requirements: *9955820
76
+ - !ruby/object:Gem::Dependency
77
+ name: ruby-filemagic
78
+ requirement: &10014620 !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: 0.4.2
84
+ type: :runtime
85
+ prerelease: false
86
+ version_requirements: *10014620
87
+ description: ! 'Schleuder is designed as a tool for group communication: subscribers
88
+ can communicate encrypted (and pseudonymously) among themselves, receive emails
89
+ from non-subscribers and send emails to non-subscribers via the list.
90
+
91
+
92
+ Schleuder takes care of all decryption and encryption, stripping of headers, formatting
93
+ conversions, etc. Schleuder can also send out its own public key upon request and
94
+ process administrative commands by email.'
95
+ email: schleuder2@nadir.org
96
+ executables:
97
+ - schleuder
98
+ - schleuder-newlist
99
+ - schleuder-fix-gem-dependencies
100
+ - schleuder-init-setup
101
+ - schleuder-migrate-v2.1-to-v2.2
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - contrib/check-expired-keys.rb
106
+ - contrib/mutt-schleuder-colors.rc
107
+ - contrib/mutt-schleuder-resend.vim
108
+ - contrib/smtpserver.rb
109
+ - ext/default-list.conf
110
+ - ext/default-members.conf
111
+ - ext/list.conf.example
112
+ - ext/schleuder.conf
113
+ - lib/schleuder.rb
114
+ - lib/schleuder/archiver.rb
115
+ - lib/schleuder/crypt.rb
116
+ - lib/schleuder/errors.rb
117
+ - lib/schleuder/list.rb
118
+ - lib/schleuder/list_config.rb
119
+ - lib/schleuder/log/listlogger.rb
120
+ - lib/schleuder/log/outputter/emailoutputter.rb
121
+ - lib/schleuder/log/outputter/metaemailoutputter.rb
122
+ - lib/schleuder/log/schleuderlogger.rb
123
+ - lib/schleuder/mail.rb
124
+ - lib/schleuder/mailer.rb
125
+ - lib/schleuder/member.rb
126
+ - lib/schleuder/plugin.rb
127
+ - lib/schleuder/processor.rb
128
+ - lib/schleuder/schleuder_config.rb
129
+ - lib/schleuder/storage.rb
130
+ - lib/schleuder/utils.rb
131
+ - lib/schleuder/version.rb
132
+ - plugins/README
133
+ - plugins/manage_keys_plugin.rb
134
+ - plugins/manage_members_plugin.rb
135
+ - plugins/manage_self_plugin.rb
136
+ - plugins/resend_plugin.rb
137
+ - plugins/version_plugin.rb
138
+ - README
139
+ - LICENSE
140
+ - man/schleuder.8
141
+ - man/schleuder-newlist.8
142
+ - !binary |-
143
+ YmluL3NjaGxldWRlcg==
144
+ - !binary |-
145
+ YmluL3NjaGxldWRlci1uZXdsaXN0
146
+ - !binary |-
147
+ YmluL3NjaGxldWRlci1maXgtZ2VtLWRlcGVuZGVuY2llcw==
148
+ - !binary |-
149
+ YmluL3NjaGxldWRlci1pbml0LXNldHVw
150
+ - !binary |-
151
+ YmluL3NjaGxldWRlci1taWdyYXRlLXYyLjEtdG8tdjIuMg==
152
+ homepage: http://schleuder2.nadir.org
153
+ licenses: []
154
+ post_install_message: ! "\n\n Note: There's still one dependency missing, which
155
+ we can't install in\n this run of rubygems. Please execute schleuder-fix-gem-dependencies
156
+ to\n complete the installation!\n\n"
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ none: false
168
+ requirements:
169
+ - - ! '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubyforge_project: ! '[none]'
174
+ rubygems_version: 1.8.11
175
+ signing_key:
176
+ specification_version: 3
177
+ summary: Schleuder is a gpg-enabled mailinglist with remailer-capabilities.
178
+ test_files: []