Merge branch 'master' of github.com:diaspora/diaspora

This commit is contained in:
ilya 2010-10-20 09:39:32 -07:00
commit 4d1ce410d7
47 changed files with 280 additions and 976 deletions

2
.gitignore vendored
View file

@ -13,7 +13,7 @@ public/stylesheets/ui.css
# Uploded files and local files
public/uploads/*
public/source.tar*
public/source.tar
tmp/**/*
db/*.sqlite3

View file

@ -1,7 +1,6 @@
source 'http://rubygems.org'
gem 'rails', '>= 3.0.0'
gem 'bundler', '>= 1.0.0'
#Security
@ -42,7 +41,6 @@ gem 'aws'
group :test, :development do
gem 'factory_girl_rails'
gem 'ruby-debug19' if RUBY_VERSION.include? "1.9"
gem 'ruby-debug' if RUBY_VERSION.include? "1.8"
end

View file

@ -9,7 +9,6 @@ class RegistrationsController < Devise::RegistrationsController
rescue MongoMapper::DocumentNotValid => e
flash[:error] = e.message
redirect_to new_user_registration_path
return
end
if user.save
flash[:notice] = I18n.t 'registrations.create.success'
@ -20,7 +19,7 @@ class RegistrationsController < Devise::RegistrationsController
end
end
def update
def update
super
end
end

View file

@ -5,11 +5,10 @@
class UsersController < ApplicationController
require File.join(Rails.root, 'lib/diaspora/ostatus_builder')
require File.join(Rails.root, 'lib/diaspora/exporter')
require File.join(Rails.root, 'lib/diaspora/importer')
require File.join(Rails.root, 'lib/collect_user_photos')
before_filter :authenticate_user!, :except => [:new, :create, :public, :import]
before_filter :authenticate_user!, :except => [:new, :create, :public]
respond_to :html
@ -79,31 +78,6 @@ class UsersController < ApplicationController
send_data( File.open(tar_path).read, :filename => "#{current_user.id}.tar" )
end
def invite
User.invite!(:email => params[:email])
end
def import
xml = params[:upload][:file].read
params[:user][:diaspora_handle] = 'asodij@asodij.asd'
begin
importer = Diaspora::Importer.new(Diaspora::Parsers::XML)
importer.execute(xml, params[:user])
flash[:notice] = "hang on a sec, try logging in!"
rescue Exception => e
flash[:error] = "Derp, something went wrong: #{e.message}"
end
redirect_to new_user_registration_path
#redirect_to user_session_path
end
private
def prep_image_url(params)
url = APP_CONFIG[:pod_url].dup

View file

@ -14,7 +14,6 @@ class Post
xml_accessor :_id
xml_accessor :person, :as => Person
xml_reader :public
xml_reader :created_at
key :public , Boolean, :default => false

View file

@ -19,8 +19,6 @@ class Profile
validates_presence_of :first_name, :last_name
before_save :strip_names
def person_id
self._parent_document.id
end
@ -29,9 +27,4 @@ class Profile
self._parent_document
end
private
def strip_names
first_name.strip!
last_name.strip!
end
end

View file

@ -56,7 +56,7 @@ class User
many :raw_visible_posts, :in => :visible_post_ids, :class_name => 'Post'
many :aspects, :class_name => 'Aspect'
#after_create :seed_aspects
after_create :seed_aspects
before_destroy :unfriend_everyone, :remove_person, :remove_all_aspects
@ -395,11 +395,7 @@ class User
opts[:serialized_private_key] = generate_key
opts[:person][:serialized_public_key] = opts[:serialized_private_key].public_key
u = User.new(opts)
u.seed_aspects
u.save!
u
User.create(opts)
end
def seed_aspects

View file

@ -2,14 +2,12 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
.span-12.last
.modal_title_bar
%h4= t('.add_a_new_album')
%h1=t('.add_a_new_album')
= form_for Album.new do |f|
= f.error_messages
%p
= f.label :name
= f.text_field :name
= f.hidden_field :to, :value => aspect
= f.submit t('.create'), :class => 'button'
= form_for Album.new do |f|
= f.error_messages
%p
= f.label :name
= f.text_field :name
= f.hidden_field :to, :value => aspect
= f.submit t('.create'), :class => 'button'

View file

@ -2,14 +2,10 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
.span-12.last
.modal_title_bar
%h4= t('.add_a_new_aspect')
= form_for Aspect.new do |aspect|
= aspect.error_messages
%p
= aspect.label :name
= aspect.text_field :name
= aspect.submit t('.create'), :class => 'button'
%h1=t('.add_a_new_aspect')
= form_for Aspect.new do |aspect|
= aspect.error_messages
%p
= aspect.label :name
= aspect.text_field :name
= aspect.submit t('.create'), :class => 'button'

View file

@ -1,18 +1,15 @@
.span-12.last
.modal_title_bar
%h4 Send invitation
%h2 Send invitation
= form_for User.new, :url => invitation_path(User) do |invite|
%p
= invite.label :email
= invite.text_field :email
To
- unless @aspect.is_a? Aspect
= invite.select(:aspects, @aspects_dropdown_array)
- else
= invite.select(:aspects, @aspects_dropdown_array, :selected => @aspect.id)
Message:
= invite.text_area :invite_messages
= form_for User.new, :url => invitation_path(User) do |invite|
%p
= invite.label :email
= invite.text_field :email
To
- unless @aspect.is_a? Aspect
= invite.select(:aspects, @aspects_dropdown_array)
- else
= invite.select(:aspects, @aspects_dropdown_array, :selected => @aspect.id)
Message:
= invite.text_area :invite_messages
%p= invite.submit "Send an invitation"
%p= invite.submit "Send an invitation"

View file

@ -62,5 +62,5 @@
.span-24.last
= yield
.span-19.prepend-5.last
.span-24.last
= render "posts/debug"

View file

@ -27,8 +27,7 @@
%br
%br
= render "albums/album", :post => post.album, :current_user => current_user
= link_to (image_tag post.url(:thumb_medium)), object_path(post)
= link_to (image_tag post.url(:thumb_large)), object_path(post)
.info
%span.time= link_to(how_long_ago(post), photo_path(post))

View file

@ -24,27 +24,3 @@
= pr.text_field :last_name
= f.submit t('.sign_up')
= render :partial => "devise/shared/links"
%br
%br
%h2 or, upload yourself
= form_tag '/users/import', :multipart => true do
%p
= label_tag 'user[email]'
= text_field_tag 'user[email]'
%p
= label_tag 'user[password]'
= password_field_tag 'user[password]'
%p
= label_tag 'user[password_confirmation]'
= password_field_tag 'user[password_confirmation]'
%label Select File
= file_field 'upload', 'file'
= submit_tag "Upload"

View file

@ -2,22 +2,20 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
.span-12.last
.modal_title_bar
%h4
=t('.add_a_new_friend_to')
%i= aspect.name
%h1
=t('.add_a_new_friend_to')
%i= aspect.name
= form_for Request.new do |fr_request|
= fr_request.error_messages
= form_for Request.new do |fr_request|
= fr_request.error_messages
=t('.enter_a_diaspora_username')
%br
%i= t '.your_diaspora_username_is', :diaspora_handle => current_user.diaspora_handle
=t('.enter_a_diaspora_username')
%br
%i= t '.your_diaspora_username_is', :diaspora_handle => current_user.diaspora_handle
%p
= fr_request.label :destination_url, t(".friends_username")
= fr_request.text_field :destination_url
= fr_request.hidden_field :aspect_id, :value => aspect.id
= fr_request.submit
%p
= fr_request.label :destination_url, t(".friends_username")
= fr_request.text_field :destination_url
= fr_request.hidden_field :aspect_id, :value => aspect.id
= fr_request.submit

View file

@ -1,18 +1,12 @@
-# Copyright (c) 2010, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
.span-12.last
.modal_title_bar
%h4 You are about to post a public message!
%p
Public messages will be available for others outside of Diaspora to see.
%br
%br
- if @logged_in
= connected_fb_as(@access_token)
- else
= link_to "Connect to Facebook", @fb_access_url
%br
%br
= link_to "OK", '#', :class => "button", :onClick => '$.fancybox.close();'
%h3 You are about to post a public message!
%p
Public messages will be available for others outside of Diaspora to see.
%br
%br
- if @logged_in
= connected_fb_as(@access_token)
- else
= link_to "Connect to Facebook", @fb_access_url
%br
%br
= link_to "OK", '#', :class => "button", :onClick => '$.fancybox.close();'

View file

@ -2,6 +2,16 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
:javascript
$(".reshare_button").toggle(function(e){
e.preventDefault();
$(this).parent(".reshare_pane").children(".reshare_box").fadeIn(200);
}, function(e) {
e.preventDefault();
$(this).parent(".reshare_pane").children(".reshare_box").fadeOut(200);
});
- unless current_user.aspects.size == current_user.aspects_with_post(post.id).size
.reshare_pane
%span.reshare_button

View file

@ -2,14 +2,22 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
%h1
= link_to @status_message.person.real_name, @status_message.person
= @status_message.message
.span-14.append-1.last
#stream
%h1.show_text
= person_image_link(@status_message.person)
= link_to @status_message.person.real_name, @status_message.person
= make_links(@status_message.message)
%h4= "#{t('.comments')} (#{@status_message.comments.count})"
= "Posted #{how_long_ago(@status_message)} to"
- for aspect in current_user.aspects_with_post( @status_message.id )
= link_to aspect.name, aspect
= render "comments/comments", :post => @status_message
%p
- if current_user.owns? @status_message
= link_to t('.destroy'), @status_message, :confirm => t('are_you_sure?'), :method => :delete
%p
= link_to t('.destroy'), @status_message, :confirm => t('.are_you_sure'), :method => :delete
.span-9.last
#stream.show
%li.message{:id => @status_message.id}
= render "comments/comments", :post => @status_message

View file

@ -7,6 +7,7 @@ default:
debug: false
socket_debug : false
socket_host: 0.0.0.0
socket_pidfile: log/diaspora-wsd.pid
socket_port: 8080
socket_collection_name: 'websocket'
pubsub_server: 'https://pubsubhubbub.appspot.com/'

View file

@ -16,7 +16,6 @@ Diaspora::Application.routes.draw do
# added public route to user
match 'public/:username', :to => 'users#public'
match 'users/export', :to => 'users#export'
match 'users/import', :to => 'users#import'
match 'users/export_photos', :to => 'users#export_photos'
resources :users, :except => [:create, :new, :show]

View file

@ -14,51 +14,36 @@ module Diaspora
module XML
def execute(user)
builder = Nokogiri::XML::Builder.new do |xml|
user_person_id = user.person.id
xml.export {
xml.user {
xml.username user.username
xml.serialized_private_key user.serialized_private_key
xml.parent << user.person.to_xml
}
xml.user {
xml.username user.username
xml.parent << user.person.to_xml
xml.serialized_private_key user.serialized_private_key
xml.aspects {
user.aspects.each do |aspect|
xml.aspect {
xml.id_ aspect.id
xml.name aspect.name
xml.person_ids {
aspect.person_ids.each do |id|
xml.person_id id
xml.people {
aspect.people.each do |person|
xml.person person.to_xml
end
}
xml.posts {
aspect.posts.find_all_by_person_id(user.person.id).each do |post|
post_doc = post.to_xml
post.comments.each do |comment|
post_doc << comment.to_xml
end
xml.post_ids {
aspect.posts.find_all_by_person_id(user_person_id).each do |post|
xml.post_id post.id
xml.post post_doc
end
}
}
end
}
xml.people {
user.friends.each do |friend|
xml.parent << friend.to_xml
end
}
xml.posts {
user.raw_visible_posts.find_all_by_person_id(user_person_id).each do |post|
#post_doc = post.to_xml
#post.comments.each do |comment|
# post_doc << comment.to_xml
#end
xml.parent << post.to_xml
end
}
}
end

View file

@ -1,179 +0,0 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
module Diaspora
class Importer
def initialize(strategy)
self.class.send(:include, strategy)
end
def commit(user, person, aspects, people, posts, opts = {})
filter = verify_and_clean(user, person, people, aspects, posts)
#assume data is good
# to go
user.email = opts[:email]
user.password= opts[:password]
user.password_confirmation = opts[:pasword_confirmation]
user.person = person
user.person.diaspora_handle = opts[:diaspora_handle]
user.visible_post_ids = filter[:whitelist].keys
user.friend_ids = people.collect{ |x| x.id }
user.visible_person_ids = user.friend_ids
user.save!
user.person.save!
posts.each do |post|
post.save! if filter[:unknown].include? post.id
end
aspects.each do |aspect|
user.aspects << aspect
end
people.each do |p|
p.save! if filter[:people].include? p.id.to_s
end
end
### verification (to be module) ################
def verify_and_clean(user, person, people, aspects, posts)
verify_user(user)
verify_person_for_user(user, person)
filters = filter_posts(posts, person)
clean_aspects(aspects, filters[:whitelist])
filters[:people] = filter_people(people)
filters
end
def verify_user(user)
User.find_by_id(user.id).nil? ? true : raise("User already exists!")
end
def verify_person_for_user(user, person)
local_person = Person.find_by_id(person.id)
if local_person
unless user.encryption_key.public_key.to_s == local_person.public_key.to_s
raise "local person found with different owner"
end
end
true
end
def filter_people(people)
person_ids = people.collect{|x| x.id}
people_from_db = Person.find_all_by_id(person_ids) #this query should be limited to only return person_id
person_ids = person_ids - people_from_db.collect{ |x| x.id }
person_hash = {}
person_ids.each{|x| person_hash[x.to_s] = true }
person_hash
end
def filter_posts(posts, person)
post_ids = posts.collect{|x| x.id}
posts_from_db = Post.find_all_by_id(post_ids) #this query should be limited to only return post id and owner id
unknown_posts = post_ids - posts_from_db.collect{|x| x.id}
posts_from_db.delete_if{|x| x.person_id == person.id}
unauthorized_post_ids = posts_from_db.collect{|x| x.id}
post_whitelist = post_ids - unauthorized_post_ids
unknown = {}
unknown_posts.each{|x| unknown[x.to_s] = true }
whitelist = {}
post_whitelist.each{|x| whitelist[x.to_s] = true }
return {
:unknown => unknown,
:whitelist => whitelist }
end
def clean_aspects(aspects, whitelist)
aspects.each do |aspect|
aspect.post_ids.delete_if{ |x| !whitelist.include? x.to_s }
end
end
end
module Parsers
module XML
def execute(xml, opts = {})
doc = Nokogiri::XML.parse(xml)
user, person = parse_user_and_person(doc)
aspects = parse_aspects(doc)
people = parse_people(doc)
posts = parse_posts(doc)
user
commit(user, person, aspects, people, posts, opts)
end
def parse_user_and_person(doc)
user = User.new
user_doc = doc.xpath('/export/user')
user.username = user_doc.xpath('//user/username').text
user.serialized_private_key= user_doc.xpath('//user/serialized_private_key').text
person = Person.from_xml(user_doc.xpath('//user/person').to_s)
[user, person]
end
def parse_aspects(doc)
aspects = []
aspect_doc = doc.xpath('/export/aspects/aspect')
aspect_doc.each do |x|
a = Nokogiri::XML.parse(x.to_s)
aspect = Aspect.new
aspect.name = a.xpath('/aspect/name').text
aspect.post_ids = a.xpath('/aspect/post_ids/post_id').collect{ |x| x.text.to_id }
aspect.person_ids = a.xpath('/aspect/person_ids/person_id').collect{ |x| x.text.to_id }
aspects << aspect
end
aspects
end
def parse_people(doc)
people_doc = doc.xpath('/export/people/person')
people_doc.inject([]) do |people,curr|
people << Person.from_xml(curr.to_s)
end
end
def parse_posts(doc)
post_doc = doc.xpath('/export/posts/status_message')
post_doc.inject([]) do |posts,curr|
posts << StatusMessage.from_xml(curr.to_s)
end
end
end
end
end

View file

@ -17,17 +17,23 @@ module Diaspora
sender_in_xml = sender(object, xml)
if (salmon_author == sender_in_xml)
if object.is_a? Retraction
receive_retraction object, xml
elsif object.is_a? Request
if object.is_a? Request
receive_request object, sender_in_xml
elsif object.is_a? Profile
receive_profile object, xml
elsif object.is_a?(Comment)
receive_comment object, xml
elsif self.friend_ids.include? salmon_author.id
if object.is_a? Retraction
receive_retraction object, xml
elsif object.is_a? Profile
receive_profile object, xml
elsif object.is_a?(Comment)
receive_comment object, xml
else
receive_post object, xml
end
else
receive_post object, xml
raise "Not friends with that person"
end
else
raise "Malicious Post, #{salmon_author.real_name} with id #{salmon_author.id} is sending a #{object.class} as #{sender_in_xml.real_name} with id #{sender_in_xml.id} "
end

View file

@ -12,11 +12,11 @@ aimed for packaging purposes.
Prerequisites:
- ruby-1.8, rubygem, git and rake as described in
http://github.com/diaspora/diaspora/wiki/Rpm-installation-on-fedora
or http://github.com/diaspora/diaspora/wiki/Installing-on-CentOS-Fedora
[RPM installation Fedora](http://github.com/diaspora/diaspora/wiki/Rpm-installation-on-fedora)
or [Installing-on-CentOS-Fedora](http://github.com/diaspora/diaspora/wiki/Installing-on-CentOS-Fedora)
- A personal environment to build RPM:s, also described in
http://github.com/diaspora/diaspora/wiki/Rpm-installation-on-fedora
[RPM installation Fedora](http://github.com/diaspora/diaspora/wiki/Rpm-installation-on-fedora)
Install g++ (possibly unnnecessary?):
% yum install gcc-c++
@ -46,7 +46,7 @@ Start development server:
cd /usr/share/diaspora/master
./script/server
See http://github.com/diaspora/diaspora/wiki/Using-apache for
See [Using Apache](http://github.com/diaspora/diaspora/wiki/Using-apache) for
apache/passenger setup. After configuration, start with:
/sbin/service diaspora-wsd start
/sbin/service httpd restart
@ -120,7 +120,8 @@ directory, copy-paste previous version nr. It will be updated.
This has been confirmed to start up and provide basic functionality both using
the thin webserver and apache passenger, on 32/64 bit systems and in the
mock build environment.
mock build environment. Irregular nightly builds are available form time to time
at [ftp://mumin.dnsalias.net/pub/leamas/diaspora/builds](ftp://mumin.dnsalias.net/pub/leamas/diaspora/builds)
#### Implementation

View file

@ -39,18 +39,20 @@ else
exit 1
fi
# %attr(0777, diaspora, diaspora) doesn't work in specfile due to umask 022.
chmod 777 /var/lib/diaspora/uploads
chown -R diaspora /var/log/diaspora
sed -i '/socket_pidfile:/s|:.*|: /var/run/diaspora/diaspora-wsd.pid|' \
config/app_config.yml
hostname=$( awk '/pod_url:/ { print $2; exit }' <config/app_config.yml)
if [ -n "$arg_hostname" ]; then
sed -i "/pod_url:/s|$hostname|$arg_hostname|g" config/app_config.yml &&
sed -i "/pod_url:/s/$hostname/$arg_hostname/g" config/app_config.yml &&
echo "config/app_config.yml updated."
exit 0
fi
hostname=$( awk '/pod_url:/ { print $2; exit }' <config/app_config.yml)
while : ; do
echo "Current hostname is \"$hostname\""
echo -n "Enter new hostname [$hostname] :"
@ -58,7 +60,7 @@ while : ; do
echo -n "Use hostname \"$new_hostname\" as pod_url (Yes/No) [Yes]? :"
read yesno garbage
test "${yesno:0:1}" = 'y' -o "${yesno:0:1}" = 'Y' -o -z "$yesno" && {
sed -i "/pod_url:/s|$hostname|$new_hostname|g" config/app_config.yml &&
sed -i "/pod_url:/s/$hostname/$new_hostname/g" config/app_config.yml &&
echo "config/app_config.yml updated."
break
}

View file

@ -33,9 +33,9 @@ cd /usr/share/diaspora
RETVAL=0
prog="Diaspora websocket server"
exec="script/websocket_server.rb"
pidfile="/var/run/diaspora-wsd"
pidfile="/var/run/diaspora/diaspora-wsd"
lockfile="/var/lock/subsys/diaspora-wsd"
logfile=/var/log/diaspora-wsd.log
logfile="/var/log/diaspora/diaspora-wsd.log"
[ -n "$OPTIONS" ] && OPTIONS=" $OPTIONS"
ruby_cmd="ruby -C $PWD $exec$OPTIONS"

View file

@ -77,6 +77,7 @@ mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/lib/diaspora/tmp
cp %SOURCE2 $RPM_BUILD_ROOT/%{_datadir}/diaspora
mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/log/diaspora
mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/run/diaspora
mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/lib/diaspora/uploads
mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/lib/diaspora/tmp
@ -94,6 +95,8 @@ find -L $RPM_BUILD_ROOT/%{_datadir}/diaspora -type f \
cat files >> dirs && mv -f dirs files
sed -i -e '\|.*/master/config.ru"$|d' \
-e '\|.*/master/config/environment.rb"$|d' \
-e '\|.*/run/diaspora"$|d' \
-e '\|.*/pkg/fedora/dist"$|d' \
-e 's|%{buildroot}||' -e 's|//|/|' -e '/""/d' \
files
@ -101,6 +104,7 @@ sed -i -e '\|.*/master/config.ru"$|d' \
%post wsd
/sbin/chkconfig --add diaspora-wsd || :
%preun wsd
if [ $1 -eq 0 ] ; then
service diaspora-wsd stop &>/dev/null || :
@ -117,9 +121,11 @@ rm -fr $RPM_BUILD_ROOT
%doc AUTHORS README.md GNU-AGPL-3.0 COPYRIGHT README-Fedora.md
%attr(-, diaspora, diaspora) %{_datadir}/diaspora/master/config.ru
%attr(-, diaspora, diaspora) %{_datadir}/diaspora/master/config/environment.rb
%attr(-, diaspora, diaspora) %{_datadir}/diaspora/master/pkg/fedora/dist
%attr(-, diaspora, diaspora) %{_localstatedir}/log/diaspora
%attr(-, diaspora, diaspora) %{_localstatedir}/lib/diaspora/uploads
%attr(-, diaspora, diaspora) %{_localstatedir}/lib/diaspora/tmp
%attr(-, diaspora, diaspora) %{_localstatedir}/run/diaspora
%{_datadir}/diaspora/master/tmp
%{_datadir}/diaspora/master/public/uploads

