bbmb 2.0.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 (92) hide show
  1. data/History.txt +5 -0
  2. data/LICENSE.txt +339 -0
  3. data/Manifest.txt +91 -0
  4. data/README.txt +25 -0
  5. data/Rakefile +28 -0
  6. data/bin/admin +71 -0
  7. data/bin/bbmbd +61 -0
  8. data/lib/bbmb.rb +9 -0
  9. data/lib/bbmb/config.rb +106 -0
  10. data/lib/bbmb/html/state/change_password.rb +50 -0
  11. data/lib/bbmb/html/state/current_order.rb +81 -0
  12. data/lib/bbmb/html/state/customer.rb +109 -0
  13. data/lib/bbmb/html/state/customers.rb +52 -0
  14. data/lib/bbmb/html/state/favorites.rb +19 -0
  15. data/lib/bbmb/html/state/favorites_result.rb +21 -0
  16. data/lib/bbmb/html/state/global.rb +62 -0
  17. data/lib/bbmb/html/state/history.rb +95 -0
  18. data/lib/bbmb/html/state/info.rb +23 -0
  19. data/lib/bbmb/html/state/json.rb +16 -0
  20. data/lib/bbmb/html/state/login.rb +76 -0
  21. data/lib/bbmb/html/state/order.rb +21 -0
  22. data/lib/bbmb/html/state/orders.rb +19 -0
  23. data/lib/bbmb/html/state/result.rb +64 -0
  24. data/lib/bbmb/html/state/show_pass.rb +16 -0
  25. data/lib/bbmb/html/state/viral/admin.rb +41 -0
  26. data/lib/bbmb/html/state/viral/customer.rb +143 -0
  27. data/lib/bbmb/html/util/known_user.rb +51 -0
  28. data/lib/bbmb/html/util/multilingual.rb +18 -0
  29. data/lib/bbmb/html/util/session.rb +52 -0
  30. data/lib/bbmb/html/util/validator.rb +55 -0
  31. data/lib/bbmb/html/view/backorder.rb +24 -0
  32. data/lib/bbmb/html/view/change_password.rb +42 -0
  33. data/lib/bbmb/html/view/copyleft.rb +41 -0
  34. data/lib/bbmb/html/view/current_order.rb +482 -0
  35. data/lib/bbmb/html/view/customer.rb +152 -0
  36. data/lib/bbmb/html/view/customers.rb +145 -0
  37. data/lib/bbmb/html/view/favorites.rb +162 -0
  38. data/lib/bbmb/html/view/favorites_result.rb +26 -0
  39. data/lib/bbmb/html/view/foot.rb +21 -0
  40. data/lib/bbmb/html/view/head.rb +32 -0
  41. data/lib/bbmb/html/view/history.rb +60 -0
  42. data/lib/bbmb/html/view/info.rb +33 -0
  43. data/lib/bbmb/html/view/json.rb +20 -0
  44. data/lib/bbmb/html/view/list_prices.rb +51 -0
  45. data/lib/bbmb/html/view/login.rb +46 -0
  46. data/lib/bbmb/html/view/multilingual.rb +17 -0
  47. data/lib/bbmb/html/view/navigation.rb +30 -0
  48. data/lib/bbmb/html/view/order.rb +123 -0
  49. data/lib/bbmb/html/view/orders.rb +50 -0
  50. data/lib/bbmb/html/view/result.rb +107 -0
  51. data/lib/bbmb/html/view/search.rb +28 -0
  52. data/lib/bbmb/html/view/show_pass.rb +60 -0
  53. data/lib/bbmb/html/view/template.rb +61 -0
  54. data/lib/bbmb/model/customer.rb +96 -0
  55. data/lib/bbmb/model/order.rb +255 -0
  56. data/lib/bbmb/model/product.rb +99 -0
  57. data/lib/bbmb/model/promotion.rb +52 -0
  58. data/lib/bbmb/model/quota.rb +27 -0
  59. data/lib/bbmb/model/subject.rb +46 -0
  60. data/lib/bbmb/persistence/none.rb +6 -0
  61. data/lib/bbmb/persistence/odba.rb +42 -0
  62. data/lib/bbmb/persistence/odba/model/customer.rb +47 -0
  63. data/lib/bbmb/persistence/odba/model/order.rb +50 -0
  64. data/lib/bbmb/persistence/odba/model/product.rb +26 -0
  65. data/lib/bbmb/persistence/odba/model/quota.rb +12 -0
  66. data/lib/bbmb/util/invoicer.rb +126 -0
  67. data/lib/bbmb/util/mail.rb +140 -0
  68. data/lib/bbmb/util/multilingual.rb +57 -0
  69. data/lib/bbmb/util/numbers.rb +67 -0
  70. data/lib/bbmb/util/password_generator.rb +44 -0
  71. data/lib/bbmb/util/polling_manager.rb +135 -0
  72. data/lib/bbmb/util/server.rb +159 -0
  73. data/lib/bbmb/util/target_dir.rb +36 -0
  74. data/lib/bbmb/util/transfer_dat.rb +34 -0
  75. data/lib/bbmb/util/updater.rb +27 -0
  76. data/test/data/ydim.yml +2 -0
  77. data/test/model/test_customer.rb +75 -0
  78. data/test/model/test_order.rb +426 -0
  79. data/test/model/test_product.rb +238 -0
  80. data/test/model/test_promotion.rb +40 -0
  81. data/test/stub/persistence.rb +57 -0
  82. data/test/suite.rb +12 -0
  83. data/test/test_bbmb.rb +18 -0
  84. data/test/util/test_invoicer.rb +189 -0
  85. data/test/util/test_mail.rb +359 -0
  86. data/test/util/test_money.rb +71 -0
  87. data/test/util/test_password_generator.rb +27 -0
  88. data/test/util/test_polling_manager.rb +312 -0
  89. data/test/util/test_server.rb +189 -0
  90. data/test/util/test_target_dir.rb +82 -0
  91. data/test/util/test_transfer_dat.rb +45 -0
  92. metadata +190 -0
