summaryrefslogtreecommitdiff
path: root/client.rb
blob: 891a1d8f943cac0da5def93edeabc696294a07c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# client-server

post '/follow' do
  protected!
  params['id'] = actor params['mention'] if params['mention']
  create_activity 'Follow', params['id'], [params['id']]
  200
end

post '/unfollow' do
  protected!
  params['id'] = actor params['mention'] if params['mention']
  following = Dir[File.join(OUTBOX[:dir], 'follow', '*.json')].collect { |f| JSON.load_file(f) }
  activity = following.find { |a| a['object'] == params['id'] }
  activity ||= {
    '@context' => 'https://www.w3.org/ns/activitystreams',
    'type' => 'Follow',
    'actor' => 'https://social.pdp8.info/pdp8',
    'object' => params['id']
  }
  create_activity 'Undo', activity, [params['id']]
  update_collection FOLLOWING, params['id'], 'delete'
  200
end

post '/announce' do # TODO
  protected!
  to = ['https://www.w3.org/ns/activitystreams#Public', FOLLOWERS_URL]
  to << params['attributedTo']
  create_activity 'Announce', params['id'], to
  outbox_html('announce')
  200
end

post '/undo' do # TODO: generalize for announce
  protected!
  Dir[File.join('outbox', '*', '*.json')].each do |activity_file|
    activity = JSON.load_file(activity_file)
    next unless activity['id'] == params['id']

    object_file, object = find_object activity['object']['id']
    create_activity 'Undo', params['id'], activity['to']
    FileUtils.rm(activity_file)
    FileUtils.rm(object_file)
    if activity_file.match 'create'
      outbox_html('create')
    elsif activity_file.match 'announce'
      outbox_html('announce')
    end
  end
  200
end

post '/login' do
  session['client'] = (OpenSSL::Digest::SHA256.base64digest(params['secret']) == File.read('.digest').chomp)
  200
end

helpers do
  def protected!
    halt 403 unless session['client']
  end
end