0
pkg/fedora/dist/.gitkeep vendored Normal file
View file

View file

@ -126,8 +126,7 @@ function checkout()
git clone --quiet $GIT_REPO;
(
cd diaspora;
git remote add upstream \
git://github.com/diaspora/diaspora.git
git remote add upstream $GIT_REPO
for p in ../../*.patch; do
git apply --whitespace=fix $p > /dev/null
done &> /dev/null || :
@ -181,7 +180,6 @@ function make_bundle()
# Usage: make_bundle [ commit, defaults to HEAD]
#
{
set -x
checkout ${1:-'HEAD'} >/dev/null
bundle_id=$( git_id dist/diaspora/Gemfile)
bundle_name="diaspora-bundle-$VERSION-$bundle_id"

View file

@ -5,6 +5,7 @@ work as a first step towards packaging, but should be usable as is.
### Synopsis
Bootstrap the distribution from git:
% sudo apt-get install git-core
% git clone git://github.com/diaspora/diaspora.git
@ -79,19 +80,11 @@ dependencies lives in the application - nothing is installed by user or
on system level.
This has been tested on a Ubuntu 32-bit 10.10 , clean server and on 10.04
Lucid desktop, also clean installation.
Lucid desktop, also clean installation. Irregular nightly builds are
available from time to time at
[ftp://mumin.dnsalias.net/pub/leamas/diaspora/builds](ftp://mumin.dnsalias.net/pub/leamas/diaspora/builds)
mongodb is having problems occasionally. Sometimes the dependencies are not
installed, and mongod refuses to start. invoke */usr/bin/mongod -f
/etc/mongodb.conf* to test. The lockfile /var/lib/mongodb/mongod.conf is
also a potential problem. Remove to make it start again.
The diaspora-wsd is just placeholder FTM, it does **not** work.

View file

@ -30,7 +30,7 @@ sed -i '/BUNDLE_PATH/s|:.*|: /usr/lib/diaspora-bundle/bundle|' \
cp master/GNU-AGPL-3.0 master/COPYRIGHT master/README.md master/AUTHORS .
cp master/config/app_config.yml.example ./app_config.yml
cp master/pkg/ubuntu/diaspora-wsd /etc/init.d
cp master/pkg/ubuntu/diaspora-wsd.conf /etc/init
sed -i '/^cd /s|.*|cd /usr/share/diaspora/master|' /etc/init.d/diaspora-wsd
@ -41,8 +41,8 @@ cp master/pkg/ubuntu/diaspora-setup .
mkdir -p /var/log/diaspora
mkdir -p /var/lib/diaspora/uploads
mkdir -p /var/lib/diaspora/tmp
mkdir -p /var/run/diaspora
mkdir -p /etc/diaspora
mkdir -p /usr/share/diaspora/master/pkg/ubuntu/dist
ln -sf /var/log/diaspora ./master/log
cp master/config/app_config.yml.example /etc/diaspora/app_config.yml
@ -65,5 +65,6 @@ chown diaspora:diaspora /var/log/diaspora
chown diaspora:diaspora /var/lib/diaspora/uploads
chown diaspora:diaspora /var/lib/diaspora/tmp
chown diaspora:diaspora /var/lib/diaspora
chown diaspora:diaspora /var/run/diaspora
chown diaspora:diaspora /usr/share/diaspora/master/pkg/ubuntu/dist

View file

@ -43,9 +43,11 @@ else
exit 1
fi
chmod 777 /var/lib/diaspora/uploads
chown -R diaspora /var/log/diaspora
sed -i '/socket_pidfile:/s|:.*|: /var/run/diaspora/diaspora-wsd.pid|' \
config/app_config.yml
hostname=$( awk '/pod_url:/ { print $2; exit }' <config/app_config.yml)
if [ -n "$arg_hostname" ]; then
@ -61,7 +63,7 @@ while : ; do
echo -n "Use hostname \"$new_hostname\" as pod_url (Yes/No) [Yes]? :"
read yesno garbage
test "${yesno:0:1}" = 'y' -o "${yesno:0:1}" = 'Y' -o -z "$yesno" && {
sed -i "/pod_url:/s|$hostname|$new_hostname|g" config/app_config.yml &&
sed -i "/pod_url:/s/$hostname/$new_hostname/g" config/app_config.yml &&
echo "config/app_config.yml updated."
break
}

View file

@ -1,102 +0,0 @@
#!/bin/bash
#
# /etc/rc.d/init.d/diaspora-wsd
#
# SHOULD start the diaspora websocket daemon, but it doesn't. No way.
#
# chkconfig: - 80 80
# description: Diaspora websocket daemon
### BEGIN INIT INFO
# Provides: diaspora-wsd
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Should-Start: $remote_fs
# Should-Stop: $remote_fs
# Default-Start:
# Default-Stop: 0 1 2 3 4 5 6
# Short-Description: start and stop Diaspora websocket server
# Description: The websocket server provides websocket services for
# diaspora.
### END INIT INFO
# Source function library.
. /etc/init.d/functions
if [ -f /etc/sysconfig/diaspora-wsd -a $UID -eq 0 ]; then
. /etc/sysconfig/diaspora-wsd
fi
# Note: this line is patched by installation scripts.
cd /usr/share/diaspora
RETVAL=0
prog="Diaspora websocket server"
exec="script/websocket_server.rb"
pidfile="/var/run/diaspora-wsd"
lockfile="/var/lock/subsys/diaspora-wsd"
logfile=/var/log/diaspora-wsd.log
[ -n "$OPTIONS" ] && OPTIONS=" $OPTIONS"
ruby_cmd="ruby -C $PWD $exec$OPTIONS"
start() {
[ $UID -eq 0 ] || exit 4
[ -f $exec ] || exit 5
echo -n $"Starting $prog: "
daemon --pidfile $pidfile "$ruby_cmd >>$logfile 2>&1 &"
RETVAL=$?
echo
if test $RETVAL = 0; then
touch $lockfile
pgrep -f "$ruby_cmd" > $pidfile || {
echo "Warning: cannot find running diaspora-webserver"
exit 7
}
fi
}
stop() {
[ $UID -eq 0 ] || exit 4
echo -n $"Stopping $prog: "
killproc -p $pidfile $exec
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f $lockfile
echo
}
#
# See how we were called.
#
case "$1" in
start)
start
;;
stop)
stop
;;
force-reload|restart)
stop
sleep 1
start
RETVAL=$?
;;
condrestart|try-restart)
if [ -f $lockfile ]; then
stop
sleep 3
start
fi
;;
status)
status -p $pidfile $exec
RETVAL=$?
;;
*)
echo $"Usage: $0 {condrestart|try-restart|start|stop|restart|force-reload|status}"
RETVAL=2
[ "$1" = 'usage' ] && RETVAL=0
esac
exit $RETVAL