@@ -0,0 +1,28 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ # Hoe.plugin :compiler
7
+ # Hoe.plugin :cucumberfeatures
8
+ # Hoe.plugin :gem_prelude_sucks
9
+ # Hoe.plugin :inline
10
+ # Hoe.plugin :inline
11
+ # Hoe.plugin :manifest
12
+ # Hoe.plugin :newgem
13
+ # Hoe.plugin :racc
14
+ # Hoe.plugin :rubyforge
15
+ # Hoe.plugin :rubyforge
16
+ # Hoe.plugin :website
17
+
18
+ Hoe.spec 'bbmb' do
19
+ # HEY! If you fill these out in ~/.hoe_template/Rakefile.erb then
20
+ # you'll never have to touch them again!
21
+ # (delete this comment too, of course)
22
+
23
+ developer('Masaomi Hatakeyama, Zeno R.R. Davatz', 'mhatakeyama@ywesee.com, zdavatz@ywesee.com')
24
+
25
+ # self.rubyforge_name = 'bbmbx' # if different than 'bbmb'
26
+ end
27
+
28
+ # vim: syntax=ruby
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env ruby
2
+ # Admin -- bbmb -- 09.07.2003 -- hwyss@ywesee.com
3
+
4
+ $KCODE = 'u'
5
+
6
+ require 'drb'
7
+ require 'sbsm/drb'
8
+ require 'bbmb'
9
+ require 'bbmb/config'
10
+ require 'encoding/character/utf-8'
11
+ require 'readline'
12
+ include Readline
13
+
14
+ Kernel.trap('INT') {
15
+ if($current.respond_to?(:exit))
16
+ $current.exit
17
+ $current = nil
18
+ else
19
+ puts "<ctrl-c> is used to kill admin-threads."
20
+ puts "Type <quit> or <exit> to exit."
21
+ end
22
+ }
23
+
24
+ auth_domain = BBMB.config.auth_domain
25
+ $0 = "#{auth_domain} (Admin-Tool)"
26
+ prompt = "#{auth_domain}> "
27
+
28
+ DRb.start_service('druby://localhost:0')
29
+ bbmb = DRbObject.new(nil, BBMB.config.server_url)
30
+ last_error = nil
31
+ priority = -1
32
+ while(line = readline(prompt, true))
33
+ result = ''
34
+ result.extend(DRb::DRbUndumped)
35
+ line.strip!
36
+ $stdout.print "-> "
37
+ line.gsub! /puts\s+((.(?!end|;))*.)/, "BBMB.logger.error('admin') { \\1 }"
38
+ case line.downcase
39
+ when 'exit', 'quit'
40
+ $stdout.puts 'Goodbye'
41
+ break
42
+ when 'bt', 'backtrace'
43
+ if last_error.respond_to?(:backtrace)
44
+ $stdout.puts last_error.backtrace
45
+ else
46
+ $stdout.puts 'No Error'
47
+ end
48
+ when /^last_error/
49
+ begin
50
+ $stdout.puts eval(line)
51
+ rescue StandardError, SyntaxError => last_error
52
+ $stdout.puts last_error
53
+ end
54
+ when /sp\s+(-?\d+)/, /set_priority\s+(-?\d+)/
55
+ priority = $~[1].to_i
56
+ $stdout.puts "setting Priority to #{priority}"
57
+ else
58
+ begin
59
+ bgflag = line.slice!(/\s*\&\s*$/)
60
+ $current = bbmb._admin(line, result, priority)
61
+ unless(bgflag)
62
+ $current.join
63
+ end
64
+ $stdout.puts result
65
+ rescue StandardError, SyntaxError => last_error
66
+ $stdout.puts last_error
67
+ end
68
+ end
69
+ $current = nil
70
+ $stdout.flush
71
+ end
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $KCODE = 'u'
4
+
5
+ $: << File.expand_path('../lib', File.dirname(__FILE__))
6
+
7
+ require 'drb'
8
+ require 'logger'
9
+ require 'bbmb/config'
10
+ require 'bbmb/util/server'
11
+ require 'encoding/character/utf-8'
12
+ require 'pp'
13
+
14
+ module BBMB
15
+ @config.load_files.each { |local|
16
+ require local
17
+ }
18
+ require File.join('bbmb', 'persistence', @config.persistence)
19
+ case @config.persistence
20
+ when 'odba'
21
+ DRb.install_id_conv ODBA::DRbIdConv.new
22
+ @persistence = BBMB::Persistence::ODBA
23
+ end
24
+
25
+ log_file = @config.log_file
26
+ if(log_file.is_a?(String))
27
+ FileUtils.mkdir_p(File.dirname(log_file))
28
+ log_file = File.open(log_file, 'a')
29
+ at_exit { log_file.close }
30
+ end
31
+ @logger = Logger.new(log_file)
32
+ @logger.level = Logger.const_get(@config.log_level)
33
+ @logger.debug('config') { @config.pretty_inspect }
34
+
35
+ VERSION = `cg-object-id`
36
+
37
+ @auth = DRb::DRbObject.new(nil, @config.auth_url)
38
+
39
+ begin
40
+ @server = BBMB::Util::Server.new(@persistence)
41
+ @server.extend(DRbUndumped)
42
+ if(@config.update?)
43
+ @server.run_updater
44
+ end
45
+ if(@config.invoice?)
46
+ @server.run_invoicer
47
+ end
48
+
49
+ url = @config.server_url
50
+ url.untaint
51
+ DRb.start_service(url, @server)
52
+ $SAFE = 1
53
+ $0 = @config.name
54
+ @logger.info('start') {
55
+ sprintf("starting bbmb-server on %s", url) }
56
+ DRb.thread.join
57
+ rescue Exception => error
58
+ @logger.error('fatal') { error }
59
+ raise
60
+ end
61
+ end
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # Bbmb -- bbmb.ch -- 17.12.2019 -- zdavatz@ywesee.com
3
+
4
+ module BBMB
5
+ VERSION = '2.0.0'
6
+ class << self
7
+ attr_accessor :auth, :config, :logger, :persistence, :server
8
+ end
9
+ end
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env ruby
2
+ # @config -- bbmb.ch -- 08.09.2006 -- hwyss@ywesee.com
3
+
4
+ require 'rclconf'
5
+ require 'bbmb'
6
+
7
+ module BBMB
8
+ default_dir = if(root = ENV['DOCUMENT_ROOT'])
9
+ File.expand_path('../etc', root)
10
+ elsif(home = ENV['HOME'])
11
+ File.expand_path('.bbmb/etc', home)
12
+ else
13
+ require 'tmpdir'
14
+ Dir.tmpdir
15
+ end
16
+ default_config_files = [
17
+ File.join(default_dir, 'bbmb.yml'),
18
+ '/etc/bbmb/bbmb.yml',
19
+ ]
20
+ defaults = {
21
+ 'admin_address' => '',
22
+ 'admins' => [],
23
+ 'auth_domain' => 'ch.bbmb',
24
+ 'auth_url' => 'druby://localhost:12001',
25
+ 'bbmb_dir' => File.expand_path('..', default_dir),
26
+ 'config' => default_config_files,
27
+ 'confirm_error_body' => 'Customer %s does not have an email address configured',
28
+ 'confirm_error_cc' => [],
29
+ 'confirm_error_from' => 'errors.test@bbmb.ch',
30
+ 'confirm_error_subject' => 'Customer %s without email address',
31
+ 'confirm_error_to' => nil,
32
+ 'data_dir' => File.expand_path('../data', default_dir),
33
+ 'db_name' => 'bbmb',
34
+ 'db_user' => 'bbmb',
35
+ 'db_auth' => 'bbmb',
36
+ 'db_backend' => :psql,
37
+ 'debug' => true,
38
+ 'enable_price_levels' => false,
39
+ 'error_recipients' => [],
40
+ 'http_server' => 'http://www.bbmb.ch',
41
+ 'importers' => {
42
+ 'ywsarti.csv' => 'ProductImporter',
43
+ 'ywskund.csv' => 'CustomerImporter',
44
+ },
45
+ 'inject_error_body' => 'The order %s, committed on %s, assigned to the unknown customer: %s',
46
+ 'inject_error_cc' => [],
47
+ 'inject_error_from' => 'errors.test@bbmb.ch',
48
+ 'inject_error_subject' => 'Order %s with missing customer: %s',
49
+ 'inject_error_to' => nil,
50
+ 'invoice?' => true,
51
+ 'invoice_baseline' => nil,
52
+ 'invoice_monthly_baseline' => nil,
53
+ 'invoice_monthly_baseamount' => nil,
54
+ 'invoice_format' => "Invoice %s-%s",
55
+ 'invoice_item_format' => "Turnover: %1.2f \nOrders: %i",
56
+ 'invoice_item_baseamount_format' => "Turnover up to the base amount",
57
+ 'invoice_item_baseamount_unit' => "Base-Amount",
58
+ 'invoice_newyear' => "1.1.",
59
+ 'invoice_percentage' => 0.1,
60
+ 'i2_100' => 'YWESEE',
61
+ 'load_files' => ['bbmb/util/csv_importer'],
62
+ 'log_file' => STDERR,
63
+ 'log_level' => 'INFO',
64
+ 'mail_confirm_body' => nil,
65
+ 'mail_confirm_cc' => [],
66
+ 'mail_confirm_from' => 'confirm.test@bbmb.ch',
67
+ 'mail_confirm_reply_to' => nil, ## used for determining if a confirmation should be sent
68
+ 'mail_confirm_lines' => [],
69
+ 'mail_confirm_subject' => 'Bbmb-Confirm %s',
70
+ 'mail_order_cc' => [],
71
+ 'mail_order_from' => 'orders.test@bbmb.ch',
72
+ 'mail_order_subject' => 'Bbmb-Order %s',
73
+ 'mail_order_to' => 'orders.test@bbmb.ch',
74
+ 'mail_request_cc' => [],
75
+ 'mail_request_from' => 'requests.test@bbmb.ch',
76
+ 'mail_request_subject' => 'Bbmb-Request %s',
77
+ 'mail_request_to' => 'requests.test@bbmb.ch',
78
+ 'name' => 'Bbmb(test)',
79
+ 'order_destinations' => [],
80
+ 'pagestep' => 20,
81
+ 'persistence' => 'odba',
82
+ 'polling_file' => File.expand_path('polling.yml', default_dir),
83
+ 'scm_link' => 'http://scm.ywesee.com/?p=bbmb/.git',
84
+ 'server_url' => 'druby://localhost:12000',
85
+ 'session_timeout' => 3600,
86
+ 'smtp_authtype' => nil,
87
+ 'smtp_helo' => 'localhost.localdomain',
88
+ 'smtp_pass' => nil,
89
+ 'smtp_port' => 25,
90
+ 'smtp_server' => 'mail.bbmb.ch',
91
+ 'smtp_user' => nil,
92
+ 'target_format' => 'i2',
93
+ 'target_format_fs' => ",",
94
+ 'target_format_rs' => "\n",
95
+ 'tmpfile_basename' => 'bbmb',
96
+ 'update?' => true,
97
+ 'update_hour' => 23,
98
+ 'vat_rate' => 2.4,
99
+ 'ydim_config' => nil,
100
+ 'ydim_id' => nil,
101
+ }
102
+
103
+ config = RCLConf::RCLConf.new(ARGV, defaults)
104
+ config.load(config.config)
105
+ @config = config
106
+ end
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+ # Html::State::ChangePassword -- virbac.bbmb.ch -- 28.06.2007 -- hwyss@ywesee.com
3
+
4
+ require 'bbmb/html/state/global'
5
+ require 'bbmb/html/view/change_password'
6
+
7
+ module BBMB
8
+ module Html
9
+ module State
10
+ class ChangePassword < Global
11
+ DIRECT_EVENT = :change_pass
12
+ VIEW = Html::View::ChangePassword
13
+ mandatory :email, :pass, :confirm_pass
14
+ def save
15
+ keys = mandatory
16
+ input = user_input(keys, keys)
17
+ if(error?)
18
+ @errors.dup.each { |key, val|
19
+ if(/^e_(empty|missing)_/.match val.message)
20
+ @errors.store(key, create_error(:e_need_all_fields, key, nil))
21
+ end
22
+ }
23
+ else
24
+ update_user input
25
+ unless(error?)
26
+ BBMB.persistence.save(@model)
27
+ return State::Info.new(@session, :message => :login_data_saved,
28
+ :event => :home)
29
+ end
30
+ end
31
+ self
32
+ end
33
+ def update_user(input)
34
+ email = input.delete(:email)
35
+ @model.email = email
36
+ @model.protect!(:email)
37
+ if(passhash = input.delete(:confirm_pass))
38
+ begin
39
+ @session.user.set_password(email, passhash)
40
+ rescue Yus::YusError => e
41
+ @errors.store(:pass, create_error(:e_pass_not_set, :email, email))
42
+ end
43
+ end
44
+ rescue Yus::YusError => e
45
+ @errors.store(:email, create_error(:e_duplicate_email, :email, email))
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env ruby
2
+ # Html::State::CurrentOrder -- bbmb.ch -- 20.09.2006 -- hwyss@ywesee.com
3
+
4
+ require 'bbmb/html/state/global'
5
+ require 'bbmb/html/state/info'
6
+ require 'bbmb/html/state/json'
7
+ require 'bbmb/html/view/current_order'
8
+ require 'bbmb/util/mail'
9
+ require 'bbmb/util/target_dir'
10
+ require 'bbmb/util/transfer_dat'
11
+ require 'timeout'
12
+
13
+ module BBMB
14
+ module Html
15
+ module State
16
+ class CurrentOrder < Global
17
+ DIRECT_EVENT = :current_order
18
+ VIEW = View::CurrentOrder
19
+ def init
20
+ @model = _customer.current_order
21
+ @model.calculate_effective_prices
22
+ end
23
+ def ajax
24
+ do_update
25
+ data = {}
26
+ [ :reference, :comment, :priority, :total ].each { |key|
27
+ data.store key, @model.send(key).to_s
28
+ }
29
+ State::Json.new(@session, data)
30
+ end
31
+ def commit
32
+ ## update most recent values and ensure @model = _customer.current_order
33
+ do_update
34
+ if @session.lookandfeel.enabled?(:terms_of_service, false)
35
+ if @session.user_input(:accept_terms)
36
+ _customer.terms_last_accepted ||= Time.now
37
+ else
38
+ @errors.store :terms_accepted,
39
+ create_error(:e_terms_of_service, :terms_accepted, nil)
40
+ _customer.terms_last_accepted = nil
41
+ end
42
+ BBMB.persistence.save(_customer)
43
+ end
44
+ unless error?
45
+ _customer.commit_order!
46
+ order = @model
47
+ @session.async {
48
+ @session.send_order order, _customer
49
+ }
50
+ @model = _customer.current_order
51
+ Info.new(@session, :message => :order_sent,
52
+ :event => :current_order)
53
+ end
54
+ end
55
+ def do_update
56
+ if BBMB.config.mail_confirm_reply_to
57
+ _customer.order_confirmation = @session.user_input(:order_confirmation)
58
+ BBMB.persistence.save(_customer)
59
+ end
60
+ @model = _customer.current_order
61
+ keys = [ :comment, :priority, :reference ]
62
+ input = user_input(keys)
63
+ unless(error?)
64
+ input.each { |key, value|
65
+ @model.send("#{key}=", value)
66
+ }
67
+ case @model.priority
68
+ when 40
69
+ @model.shipping = 80
70
+ when 41
71
+ @model.shipping = 50
72
+ else
73
+ @model.shipping = 0
74
+ end
75
+ BBMB.persistence.save(@model)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env ruby
2
+ # Html::State::Customer -- bbmb.ch -- 19.09.2006 -- hwyss@ywesee.com
3
+
4
+ require 'bbmb/html/state/global'
5
+ require 'bbmb/html/state/show_pass'
6
+ require 'bbmb/html/view/customer'
7
+ require 'bbmb/util/password_generator'
8
+ require 'ostruct'
9
+
10
+ module BBMB
11
+ module Html
12
+ module State
13
+ class Customer < Global
14
+ attr_reader :cleartext
15
+ mandatory :address1, :email, :organisation, :customer_id
16
+ VIEW = View::Customer
17
+ def init
18
+ @model = Model::Customer.find_by_customer_id(@session.user_input(:customer_id))
19
+ end
20
+ def direct_argument_keys
21
+ [:customer_id]
22
+ end
23
+ def direct_event
24
+ unless(error? || @session.event == :change_pass)
25
+ [ :customer, {:customer_id => @model.customer_id} ]
26
+ end
27
+ end
28
+ def generate_pass
29
+ _save
30
+ if(email = @model.email)
31
+ @cleartext = BBMB::Util::PasswordGenerator.generate(@model)
32
+ passhash = @session.validate(:pass, @cleartext)
33
+ begin
34
+ @session.user.grant(email, 'login',
35
+ BBMB.config.auth_domain + '.Customer')
36
+ @session.user.set_password(email, passhash)
37
+ rescue Yus::YusError
38
+ @errors.store(:pass, create_error(:e_pass_not_set, :pass, nil))
39
+ end
40
+ else
41
+ error = create_error(:e_email_required, :email, @model.email)
42
+ @errors.store(:email, error)
43
+ end
44
+ self
45
+ end
46
+ def mandatory
47
+ mandatory = _mandatory
48
+ if(@session.user_input(:pass) \
49
+ || @session.user_input(:confirm_pass))
50
+ mandatory += [:pass, :confirm_pass]
51
+ end
52
+ mandatory
53
+ end
54
+ def save
55
+ _save
56
+ self
57
+ end
58
+ alias :change_pass :save
59
+ def _save
60
+ keys = mandatory + [ :ean13, :title, :drtitle, :lastname, :firstname,
61
+ :address2, :address3, :plz, :city, :canton,
62
+ :phone_business, :phone_private, :phone_mobile, :fax ]
63
+ if BBMB.config.mail_confirm_reply_to
64
+ keys.push :order_confirmation
65
+ end
66
+ input = user_input(keys, mandatory)
67
+ update_user(input)
68
+ if(error?)
69
+ @errors.store(:error, create_error(:error, :error, nil))
70
+ @errors.store(:user, create_error(:e_user_unsaved, :error, nil))
71
+ else
72
+ input.each { |key, val|
73
+ writer = "#{key}="
74
+ if(@model.respond_to?(writer) && @model.send(key) != val)
75
+ @model.send(writer, val)
76
+ @model.protect!(key)
77
+ end
78
+ }
79
+ BBMB.persistence.save(@model)
80
+ end
81
+ end
82
+ def show_pass
83
+ model = OpenStruct.new
84
+ model.cleartext = @cleartext
85
+ model.email = @model.email
86
+ model.address_lines = @model.address_lines
87
+ @cleartext = nil
88
+ ShowPass.new(@session, model)
89
+ end
90
+ def update_user(input)
91
+ email = input.delete(:email)
92
+ @model.email = email
93
+ @model.protect!(:email)
94
+ if(passhash = input.delete(:confirm_pass))
95
+ begin
96
+ @session.user.grant(email, 'login',
97
+ BBMB.config.auth_domain + '.Customer')
98
+ @session.user.set_password(email, passhash)
99
+ rescue Yus::YusError => e
100
+ @errors.store(:pass, create_error(:e_pass_not_set, :email, email))
101
+ end
102
+ end
103
+ rescue Yus::YusError => e
104
+ @errors.store(:email, create_error(:e_duplicate_email, :email, email))
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end