Merge branch 'friend-refactor' of github.com:diaspora/diaspora_rails into friend-refactor
Conflicts: app/controllers/publics_controller.rb app/models/user.rb
This commit is contained in:
commit
d443be35f9
41 changed files with 464 additions and 227 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -5,5 +5,4 @@ class DashboardsController < ApplicationController
|
|||
def index
|
||||
@posts = Post.paginate :page => params[:page], :order => 'created_at DESC'
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -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 => "<p>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.</p> <p>also i can tell it won’t be long and also happy summer imaginary constructs -mumblelard</p>", :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 => "<p>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.</p> <p>also i can tell it won’t be long and also happy summer imaginary constructs -mumblelard</p>", :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
|
||||
|
||||
|
|
|
|||
44
app/controllers/groups_controller.rb
Normal file
44
app/controllers/groups_controller.rb
Normal file
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
12
app/models/group.rb
Normal file
12
app/models/group.rb
Normal file
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
6
app/views/groups/_new_group.haml
Normal file
6
app/views/groups/_new_group.haml
Normal file
|
|
@ -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'
|
||||
25
app/views/groups/edit.html.haml
Normal file
25
app/views/groups/edit.html.haml
Normal file
|
|
@ -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
|
||||
14
app/views/groups/new.html.haml
Normal file
14
app/views/groups/new.html.haml
Normal file
|
|
@ -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
|
||||
|
|
@ -7,7 +7,9 @@
|
|||
$(document).ready(function(){
|
||||
function debug(str){ $("#debug").append("<p>" + 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']);
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
13
app/views/shared/_group_nav.haml
Normal file
13
app/views/shared/_group_nav.haml
Normal file
|
|
@ -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
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
2
config/initializers/logging.rb
Normal file
2
config/initializers/logging.rb
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
Rails.logger = Logger.new(
|
||||
Rails.root.join("log",Rails.env + ".log"),3,5*1024*1024)
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ Diaspora::Application.routes.draw do |map|
|
|||
resources :requests
|
||||
resources :photos
|
||||
resources :albums
|
||||
resources :groups
|
||||
|
||||
match "/images/files/*path" => "gridfs#serve"
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
16
public/javascripts/group_nav.js
Normal file
16
public/javascripts/group_nav.js
Normal file
|
|
@ -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");});
|
||||
|
||||
});
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
32
spec/models/group_spec.rb
Normal file
32
spec/models/group_spec.rb
Normal file
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue