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:
maxwell 2010-08-09 17:31:46 -07:00
commit d443be35f9
41 changed files with 464 additions and 227 deletions

View file

@ -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

View file

@ -5,5 +5,4 @@ class DashboardsController < ApplicationController
def index
@posts = Post.paginate :page => params[:page], :order => 'created_at DESC'
end
end
end

View file

@ -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 wont 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 wont 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

View 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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
View 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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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.")

View file

@ -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

View file

@ -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"

View file

@ -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)

View 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'

View 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

View 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

View file

@ -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']);

View file

@ -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"

View file

@ -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

View 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

View file

@ -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"

View file

@ -0,0 +1,2 @@
Rails.logger = Logger.new(
Rails.root.join("log",Rails.env + ".log"),3,5*1024*1024)

View file

@ -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

View file

@ -8,6 +8,7 @@ Diaspora::Application.routes.draw do |map|
resources :requests
resources :photos
resources :albums
resources :groups
match "/images/files/*path" => "gridfs#serve"

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View 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");});
});

View file

@ -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

View file

@ -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; }

View file

@ -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

View file

@ -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

View file

@ -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 {

View file

@ -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
View 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

View file

@ -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