View file

@ -0,0 +1,19 @@
# Ubuntu upstart file at /etc/init/diaspora-wsd.conf
start on runlevel [5]
stop on runlevel [06]
export fork
script
if [ -f /etc/default/diaspora ]; then
. /etc/default/diaspora;
fi;
cd /usr/share/diaspora/master;
start-stop-daemon --start \
--chuid diaspora:diaspora \
--chdir $PWD \
--exec "/usr/local/bin/bundle" \
-- exec ruby -C $PWD script/websocket_server.rb;
end script

0
pkg/ubuntu/dist/.gitkeep vendored Normal file
View file

View file

@ -29,7 +29,7 @@ $(".show_post_comments").live('click', function(event) {
$(this).toggleClass( "visible" );
});
$(".comment_box").toggle(function(evt){
$(".comment_box").live('focus', function(evt){
var $this = $(this);
$this.attr("rows", 2);
$this.parents("p").parents("form").children("p").children(".comment_submit").fadeIn(200);
@ -47,10 +47,3 @@ $(".comment_submit").live('click', function(evt){
$(this).closest("form").children("p .comment_box").attr("rows", 1);
});
$(".reshare_button").live("click", function(e){
e.preventDefault();
var button = $(this);
button.parent(".reshare_pane").children(".reshare_box").show();
button.addClass("active");
});

View file

@ -53,21 +53,6 @@ $(document).ready(function(){
}
});
$("#user_menu").click( function(){
$(this).toggleClass("active");
});
$('body').click( function(event){
if(!$(event.target).closest('#user_menu').length){
$("#user_menu").removeClass("active");
};
if(!$(event.target).closest('.reshare_box').length){
$(".reshare_button").removeClass("active");
$(".reshare_box").hide();
};
});
});//end document ready

View file

@ -22,7 +22,7 @@ a
:color #22AAE0
&:active
:color #005D9C
h1, h2, h3, h4
:color #444
@ -48,14 +48,14 @@ h3
:width 100%
:padding 1em
:box-shadow 0 1px 2px #333
:-moz-box-shadow 0 1px 2px #333
:-webkit-box-shadow 0 1px 2px #333
:font
:weight bold
#flash_notice
:background
:color rgba(127,255,36,0.85)
@ -128,9 +128,9 @@ header
a
:text-shadow 0 1px 0 #000
:width 100px
:z-index 10
:font
:size 14px
:padding 5px 10px
:left 40px
:margin 0
@ -152,7 +152,11 @@ header
a
:display block
&.active
&:hover
li
:display block
&:hover
:margin
:top -3px
:right -6px
@ -164,14 +168,11 @@ header
:-webkit-box-shadow 0 1px 2px #333
:-moz-box-shadow 0 1px 2px #333
li
:display block
.avatar
:height 20px
:width 20px
:position absolute
:left 5px
:left 5px
:display block
@ -179,14 +180,13 @@ header
:margin
:left 425px
ul#stream
#stream
:margin 0
:padding 0
> li
:min-height 50px
:list-style none
:padding 12px 0
:right 12px
:border
:bottom 1px solid #eee
@ -275,7 +275,7 @@ li.message
:weight bold
:margin
:right 5px
&:hover
div.info, .time
a
@ -293,16 +293,6 @@ li.message
:decoration none
:cursor default
.right .reshare_pane .reshare_button
:padding 5px
&.active
:background
:color #333
:border-radius 5px 5px 0 0
a
:color #fff
:text-shadow none
.right .reshare_pane
:margin
:left 5px
@ -310,14 +300,13 @@ li.message
:display inline
:position relative
ul.reshare_box
:width 150px
:display none
:z-index 10
:position absolute
:margin
:top 0
:top 5px
:padding 0
:background
@ -326,7 +315,9 @@ li.message
:list
:style none
:border 5px solid #333
:border 5px solid #666
:-webkit-box-shadow 0 0 5px #666
:-moz-box-shadow 0 0 5px #666
:text-shadow 0 2px #fff
:color #000
@ -349,7 +340,6 @@ li.message
:display block
:height 100%
:padding 2px 5px
:cursor default
&:hover
:background
@ -404,6 +394,20 @@ form
:margin
:right 1em
#stream.show
div.comments
:display block
ul.comment_set
:margin
:top 0
> li
:border none
:padding 0
&:hover
> li
:background none
:border none
#stream div.comments
:display none
@ -794,8 +798,8 @@ h1.big_text
:margin 0
a
:-webkit-border-radius 5px 5px 0 0
:-moz-border-radius 5px 5px 0 0
:-webkit-border-radius 5px 5px 0 0
:-moz-border-radius 5px 5px 0 0
:text-shadow 0 1px 0 #444
:line
@ -923,7 +927,7 @@ h1.big_text
:color #333
:border-radius 5px
a
:color #ccc
@ -1066,3 +1070,7 @@ header
:font
:size small
.show_text
img
:height 27px
:width 27px

View file

@ -5,6 +5,26 @@
require File.dirname(__FILE__) + '/../config/environment'
require File.dirname(__FILE__) + '/../lib/diaspora/websocket'
at_exit do
begin
File.delete(PID_FILE)
rescue
puts 'Cannot remove pidfile: ' + (PID_FILE ? PID_FILE : "NIL")
end
end
def write_pidfile
begin
f = File.open(PID_FILE, "w")
f.write(Process.pid)
f.close
rescue => e
puts "Can't write to pidfile!"
puts e.inspect
puts e.backtrace
end
end
CHANNEL = Magent::GenericChannel.new('websocket')
def process_message
if CHANNEL.queue_count > 0
@ -37,6 +57,8 @@ begin
}
end
PID_FILE = APP_CONFIG[:socket_pidfile]
write_pidfile
puts "Websocket server started."
process_message
}

