vines 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +19 -0
- data/README +34 -0
- data/Rakefile +55 -0
- data/bin/vines +95 -0
- data/conf/certs/README +32 -0
- data/conf/certs/ca-bundle.crt +3987 -0
- data/conf/config.rb +114 -0
- data/lib/vines.rb +155 -0
- data/lib/vines/command/bcrypt.rb +12 -0
- data/lib/vines/command/cert.rb +49 -0
- data/lib/vines/command/init.rb +58 -0
- data/lib/vines/command/ldap.rb +35 -0
- data/lib/vines/command/restart.rb +12 -0
- data/lib/vines/command/schema.rb +24 -0
- data/lib/vines/command/start.rb +28 -0
- data/lib/vines/command/stop.rb +18 -0
- data/lib/vines/config.rb +191 -0
- data/lib/vines/contact.rb +99 -0
- data/lib/vines/daemon.rb +78 -0
- data/lib/vines/error.rb +150 -0
- data/lib/vines/jid.rb +56 -0
- data/lib/vines/kit.rb +23 -0
- data/lib/vines/router.rb +125 -0
- data/lib/vines/stanza.rb +55 -0
- data/lib/vines/stanza/iq.rb +50 -0
- data/lib/vines/stanza/iq/auth.rb +18 -0
- data/lib/vines/stanza/iq/disco_info.rb +25 -0
- data/lib/vines/stanza/iq/disco_items.rb +23 -0
- data/lib/vines/stanza/iq/error.rb +16 -0
- data/lib/vines/stanza/iq/ping.rb +16 -0
- data/lib/vines/stanza/iq/query.rb +10 -0
- data/lib/vines/stanza/iq/result.rb +16 -0
- data/lib/vines/stanza/iq/roster.rb +153 -0
- data/lib/vines/stanza/iq/session.rb +22 -0
- data/lib/vines/stanza/iq/vcard.rb +58 -0
- data/lib/vines/stanza/message.rb +41 -0
- data/lib/vines/stanza/presence.rb +119 -0
- data/lib/vines/stanza/presence/error.rb +23 -0
- data/lib/vines/stanza/presence/probe.rb +38 -0
- data/lib/vines/stanza/presence/subscribe.rb +66 -0
- data/lib/vines/stanza/presence/subscribed.rb +64 -0
- data/lib/vines/stanza/presence/unavailable.rb +15 -0
- data/lib/vines/stanza/presence/unsubscribe.rb +57 -0
- data/lib/vines/stanza/presence/unsubscribed.rb +50 -0
- data/lib/vines/storage.rb +216 -0
- data/lib/vines/storage/couchdb.rb +119 -0
- data/lib/vines/storage/ldap.rb +59 -0
- data/lib/vines/storage/local.rb +66 -0
- data/lib/vines/storage/redis.rb +108 -0
- data/lib/vines/storage/sql.rb +174 -0
- data/lib/vines/store.rb +51 -0
- data/lib/vines/stream.rb +198 -0
- data/lib/vines/stream/client.rb +131 -0
- data/lib/vines/stream/client/auth.rb +94 -0
- data/lib/vines/stream/client/auth_restart.rb +33 -0
- data/lib/vines/stream/client/bind.rb +58 -0
- data/lib/vines/stream/client/bind_restart.rb +25 -0
- data/lib/vines/stream/client/closed.rb +13 -0
- data/lib/vines/stream/client/ready.rb +15 -0
- data/lib/vines/stream/client/start.rb +27 -0
- data/lib/vines/stream/client/tls.rb +37 -0
- data/lib/vines/stream/component.rb +53 -0
- data/lib/vines/stream/component/handshake.rb +25 -0
- data/lib/vines/stream/component/ready.rb +24 -0
- data/lib/vines/stream/component/start.rb +19 -0
- data/lib/vines/stream/http.rb +111 -0
- data/lib/vines/stream/http/http_request.rb +22 -0
- data/lib/vines/stream/http/http_state.rb +139 -0
- data/lib/vines/stream/http/http_states.rb +53 -0
- data/lib/vines/stream/parser.rb +78 -0
- data/lib/vines/stream/server.rb +126 -0
- data/lib/vines/stream/server/auth.rb +13 -0
- data/lib/vines/stream/server/auth_restart.rb +19 -0
- data/lib/vines/stream/server/final_restart.rb +20 -0
- data/lib/vines/stream/server/outbound/auth.rb +31 -0
- data/lib/vines/stream/server/outbound/auth_restart.rb +20 -0
- data/lib/vines/stream/server/outbound/auth_result.rb +28 -0
- data/lib/vines/stream/server/outbound/final_features.rb +27 -0
- data/lib/vines/stream/server/outbound/final_restart.rb +20 -0
- data/lib/vines/stream/server/outbound/start.rb +20 -0
- data/lib/vines/stream/server/outbound/tls.rb +30 -0
- data/lib/vines/stream/server/outbound/tls_result.rb +31 -0
- data/lib/vines/stream/server/ready.rb +20 -0
- data/lib/vines/stream/server/start.rb +13 -0
- data/lib/vines/stream/server/tls.rb +13 -0
- data/lib/vines/stream/state.rb +55 -0
- data/lib/vines/token_bucket.rb +46 -0
- data/lib/vines/user.rb +124 -0
- data/lib/vines/version.rb +5 -0
- data/lib/vines/xmpp_server.rb +25 -0
- data/test/config_test.rb +396 -0
- data/test/error_test.rb +59 -0
- data/test/ext/nokogiri.rb +14 -0
- data/test/jid_test.rb +71 -0
- data/test/kit_test.rb +21 -0
- data/test/router_test.rb +60 -0
- data/test/stanza/iq/roster_test.rb +198 -0
- data/test/stanza/iq/session_test.rb +30 -0
- data/test/stanza/iq/vcard_test.rb +159 -0
- data/test/stanza/message_test.rb +124 -0
- data/test/stanza/presence/subscribe_test.rb +75 -0
- data/test/storage/couchdb_test.rb +102 -0
- data/test/storage/ldap_test.rb +207 -0
- data/test/storage/local_test.rb +54 -0
- data/test/storage/redis_test.rb +75 -0
- data/test/storage/sql_test.rb +55 -0
- data/test/storage/storage_tests.rb +134 -0
- data/test/storage_test.rb +90 -0
- data/test/stream/client/auth_test.rb +127 -0
- data/test/stream/client/ready_test.rb +47 -0
- data/test/stream/component/handshake_test.rb +46 -0
- data/test/stream/component/ready_test.rb +105 -0
- data/test/stream/component/start_test.rb +41 -0
- data/test/stream/parser_test.rb +121 -0
- data/test/stream/server/outbound/auth_test.rb +77 -0
- data/test/stream/server/ready_test.rb +100 -0
- data/test/token_bucket_test.rb +24 -0
- data/test/user_test.rb +64 -0
- metadata +318 -0
data/conf/config.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# This is the Vines XMPP server configuration file. Restart the server with
|
4
|
+
# 'vines restart' after updating this file.
|
5
|
+
|
6
|
+
Vines::Config.configure do
|
7
|
+
# Set the logging level to debug, info, warn, error, or fatal. The debug
|
8
|
+
# level logs all XML sent and received by the server.
|
9
|
+
log :info
|
10
|
+
|
11
|
+
# Each host element below is a virtual host domain name that this server will
|
12
|
+
# service. Hosts can share storage configurations or use separate databases.
|
13
|
+
# TLS encryption is mandatory so each host must have a <domain>.crt and
|
14
|
+
# <domain>.key file in the conf/certs directory. A self-signed certificate can
|
15
|
+
# be generated for a virtual host domain with the 'vines cert <domain.tld>'
|
16
|
+
# command. Change the example, 'wonderland.lit', domain name to your actual
|
17
|
+
# domain.
|
18
|
+
#
|
19
|
+
# Shared storage example:
|
20
|
+
# host 'verona.lit', 'wonderland.lit' do
|
21
|
+
# storage 'fs' do
|
22
|
+
# dir 'conf/users'
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
|
26
|
+
host 'wonderland.lit' do
|
27
|
+
storage 'fs' do
|
28
|
+
dir 'conf/users'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Hosts can use LDAP authentication that overrides the authentication
|
33
|
+
# provided by a storage database. If LDAP is in use, passwords are not
|
34
|
+
# saved or validated against the storage database. However, all other user
|
35
|
+
# information, like rosters, is still saved in the storage database.
|
36
|
+
#
|
37
|
+
# host 'wonderland.lit' do
|
38
|
+
# storage 'fs' do
|
39
|
+
# dir 'conf/users'
|
40
|
+
# end
|
41
|
+
# ldap 'ldap.wonderland.lit', 636 do
|
42
|
+
# dn 'cn=Directory Manager'
|
43
|
+
# password 'secr3t'
|
44
|
+
# basedn 'dc=wonderland,dc=lit'
|
45
|
+
# object_class 'person'
|
46
|
+
# user_attr 'uid'
|
47
|
+
# name_attr 'cn'
|
48
|
+
# tls true
|
49
|
+
# end
|
50
|
+
# end
|
51
|
+
|
52
|
+
# Configure the client-to-server port. The max_resources_per_account attribute
|
53
|
+
# limits how many concurrent connections one user can have to the server.
|
54
|
+
client '0.0.0.0', 5222 do
|
55
|
+
max_stanza_size 65536
|
56
|
+
max_resources_per_account 5
|
57
|
+
end
|
58
|
+
|
59
|
+
# Configure the server-to-server port. The max_stanza_size attribute should be
|
60
|
+
# much larger than the setting for client-to-server. Add domain names to the
|
61
|
+
# 'hosts' white-list attribute to allow those servers to connect. Any connection
|
62
|
+
# attempt from a host not in this list will be denied.
|
63
|
+
server '0.0.0.0', 5269 do
|
64
|
+
max_stanza_size 131072
|
65
|
+
hosts []
|
66
|
+
end
|
67
|
+
|
68
|
+
# Configure the XEP-0124 BOSH port. This allows HTTP clients to connect to
|
69
|
+
# the XMPP server.
|
70
|
+
http '0.0.0.0', 5280 do
|
71
|
+
max_stanza_size 131072
|
72
|
+
end
|
73
|
+
|
74
|
+
# Configure the XEP-0114 external component port. Add entries for each
|
75
|
+
# component sub-domain allowed to connect to this server. Components must
|
76
|
+
# authenticate with a password.
|
77
|
+
component '0.0.0.0', 5347 do
|
78
|
+
max_stanza_size 131072
|
79
|
+
#components 'tea.wonderland.lit' => 'secr3t',
|
80
|
+
# 'cake.wonderland.lit' => 'passw0rd'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Available storage implementations:
|
85
|
+
|
86
|
+
#storage 'fs' do
|
87
|
+
# dir 'conf/users'
|
88
|
+
#end
|
89
|
+
|
90
|
+
#storage 'couchdb' do
|
91
|
+
# host 'localhost'
|
92
|
+
# port 6984
|
93
|
+
# database 'xmpp'
|
94
|
+
# tls true
|
95
|
+
# username ''
|
96
|
+
# password ''
|
97
|
+
#end
|
98
|
+
|
99
|
+
#storage 'redis' do
|
100
|
+
# host 'localhost'
|
101
|
+
# port 6379
|
102
|
+
# database 0
|
103
|
+
# password ''
|
104
|
+
#end
|
105
|
+
|
106
|
+
#storage 'sql' do
|
107
|
+
# adapter 'postgresql'
|
108
|
+
# host 'localhost'
|
109
|
+
# port 5432
|
110
|
+
# database 'xmpp'
|
111
|
+
# username ''
|
112
|
+
# password ''
|
113
|
+
# pool 5
|
114
|
+
#end
|
data/lib/vines.rb
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Vines
|
4
|
+
NAMESPACES = {
|
5
|
+
:stream => 'http://etherx.jabber.org/streams'.freeze,
|
6
|
+
:client => 'jabber:client'.freeze,
|
7
|
+
:server => 'jabber:server'.freeze,
|
8
|
+
:component => 'jabber:component:accept'.freeze,
|
9
|
+
:roster => 'jabber:iq:roster'.freeze,
|
10
|
+
:non_sasl => 'jabber:iq:auth'.freeze,
|
11
|
+
:sasl => 'urn:ietf:params:xml:ns:xmpp-sasl'.freeze,
|
12
|
+
:tls => 'urn:ietf:params:xml:ns:xmpp-tls'.freeze,
|
13
|
+
:bind => 'urn:ietf:params:xml:ns:xmpp-bind'.freeze,
|
14
|
+
:session => 'urn:ietf:params:xml:ns:xmpp-session'.freeze,
|
15
|
+
:ping => 'urn:xmpp:ping'.freeze,
|
16
|
+
:disco_items => 'http://jabber.org/protocol/disco#items'.freeze,
|
17
|
+
:disco_info => 'http://jabber.org/protocol/disco#info'.freeze,
|
18
|
+
:http_bind => 'http://jabber.org/protocol/httpbind'.freeze,
|
19
|
+
:bosh => 'urn:xmpp:xbosh'.freeze,
|
20
|
+
:vcard => 'vcard-temp'.freeze
|
21
|
+
}.freeze
|
22
|
+
|
23
|
+
module Log
|
24
|
+
@@logger = nil
|
25
|
+
def log
|
26
|
+
unless @@logger
|
27
|
+
@@logger = Logger.new(STDOUT)
|
28
|
+
@@logger.level = Logger::INFO
|
29
|
+
@@logger.progname = 'vines'
|
30
|
+
@@logger.formatter = Class.new(Logger::Formatter) do
|
31
|
+
def initialize
|
32
|
+
@time = "%Y-%m-%dT%H:%M:%SZ".freeze
|
33
|
+
@fmt = "[%s] %5s -- %s: %s\n".freeze
|
34
|
+
end
|
35
|
+
def call(severity, time, program, msg)
|
36
|
+
@fmt % [time.utc.strftime(@time), severity, program, msg2str(msg)]
|
37
|
+
end
|
38
|
+
end.new
|
39
|
+
end
|
40
|
+
@@logger
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
%w[
|
46
|
+
resolv-replace
|
47
|
+
active_record
|
48
|
+
base64
|
49
|
+
bcrypt
|
50
|
+
digest/sha1
|
51
|
+
em-http
|
52
|
+
em-redis
|
53
|
+
eventmachine
|
54
|
+
fiber
|
55
|
+
logger
|
56
|
+
net/ldap
|
57
|
+
nokogiri
|
58
|
+
openssl
|
59
|
+
socket
|
60
|
+
thin
|
61
|
+
uri
|
62
|
+
yaml
|
63
|
+
|
64
|
+
vines/jid
|
65
|
+
vines/stanza
|
66
|
+
vines/stanza/iq
|
67
|
+
vines/stanza/iq/query
|
68
|
+
vines/stanza/iq/auth
|
69
|
+
vines/stanza/iq/disco_info
|
70
|
+
vines/stanza/iq/disco_items
|
71
|
+
vines/stanza/iq/error
|
72
|
+
vines/stanza/iq/ping
|
73
|
+
vines/stanza/iq/result
|
74
|
+
vines/stanza/iq/roster
|
75
|
+
vines/stanza/iq/session
|
76
|
+
vines/stanza/iq/vcard
|
77
|
+
vines/stanza/message
|
78
|
+
vines/stanza/presence
|
79
|
+
vines/stanza/presence/error
|
80
|
+
vines/stanza/presence/probe
|
81
|
+
vines/stanza/presence/subscribe
|
82
|
+
vines/stanza/presence/subscribed
|
83
|
+
vines/stanza/presence/unavailable
|
84
|
+
vines/stanza/presence/unsubscribe
|
85
|
+
vines/stanza/presence/unsubscribed
|
86
|
+
|
87
|
+
vines/storage
|
88
|
+
vines/storage/couchdb
|
89
|
+
vines/storage/ldap
|
90
|
+
vines/storage/local
|
91
|
+
vines/storage/redis
|
92
|
+
vines/storage/sql
|
93
|
+
|
94
|
+
vines/store
|
95
|
+
vines/contact
|
96
|
+
vines/config
|
97
|
+
vines/daemon
|
98
|
+
vines/error
|
99
|
+
vines/kit
|
100
|
+
vines/router
|
101
|
+
vines/token_bucket
|
102
|
+
vines/user
|
103
|
+
vines/version
|
104
|
+
vines/xmpp_server
|
105
|
+
|
106
|
+
vines/stream
|
107
|
+
vines/stream/state
|
108
|
+
vines/stream/parser
|
109
|
+
|
110
|
+
vines/stream/client
|
111
|
+
vines/stream/client/start
|
112
|
+
vines/stream/client/tls
|
113
|
+
vines/stream/client/auth_restart
|
114
|
+
vines/stream/client/auth
|
115
|
+
vines/stream/client/bind_restart
|
116
|
+
vines/stream/client/bind
|
117
|
+
vines/stream/client/ready
|
118
|
+
vines/stream/client/closed
|
119
|
+
|
120
|
+
vines/stream/component
|
121
|
+
vines/stream/component/start
|
122
|
+
vines/stream/component/handshake
|
123
|
+
vines/stream/component/ready
|
124
|
+
|
125
|
+
vines/stream/http
|
126
|
+
vines/stream/http/http_state
|
127
|
+
vines/stream/http/http_states
|
128
|
+
vines/stream/http/http_request
|
129
|
+
|
130
|
+
vines/stream/server
|
131
|
+
vines/stream/server/start
|
132
|
+
vines/stream/server/tls
|
133
|
+
vines/stream/server/auth_restart
|
134
|
+
vines/stream/server/auth
|
135
|
+
vines/stream/server/final_restart
|
136
|
+
vines/stream/server/ready
|
137
|
+
|
138
|
+
vines/stream/server/outbound/start
|
139
|
+
vines/stream/server/outbound/tls
|
140
|
+
vines/stream/server/outbound/tls_result
|
141
|
+
vines/stream/server/outbound/auth_restart
|
142
|
+
vines/stream/server/outbound/auth
|
143
|
+
vines/stream/server/outbound/auth_result
|
144
|
+
vines/stream/server/outbound/final_restart
|
145
|
+
vines/stream/server/outbound/final_features
|
146
|
+
|
147
|
+
vines/command/bcrypt
|
148
|
+
vines/command/cert
|
149
|
+
vines/command/init
|
150
|
+
vines/command/ldap
|
151
|
+
vines/command/restart
|
152
|
+
vines/command/schema
|
153
|
+
vines/command/start
|
154
|
+
vines/command/stop
|
155
|
+
].each {|f| require f }
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Vines
|
4
|
+
module Command
|
5
|
+
class Cert
|
6
|
+
def run(opts)
|
7
|
+
raise 'vines cert <domain>' unless opts[:args].size == 1
|
8
|
+
dir = File.expand_path(File.join(opts[:config], '../certs'))
|
9
|
+
create_cert(opts[:args].first, dir)
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_cert(domain, dir)
|
13
|
+
domain = domain.downcase
|
14
|
+
key = OpenSSL::PKey::RSA.generate(2048)
|
15
|
+
ca = OpenSSL::X509::Name.parse("/C=US/ST=Colorado/L=Denver/O=Vines XMPP Server/CN=#{domain}")
|
16
|
+
cert = OpenSSL::X509::Certificate.new
|
17
|
+
cert.version = 2
|
18
|
+
cert.subject = ca
|
19
|
+
cert.issuer = ca
|
20
|
+
cert.serial = Time.now.to_i
|
21
|
+
cert.public_key = key.public_key
|
22
|
+
cert.not_before = Time.now - (24 * 60 * 60)
|
23
|
+
cert.not_after = Time.now + (365 * 24 * 60 * 60)
|
24
|
+
|
25
|
+
factory = OpenSSL::X509::ExtensionFactory.new
|
26
|
+
factory.subject_certificate = cert
|
27
|
+
factory.issuer_certificate = cert
|
28
|
+
cert.extensions = [
|
29
|
+
%w[basicConstraints CA:TRUE],
|
30
|
+
%w[subjectKeyIdentifier hash],
|
31
|
+
%w[subjectAltName] << [domain, hostname].map {|n| "DNS:#{n}" }.join(',')
|
32
|
+
].map {|k, v| factory.create_ext(k, v) }
|
33
|
+
|
34
|
+
cert.sign(key, OpenSSL::Digest::SHA1.new)
|
35
|
+
|
36
|
+
{'key' => key, 'crt' => cert}.each_pair do |ext, o|
|
37
|
+
name = File.join(dir, "#{domain}.#{ext}")
|
38
|
+
File.open(name, "w") {|f| f.write(o.to_pem) }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def hostname
|
45
|
+
Socket.gethostbyname(Socket.gethostname).first.downcase
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Vines
|
4
|
+
module Command
|
5
|
+
class Init
|
6
|
+
def run(opts)
|
7
|
+
raise 'vines init <domain>' unless opts[:args].size == 1
|
8
|
+
domain = opts[:args].first
|
9
|
+
dir = File.expand_path(domain)
|
10
|
+
raise "Directory already initialized: #{domain}" if File.exists?(dir)
|
11
|
+
Dir.mkdir(dir)
|
12
|
+
|
13
|
+
FileUtils.cp_r(File.expand_path('../../../../conf', __FILE__), dir)
|
14
|
+
users, log, pid = %w[conf/users log pid].map do |sub|
|
15
|
+
File.join(dir, sub).tap {|subdir| Dir.mkdir(subdir) }
|
16
|
+
end
|
17
|
+
|
18
|
+
create_users(domain, users)
|
19
|
+
update_config(domain, File.join(dir, 'conf', 'config.rb'))
|
20
|
+
Command::Cert.new.create_cert(domain, File.join(dir, 'conf/certs'))
|
21
|
+
|
22
|
+
puts "Initialized server directory: #{domain}"
|
23
|
+
puts "Run 'cd #{domain} && vines start' to begin"
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def update_config(domain, config)
|
29
|
+
text = File.read(config)
|
30
|
+
File.open(config, 'w') do |f|
|
31
|
+
f.write(text.gsub('wonderland.lit', domain.downcase))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_users(domain, dir)
|
36
|
+
password = 'secr3t'
|
37
|
+
alice, arthur = %w[alice arthur].map do |jid|
|
38
|
+
User.new(:jid => [jid, domain.downcase].join('@'),
|
39
|
+
:password => BCrypt::Password.create(password).to_s)
|
40
|
+
end
|
41
|
+
|
42
|
+
[[alice, arthur], [arthur, alice]].each do |user, contact|
|
43
|
+
user.roster << Contact.new(
|
44
|
+
:jid => contact.jid,
|
45
|
+
:name => contact.jid.node.capitalize,
|
46
|
+
:subscription => 'both',
|
47
|
+
:groups => %w[Buddies])
|
48
|
+
end
|
49
|
+
|
50
|
+
storage = Storage::Local.new { dir(dir) }
|
51
|
+
[alice, arthur].each do |user|
|
52
|
+
storage.save_user(user)
|
53
|
+
puts "Created example user #{user.jid} with password #{password}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Vines
|
4
|
+
module Command
|
5
|
+
class Ldap
|
6
|
+
def run(opts)
|
7
|
+
raise 'vines ldap <domain>' unless opts[:args].size == 1
|
8
|
+
require opts[:config]
|
9
|
+
domain = opts[:args].first
|
10
|
+
unless storage = Config.instance.vhosts[domain]
|
11
|
+
raise "#{domain} virtual host not found in conf/config.rb"
|
12
|
+
end
|
13
|
+
unless storage.ldap?
|
14
|
+
raise "LDAP connector not configured for #{domain} virtual host"
|
15
|
+
end
|
16
|
+
$stdout.write('JID: ')
|
17
|
+
jid = $stdin.gets.chomp
|
18
|
+
jid = [jid, domain].join('@') unless jid.include?('@')
|
19
|
+
$stdout.write('Password: ')
|
20
|
+
`stty -echo`
|
21
|
+
password = $stdin.gets.chomp
|
22
|
+
`stty echo`
|
23
|
+
puts
|
24
|
+
|
25
|
+
begin
|
26
|
+
user = storage.ldap.authenticate(jid, password)
|
27
|
+
rescue Exception => e
|
28
|
+
raise "LDAP connection failed: #{e.message}"
|
29
|
+
end
|
30
|
+
raise "User not found" unless user
|
31
|
+
puts "Found #{user.jid} with name: #{user.name}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Vines
|
4
|
+
module Command
|
5
|
+
class Schema
|
6
|
+
def run(opts)
|
7
|
+
raise 'vines schema <domain>' unless opts[:args].size == 1
|
8
|
+
require opts[:config]
|
9
|
+
domain = opts[:args].first
|
10
|
+
unless storage = Config.instance.vhosts[domain]
|
11
|
+
raise "#{domain} virtual host not found in conf/config.rb"
|
12
|
+
end
|
13
|
+
unless storage.respond_to?(:create_schema)
|
14
|
+
raise "SQL storage not configured for #{domain} virtual host"
|
15
|
+
end
|
16
|
+
begin
|
17
|
+
storage.create_schema
|
18
|
+
rescue Exception => e
|
19
|
+
raise "Schema creation failed: #{e.message}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|