boxroom 0.0.1

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 (215) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +50 -0
  4. data/Rakefile +36 -0
  5. data/app/assets/config/boxroom_manifest.js +2 -0
  6. data/app/assets/images/boxroom/clipboard.png +0 -0
  7. data/app/assets/images/boxroom/clipboard_add.png +0 -0
  8. data/app/assets/images/boxroom/copy.png +0 -0
  9. data/app/assets/images/boxroom/delete.png +0 -0
  10. data/app/assets/images/boxroom/edit.png +0 -0
  11. data/app/assets/images/boxroom/exclamation.png +0 -0
  12. data/app/assets/images/boxroom/extend.png +0 -0
  13. data/app/assets/images/boxroom/failed.png +0 -0
  14. data/app/assets/images/boxroom/file.png +0 -0
  15. data/app/assets/images/boxroom/file_add.png +0 -0
  16. data/app/assets/images/boxroom/fileicons/7z.png +0 -0
  17. data/app/assets/images/boxroom/fileicons/ai.png +0 -0
  18. data/app/assets/images/boxroom/fileicons/aif.png +0 -0
  19. data/app/assets/images/boxroom/fileicons/aiff.png +0 -0
  20. data/app/assets/images/boxroom/fileicons/audio.png +0 -0
  21. data/app/assets/images/boxroom/fileicons/bz2.png +0 -0
  22. data/app/assets/images/boxroom/fileicons/c.png +0 -0
  23. data/app/assets/images/boxroom/fileicons/conf.png +0 -0
  24. data/app/assets/images/boxroom/fileicons/cpp.png +0 -0
  25. data/app/assets/images/boxroom/fileicons/cs.png +0 -0
  26. data/app/assets/images/boxroom/fileicons/css.png +0 -0
  27. data/app/assets/images/boxroom/fileicons/csv.png +0 -0
  28. data/app/assets/images/boxroom/fileicons/divx.png +0 -0
  29. data/app/assets/images/boxroom/fileicons/doc.png +0 -0
  30. data/app/assets/images/boxroom/fileicons/docx.png +0 -0
  31. data/app/assets/images/boxroom/fileicons/dot.png +0 -0
  32. data/app/assets/images/boxroom/fileicons/fla.png +0 -0
  33. data/app/assets/images/boxroom/fileicons/gif.png +0 -0
  34. data/app/assets/images/boxroom/fileicons/gz.png +0 -0
  35. data/app/assets/images/boxroom/fileicons/htm.png +0 -0
  36. data/app/assets/images/boxroom/fileicons/html.png +0 -0
  37. data/app/assets/images/boxroom/fileicons/image.png +0 -0
  38. data/app/assets/images/boxroom/fileicons/java.png +0 -0
  39. data/app/assets/images/boxroom/fileicons/jpeg.png +0 -0
  40. data/app/assets/images/boxroom/fileicons/jpg.png +0 -0
  41. data/app/assets/images/boxroom/fileicons/js.png +0 -0
  42. data/app/assets/images/boxroom/fileicons/mdb.png +0 -0
  43. data/app/assets/images/boxroom/fileicons/mdbx.png +0 -0
  44. data/app/assets/images/boxroom/fileicons/mov.png +0 -0
  45. data/app/assets/images/boxroom/fileicons/mp3.png +0 -0
  46. data/app/assets/images/boxroom/fileicons/mpg.png +0 -0
  47. data/app/assets/images/boxroom/fileicons/ogg.png +0 -0
  48. data/app/assets/images/boxroom/fileicons/pdf.png +0 -0
  49. data/app/assets/images/boxroom/fileicons/php.png +0 -0
  50. data/app/assets/images/boxroom/fileicons/pl.png +0 -0
  51. data/app/assets/images/boxroom/fileicons/png.png +0 -0
  52. data/app/assets/images/boxroom/fileicons/ppt.png +0 -0
  53. data/app/assets/images/boxroom/fileicons/pptx.png +0 -0
  54. data/app/assets/images/boxroom/fileicons/ps.png +0 -0
  55. data/app/assets/images/boxroom/fileicons/py.png +0 -0
  56. data/app/assets/images/boxroom/fileicons/ram.png +0 -0
  57. data/app/assets/images/boxroom/fileicons/rar.png +0 -0
  58. data/app/assets/images/boxroom/fileicons/rb.png +0 -0
  59. data/app/assets/images/boxroom/fileicons/rm.png +0 -0
  60. data/app/assets/images/boxroom/fileicons/rtf.png +0 -0
  61. data/app/assets/images/boxroom/fileicons/sql.png +0 -0
  62. data/app/assets/images/boxroom/fileicons/swf.png +0 -0
  63. data/app/assets/images/boxroom/fileicons/tar.png +0 -0
  64. data/app/assets/images/boxroom/fileicons/tgz.png +0 -0
  65. data/app/assets/images/boxroom/fileicons/txt.png +0 -0
  66. data/app/assets/images/boxroom/fileicons/video.png +0 -0
  67. data/app/assets/images/boxroom/fileicons/wav.png +0 -0
  68. data/app/assets/images/boxroom/fileicons/wma.png +0 -0
  69. data/app/assets/images/boxroom/fileicons/wmv.png +0 -0
  70. data/app/assets/images/boxroom/fileicons/xls.png +0 -0
  71. data/app/assets/images/boxroom/fileicons/xlsx.png +0 -0
  72. data/app/assets/images/boxroom/fileicons/xml.png +0 -0
  73. data/app/assets/images/boxroom/fileicons/xvid.png +0 -0
  74. data/app/assets/images/boxroom/fileicons/zip.png +0 -0
  75. data/app/assets/images/boxroom/folder.png +0 -0
  76. data/app/assets/images/boxroom/folder_add.png +0 -0
  77. data/app/assets/images/boxroom/group.png +0 -0
  78. data/app/assets/images/boxroom/group_add.png +0 -0
  79. data/app/assets/images/boxroom/group_grey.png +0 -0
  80. data/app/assets/images/boxroom/information.png +0 -0
  81. data/app/assets/images/boxroom/logo.png +0 -0
  82. data/app/assets/images/boxroom/move.png +0 -0
  83. data/app/assets/images/boxroom/permissions.png +0 -0
  84. data/app/assets/images/boxroom/share.png +0 -0
  85. data/app/assets/images/boxroom/spinner.gif +0 -0
  86. data/app/assets/images/boxroom/tick.png +0 -0
  87. data/app/assets/images/boxroom/user.png +0 -0
  88. data/app/assets/images/boxroom/user_add.png +0 -0
  89. data/app/assets/javascripts/boxroom/application.js.coffee +51 -0
  90. data/app/assets/javascripts/boxroom/files.js.coffee +33 -0
  91. data/app/assets/stylesheets/boxroom/application.scss +7 -0
  92. data/app/concepts/boxroom/base_cell.rb +7 -0
  93. data/app/concepts/boxroom/folder/cell/show.rb +25 -0
  94. data/app/concepts/boxroom/folder/view/show.erb +69 -0
  95. data/app/concepts/boxroom/search/contract/files_and_folders.rb +9 -0
  96. data/app/concepts/boxroom/search/operations/files_and_folders.rb +21 -0
  97. data/app/controllers/boxroom/admins_controller.rb +30 -0
  98. data/app/controllers/boxroom/application_controller.rb +5 -0
  99. data/app/controllers/boxroom/clipboard_controller.rb +87 -0
  100. data/app/controllers/boxroom/files_controller.rb +78 -0
  101. data/app/controllers/boxroom/folders_controller.rb +91 -0
  102. data/app/controllers/boxroom/groups_controller.rb +60 -0
  103. data/app/controllers/boxroom/permissions_controller.rb +19 -0
  104. data/app/controllers/boxroom/reset_password_controller.rb +45 -0
  105. data/app/controllers/boxroom/search_controller.rb +21 -0
  106. data/app/controllers/boxroom/sessions_controller.rb +48 -0
  107. data/app/controllers/boxroom/share_links_controller.rb +67 -0
  108. data/app/controllers/boxroom/signup_controller.rb +31 -0
  109. data/app/controllers/boxroom/users_controller.rb +75 -0
  110. data/app/controllers/concerns/boxroom/base_controller.rb +92 -0
  111. data/app/helpers/boxroom/application_helper.rb +4 -0
  112. data/app/helpers/boxroom/folders_helper.rb +17 -0
  113. data/app/jobs/boxroom/application_job.rb +4 -0
  114. data/app/mailers/boxroom/application_mailer.rb +6 -0
  115. data/app/mailers/boxroom/user_mailer.rb +18 -0
  116. data/app/models/boxroom/application_record.rb +5 -0
  117. data/app/models/boxroom/clipboard.rb +45 -0
  118. data/app/models/boxroom/folder.rb +113 -0
  119. data/app/models/boxroom/group.rb +57 -0
  120. data/app/models/boxroom/permission.rb +6 -0
  121. data/app/models/boxroom/permitted_params.rb +33 -0
  122. data/app/models/boxroom/share_link.rb +40 -0
  123. data/app/models/boxroom/user.rb +113 -0
  124. data/app/models/boxroom/user_file.rb +35 -0
  125. data/app/views/boxroom/admins/new.html.erb +42 -0
  126. data/app/views/boxroom/clipboard/_clipboard_empty.de.html.erb +2 -0
  127. data/app/views/boxroom/clipboard/_clipboard_empty.en.html.erb +2 -0
  128. data/app/views/boxroom/clipboard/_clipboard_empty.es.html.erb +2 -0
  129. data/app/views/boxroom/clipboard/_clipboard_empty.fr.html.erb +2 -0
  130. data/app/views/boxroom/clipboard/_clipboard_empty.it.html.erb +2 -0
  131. data/app/views/boxroom/clipboard/_clipboard_empty.nl.html.erb +2 -0
  132. data/app/views/boxroom/clipboard/_clipboard_empty.zh-CN.html.erb +2 -0
  133. data/app/views/boxroom/clipboard/_show.html.erb +72 -0
  134. data/app/views/boxroom/files/edit.html.erb +24 -0
  135. data/app/views/boxroom/files/new.html.erb +45 -0
  136. data/app/views/boxroom/folders/_form.html.erb +19 -0
  137. data/app/views/boxroom/folders/edit.html.erb +6 -0
  138. data/app/views/boxroom/folders/new.html.erb +6 -0
  139. data/app/views/boxroom/folders/show.html.erb +69 -0
  140. data/app/views/boxroom/groups/_form.html.erb +21 -0
  141. data/app/views/boxroom/groups/edit.html.erb +4 -0
  142. data/app/views/boxroom/groups/index.html.erb +42 -0
  143. data/app/views/boxroom/groups/new.html.erb +4 -0
  144. data/app/views/boxroom/permissions/_form.html.erb +46 -0
  145. data/app/views/boxroom/reset_password/_message.de.html.erb +2 -0
  146. data/app/views/boxroom/reset_password/_message.en.html.erb +2 -0
  147. data/app/views/boxroom/reset_password/_message.es.html.erb +2 -0
  148. data/app/views/boxroom/reset_password/_message.fr.html.erb +2 -0
  149. data/app/views/boxroom/reset_password/_message.it.html.erb +2 -0
  150. data/app/views/boxroom/reset_password/_message.nl.html.erb +2 -0
  151. data/app/views/boxroom/reset_password/_message.zh-CN.html.erb +2 -0
  152. data/app/views/boxroom/reset_password/edit.html.erb +30 -0
  153. data/app/views/boxroom/reset_password/new.html.erb +22 -0
  154. data/app/views/boxroom/search/show.html.erb +15 -0
  155. data/app/views/boxroom/sessions/new.html.erb +31 -0
  156. data/app/views/boxroom/share_links/index.html.erb +24 -0
  157. data/app/views/boxroom/share_links/new.html.erb +49 -0
  158. data/app/views/boxroom/shared/_footer.html.erb +9 -0
  159. data/app/views/boxroom/shared/_header.html.erb +45 -0
  160. data/app/views/boxroom/signup/edit.html.erb +42 -0
  161. data/app/views/boxroom/user_mailer/reset_password_email.de.text.erb +18 -0
  162. data/app/views/boxroom/user_mailer/reset_password_email.en.text.erb +17 -0
  163. data/app/views/boxroom/user_mailer/reset_password_email.es.text.erb +17 -0
  164. data/app/views/boxroom/user_mailer/reset_password_email.fr.text.erb +17 -0
  165. data/app/views/boxroom/user_mailer/reset_password_email.it.text.erb +17 -0
  166. data/app/views/boxroom/user_mailer/reset_password_email.nl.text.erb +17 -0
  167. data/app/views/boxroom/user_mailer/reset_password_email.zh-CN.text.erb +16 -0
  168. data/app/views/boxroom/user_mailer/share_link_email.de.text.erb +20 -0
  169. data/app/views/boxroom/user_mailer/share_link_email.en.text.erb +20 -0
  170. data/app/views/boxroom/user_mailer/share_link_email.es.text.erb +20 -0
  171. data/app/views/boxroom/user_mailer/share_link_email.fr.text.erb +20 -0
  172. data/app/views/boxroom/user_mailer/share_link_email.it.text.erb +20 -0
  173. data/app/views/boxroom/user_mailer/share_link_email.nl.text.erb +20 -0
  174. data/app/views/boxroom/user_mailer/share_link_email.zh-CN.text.erb +20 -0
  175. data/app/views/boxroom/user_mailer/signup_email.de.text.erb +9 -0
  176. data/app/views/boxroom/user_mailer/signup_email.en.text.erb +9 -0
  177. data/app/views/boxroom/user_mailer/signup_email.es.text.erb +9 -0
  178. data/app/views/boxroom/user_mailer/signup_email.fr.text.erb +9 -0
  179. data/app/views/boxroom/user_mailer/signup_email.it.text.erb +9 -0
  180. data/app/views/boxroom/user_mailer/signup_email.nl.text.erb +10 -0
  181. data/app/views/boxroom/user_mailer/signup_email.zh-CN.text.erb +8 -0
  182. data/app/views/boxroom/users/_form.html.erb +63 -0
  183. data/app/views/boxroom/users/edit.html.erb +4 -0
  184. data/app/views/boxroom/users/index.html.erb +68 -0
  185. data/app/views/boxroom/users/new.html.erb +4 -0
  186. data/app/views/layouts/boxroom/application.html.erb +37 -0
  187. data/config/locales/de.yml +414 -0
  188. data/config/locales/en.yml +407 -0
  189. data/config/locales/es.yml +403 -0
  190. data/config/locales/fr.yml +403 -0
  191. data/config/locales/it.yml +414 -0
  192. data/config/locales/nl.yml +408 -0
  193. data/config/locales/zh-CN.yml +406 -0
  194. data/config/routes.rb +44 -0
  195. data/db/migrate/20100930062939_boxroom_create_users.rb +20 -0
  196. data/db/migrate/20100930091426_boxroom_create_folders.rb +14 -0
  197. data/db/migrate/20100930091451_boxroom_create_groups.rb +12 -0
  198. data/db/migrate/20101002122244_boxroom_create_user_files.rb +17 -0
  199. data/db/migrate/20101005071402_boxroom_create_permissions.rb +16 -0
  200. data/db/migrate/20101005071508_boxroom_create_groups_users.rb +12 -0
  201. data/db/migrate/20110106045148_boxroom_drop_column_user_id_from_folders.rb +9 -0
  202. data/db/migrate/20110106045414_boxroom_drop_column_user_id_from_user_files.rb +9 -0
  203. data/db/migrate/20110529123402_boxroom_drop_column_access_key_from_users.rb +9 -0
  204. data/db/migrate/20110616215033_boxroom_create_share_links.rb +15 -0
  205. data/db/migrate/20120411075110_boxroom_add_column_signup_token_to_users.rb +8 -0
  206. data/db/migrate/20120411081345_boxroom_add_column_signup_token_expires_at_to_users.rb +7 -0
  207. data/db/migrate/20130626210927_boxroom_add_columns_message_user_id_to_share_links.rb +6 -0
  208. data/db/migrate/20130628082245_boxroom_populate_user_id_in_share_links.rb +9 -0
  209. data/lib/boxroom.rb +35 -0
  210. data/lib/boxroom/configuration.rb +18 -0
  211. data/lib/boxroom/engine.rb +9 -0
  212. data/lib/boxroom/version.rb +3 -0
  213. data/lib/paperclip/spoof_detector.rb +7 -0
  214. data/lib/tasks/boxroom_tasks.rake +4 -0
  215. metadata +481 -0