View file

@ -8,7 +8,8 @@ describe PublicsController do
render_views
let(:user) {Factory.create :user}
let(:user2){Factory.create :user}
let(:aspect1){user.aspect(:name => "foo")}
let(:aspect2){user2.aspect(:name => "far")}
before do
sign_in :user, user
end
@ -21,7 +22,8 @@ describe PublicsController do
it 'should accept a post from another node and save the information' do
message = user2.build_post(:status_message, :message => "hi")
friend_users(user, aspect1, user2, aspect2)
user.reload
user.visible_post_ids.include?(message.id).should be false

View file

@ -12,6 +12,8 @@ describe Diaspora::Parser do
@user3 = Factory.create :user
@person = @user3.person
@user2 = Factory.create(:user)
@aspect2 = @user2.aspect(:name => "pandas")
friend_users(@user, @aspect, @user2, @aspect2)
end
describe "parsing compliant XML object" do
@ -49,7 +51,7 @@ describe Diaspora::Parser do
end
it 'should marshal retractions' do
person = Factory.create(:person)
person = @user2.person
message = Factory.create(:status_message, :person => person)
retraction = Retraction.for(message)
xml = retraction.to_diaspora_xml
@ -97,17 +99,17 @@ describe Diaspora::Parser do
end
it "should activate the Person if I initiated a request to that url" do
request = @user.send_friend_request_to( @user2.person, @aspect)
request = @user.send_friend_request_to( @user3.person, @aspect)
@user.reload
request.reverse_for @user2
request.reverse_for @user3
xml = request.to_diaspora_xml
@user2.person.destroy
@user2.destroy
@user3.person.destroy
@user3.destroy
@user.receive xml, @user2.person
new_person = Person.first(:url => @user2.person.url)
@user.receive xml, @user3.person
new_person = Person.first(:url => @user3.person.url)
new_person.nil?.should be false
@user.reload
@ -117,18 +119,20 @@ describe Diaspora::Parser do
end
it 'should process retraction for a person' do
user4 = Factory(:user)
person_count = Person.all.count
request = @user.send_friend_request_to( @user2.person, @aspect)
request = @user.send_friend_request_to( user4.person, @aspect)
@user.reload
request.reverse_for @user2
request.reverse_for user4
xml = request.to_diaspora_xml
retraction = Retraction.for(@user2)
retraction = Retraction.for(user4)
retraction_xml = retraction.to_diaspora_xml
@user2.person.destroy
@user2.destroy
@user.receive xml, @user2.person
user4.person.destroy
user4.destroy
@user.receive xml, user4.person
@aspect.reload
@ -136,7 +140,7 @@ describe Diaspora::Parser do
#They are now friends
Person.count.should == person_count
@user.receive retraction_xml, @user2.person
@user.receive retraction_xml, user4.person
@aspect.reload
@ -145,7 +149,7 @@ describe Diaspora::Parser do
it 'should marshal a profile for a person' do
#Create person
person = Factory.create(:person)
person = @user2.person
id = person.id
person.profile = Profile.new(:first_name => 'bob', :last_name => 'billytown', :image_url => "http://clown.com")
person.save

