class CreateAccount < ApplicationService def initialize(args) @username = args[:username] @domain = args[:ou] || "kosmos.org" @email = args[:email] @password = args[:password] @invitation = args[:invitation] end def call user = create_user_in_database add_ldap_document if @invitation.present? update_invitation(user.id) exchange_xmpp_contacts end end private def create_user_in_database User.create!( cn: @username, ou: @domain, email: @email, password: @password, password_confirmation: @password ) end def update_invitation(user_id) @invitation.update! invited_user_id: user_id, used_at: DateTime.now end def add_ldap_document dn = "cn=#{@username},ou=kosmos.org,cn=users,dc=kosmos,dc=org" attr = { objectclass: ["top", "account", "person", "extensibleObject"], cn: @username, sn: @username, uid: @username, mail: @email, userPassword: Devise.ldap_auth_password_builder.call(@password) } ldap_client.add(dn: dn, attributes: attr) end def ldap_client ldap_client ||= Net::LDAP.new host: ldap_config['host'], port: ldap_config['port'], encryption: ldap_config['ssl'], auth: { method: :simple, username: ldap_config['admin_user'], password: ldap_config['admin_password'] } end def ldap_config ldap_config ||= YAML.load(ERB.new(File.read("#{Rails.root}/config/ldap.yml")).result)[Rails.env] end def exchange_xmpp_contacts #TODO enable in development when we have easy setup of ejabberd etc. return if Rails.env.development? ejabberd = EjabberdApiClient.new inviter = @invitation.user ejabberd.add_rosteritem({ "localuser": @username, "localhost": @domain, "user": inviter.cn, "host": inviter.ou, "nick": inviter.cn, "group": "Friends", "subs": "both" }) ejabberd.add_rosteritem({ "localuser": inviter.cn, "localhost": inviter.ou, "user": @username, "host": @domain, "nick": @username, "group": "Friends", "subs": "both" }) end end