@@ -0,0 +1,9 @@
1
+ module Boxroom::Search::Contract
2
+ class FilesAndFolders < Reform::Form
3
+ property :term, virtual: true
4
+ property :folder_id, virtual: true
5
+
6
+ validates :folder_id, presence: true
7
+ validates :term, length: {minimum: 3}
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module Boxroom::Search
2
+ class FilesAndFolders < ::Trailblazer::Operation
3
+ step Trailblazer::Operation::Contract::Build(constant: Boxroom::Search::Contract::FilesAndFolders)
4
+ step Trailblazer::Operation::Contract::Validate()
5
+ step :search_tree
6
+
7
+ def search_tree(options, params:, **)
8
+ options['files'], options['folders'] = [], []
9
+ folder = Boxroom::Folder.find(params[:folder_id])
10
+ search_folder(params[:term], folder, options)
11
+ end
12
+
13
+ def search_folder(term, folder, options)
14
+ options['folders'] << folder if folder.name.downcase.include? term.downcase
15
+ options['files'] += folder.user_files.where("lower(attachment_file_name) LIKE ?", "%#{term.downcase}%").all.to_a
16
+ folder.children.each do |f|
17
+ search_folder(term, f, options)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ module Boxroom
2
+ class AdminsController < Boxroom::ApplicationController
3
+ include Boxroom::BaseController
4
+
5
+ skip_before_action :require_admin_in_system, :require_login
6
+ before_action :require_no_admin
7
+
8
+ def new
9
+ @user = User.new
10
+ end
11
+
12
+ def create
13
+ @user = User.new(permitted_params.user)
14
+ @user.password_required = true
15
+ @user.is_admin = true
16
+
17
+ if @user.save
18
+ redirect_to new_session_url, :notice => t(:admin_user_created_successfully)
19
+ else
20
+ render :action => 'new'
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def require_no_admin
27
+ redirect_to new_session_url unless User.no_admin_yet?
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,5 @@
1
+ module Boxroom
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery
4
+ end
5
+ end
@@ -0,0 +1,87 @@
1
+ module Boxroom
2
+ class ClipboardController < Boxroom::ApplicationController
3
+ include Boxroom::BaseController
4
+
5
+ before_action :require_existing_item, :except => :reset
6
+ before_action :require_existing_target_folder, :only => [:copy, :move]
7
+ before_action :require_target_is_not_child, :only => :move
8
+ before_action :require_create_permission, :only => [:copy, :move]
9
+ before_action :require_read_permission, :only => [:create, :copy, :move]
10
+ before_action :require_delete_permission, :only => :move
11
+
12
+ # @item is set in require_existing_item
13
+ def create
14
+ cl = clipboard
15
+ cl.add(@item)
16
+ session[:clipboard] = cl
17
+ redirect_to folder_url(params[:folder_id]), :notice => t(:added_to_clipboard)
18
+ end
19
+
20
+ # @item is set in require_existing_item
21
+ def destroy
22
+ cl = clipboard
23
+ cl.remove(@item)
24
+ session[:clipboard] = cl
25
+ redirect_to folder_url(params[:folder_id])
26
+ end
27
+
28
+ def reset
29
+ cl = clipboard
30
+ cl.reset
31
+ session[:clipboard] = cl
32
+ redirect_to folder_url(params[:folder_id])
33
+ end
34
+
35
+ def copy
36
+ paste :copy
37
+ end
38
+
39
+ def move
40
+ paste :move
41
+ end
42
+
43
+ private
44
+
45
+ # @item is set in require_existing_item
46
+ # @target_folder is set in require_existing_target_folder
47
+ def paste(action)
48
+ @item.send(action, @target_folder)
49
+ cl = clipboard
50
+ cl.remove(@item)
51
+ session[:clipboard] = cl
52
+ redirect_to folder_url(params[:folder_id])
53
+ rescue ActiveRecord::RecordInvalid
54
+ redirect_to folder_url(params[:folder_id]), :alert => t("could_not_#{action}", :type => t(params[:type]))
55
+ end
56
+
57
+ def require_existing_item
58
+ if params[:type] == 'folder'
59
+ @item = @folder = Folder.find(params[:id])
60
+ else
61
+ @item = UserFile.find(params[:id])
62
+ @folder = @item.folder
63
+ end
64
+ rescue ActiveRecord::RecordNotFound
65
+ redirect_to folder_url(params[:folder_id]), :alert => t(:already_deleted, :type => t("this_#{params[:type]}"))
66
+ end
67
+
68
+ def require_target_is_not_child
69
+ if params[:type] == 'folder'
70
+ if @folder == @target_folder || @folder.parent_of?(@target_folder)
71
+ redirect_to folder_url(params[:folder_id]), :alert => t(:cannot_move_to_own_subfolder)
72
+ end
73
+ end
74
+ end
75
+
76
+ # Overrides require_#{method}_permission in ApplicationController.
77
+ # Check if @folder can be read or deleted and redirects to the
78
+ # current folder (identified by params[:folder_id]) if not.
79
+ %w{read delete}.each do |method|
80
+ define_method "require_#{method}_permission" do
81
+ unless current_user.send("can_#{method}", @folder)
82
+ redirect_to folder_url(params[:folder_id]), :alert => t(:no_permissions_for_this_type, :method => t(method), :type => t("this_#{params[:type]}"))
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,78 @@
1
+ module Boxroom
2
+ class FilesController < Boxroom::ApplicationController
3
+ include Boxroom::BaseController
4
+
5
+ before_action :require_existing_file, :only => [:show, :edit, :update, :destroy]
6
+ before_action :require_existing_target_folder, :only => [:new, :create]
7
+
8
+ before_action :require_create_permission, :only => [:new, :create]
9
+ before_action :require_read_permission, :only => :show
10
+ before_action :require_update_permission, :only => [:edit, :update]
11
+ before_action :require_delete_permission, :only => :destroy
12
+
13
+ # @file and @folder are set in require_existing_file
14
+ def show
15
+ send_file @file.attachment.path, :filename => @file.attachment_file_name
16
+ end
17
+
18
+ # @target_folder is set in require_existing_target_folder
19
+ def new
20
+ @file = @target_folder.user_files.build
21
+ end
22
+
23
+ # @target_folder is set in require_existing_target_folder
24
+ def create
25
+ existing_file = UserFile.where(
26
+ attachment_file_name: permitted_params.user_file["attachment"].original_filename,
27
+ attachment_content_type: permitted_params.user_file["attachment"].content_type,
28
+ folder_id: params[:target_folder_id]
29
+ ).first
30
+
31
+ if existing_file # Resume upload
32
+ existing_file.update_attribute(:attachment_file_size, existing_file.attachment_file_size + permitted_params.user_file["attachment"].size)
33
+ File.open("#{Rails.root}/#{Boxroom.configuration.uploads_path}/#{Rails.env}/#{existing_file.id}/original/#{existing_file.id}", "ab") {|f| f.write(permitted_params.user_file["attachment"].read)}
34
+ else
35
+ @file = @target_folder.user_files.create(permitted_params.user_file)
36
+ end
37
+
38
+ head :ok
39
+ end
40
+
41
+ # @file and @folder are set in require_existing_file
42
+ def edit
43
+ end
44
+
45
+ # @file and @folder are set in require_existing_file
46
+ def update
47
+ if @file.update_attributes(permitted_params.user_file)
48
+ redirect_to edit_file_url(@file), :notice => t(:your_changes_were_saved)
49
+ else
50
+ render :action => 'edit'
51
+ end
52
+ end
53
+
54
+ # @file and @folder are set in require_existing_file
55
+ def destroy
56
+ @file.destroy
57
+ redirect_to @folder
58
+ end
59
+
60
+ def exists
61
+ @folder = Folder.find(params[:folder])
62
+
63
+ if current_user.can_read(@folder) || current_user.can_write(@folder)
64
+ @file = @folder.user_files.build(:attachment_file_name => params[:name].gsub(Boxroom::RESTRICTED_CHARACTERS, '_'))
65
+ render :json => !@file.valid?
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def require_existing_file
72
+ @file = UserFile.find(params[:id])
73
+ @folder = @file.folder
74
+ rescue ActiveRecord::RecordNotFound
75
+ redirect_to Folder.root, :alert => t(:already_deleted, :type => t(:this_file))
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,91 @@
1
+ module Boxroom
2
+ class FoldersController < Boxroom::ApplicationController
3
+ include Boxroom::BaseController
4
+
5
+ before_action :require_existing_folder, :only => [:show, :edit, :update, :destroy]
6
+ before_action :require_existing_target_folder, :only => [:new, :create]
7
+ before_action :require_folder_isnt_root_folder, :only => [:edit, :update, :destroy]
8
+
9
+ before_action :require_create_permission, :only => [:new, :create]
10
+ before_action :require_read_permission, :only => :show
11
+ before_action :require_update_permission, :only => [:edit, :update]
12
+ before_action :require_delete_permission, :only => :destroy
13
+
14
+ def index
15
+ redirect_to Folder.root
16
+ end
17
+
18
+ # Note: @folder is set in require_existing_folder
19
+ def show
20
+ end
21
+
22
+ # Note: @target_folder is set in require_existing_target_folder
23
+ def new
24
+ @folder = @target_folder.children.build
25
+ end
26
+
27
+ # Note: @target_folder is set in require_existing_target_folder
28
+ def create
29
+ @folder = @target_folder.children.build(permitted_params.folder)
30
+
31
+ if @folder.save
32
+ redirect_to @target_folder
33
+ else
34
+ render :action => 'new'
35
+ end
36
+ end
37
+
38
+ # Note: @folder is set in require_existing_folder
39
+ def edit
40
+ end
41
+
42
+ # Note: @folder is set in require_existing_folder
43
+ def update
44
+ if @folder.update_attributes(permitted_params.folder)
45
+ redirect_to edit_folder_url(@folder), :notice => t(:your_changes_were_saved)
46
+ else
47
+ render :action => 'edit'
48
+ end
49
+ end
50
+
51
+ # Note: @folder is set in require_existing_folder
52
+ def destroy
53
+ target_folder = @folder.parent
54
+ @folder.destroy
55
+ redirect_to target_folder
56
+ end
57
+
58
+ private
59
+
60
+ # get_folder_or_redirect is defined in ApplicationController
61
+ def require_existing_folder
62
+ @folder = get_folder_or_redirect(params[:id])
63
+ end
64
+
65
+ def require_folder_isnt_root_folder
66
+ if @folder.is_root?
67
+ redirect_to Folder.root, :alert => t(:cannot_delete_root_folder)
68
+ end
69
+ end
70
+
71
+ # Overrides require_delete_permission in ApplicationController
72
+ def require_delete_permission
73
+ unless @folder.is_root? || current_user.can_delete(@folder)
74
+ redirect_to @folder.parent, :alert => t(:no_permissions_for_this_type, :method => t(:delete), :type => t(:this_folder))
75
+ else
76
+ require_delete_permissions_for(@folder.children)
77
+ end
78
+ end
79
+
80
+ def require_delete_permissions_for(folders)
81
+ folders.each do |folder|
82
+ unless current_user.can_delete(folder)
83
+ redirect_to @folder.parent, :alert => t(:no_delete_permissions_for_subfolder)
84
+ else
85
+ # Recursive...
86
+ require_delete_permissions_for(folder.children)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,60 @@
1
+ module Boxroom
2
+ class GroupsController < Boxroom::ApplicationController
3
+ include Boxroom::BaseController
4
+
5
+ before_action :require_admin
6
+ before_action :require_existing_group, :only => [:edit, :update, :destroy]
7
+ before_action :require_group_isnt_admins_group, :only => [:edit, :update, :destroy]
8
+
9
+ def index
10
+ @groups = Group.order(:name)
11
+ end
12
+
13
+ def new
14
+ @group = Group.new
15
+ end
16
+
17
+ def create
18
+ @group = Group.new(permitted_params.group)
19
+
20
+ if @group.save
21
+ redirect_to groups_url
22
+ else
23
+ render :action => 'new'
24
+ end
25
+ end
26
+
27
+ # Note: @group is set in require_existing_group
28
+ def edit
29
+ end
30
+
31
+ # Note: @group is set in require_existing_group
32
+ def update
33
+ if @group.update_attributes(permitted_params.group)
34
+ redirect_to edit_group_url(@group), :notice => t(:your_changes_were_saved)
35
+ else
36
+ render :action => 'edit'
37
+ end
38
+ end
39
+
40
+ # Note: @group is set in require_existing_group
41
+ def destroy
42
+ @group.destroy
43
+ redirect_to groups_url
44
+ end
45
+
46
+ private
47
+
48
+ def require_existing_group
49
+ @group = Group.find(params[:id])
50
+ rescue ActiveRecord::RecordNotFound
51
+ redirect_to groups_url, :alert => t(:group_already_deleted)
52
+ end
53
+
54
+ def require_group_isnt_admins_group
55
+ if @group.admins_group?
56
+ redirect_to groups_url, :alert => t(:admins_group_cannot_be_deleted)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,19 @@
1
+ module Boxroom
2
+ class PermissionsController < Boxroom::ApplicationController
3
+ include Boxroom::BaseController
4
+
5
+ before_action :require_admin
6
+
7
+ def update_multiple
8
+ if params[:permissions]
9
+ permissions = Permission.update(params[:permissions].keys, params[:permissions].values)
10
+ folder = permissions.first.folder
11
+ folder.copy_permissions_to_children(permissions) if params[:recursive] && folder.has_children?
12
+ end
13
+
14
+ redirect_back fallback_location: root_path
15
+ rescue ActiveRecord::RecordNotFound # Folder was deleted, so permissions are gone too
16
+ redirect_to Folder.root, :alert => t(:already_deleted, :type => t(:this_folder))
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,45 @@
1
+ module Boxroom
2
+ class ResetPasswordController < Boxroom::ApplicationController
3
+ include Boxroom::BaseController
4
+
5
+ before_action :require_valid_token, :only => [:edit, :update]
6
+ skip_before_action :require_login
7
+
8
+ def new
9
+ end
10
+
11
+ def create
12
+ user = User.find_by_email(params[:email])
13
+
14
+ unless user.nil?
15
+ user.refresh_reset_password_token
16
+ UserMailer.reset_password_email(user).deliver_now
17
+ end
18
+
19
+ redirect_to new_reset_password_url, :notice => t(:instruction_email_sent, :email => params[:email])
20
+ end
21
+
22
+ # Note: @user is set in require_valid_token
23
+ def edit
24
+ end
25
+
26
+ # Note: @user is set in require_valid_token
27
+ def update
28
+ if @user.update_attributes(permitted_params.user.merge({:password_required => true}))
29
+ redirect_to new_session_url, :notice => t(:password_reset_successfully)
30
+ else
31
+ render :action => 'edit'
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def require_valid_token
38
+ @user = User.find_by_reset_password_token(params[:id])
39
+
40
+ if @user.nil? || @user.reset_password_token_expires_at < Time.now
41
+ redirect_to new_reset_password_url, :alert => t(:reset_url_expired)
42
+ end
43
+ end
44
+ end
45
+ end