View file

@ -9,57 +9,25 @@ describe Diaspora::Exporter do
let!(:user1) { Factory(:user) }
let!(:user2) { Factory(:user) }
let!(:user3) { Factory(:user) }
let(:aspect1) { user1.aspect(:name => "Work") }
let(:aspect2) { user2.aspect(:name => "Family") }
let(:aspect3) { user3.aspect(:name => "Pivots") }
let!(:status_message1) { user1.post(:status_message, :message => "One", :public => true, :to => aspect1.id) }
let!(:status_message2) { user1.post(:status_message, :message => "Two", :public => true, :to => aspect1.id) }
let!(:status_message3) { user2.post(:status_message, :message => "Three", :public => false, :to => aspect2.id) }
let(:exported) { Diaspora::Exporter.new(Diaspora::Exporters::XML).execute(user1) }
let!(:exported) { Diaspora::Exporter.new(Diaspora::Exporters::XML).execute(user1) }
it 'should include a users posts' do
exported.should include status_message1.message
exported.should include status_message2.message
exported.should_not include status_message3.message
exported.should include status_message1.to_xml.to_s
exported.should include status_message2.to_xml.to_s
exported.should_not include status_message3.to_xml.to_s
end
it 'should include a users private key' do
exported.should include user1.serialized_private_key
end
it 'should include post_ids' do
doc = Nokogiri::XML::parse(exported)
doc.xpath('//aspects').to_s.should include status_message1.id.to_s
doc.xpath('//aspects').to_s.should include status_message2.id.to_s
doc.xpath('//posts').to_s.should include status_message1.id.to_s
end
it 'should include post created at time' do
doc = Nokogiri::XML::parse(exported)
Time.parse(doc.xpath('//posts/status_message/created_at').first.text).should == status_message1.created_at
end
it 'should include a list of users posts' do
doc = Nokogiri::XML::parse(exported)
posts = doc.xpath('//posts').to_s
posts.should include(status_message1.message)
end
it 'should serialize a users friends' do
friend_users(user1, aspect1, user3, aspect3)
doc = Nokogiri::XML::parse(exported)
doc.xpath('/export/people').to_s.should include user3.person.id.to_s
end
it 'should serialize only a users posts within his aspects' do
message = Factory(:status_message, :message => "Shouldn't be here", :person => user3.person)
aspect1.posts << message
doc = Nokogiri::XML::parse(exported)
doc.xpath('/export/aspects').to_s.should_not include message.message
end
end

