diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index bb091706b..a36a8c873 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -16,6 +16,7 @@ class ApplicationController < ActionController::Base end def set_friends_and_status + @groups = current_user.groups @friends = current_user.friends if current_user @latest_status_message = StatusMessage.newest_for(current_user) if current_user end diff --git a/app/controllers/dashboards_controller.rb b/app/controllers/dashboards_controller.rb index 438163fff..882cdca50 100644 --- a/app/controllers/dashboards_controller.rb +++ b/app/controllers/dashboards_controller.rb @@ -5,5 +5,4 @@ class DashboardsController < ApplicationController def index @posts = Post.paginate :page => params[:page], :order => 'created_at DESC' end - - end +end diff --git a/app/controllers/dev_utilities_controller.rb b/app/controllers/dev_utilities_controller.rb index f45be992b..7a1021b09 100644 --- a/app/controllers/dev_utilities_controller.rb +++ b/app/controllers/dev_utilities_controller.rb @@ -3,21 +3,21 @@ class DevUtilitiesController < ApplicationController include ApplicationHelper def warzombie render :nothing => true - if User.owner.email == "tom@tom.joindiaspora.com" && StatusMessage.where(:message => "There's a bomb in the lasagna!?").first == nil - StatusMessage.create(:message => "There's a bomb in the lasagna!?", :person => User.owner) - Bookmark.create(:title => "xkcd", :link => "http://xkcd.com/743/", :person => User.owner ) - StatusMessage.create(:message => "I switched to Motoroi today, a Motorola Android-based phone, in Korea. Now, I am using Android phones in both the U.S. and Korea", :person => User.owner, :created_at => Time.now-930) - StatusMessage.create(:message => "I had 5 hours to study for it :-( GREs on Thursday. Wunderbar.", :person => User.owner, :created_at => Time.now-43990) - StatusMessage.create(:message => "Spotted in toy story 3: google maps, OSX, and windows XP. Two out of three isn't bad.", :person => User.owner, :created_at => Time.now-4390) - Bookmark.create( :title => "Reddit", :link => "http://reddit.com", :person => User.owner, :created_at => Time.now-54390) - Blog.create(:title => "I Love Rock'N'Roll - Joan Jett & The Blackhearts", :body => "

The loudspeakers played this song as we walked into the city pool for the first time this summer. Those loudspeakers make every song sound fresh even if I have heard it a thousand times and their effect on this song was no different. Joan sounded young and strong and ready, and for a moment I forgot where or when I was.

also i can tell it won’t be long and also happy summer imaginary constructs -mumblelard

", :person => User.owner, :created_at => Time.now-3090) - StatusMessage.create(:message => "Commercials for IE make me SO MAD and my friends just don't get why.", :person => User.owner, :created_at => Time.now-30900) - Bookmark.create(:title => "Zombo.com", :link => "http://zombo.com", :person => User.owner, :created_at => Time.now-9090) - StatusMessage.create(:message => "Why do I have \"No More Heroes\" by Westlife on repeat all day?", :person => User.owner, :created_at => Time.now-590000) - StatusMessage.create(:message => "Mmm. Friday night. Acknowledged.", :person => User.owner, :created_at => Time.now-503900) - StatusMessage.create(:message => "Getting a universal remote is the epitome of laziness, I do declare.", :person => User.owner, :created_at => Time.now-4400) - StatusMessage.create(:message => "Does anyone know how to merge two Skype contact entries of the same person? (i.e. one Skype ID and one mobile number)", :person => User.owner, :created_at => Time.now-400239) - StatusMessage.create(:message => "A cool, cool morning for once.", :person => User.owner, :created_at => Time.now-150000) + if current_user.email == "tom@tom.joindiaspora.com" && StatusMessage.where(:message => "There's a bomb in the lasagna!?").first == nil + current_user.post(:status_message, :message => "There's a bomb in the lasagna!?") + current_user.post(:bookmark, :title => "xkcd", :link => "http://xkcd.com/743/" ) + current_user.post(:status_message, :message => "I switched to Motoroi today, a Motorola Android-based phone, in Korea. Now, I am using Android phones in both the U.S. and Korea", :created_at => Time.now-930) + current_user.post(:status_message, :message => "I had 5 hours to study for it :-( GREs on Thursday. Wunderbar.", :created_at => Time.now-43990) + current_user.post(:status_message, :message => "Spotted in toy story 3: google maps, OSX, and windows XP. Two out of three isn't bad.", :created_at => Time.now-4390) + current_user.post(:bookmark, :title => "Reddit", :link => "http://reddit.com", :created_at => Time.now-54390) + current_user.post(:blog, :title => "I Love Rock'N'Roll - Joan Jett & The Blackhearts", :body => "

The loudspeakers played this song as we walked into the city pool for the first time this summer. Those loudspeakers make every song sound fresh even if I have heard it a thousand times and their effect on this song was no different. Joan sounded young and strong and ready, and for a moment I forgot where or when I was.

also i can tell it won’t be long and also happy summer imaginary constructs -mumblelard

", :created_at => Time.now-3090) + current_user.post(:status_message, :message => "Commercials for IE make me SO MAD and my friends just don't get why.", :created_at => Time.now-30900) + current_user.post(:bookmark, :title => "Zombo.com", :link => "http://zombo.com", :created_at => Time.now-9090) + current_user.post(:status_message, :message => "Why do I have \"No More Heroes\" by Westlife on repeat all day?", :created_at => Time.now-590000) + current_user.post(:status_message, :message => "Mmm. Friday night. Acknowledged.", :created_at => Time.now-503900) + current_user.post(:status_message, :message => "Getting a universal remote is the epitome of laziness, I do declare.", :created_at => Time.now-4400) + current_user.post(:status_message, :message => "Does anyone know how to merge two Skype contact entries of the same person? (i.e. one Skype ID and one mobile number)", :created_at => Time.now-400239) + current_user.post(:status_message, :message => "A cool, cool morning for once.", :created_at => Time.now-150000) end end @@ -25,10 +25,10 @@ def warzombie render :nothing => true bkr_info = backer_info - if User.owner.email == "tom@tom.joindiaspora.com" && User.owner.friends.first.nil? + if current_user.email == "tom@tom.joindiaspora.com" && current_user.friends.first.nil? bkr_info.each do |backer| - logger.info "Zombefriending #{backer['given_name']} #{backer['family_name']}" - User.owner.send_friend_request_to("http://#{backer['username']}.joindiaspora.com/") + logger.debug "Zombefriending #{backer['given_name']} #{backer['family_name']}" + current_user.send_friend_request_to("http://#{backer['username']}.joindiaspora.com/") end end end @@ -36,7 +36,7 @@ def warzombie def zombiefriendaccept render :nothing => true Request.all.each{|r| - User.owner.accept_friend_request(r.id) + current_user.accept_friend_request(r.id) } end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb new file mode 100644 index 000000000..e12809fb6 --- /dev/null +++ b/app/controllers/groups_controller.rb @@ -0,0 +1,44 @@ +class GroupsController < ApplicationController + before_filter :authenticate_user! + + def create + @group = current_user.group(params[:group]) + + if @group.created_at + flash[:notice] = "Successfully created group." + redirect_to root_url + else + render :action => 'new' + end + end + + def new + @group = Group.new + end + + def destroy + @group = Group.first(:id => params[:id]) + @group.destroy + flash[:notice] = "Successfully destroyed group." + redirect_to groups_url + end + + def show + @group = Group.first(:id => params[:id]) + end + + def edit + @group = Group.first(:id => params[:id]) + end + + def update + @group = Group.first(:id => params[:id]) + if @group.update_attributes(params[:group]) + flash[:notice] = "Successfully updated group." + redirect_to @group + else + render :action => 'edit' + end + end + +end diff --git a/app/controllers/publics_controller.rb b/app/controllers/publics_controller.rb index 9192f064e..0df200efa 100644 --- a/app/controllers/publics_controller.rb +++ b/app/controllers/publics_controller.rb @@ -19,7 +19,7 @@ class PublicsController < ApplicationController def receive user = User.first(:id => params[:id]) - Rails.logger.info "PublicsController has received: #{params[:xml]}" + Rails.logger.debug "PublicsController has received: #{params[:xml]}" store_objects_from_xml params[:xml], user render :nothing => true end diff --git a/app/controllers/requests_controller.rb b/app/controllers/requests_controller.rb index 39f9c8376..38714034f 100644 --- a/app/controllers/requests_controller.rb +++ b/app/controllers/requests_controller.rb @@ -26,7 +26,7 @@ class RequestsController < ApplicationController def create rel_hash = relationship_flow(params[:request][:destination_url]) - Rails.logger.info("Sending request: #{rel_hash}") + Rails.logger.debug("Sending request: #{rel_hash}") @request = current_user.send_request(rel_hash) if @request diff --git a/app/controllers/sockets_controller.rb b/app/controllers/sockets_controller.rb index e25472d52..eb4f57fc9 100644 --- a/app/controllers/sockets_controller.rb +++ b/app/controllers/sockets_controller.rb @@ -2,22 +2,14 @@ class SocketsController < ApplicationController include ApplicationHelper include SocketsHelper include Rails.application.routes.url_helpers - before_filter :authenticate_user! def incoming(msg) - puts "#{msg} connected!" + puts "Got a connection to: #{msg}" end - def new_subscriber - WebSocket.subscribe - end - - def outgoing(object) + def outgoing(uid,object) @_request = ActionDispatch::Request.new({}) - WebSocket.push_to_clients(action_hash(object)) + WebSocket.push_to_user(uid, action_hash(uid, object)) end - def delete_subscriber(sid) - WebSocket.unsubscribe(sid) - end end diff --git a/app/helpers/sockets_helper.rb b/app/helpers/sockets_helper.rb index 194f321ff..749de4b41 100644 --- a/app/helpers/sockets_helper.rb +++ b/app/helpers/sockets_helper.rb @@ -9,9 +9,10 @@ module SocketsHelper {:host => ""} end - def action_hash(object) + def action_hash(uid, object) begin - v = render_to_string(:partial => type_partial(object), :locals => {:post => object}) unless object.is_a? Retraction + user = User.first(:id => uid) + v = render_to_string(:partial => type_partial(object), :locals => {:post => object, :current_user => user}) unless object.is_a? Retraction rescue Exception => e Rails.logger.error("web socket view rendering failed for object #{object.inspect}.") raise e diff --git a/app/models/comment.rb b/app/models/comment.rb index d374f13ed..f2b6aface 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -71,7 +71,7 @@ class Comment protected def sign_if_my_post unless self.post.person.owner.nil? - self.post_creator_signature = sign_with_key self.post.person.key + self.post_creator_signature = sign_with_key self.post.person.encryption_key end end diff --git a/app/models/group.rb b/app/models/group.rb new file mode 100644 index 000000000..885e471cc --- /dev/null +++ b/app/models/group.rb @@ -0,0 +1,12 @@ +class Group + include MongoMapper::Document + + key :name, String + + many :people, :class_name => 'Person' + belongs_to :user, :class_name => 'User' + + timestamps! + +end + diff --git a/app/models/person.rb b/app/models/person.rb index 477c091ca..a82dd56cf 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -39,16 +39,16 @@ class Person "#{profile.first_name.to_s} #{profile.last_name.to_s}" end - def key + def encryption_key OpenSSL::PKey::RSA.new( serialized_key ) end - def key= new_key + def encryption_key= new_key raise TypeError unless new_key.class == OpenSSL::PKey::RSA serialized_key = new_key.export end def export_key - key.public_key.export + encryption_key.public_key.export end diff --git a/app/models/photo.rb b/app/models/photo.rb index e57e2f78d..c06ceb62c 100644 --- a/app/models/photo.rb +++ b/app/models/photo.rb @@ -41,11 +41,9 @@ class Photo < Post end def remote_photo= remote_path - Rails.logger.info("Setting remote photo with id #{id}") @remote_photo = remote_path image.download! remote_path image.store! - Rails.logger.info("Setting remote photo with id #{id}") end def ensure_user_picture diff --git a/app/models/post.rb b/app/models/post.rb index 74fce8881..0768a91c8 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -59,10 +59,10 @@ class Post end def log_inspection - Rails.logger.info self.inspect + Rails.logger.debug self.inspect end def log_save_inspection - Rails.logger.info "After saving, object is:" + Rails.logger.debug "After saving, object is:" log_inspection end @@ -76,7 +76,10 @@ protected end def send_to_view - SocketsController.new.outgoing(self) + people_with_permissions.each{|f| + SocketsController.new.outgoing(f.owner_id, self) if f.owner_id + } + SocketsController.new.outgoing(person.owner_id, self) if person.owner_id end def remove_from_view diff --git a/app/models/retraction.rb b/app/models/retraction.rb index 6ade21ec7..dff72b767 100644 --- a/app/models/retraction.rb +++ b/app/models/retraction.rb @@ -27,7 +27,7 @@ class Retraction def perform begin return unless signature_valid? - Rails.logger.info("Retracting #{self.type} id: #{self.post_id}") + Rails.logger.debug("Retracting #{self.type} id: #{self.post_id}") self.type.constantize.destroy(self.post_id) rescue NameError Rails.logger.info("Retraction for unknown type recieved.") diff --git a/app/models/user.rb b/app/models/user.rb index 2e43ecd00..c6f7e5476 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -12,10 +12,13 @@ class User many :friends, :in => :friend_ids, :class_name => 'Person' many :pending_requests, :in => :pending_request_ids, :class_name => 'Request' + many :groups, :class_name => 'Group' + before_validation_on_create :assign_key before_validation :do_bad_things - ######## Posting ######## + ######## Making things work ######## + key :email, String def method_missing(method, *args) @@ -27,9 +30,14 @@ class User "#{person.profile.first_name.to_s} #{person.profile.last_name.to_s}" end + ######### Groups ###################### + def group( opts = {} ) + opts[:user] = self + Group.create(opts) + end - ######### Friend Requesting + ######### Friend Requesting ########### def send_friend_request_to(friend_url) unless self.friends.detect{ |x| x.url == friend_url} @@ -67,20 +75,18 @@ class User end def receive_friend_request(friend_request) - - puts friend_request.inspect - Rails.logger.info("receiving friend request #{friend_request.to_json}") + Rails.logger.debug("receiving friend request #{friend_request.to_json}") friend_request.person.serialized_key = friend_request.exported_key if Request.where(:callback_url => friend_request.callback_url).first activate_friend friend_request.person - Rails.logger.info("#{self.real_name}'s friend request has been accepted") + Rails.logger.debug("#{self.real_name}'s friend request has been accepted") friend_request.destroy else friend_request.person.save pending_requests << friend_request save - Rails.logger.info("#{self.real_name} has received a friend request") + Rails.logger.debug("#{self.real_name} has received a friend request") friend_request.save end end diff --git a/app/views/albums/index.html.haml b/app/views/albums/index.html.haml index 8f3816f3d..2e47295d6 100644 --- a/app/views/albums/index.html.haml +++ b/app/views/albums/index.html.haml @@ -2,8 +2,8 @@ .back = link_to "⇧ home", root_path Albums - .button.right#add_album_button - = link_to 'New Album', "#" + .right#add_album_button + = link_to 'New Album', "#", :class => "button" #add_album_box.contextual_pane = render "albums/new_album" diff --git a/app/views/albums/show.html.haml b/app/views/albums/show.html.haml index 92b3c2756..6911d2555 100644 --- a/app/views/albums/show.html.haml +++ b/app/views/albums/show.html.haml @@ -25,6 +25,7 @@ #content_bottom .back = link_to "⇧ albums", albums_path + -if current_user.owns? @album .button.right = link_to 'Edit Album', edit_album_path(@album) diff --git a/app/views/groups/_new_group.haml b/app/views/groups/_new_group.haml new file mode 100644 index 000000000..755223fd8 --- /dev/null +++ b/app/views/groups/_new_group.haml @@ -0,0 +1,6 @@ += form_for Group.new do |f| + = f.error_messages + %p + = f.label :name + = f.text_field :name + = f.submit 'create', :class => 'button' diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml new file mode 100644 index 000000000..461bff1db --- /dev/null +++ b/app/views/groups/edit.html.haml @@ -0,0 +1,25 @@ +%h1.big_text + .back + = link_to "⇧ #{@group.name}", @group + + = "Editing #{@group.name}" + +.sub_header + ="updated #{how_long_ago(@group)}" + +- form_for @group do |a| + = a.error_messages + %p + = a.text_field :name + + #submit_block + = link_to "Cancel", root_path + or + = a.submit + +.button.delete + = link_to 'Delete Album', @group, :confirm => 'Are you sure?', :method => :delete + +#content_bottom + .back + = link_to "⇧ #{@group.name}", @group diff --git a/app/views/groups/new.html.haml b/app/views/groups/new.html.haml new file mode 100644 index 000000000..c899fd9ae --- /dev/null +++ b/app/views/groups/new.html.haml @@ -0,0 +1,14 @@ +%h1.big_text + =link_to 'groups', groups_path + >> + new group + += form_for @group do |f| + = f.error_messages + %p + = f.label :name + = f.text_field :name + %p + = f.submit + +%p= link_to "Back to List", groups_path diff --git a/app/views/js/_websocket_js.haml b/app/views/js/_websocket_js.haml index 768c03cb7..793aea9db 100644 --- a/app/views/js/_websocket_js.haml +++ b/app/views/js/_websocket_js.haml @@ -7,7 +7,9 @@ $(document).ready(function(){ function debug(str){ $("#debug").append("

" + str); }; - ws = new WebSocket("ws://#{request.host}:8080/"); + ws = new WebSocket("ws://#{request.host}:8080/#{CGI::escape(current_user.id.to_s)}"); + + //Attach onmessage to websocket ws.onmessage = function(evt) { var obj = jQuery.parseJSON(evt.data); debug("got a " + obj['class']); diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 4eb0281a4..02568e239 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -10,9 +10,8 @@ = stylesheet_link_tag "application", "ui", 'bubble' /= javascript_include_tag "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" = javascript_include_tag 'jquery142', 'rails', 'google' - = javascript_include_tag 'tiny_mce/tiny_mce', 'jquery.infieldlabel' - = javascript_include_tag 'jquery.cycle/jquery.cycle.min.js' - = javascript_include_tag 'view', 'publisher', 'image_picker' + = javascript_include_tag 'tiny_mce/tiny_mce', 'jquery.infieldlabel', 'jquery.cycle/jquery.cycle.min.js' + = javascript_include_tag 'view', 'publisher', 'image_picker', 'group_nav' = render 'js/websocket_js' = csrf_meta_tag @@ -41,6 +40,9 @@ = link_to "logout", destroy_user_session_path - else = link_to "login", new_user_session_path + + = render "shared/group_nav" + .container - if user_signed_in? @@ -62,12 +64,6 @@ .container .span-24.last - .span-20.append-1.last - - = yield - - .span-3.last - = render 'people/sidebar' if user_signed_in? - - .span-24.last - = render "posts/debug" + = yield + .span-24.last + = render "posts/debug" diff --git a/app/views/photos/show.html.haml b/app/views/photos/show.html.haml index f1956ee4d..bf5a8f01d 100644 --- a/app/views/photos/show.html.haml +++ b/app/views/photos/show.html.haml @@ -3,8 +3,8 @@ = link_to "⇧ #{@album.name}", album_path(@album) = @photo.image - .button.right - = link_to 'Edit Photo', edit_photo_path(@photo) + .right + = link_to 'Edit Photo', edit_photo_path(@photo), :class => "button" .sub_header = link_to "full size", @photo.image.url @@ -25,6 +25,7 @@ #content_bottom .back = link_to "⇧ #{@album.name}", album_path(@album) + -if current_user.owns? @album .button.right = link_to 'Delete Photo', @photo, :confirm => 'Are you sure?', :method => :delete diff --git a/app/views/shared/_group_nav.haml b/app/views/shared/_group_nav.haml new file mode 100644 index 000000000..c61712038 --- /dev/null +++ b/app/views/shared/_group_nav.haml @@ -0,0 +1,13 @@ +#group + %ul + - for group in @groups + %li= link_to group.name, group_path(group) + + %li.new_group= link_to "NEW GROUP", new_group_path + + #friend_pictures + - for friend in @friends + = person_image_link(friend) + + .add_new + = link_to "+", requests_path diff --git a/app/views/status_messages/_status_message.html.haml b/app/views/status_messages/_status_message.html.haml index adb774cd6..ac0f55c34 100644 --- a/app/views/status_messages/_status_message.html.haml +++ b/app/views/status_messages/_status_message.html.haml @@ -14,4 +14,4 @@ - if current_user.owns?(post) .destroy_link - = link_to 'Delete', status_message_path(post), :confirm => 'Are you sure?', :method => :delete, :remote => true + = link_to 'Delete', status_message_path(post), :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "delete" diff --git a/config/initializers/logging.rb b/config/initializers/logging.rb new file mode 100644 index 000000000..447ec5c17 --- /dev/null +++ b/config/initializers/logging.rb @@ -0,0 +1,2 @@ +Rails.logger = Logger.new( + Rails.root.join("log",Rails.env + ".log"),3,5*1024*1024) diff --git a/config/initializers/socket.rb b/config/initializers/socket.rb index aebf023f3..2fec8a328 100644 --- a/config/initializers/socket.rb +++ b/config/initializers/socket.rb @@ -3,38 +3,50 @@ require 'eventmachine' module WebSocket EM.next_tick { - initialize_channel + initialize_channels EventMachine::WebSocket.start( :host => "0.0.0.0", :port => APP_CONFIG[:socket_port], :debug =>APP_CONFIG[:debug]) do |ws| ws.onopen { - @ws = ws - sid = @channel.subscribe{ |msg| ws.send msg }#SocketsController.new.new_subscriber + + sid = self.subscribe(ws.request['Path'].gsub('/',''), ws) ws.onmessage { |msg| SocketsController.new.incoming(msg) }#@channel.push msg; puts msg} - ws.onclose { SocketsController.new.delete_subscriber(sid) } + ws.onclose { unsubscribe(ws.request['Path'].gsub('/',''), sid) } } end } - def self.initialize_channel - @channel = EM::Channel.new + def self.initialize_channels + @channels = {} end - def self.push_to_clients(html) - @channel.push(html) + def self.push_to_user(uid, data) + Rails.logger.debug "Websocketing to #{uid}" + @channels[uid.to_s][0].push(data) if @channels[uid.to_s] end - def self.unsubscribe(sid) - @channel.unsubscribe(sid) + def self.subscribe(uid, ws) + Rails.logger.debug "Subscribing socket to #{User.first(:id => uid).email}" + self.ensure_channel(uid) + @channels[uid][0].subscribe{ |msg| ws.send msg } + @channels[uid][1] += 1 end - - - def self.subscribe - @channel.subscribe{ |msg| ws.send msg } + + def self.ensure_channel(uid) + @channels[uid] ||= [EM::Channel.new, 0 ] + end + + def self.unsubscribe(uid,sid) + Rails.logger.debug "Unsubscribing socket #{sid} from #{User.first(:id => uid).email}" + @channels[uid][0].unsubscribe(sid) if @channels[uid] + @channels[uid][1] -= 1 + if @channels[uid][1] <= 0 + @channels.delete(uid) + end end end diff --git a/config/routes.rb b/config/routes.rb index 274eaa86a..50811fa73 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,6 +8,7 @@ Diaspora::Application.routes.draw do |map| resources :requests resources :photos resources :albums + resources :groups match "/images/files/*path" => "gridfs#serve" diff --git a/db/seeds/dev.rb b/db/seeds/dev.rb index dfc4d1c14..f13e27f4c 100644 --- a/db/seeds/dev.rb +++ b/db/seeds/dev.rb @@ -9,17 +9,17 @@ require 'config/environment' # Create seed user -user = User.create( :email => "robert@joindiaspora.com", - :password => "evankorth", - :person => Person.create( - :email => "robert@joindiaspora.com", - :url => "http://localhost:3000/", - :profile => Profile.new( - :first_name => "bobert", - :last_name => "brin" ))) +user = User.create( :email => "robert@joindiaspora.com", + :password => "evankorth", + :person => Person.new( + :email => "robert@joindiaspora.com", + :url => "http://localhost:3000/", + :profile => Profile.new( + :first_name => "bobert", + :last_name => "brin" ))) -puts user.save! -puts user.person.save +puts user.save +puts user.person.save! puts user.save! puts user.person.inspect puts user.inspect diff --git a/lib/diaspora/parser.rb b/lib/diaspora/parser.rb index 3737e5c25..59d7f45d4 100644 --- a/lib/diaspora/parser.rb +++ b/lib/diaspora/parser.rb @@ -45,16 +45,16 @@ module Diaspora def store_objects_from_xml(xml, user) objects = parse_objects_from_xml(xml) objects.each do |p| - Rails.logger.info("Receiving object:\n#{p.inspect}") + Rails.logger.debug("Receiving object:\n#{p.inspect}") if p.is_a? Retraction - Rails.logger.info "Got a retraction for #{p.post_id}" + Rails.logger.debug "Got a retraction for #{p.post_id}" p.perform elsif p.is_a? Request user.receive_friend_request(p) elsif p.is_a? Profile p.save elsif p.respond_to?(:person) && !(p.person.nil?) && !(p.person.is_a? User) - Rails.logger.info("Saving object with success: #{p.save}") + Rails.logger.debug("Saving object with success: #{p.save}") end end end diff --git a/lib/diaspora/webhooks.rb b/lib/diaspora/webhooks.rb index 929dff515..423800459 100644 --- a/lib/diaspora/webhooks.rb +++ b/lib/diaspora/webhooks.rb @@ -20,7 +20,7 @@ module Diaspora unless recipients.empty? recipients.map!{|x| x = x.url + "receive/"} xml = Post.build_xml_for(self) - Rails.logger.info("Adding xml for #{self} to message queue to #{recipients}") + Rails.logger.debug("Adding xml for #{self} to message queue to #{recipients}") @@queue.add_post_request( recipients, xml ) end @@queue.process @@ -29,7 +29,7 @@ module Diaspora def push_to_url(url) hook_url = url + "receive/" xml = self.class.build_xml_for(self) - Rails.logger.info("Adding xml for #{self} to message queue to #{url}") + Rails.logger.debug("Adding xml for #{self} to message queue to #{url}") @@queue.add_post_request( hook_url, xml ) @@queue.process end diff --git a/lib/encryptable.rb b/lib/encryptable.rb index b552a5ab4..850499bff 100644 --- a/lib/encryptable.rb +++ b/lib/encryptable.rb @@ -10,26 +10,26 @@ if person.nil? Rails.logger.info("Verifying sig on #{signable_string} but no person is here") return false - elsif person.key.nil? + elsif person.encryption_key.nil? Rails.logger.info("Verifying sig on #{signable_string} but #{person.real_name} has no key") return false elsif signature.nil? Rails.logger.info("Verifying sig on #{signable_string} but #{person.real_name} did not sign") return false end - Rails.logger.info("Verifying sig on #{signable_string} from person #{person.real_name}") - validity = person.key.verify "SHA", Base64.decode64(signature), signable_string - Rails.logger.info("Validity: #{validity}") + Rails.logger.debug("Verifying sig on #{signable_string} from person #{person.real_name}") + validity = person.encryption_key.verify "SHA", Base64.decode64(signature), signable_string + Rails.logger.debug("Validity: #{validity}") validity end protected def sign_if_mine - self.creator_signature = sign_with_key(person.key) unless person.owner_id.nil? + self.creator_signature = sign_with_key(person.encryption_key) unless person.owner_id.nil? end def sign_with_key(key) - Rails.logger.info("Signing #{signable_string}") + Rails.logger.debug("Signing #{signable_string}") Base64.encode64(key.sign "SHA", signable_string) end diff --git a/public/javascripts/group_nav.js b/public/javascripts/group_nav.js new file mode 100644 index 000000000..f3d9600bb --- /dev/null +++ b/public/javascripts/group_nav.js @@ -0,0 +1,16 @@ +$(document).ready( function() { + + var vars = [], hash; + var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); + for(var i = 0; i < hashes.length; i++) + { + hash = hashes[i].split('='); + vars.push(hash[0]); + vars[hash[0]] = hash[1]; + } + + $("."+vars['g']).addClass('selected'); + + $("#group img").load(function(){$(this).fadeIn("slow");}); + +}); diff --git a/public/javascripts/view.js b/public/javascripts/view.js index 5da7a9f9e..c181e3bcc 100644 --- a/public/javascripts/view.js +++ b/public/javascripts/view.js @@ -21,15 +21,7 @@ $(document).ready(function(){ var show_comments_toggle = $(this).parent().prev().children(".show_post_comments"); show_comments_toggle.html("hide comments ("+ ($(this).children().length - 1) + ")"); }; - }); - - $('a').hover(function(){ - if( $(this).children("img").length < 1 ) - $(this).fadeTo(60, 0.5); - }, function(){ - if( $(this).children("img").length < 1 ) - $(this).fadeTo(80, 1); - }); + }); $('#debug_info').click(function() { $('#debug_more').toggle('fast', function() { @@ -115,5 +107,8 @@ $(document).ready(function(){ $(this).fadeIn("slow"); }); + $(".delete").hover(function(){ + $(this).toggleClass("button"); + }); });//end document ready diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 9335a088f..ad207bf50 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -12,10 +12,12 @@ body { a { color: #018790; - text-decoration: none; - font-weight: bold; } + color: #556270; + text-decoration: none; } a:hover { - color: #018790; } + color: white; + background-color: #018790; + background-color: #556270; } #flash_notice, #flash_error, @@ -67,24 +69,24 @@ header { margin-bottom: 30px; color: #555555; background-color: #2b2726; + background-color: black; + background-color: white; border-bottom: 3px solid #333333; padding: 6px 0; padding-top: 0; } header #diaspora_text { + margin-bottom: 1em; font-family: "BrandonGrotesqueLightRegular"; - font-size: 24px; - position: absolute; + font-size: 16px; border: none; color: white; text-shadow: 0 2px 0 black; } header #diaspora_text a { color: #666666; } header #diaspora_text span.sub_text { - color: black; text-shadow: none; } header #session_action { float: right; - margin-top: 9px; text-shadow: 0 1px 0 black; padding-right: 10px; } header #session_action a { @@ -108,13 +110,12 @@ header { ul#stream, ul#friend_stream { margin: 0; - padding: 0; - color: #666666; } + padding: 0; } ul#stream > li, ul#friend_stream > li { list-style: none; padding: 15px 0; - border-bottom: 1px solid #f1f1f1; - margin-bottom: 5px; } + margin-bottom: 5px; + border-bottom: 1px solid #eeeeee; } ul#friend_stream > li { padding: 0.2em 0; } @@ -155,9 +156,10 @@ h3 { font-weight: bold; } form { + position: relative; font-size: 120%; margin: 1em; - margin-left: 0em; } + margin-left: 0em; } #user_name { margin-bottom: 20px; } @@ -300,7 +302,8 @@ label { color: #999999; position: absolute; top: 3px; - left: 0.48em; } + left: 0.48em; + font-weight: normal; } #publisher { background-color: rgba(10, 81, 109, 0.05); @@ -375,7 +378,6 @@ ul#publisher_content_pickers li { h1.big_text { position: relative; line-height: auto; - border-top: 2px solid #666666; border-bottom: 1px solid #666666; text-align: center; } @@ -385,7 +387,8 @@ h1.big_text { .back { position: absolute; - font-size: 12px; } + font-size: 12px; + font-weight: normal; } #content_bottom { position: relative; @@ -422,3 +425,37 @@ h1.big_text { .image_cycle img { display: none; } + +#group { + color: #333333; } + #group ul { + margin: 0; + padding: 0; + font-size: 14px; } + #group ul > li { + display: inline; + margin-right: 10px; } + #group ul > li.selected, #group ul > li.selected a { + color: white; + color: black; + font-weight: bold; + font-size: 18px; } + #group a { + color: #333333; + font-weight: normal; } + #group #friend_pictures .add_new { + position: relative; + display: inline-block; + height: 40px; + width: 40px; + background-color: #222222; + text-align: center; + font-size: 40px; } + #group #friend_pictures .add_new a { + display: block; + position: absolute; + top: -13px; + left: 7px; } + #group #friend_pictures img { + display: none; + height: 40px; } diff --git a/public/stylesheets/sass/application.sass b/public/stylesheets/sass/application.sass index 0225b383a..75b14624e 100644 --- a/public/stylesheets/sass/application.sass +++ b/public/stylesheets/sass/application.sass @@ -11,12 +11,14 @@ body :margin 0 a :color #018790 + :color #556270 :text :decoration none - :font-weight bold &:hover - :color #018790 - + :color #fff + :background + :color #018790 + :color #556270 #flash_notice, #flash_error, @@ -72,16 +74,19 @@ header :color #555 :background :color #2B2726 + :color #000 + :color #fff :border :bottom 3px solid #333 :padding 6px 0 :top 0 #diaspora_text + :margin + :bottom 1em :font :family 'BrandonGrotesqueLightRegular' - :size 24px - :position absolute + :size 16px :border none :color #fff :text @@ -90,14 +95,11 @@ header :color #666 span.sub_text - :color #000 :text :shadow none #session_action :float right - :margin - :top 9px :text-shadow 0 1px 0 #000 a :color #777 @@ -121,13 +123,12 @@ header ul#stream, ul#friend_stream :margin 0 :padding 0 - :color #666 > li :list-style none :padding 15px 0 - :border - :bottom 1px solid #f1f1f1 :margin-bottom 5px + :border + :bottom 1px solid #eee ul#friend_stream > li @@ -181,11 +182,11 @@ h3 :weight bold form + :position relative :font :size 120% :margin 1em - :margin-left 0em - + :left 0em #user_name :margin @@ -366,6 +367,8 @@ label :position absolute :top 3px :left 0.48em + :font + :weight normal #publisher :background @@ -465,7 +468,7 @@ h1.big_text :position relative :line-height auto :border - :top 2px solid #666 + //:top 2px solid #666 :bottom 1px solid #666 :text :align center @@ -479,6 +482,7 @@ h1.big_text :position absolute :font :size 12px + :weight normal #content_bottom :position relative @@ -528,3 +532,46 @@ h1.big_text .image_cycle img :display none + +#group + :color #333 + ul + :margin 0 + :padding 0 + :font + :size 14px + > li + :display inline + :margin + :right 10px + + &.selected, &.selected a + :color #fff + :color #000 + :font + :weight bold + :size 18px + + a + :color #333 + :font + :weight normal + + #friend_pictures + .add_new + :position relative + :display inline-block + :height 40px + :width 40px + :background + :color #222 + :text-align center + :font-size 40px + a + :display block + :position absolute + :top -13px + :left 7px + img + :display none + :height 40px diff --git a/public/stylesheets/sass/ui.sass b/public/stylesheets/sass/ui.sass index 50000a8d3..7a64e4ce6 100644 --- a/public/stylesheets/sass/ui.sass +++ b/public/stylesheets/sass/ui.sass @@ -5,21 +5,22 @@ :display inline - :color #777 + :padding 4px + :font-size 12px :line-height 100% :text-shadow 0 1px 0 #fff - :min-height 14px + :min-height 10px - :background -webkit-gradient(linear, 0% 29%, 0% 85%, from(#FAFAFA), to(#E0E0E0)) - :background -moz-linear-gradient(top, #FAFAFA, #E0E0E0) + :background -webkit-gradient(linear, 0% 29%, 0% 85%, from(#FCFCFC), to(#F6F6F6)) + :background -moz-linear-gradient(top, #FCFCFC, #F6F6F6) - :border 1px solid #ccc - :bottom 1px solid #666 - :left 1px solid #999 - :right 1px solid #999 + :border 1px solid #EEE + :bottom 1px solid #999 + :left 1px solid #ccc + :right 1px solid #ccc :border-radius 3px :-moz-border-radius 3px @@ -27,28 +28,31 @@ :cursor pointer + :box-shadow 0 1px 1px #eee + :-webkit-box-shadow 0 1px 1px #eee + :-moz-box-shadow 0 1px 1px #eee - :box-shadow 0 1px 1px #ccc - :-webkit-box-shadow 0 1px 1px #ccc - :-moz-box-shadow 0 1px 1px #ccc + :font-weight normal - a - :font-weight normal - :color #777 + :color #666 - -.button - :padding 5px + &:hover + :color #666 + :background -webkit-gradient(linear, 0% 29%, 0% 85%, from(#FAFAFA), to(#F0F0F0)) + :background -moz-linear-gradient(top, #FAFAFA, #F0F0F0) &:active - :box-shadow 0 0px 2px #000 - :-webkit-box-shadow 0 0px 2px #000 - :-moz-box-shadow 0 0px 2px #000 - :color #555 + :color #666 + :background -webkit-gradient(linear, 0% 29%, 0% 85%, from(#F0F0F0), to(#FAFAFA)) + :background -moz-linear-gradient(top, #F0F0F0, #FAFAFA) + :border + :top 1px solid #ccc ul.button_set - :padding 5px 0 + :padding + :left 0 + :right 0 > li :padding 5px @@ -75,8 +79,8 @@ ul.button_set :right none .button .selected, .button_set .selected - :background -webkit-gradient(linear, 0% 29%, 0% 85%, from(#E0E0E0), to(#FAFAFA)) - :background -moz-linear-gradient(top, #e0e0e0, #fafafa) + :background -webkit-gradient(linear, 0% 29%, 0% 85%, from(#F0F0F0), to(#FAFAFA)) + :background -moz-linear-gradient(top, #F0F0F0, #fafafa) :border :top 1px solid #aaa diff --git a/public/stylesheets/ui.css b/public/stylesheets/ui.css index 63c8dc0cc..f83cc7957 100644 --- a/public/stylesheets/ui.css +++ b/public/stylesheets/ui.css @@ -2,38 +2,39 @@ font-family: "Lucida Grande", sans-serif; font-style: normal; display: inline; - color: #777777; + padding: 4px; font-size: 12px; line-height: 100%; text-shadow: 0 1px 0 white; - min-height: 14px; - background: -webkit-gradient(linear, 0% 29%, 0% 85%, from(#fafafa), to(#e0e0e0)); - background: -moz-linear-gradient(top, #fafafa, #e0e0e0); - border: 1px solid #cccccc; - border-bottom: 1px solid #666666; - border-left: 1px solid #999999; - border-right: 1px solid #999999; + min-height: 10px; + background: -webkit-gradient(linear, 0% 29%, 0% 85%, from(#fcfcfc), to(#f6f6f6)); + background: -moz-linear-gradient(top, #fcfcfc, #f6f6f6); + border: 1px solid #eeeeee; + border-bottom: 1px solid #999999; + border-left: 1px solid #cccccc; + border-right: 1px solid #cccccc; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; cursor: pointer; - box-shadow: 0 1px 1px #cccccc; - -webkit-box-shadow: 0 1px 1px #cccccc; - -moz-box-shadow: 0 1px 1px #cccccc; } - .button a, .button_set a { - font-weight: normal; - color: #777777; } - -.button { - padding: 5px; } - .button:active { - box-shadow: 0 0px 2px black; - -webkit-box-shadow: 0 0px 2px black; - -moz-box-shadow: 0 0px 2px black; - color: #555555; } + box-shadow: 0 1px 1px #eeeeee; + -webkit-box-shadow: 0 1px 1px #eeeeee; + -moz-box-shadow: 0 1px 1px #eeeeee; + font-weight: normal; + color: #666666; } + .button:hover, .button_set:hover { + color: #666666; + background: -webkit-gradient(linear, 0% 29%, 0% 85%, from(#fafafa), to(#f0f0f0)); + background: -moz-linear-gradient(top, #fafafa, #f0f0f0); } + .button:active, .button_set:active { + color: #666666; + background: -webkit-gradient(linear, 0% 29%, 0% 85%, from(#f0f0f0), to(#fafafa)); + background: -moz-linear-gradient(top, #f0f0f0, #fafafa); + border-top: 1px solid #cccccc; } ul.button_set { - padding: 5px 0; } + padding-left: 0; + padding-right: 0; } ul.button_set > li { padding: 5px; display: inline; @@ -50,8 +51,8 @@ ul.button_set { border-right: none; } .button .selected, .button_set .selected { - background: -webkit-gradient(linear, 0% 29%, 0% 85%, from(#e0e0e0), to(#fafafa)); - background: -moz-linear-gradient(top, #e0e0e0, #fafafa); + background: -webkit-gradient(linear, 0% 29%, 0% 85%, from(#f0f0f0), to(#fafafa)); + background: -moz-linear-gradient(top, #f0f0f0, #fafafa); border-top: 1px solid #aaaaaa; } .right { diff --git a/spec/lib/socket_renderer_spec.rb b/spec/lib/socket_renderer_spec.rb deleted file mode 100644 index 009de8b78..000000000 --- a/spec/lib/socket_renderer_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -=begin - require File.dirname(__FILE__) + '/../spec_helper' - -describe SocketRenderer do - before do - SocketRenderer.instantiate_view - @user = Factory.create(:user, :email => "bob@jones.com") - @user.profile = Factory.create(:profile, :person => @user) - end - - it 'should render a partial for a status message' do - message = Factory.create(:status_message, :person => @user) - html = SocketRenderer.view_for message - html.include? message.message - end - - it 'should prepare a class/view hash' do - message = Factory.create(:status_message, :person => @user) - - hash = SocketRenderer.view_hash(message) - hash[:class].should == "status_messages" - end -end -=end diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb new file mode 100644 index 000000000..a40a9be11 --- /dev/null +++ b/spec/models/group_spec.rb @@ -0,0 +1,32 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +describe Group do + before do + @user = Factory.create(:user) + @friend = Factory.create(:person) + end + + describe 'creation' do + it 'should have a name' do + group = @user.group(:name => 'losers') + group.name.should == "losers" + end + end + + describe 'querying' do + before do + @group = @user.group(:name => 'losers', :people => [@friend]) + end + + it 'belong to a user' do + @group.user.id.should == @user.id + @user.groups.size.should == 1 + @user.groups.first.id.should == @group.id + end + + it 'should have people' do + @group.people.all.include?(@friend).should be true + @group.people.size.should == 1 + end + end +end diff --git a/spec/user_encryption_spec.rb b/spec/user_encryption_spec.rb index d112b726b..2c7b8963b 100644 --- a/spec/user_encryption_spec.rb +++ b/spec/user_encryption_spec.rb @@ -33,7 +33,7 @@ describe 'user encryption' do #keys.each{|k| ctx.delete_key(k, true)} end it 'should have a key' do - @user.key.should_not be nil + @user.encryption_key.should_not be nil end describe 'key exchange on friending' do it 'should send over a public key' do @@ -44,7 +44,7 @@ describe 'user encryption' do it 'should receive and marshal a public key from a request' do person = Factory.build(:person, :url => "http://test.url/" ) - person.key.nil?.should== false + person.encryption_key.nil?.should== false #should move this to friend request, but i found it here id = person.id original_key = person.export_key @@ -78,7 +78,7 @@ describe 'user encryption' do it 'should verify a remote signature' do message = Factory.build(:status_message, :person => @person) - message.creator_signature = message.send(:sign_with_key,@person.key) + message.creator_signature = message.send(:sign_with_key,@person.encryption_key) message.save(:validate => false) message.verify_creator_signature.should be true end @@ -86,14 +86,14 @@ describe 'user encryption' do it 'should know if the signature is from the wrong person' do message = Factory.build(:status_message, :person => @person) message.save(:validate => false) - message.creator_signature = message.send(:sign_with_key,@person.key) + message.creator_signature = message.send(:sign_with_key,@person.encryption_key) message.person = @user message.verify_creator_signature.should be false end it 'should know if the signature is for the wrong text' do message = Factory.build(:status_message, :person => @person) - message.creator_signature = message.send(:sign_with_key,@person.key) + message.creator_signature = message.send(:sign_with_key,@person.encryption_key) message.message = 'I love VENISON' message.save(:validate => false) message.verify_creator_signature.should be false @@ -121,7 +121,7 @@ describe 'user encryption' do describe 'comments' do before do @remote_message = Factory.build(:status_message, :person => @person) - @remote_message.creator_signature = @remote_message.send(:sign_with_key,@person.key) + @remote_message.creator_signature = @remote_message.send(:sign_with_key,@person.encryption_key) @remote_message.save @message = @user.post :status_message, :message => "hi" end @@ -139,17 +139,17 @@ describe 'user encryption' do it 'should verify a comment made on a remote post by a different friend' do comment = Comment.new(:person => @person2, :text => "balls", :post => @remote_message) - comment.creator_signature = comment.send(:sign_with_key,@person2.key) + comment.creator_signature = comment.send(:sign_with_key,@person2.encryption_key) comment.verify_creator_signature.should be true comment.valid?.should be false - comment.post_creator_signature = comment.send(:sign_with_key,@person.key) + comment.post_creator_signature = comment.send(:sign_with_key,@person.encryption_key) comment.verify_post_creator_signature.should be true comment.valid?.should be true end it 'should reject comments on a remote post with only a creator sig' do comment = Comment.new(:person => @person2, :text => "balls", :post => @remote_message) - comment.creator_signature = comment.send(:sign_with_key,@person2.key) + comment.creator_signature = comment.send(:sign_with_key,@person2.encryption_key) comment.verify_creator_signature.should be true comment.verify_post_creator_signature.should be false comment.save.should be false @@ -157,7 +157,7 @@ describe 'user encryption' do it 'should receive remote comments on a user post with a creator sig' do comment = Comment.new(:person => @person2, :text => "balls", :post => @message) - comment.creator_signature = comment.send(:sign_with_key,@person2.key) + comment.creator_signature = comment.send(:sign_with_key,@person2.encryption_key) comment.save.should be true end