diff --git a/CHANGES b/CHANGES old mode 100644 new mode 100755 index ea0208c..61bd801 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,6 @@ ## Changes -#### 0.8.5 candidate +#### 0.8.5 * servers view * identity modification diff --git a/Gemfile b/Gemfile index 8aa7193..f975baa 100755 --- a/Gemfile +++ b/Gemfile @@ -1,10 +1,10 @@ source 'http://rubygems.org' -gem 'rails', '~>3.0.9' +gem 'rails', '~>3.0.7' gem 'mysql2' , '~>0.2.7' gem 'will_paginate', '~> 3.0.beta' gem 'themes_for_rails' gem "ezcrypto", "~> 0.7.2" -gem "calendar_view", "~> 0.0.3" +gem "calendar_view", "~> 0.0.4" gem 'bluecloth', '>= 2.0.0' diff --git a/TODO b/TODO old mode 100644 new mode 100755 index 1ef14db..2979b2d --- a/TODO +++ b/TODO @@ -11,11 +11,10 @@ app/controllers/messages_controller.rb: app/controllers/messages_ops_controller.rb: - * [128] [FIXME] check if uploads directory exists - * [176] [FIXME] check if domain is set - * [192] [TODO] check if email address is valid if not get address from contacts - * [259] [FIXME] edit does not support attachments + * [249] [FIXME] edit does not support attachments + * [304] [TODO] check if email address is valid if not get address from contacts app/models/prefs.rb: * [ 19] [TODO] move refresh to prefs and make refresh page with messages + diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 008b927..d9697a4 100755 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -63,15 +63,15 @@ class ApplicationController < ActionController::Base def prepare_compose_buttons @buttons = [] - @buttons << {:text => 'send',:scope=>:compose,:image => 'email.png'} - @buttons << {:text => 'save_as_draft',:scope=>:compose,:image => 'save.png'} + @buttons << {:text => 'sendout',:scope=>:compose,:image => 'email.png'} + @buttons << {:text => 'save',:scope=>:compose,:image => 'save.png'} end def create_message_with_params - @message = Message.new - if params[:message] - @message.update_attributes(params[:message]) - end + @message = Message.new(params[:message]) +# if params[:message] +# @message.update_attributes(params[:message]) +# end files = Dir.glob(File.join($defaults["msg_upload_dir"],@current_user.username + "*")) @attachments = [] files.each do |f| diff --git a/app/controllers/folders_controller.rb b/app/controllers/folders_controller.rb index f661d77..e60ff85 100755 --- a/app/controllers/folders_controller.rb +++ b/app/controllers/folders_controller.rb @@ -12,13 +12,12 @@ class FoldersController < ApplicationController after_filter :close_imap_session, :except => [:index,:show_hide,:system] before_filter :get_folders + before_filter :prepare_buttons_to_folders theme :theme_resolver def index - @buttons = [] - @buttons << {:text => 'show_hide',:scope=>'folder',:image => 'flag.png'} - @buttons << {:text => 'refresh',:scope=>'folder',:image => 'refresh.png'} + #before_filter end def create @@ -154,6 +153,12 @@ class FoldersController < ApplicationController protected + def prepare_buttons_to_folders + @buttons = [] + @buttons << {:text => 'show_hide',:scope=>'folder',:image => 'flag.png'} + @buttons << {:text => 'refresh',:scope=>'folder',:image => 'refresh.png'} + end + def get_folders @folders = @current_user.folders @folders_shown = @current_user.folders.shown diff --git a/app/controllers/messages_ops_controller.rb b/app/controllers/messages_ops_controller.rb index b675bc9..6f5c628 100755 --- a/app/controllers/messages_ops_controller.rb +++ b/app/controllers/messages_ops_controller.rb @@ -3,6 +3,7 @@ require 'imap_mailbox' require 'imap_message' require 'mail' require 'mail_plugin_extension' +require 'net/smtp' class MessagesOpsController < ApplicationController @@ -14,8 +15,9 @@ class MessagesOpsController < ApplicationController before_filter :check_current_user ,:selected_folder,:get_current_folders before_filter :open_imap_session, :select_imap_folder before_filter :prepare_compose_buttons - before_filter :get_system_folders, :only => [:sendout_or_save,:single,:multi] - before_filter :create_message_with_params , :only => [:sendout_or_save] + before_filter :get_system_folders, :only => [:composed,:single,:multi] + before_filter :prepare_composed , :only => [:composed] + before_filter :create_message_with_params, :only=> [:composed,:single,:multi] after_filter :close_imap_session theme :theme_resolver @@ -125,17 +127,20 @@ class MessagesOpsController < ApplicationController end def upload - #FIXME check if uploads directory exists - @operation = :upload - create_message_with_params - if not params[:upload] - flash[:error] = t(:no_file_chosen,:scope=>:common) - else - name = params[:upload][:datafile].original_filename + begin + raise MailrException.new :cause=>:no_tmp_dir,:scope=>:common if not File.exists?($defaults["msg_upload_dir"]) + raise MailrException.new :cause=>:no_file_chosen,:scope=>:common if not params[:upload] + @operation = :upload + name = params[:file][:data].original_filename upload_dir = $defaults["msg_upload_dir"] path = File.join(upload_dir, @current_user.username + "_" + name) - File.open(path, "wb") { |f| f.write(params[:upload][:datafile].read) } + File.open(path, "wb") { |f| f.write(params[:file][:data].read) } + rescue MailrException => e + flash[:error] = t(e.message[:cause],:scope => e.message[:scope]) + rescue Exception => e + flash[:error] = t(:general_error,:scope=>:internal) + " (" + e.class.name + " " + e.to_s + ")" end + create_message_with_params render 'messages/compose' end @@ -168,13 +173,7 @@ class MessagesOpsController < ApplicationController # if File.exist?("#{RAILS_ROOT}/dirname/#{@filename}") # end - - ############################################### sendout_or_save ############################ - - def sendout_or_save - - #FIXME check if domain is set - + def composed if params[:delete_marked] and params[:files] params[:files].each do |filename| path = File.join(Rails.root,$defaults["msg_upload_dir"],@current_user.username + "_" +filename) @@ -184,77 +183,70 @@ class MessagesOpsController < ApplicationController @operation = :new render 'messages/compose' return - end - - mail = Mail.new - mail.subject = params[:message][:subject] - mail.from = @current_user.full_address - #TODO check if email address is valid if not get address from contacts - mail.to = params[:message][:to_addr] - mail.body = params[:message][:body] - - attachments = Dir.glob(File.join($defaults["msg_upload_dir"],@current_user.username + "*")) - #logger.custom('attach',attachments.inspect) - attachments.each do |a| - mail.add_file :filename => File.basename(a.gsub(/#{@current_user.username}_/,"")), :content => File.read(a) - end - - if params[:send] - smtp_server = @current_user.servers.primary_for_smtp - - if smtp_server.nil? - flash[:error] = t(:not_configured_smtp,:scope => :compose) - @operation = :new - render 'messages/compose' - return - end - - begin - - set_mail_defaults(@current_user,smtp_server,session) - logger.custom('mail',Mail.delivery_method.inspect) - - @response = mail.deliver! - logger.custom('response',@response.inspect) - - if @sent_folder.nil? - raise t(:not_configured_sent,:scope=>:compose) - end - @mailbox.append(@sent_folder.full_name,mail.to_s,[:Seen]) - - rescue Exception => e - flash[:error] = "#{t(:imap_err,:scope=>:internal)} (#{e.to_s})" - redirect_to :controller => 'messages', :action => 'index' - return - end - - attachments.each do |filename| - path = File.join(Rails.root,filename) - File.delete(path) if File.exist?(path) - end - - flash[:notice] = t(:was_sent,:scope => :compose) - redirect_to :controller => 'messages', :action => 'index' - elsif params[:save_as_draft] - begin - if @drafts_folder.nil? - raise t(:not_configured_drafts,:scope=>:compose) - end - @mailbox.append(@drafts_folder.full_name,mail.to_s,[:Seen]) - if params[:olduid].present? - @mailbox.move_message(params[:olduid],@trash_folder.full_name) - @mailbox.expunge - end - rescue Exception => e - flash[:error] = "#{t(:imap_error,:scope=>:internal)} (#{e.to_s})" - redirect_to :controller => 'messages', :action => 'index' - return - end - flash[:notice] = t(:was_saved,:scope => :compose) + elsif params[:upload] + upload + elsif params[:save] + save + elsif params[:sendout] + sendout + else redirect_to :controller => 'messages', :action => 'index' end end + def sendout + begin + smtp_server = @current_user.servers.primary_for_smtp + raise MailrException.new :cause=>:not_configured_smtp,:scope => :compose if smtp_server.nil? + raise MailrException.new :cause=>:has_no_domain,:scope=>:user if @current_user.has_domain?.nil? + raise MailrException.new :cause=>:not_configured_sent,:scope=>:compose if @sent_folder.nil? + send_mail_message( smtp_server, + @current_user.has_domain?, + @current_user.login, + @current_user.get_cached_password(session), + @mail.to_s, + @current_user.email, + params[:message][:to_addr] + ) + upload_dir = $defaults["msg_upload_dir"] + @attachments.each do |file| + path = File.join(upload_dir, @current_user.username + "_" + file[:name]) + File.delete(path) if File.exist?(path) + end + rescue MailrException => e + flash[:error] = t(e.message[:cause],:scope => e.message[:scope]) + rescue Exception => e + flash[:error] = t(:general_error,:scope=>:internal) + " (" + e.class.name + " " + e.to_s + ")" + else + flash[:notice] = t(:was_sent,:scope => :compose) + redirect_to :controller => 'messages', :action => 'index' + return + end + @operation = :new + render 'messages/compose' + end + + def save + begin + raise MailrException.new :cause=>:not_configured_drafts,:scope=>:folder if @drafts_folder.nil? + @mailbox.append(@drafts_folder.full_name,@mail.to_s,[:Seen]) + if params[:olduid].present? + @mailbox.move_message(params[:olduid],@trash_folder.full_name) + @mailbox.expunge + end + rescue MailrException => e + flash[:error] = t(e.message[:cause],:scope => e.message[:scope]) + rescue Exception => e + flash[:error] = t(:general_error,:scope=>:internal) + " (" + e.class.name + " " + e.to_s + ")" + else + @attachments.each do |filename| + path = File.join(Rails.root,filename) + File.delete(path) if File.exist?(path) + end + flash[:notice] = t(:was_saved,:scope => :compose) + end + redirect_to :controller => 'messages', :action => 'index' + end #FIXME edit does not support attachments def edit @@ -266,7 +258,7 @@ class MessagesOpsController < ApplicationController imap_message = @mailbox.fetch_body(old_message.uid) mail = Mail.new(imap_message) if mail.multipart? - @message.body = mail.text_part.decoded_and_charseted.gsub(/<\/?[^>]*>/, "") + @message.body = mail.text_part.nil? ? "" : mail.text_part.decoded_and_charseted.gsub(/<\/?[^>]*>/, "") else @message.body = mail.decoded_and_charseted.gsub(/<\/?[^>]*>/, "") end @@ -285,7 +277,7 @@ class MessagesOpsController < ApplicationController imap_message = @mailbox.fetch_body(old_message.uid) mail = Mail.new(imap_message) if mail.multipart? - @message.body = mail.text_part.decoded_and_charseted.gsub(/<\/?[^>]*>/, "") + @message.body = mail.text_part.nil? ? "" : mail.text_part.decoded_and_charseted.gsub(/<\/?[^>]*>/, "") else @message.body = mail.decoded_and_charseted.gsub(/<\/?[^>]*>/, "") end @@ -297,7 +289,28 @@ class MessagesOpsController < ApplicationController protected + def send_mail_message(smtp_server,domain,username,password,msgstr,from,to) + if smtp_server.auth.nil? + smtp = Net::SMTP.start(smtp_server.name, smtp_server.port, domain) + else + smtp = Net::SMTP.start(smtp_server.name, smtp_server.port, domain, username, password, smtp_server.auth) + end + smtp.send_message msgstr, from, to + smtp.finish + end + def prepare_composed + @mail = Mail.new + @mail.subject = params[:message][:subject] + @mail.from = @current_user.full_id + #TODO check if email address is valid if not get address from contacts + @mail.to = params[:message][:to_addr] + @mail.body = params[:message][:body] + @attachments = Dir.glob(File.join($defaults["msg_upload_dir"],@current_user.username + "*")) + @attachments.each do |a| + @mail.add_file :filename => File.basename(a.gsub(/#{@current_user.username}_/,"")), :content => File.read(a) + end + end ############################################ set_mail_defaults #################################### @@ -313,7 +326,7 @@ class MessagesOpsController < ApplicationController authentication = server.auth enable_starttls_auto = server.use_tls openssl_verify_mode = OpenSSL::SSL::VERIFY_NONE - user_name = user.full_address + user_name = user.login end Mail.defaults do delivery_method :smtp, {:address => server.name, diff --git a/app/controllers/prefs_controller.rb b/app/controllers/prefs_controller.rb index cdb0b6d..a3032ad 100755 --- a/app/controllers/prefs_controller.rb +++ b/app/controllers/prefs_controller.rb @@ -22,10 +22,18 @@ class PrefsController < ApplicationController end def update_identity - if params[:user] - @current_user.update_attributes(params[:user]) + if params[:user] + @current_user.first_name = params[:user][:first_name] + @current_user.last_name = params[:user][:last_name] + @current_user.domain = params[:user][:domain] + if @current_user.valid? + @current_user.save + flash[:notice] = t(:were_saved,:scope=>:prefs) + redirect_to :action => 'identity' + else + render 'prefs/identity' + end end - redirect_to :action => 'identity' end def look @@ -33,7 +41,6 @@ class PrefsController < ApplicationController end def identity - @identity = @curent_user end def servers diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index ad2e7b1..b07c1e1 100755 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -15,15 +15,15 @@ class UserController < ApplicationController def authenticate if not $defaults["only_can_logins"].nil? - if not $defaults["only_can_logins"].include?(params[:user][:email]) + if not $defaults["only_can_logins"].include?(params[:user][:login]) redirect_to :controller => 'internal', :action => 'onlycanlogins' return false end end - user = User.find_by_email(params[:user][:email]) + user = User.find_by_login(params[:user][:login]) if user.nil? - redirect_to :action => 'unknown' ,:email=> params[:user][:email] + redirect_to :action => 'unknown' ,:login=> params[:user][:login] else session[:user_id] = user.id user.set_cached_password(session,params[:user][:password]) @@ -52,7 +52,7 @@ class UserController < ApplicationController def create @user = User.new - @user.email = params[:user][:email] + @user.login = params[:user][:login] @user.first_name = params[:user][:first_name] @user.last_name = params[:user][:last_name] diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 957e311..f3f1f92 100755 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -5,7 +5,7 @@ module ApplicationHelper def form_field(object,field,flabel,example,val) model_name = eval(object.class.model_name) html = "" - html << "