View file

@ -1,234 +0,0 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
require 'spec_helper'
require File.join(Rails.root, 'lib/diaspora/exporter')
require File.join(Rails.root, 'lib/diaspora/importer')
describe Diaspora::Importer do
before(:each) do
# Five users on pod
@user1 = Factory(:user)
@user2 = Factory(:user)
@user3 = Factory(:user)
@user4 = Factory(:user)
@user5 = Factory(:user)
# Two external people referenced on pod
@person1 = Factory(:person)
@person2 = Factory(:person)
# User1 has four aspects(1-4), each following user has one aspect
@aspect1 = @user1.aspect(:name => "Dudes")
@aspect2 = @user1.aspect(:name => "Girls")
@aspect3 = @user1.aspect(:name => "Bros")
@aspect4 = @user1.aspect(:name => "People")
@aspect5 = @user2.aspect(:name => "Abe Lincolns")
@aspect6 = @user3.aspect(:name => "Cats")
@aspect7 = @user4.aspect(:name => "Dogs")
@aspect8 = @user5.aspect(:name => "Hamsters")
@aspect9 = @user5.aspect(:name => "Gophers")
@aspect10 = @user1.aspect(:name => "Work")
@aspect11 = @user1.aspect(:name => "Family")
# User1 posts one status messages to aspects (1-4), two other users post message to one aspect
@status_message1 = @user1.post(:status_message, :message => "One", :public => false, :to => @aspect1.id)
@status_message2 = @user1.post(:status_message, :message => "Two", :public => false, :to => @aspect2.id)
@status_message3 = @user1.post(:status_message, :message => "Three", :public => false, :to => @aspect3.id)
@status_message4 = @user1.post(:status_message, :message => "Four", :public => false, :to => @aspect4.id)
@status_message5 = @user2.post(:status_message, :message => "Five", :public => false, :to => @aspect5.id)
@status_message6 = @user3.post(:status_message, :message => "Six", :public => false, :to => @aspect6.id)
@status_message7 = @user5.post(:status_message, :message => "Seven", :public => false, :to => @aspect9.id)
@aspect1.posts << @status_message1
@aspect2.posts << @status_message2
@aspect3.posts << @status_message3
@aspect4.posts << @status_message4
# Friend users with user1
friend_users( @user1, @aspect1, @user2, @aspect5 )
friend_users( @user1, @aspect2, @user3, @aspect6 )
friend_users( @user1, @aspect3, @user4, @aspect7 )
friend_users( @user1, @aspect4, @user5, @aspect8 )
# Friend users 4 and 5
friend_users( @user5, @aspect9, @user4, @aspect7 )
# Generate status messages and receive for user1
@user2.receive @status_message1.to_diaspora_xml, @user1.person
@user3.receive @status_message2.to_diaspora_xml, @user1.person
@user4.receive @status_message3.to_diaspora_xml, @user1.person
@user5.receive @status_message4.to_diaspora_xml, @user1.person
@user1.receive @status_message5.to_diaspora_xml, @user2.person
@user1.receive @status_message6.to_diaspora_xml, @user3.person
# Generate status message and recieve between user4 and user5
@user4.receive @status_message7.to_diaspora_xml, @user5.person
end
it 'should gut check this test' do
@user1.friends.count.should be 4
@user1.friends.should include @user2.person
@user1.friends.should include @user3.person
@user1.friends.should include @user4.person
@user1.friends.should include @user5.person
# User is generated with two pre-populated aspects
@user1.aspects.count.should be 6
@user1.aspects.find_by_name("Dudes").people.should include @user2.person
@user1.aspects.find_by_name("Dudes").posts.should include @status_message5
@user1.raw_visible_posts.count.should be 6
@user1.raw_visible_posts.find_all_by_person_id(@user1.person.id).count.should be 4
@user1.raw_visible_posts.find_all_by_person_id(@user1.person.id).should_not include @status_message7
end
context 'parsing a user' do
before(:each) do
# Generate exported XML for user1
exporter = Diaspora::Exporter.new(Diaspora::Exporters::XML)
@user1.aspects.reload
@xml = exporter.execute(@user1)
@old_user = @user1
# Remove user1 from the server
@user1.aspects.each( &:delete )
@user1.raw_visible_posts.find_all_by_person_id(@user1.person.id).each( &:delete )
@user1.delete
@importer = Diaspora::Importer.new(Diaspora::Parsers::XML)
@doc = Nokogiri::XML::parse(@xml)
end
describe '#parse_user_and_person' do
before(:each) do
@user, @person = @importer.parse_user_and_person(@doc)
end
it 'should set username' do
@user.username.should == @old_user.username
end
it 'should set private key' do
@user.serialized_private_key.should_not be nil
@user.serialized_private_key.should == @old_user.serialized_private_key
end
end
describe '#parse_aspects' do
let(:aspects) { @importer.parse_aspects(@doc) }
it 'should return valid aspects' do
aspects.all?(&:valid?).should be true
end
it 'should return an array' do
aspects.count.should == 6
end
it 'should should have post ids' do
aspects.any?{|x| x.post_ids.count > 0}.should be true
end
it 'should have person ids' do
aspects.any?{|x| x.person_ids.count > 0}.should be true
end
end
describe '#parse_people' do
let(:people) { @importer.parse_people(@doc) }
it 'should return an array' do
people.count.should == 4
end
end
describe '#parse_posts' do
let(:posts) { @importer.parse_posts(@doc) }
it 'should return an array' do
posts.count.should == 4
end
it 'should return vaild posts' do
posts.all?(&:valid?).should be true
end
end
end
describe 'importing a user' do
context '#execute' do
before(:each) do
# Generate exported XML for user1
exporter = Diaspora::Exporter.new(Diaspora::Exporters::XML)
@xml = exporter.execute(@user1)
# Remove user1 from the server
@user1.aspects.each( &:delete )
@user1.raw_visible_posts.find_all_by_person_id(@user1.person.id).each( &:delete )
@user1.delete
@importer = Diaspora::Importer.new(Diaspora::Parsers::XML)
end
it 'should import' do
pending "there is some weirdness with diaspora handle we need to look into... and this test is terrible"
User.delete_all
Person.delete_all
Post.delete_all
StatusMessage.delete_all
Aspect.delete_all
User.count.should == 0
Person.count.should == 0
@importer.execute(@xml,
:email => "bob@bob.com",
:password => "bobbybob",
:password => "bobbybob",
:diaspora_handle => "bob@diaspora.com")
User.count.should == 1
n = User.first
Post.count.should == 4
n.aspects.count.should == 6
Person.count.should be == 5
User.first.person.diaspora_handle.should == User.first.diaspora_handle
Person.find_by_id( @user1.person.id ).nil?.should == false
Person.find_by_id( @user2.person.id ).nil?.should == false
n.aspects.count.should == 6
people_count = 0
n.aspects.each{|x| people_count += x.people.count }
people_count.should == 4
post_count = 0
n.aspects.reload
n.aspects.each{ |x| post_count += x.post_ids.count }
post_count.should == 4
n.friends.count.should be 4
end
end
end
end

View file

@ -1,109 +0,0 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
require 'spec_helper'
require File.join(Rails.root, 'lib/diaspora/importer')
describe Diaspora::Importer do
let!(:user1) { Factory(:user) }
let!(:user2) { Factory(:user) }
let!(:user3) { Factory(:user) }
let(:aspect1) { user1.aspect(:name => "Work") }
let(:aspect2) { user2.aspect(:name => "Family") }
let(:aspect3) { user3.aspect(:name => "Pivots") }
let!(:status_message1) { user1.post(:status_message, :message => "One", :public => true, :to => aspect1.id) }
let!(:status_message2) { user1.post(:status_message, :message => "Two", :public => true, :to => aspect1.id) }
let!(:status_message3) { user2.post(:status_message, :message => "Three", :public => false, :to => aspect2.id) }
let(:importer) { Diaspora::Importer.new(Diaspora::Parsers::XML) }
context 'serialized user' do
describe '#verify_user' do
it 'should return true for a new valid user' do
new_user = Factory(:user)
new_user.delete
importer.verify_user(new_user).should be true
end
it 'should return false if vaild user already exists' do
u = User.first
lambda{ importer.verify_user(user1) }.should raise_error
end
end
describe '#verify_person_for_user' do
it 'should pass if keys match' do
importer.verify_person_for_user(user1, user1.person).should be true
end
it 'should fail if private and public keys do not match' do
person = Factory(:person)
lambda{ importer.verify_person_for_user(user1, person) }.should raise_error
end
it 'should pass if the person does not exist' do
user = Factory.build(:user)
importer.verify_person_for_user(user, user.person)
end
end
describe '#filter_posts' do
it 'should make sure all found posts are owned by the user' do
posts = [status_message1, status_message2]
whitelist = importer.filter_posts(posts, user1.person)[:whitelist]
whitelist.should have(2).posts
whitelist.should include status_message1.id.to_s
whitelist.should include status_message2.id.to_s
end
it 'should remove posts not owned by the user' do
posts = [status_message1, status_message2, status_message3]
whitelist = importer.filter_posts(posts, user1.person)[:whitelist]
whitelist.should have(2).posts
whitelist.should_not include status_message3.id
end
it 'should return a list of unknown posts' do
posts = [status_message1, status_message2, Factory.build(:status_message)]
unknown = importer.filter_posts(posts, user1.person)[:unknown]
unknown.should have(1).post
end
it 'should generate a whitelist, unknown posts inclusive' do
posts = [status_message1, status_message2, Factory.build(:status_message)]
filters = importer.filter_posts(posts, user1.person)
filters[:whitelist].should include filters[:unknown].keys.first
end
end
describe '#clean_aspects' do
it 'should purge posts not in whitelist that are present in aspects' do
whitelist = {status_message1.id.to_s => true, status_message2.id.to_s => true}
aspect1.reload
aspect1.post_ids << status_message3.id.to_s
proc{ importer.clean_aspects([aspect1], whitelist) }.should change(aspect1.post_ids, :count).by(-1)
aspect1.post_ids.should_not include status_message3.id
end
end
describe '#filter_people' do
it 'should filter people who already exist in the database' do
new_peep = Factory.build(:person)
people = [user1.person, user2.person, new_peep]
importer.filter_people(people).keys.should == [new_peep.id.to_s]
end
end
end
end

View file

@ -65,7 +65,7 @@ describe Aspect do
it 'belong to a user' do
@aspect.user.id.should == @user.id
@user.aspects.size.should == 1
@user.aspects.size.should == 3
end
it 'should have people' do

View file

@ -103,10 +103,18 @@ describe Photo do
end
it 'should set the remote_photo on marshalling' do
pending "did the socket get unstubbed?"
@photo.image.store! File.open(@fixture_name)
#security hax
user2 = Factory.create(:user)
aspect2 = user2.aspect(:name => "foobars")
friend_users(@user, @aspect, user2, aspect2)
@photo.person = user2.person
@photo.save
@photo.reload
#@photo.reload
url = @photo.url
thumb_url = @photo.url :thumb_medium

View file

@ -9,15 +9,6 @@ describe Profile do
@person = Factory.build(:person)
end
describe 'sanitization' do
it 'strips the names' do
@person.profile = Factory.build(:profile, :first_name => " Bob", :last_name => "Bobson ")
@person.profile.save
@person.profile.first_name.should == "Bob"
@person.profile.last_name.should == "Bobson"
end
end
describe 'requirements' do
it "should include a first name" do
@person.profile = Factory.build(:profile,:first_name => nil)
@ -32,5 +23,7 @@ describe Profile do
@person.profile.last_name = "Smith"
@person.profile.valid?.should be true
end
end
end

View file

@ -8,8 +8,6 @@ describe User do
let(:user) { Factory(:user) }
let(:aspect) { user.aspect(:name => 'heroes') }
let(:bad_user) { Factory(:user)}
let(:user2) { Factory(:user) }
let(:aspect2) { user2.aspect(:name => 'losers') }
@ -23,9 +21,8 @@ describe User do
end
context 'non-friend valid user' do
it 'raises if receives post by non-friend' do
pending "need to that posts come from friends.... requests need special treatment(because the person may not be in the db)"
post_from_non_friend = bad_user.build_post( :status_message, :message => 'hi')
xml = bad_user.salmon(post_from_non_friend).xml_for(user.person)
@ -43,7 +40,7 @@ describe User do
end
context 'malicious friend attack vector' do
it 'overwrites messages with a different user' do
it 'overwrites messages with a different user' do
original_message = user2.post :status_message, :message => 'store this!', :to => aspect2.id
user.receive_salmon(user2.salmon(original_message).xml_for(user.person))
@ -55,8 +52,8 @@ describe User do
user.raw_visible_posts.count.should be 1
user.raw_visible_posts.first.message.should == "store this!"
end
it 'overwrites messages which apear to be from the same user' do
it 'overwrites messages which apear to be from the same user' do
original_message = user2.post :status_message, :message => 'store this!', :to => aspect2.id
user.receive_salmon(user2.salmon(original_message).xml_for(user.person))
user.raw_visible_posts.count.should be 1
@ -79,12 +76,12 @@ describe User do
user2.reload
user2.profile.first_name.should == "Robert"
end
it 'should not overwrite another persons profile through comment' do
pending
user_status = user.post(:status_message, :message => "hi", :to => 'all')
comment = Comment.new(:person_id => user3.person.id, :text => "hey", :post => user_status)
comment.creator_signature = comment.sign_with_key(user3.encryption_key)
comment.post_creator_signature = comment.sign_with_key(user.encryption_key)
@ -92,14 +89,14 @@ describe User do
original_url = person.url
original_id = person.id
puts original_url
comment.person.url = "http://bad.com/"
user3.delete
person.delete
comment.to_diaspora_xml.include?("bad.com").should be true
user2.receive_salmon(user.salmon(comment).xml_for(user2.person))
comment.person.url.should == original_url
Person.first(:id => original_id).url.should == original_url
end