Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
GitHub Mirror
mastodon
Mastodon
Commits
7de0ee7a
Unverified
Commit
7de0ee7a
authored
Nov 26, 2021
by
Eugen Rochko
Committed by
GitHub
Nov 26, 2021
Browse files
Remove Keybase integration (#17045)
parent
12b3ff6c
Changes
43
Hide whitespace changes
Inline
Side-by-side
app/controllers/api/proofs_controller.rb
deleted
100644 → 0
View file @
12b3ff6c
# frozen_string_literal: true
class
Api::ProofsController
<
Api
::
BaseController
include
AccountOwnedConcern
skip_before_action
:require_authenticated_user!
before_action
:set_provider
def
index
render
json:
@account
,
serializer:
@provider
.
serializer_class
end
private
def
set_provider
@provider
=
ProofProvider
.
find
(
params
[
:provider
])
||
raise
(
ActiveRecord
::
RecordNotFound
)
end
def
username_param
params
[
:username
]
end
end
app/controllers/api/v1/accounts/identity_proofs_controller.rb
View file @
7de0ee7a
...
...
@@ -5,8 +5,7 @@ class Api::V1::Accounts::IdentityProofsController < Api::BaseController
before_action
:set_account
def
index
@proofs
=
@account
.
suspended?
?
[]
:
@account
.
identity_proofs
.
active
render
json:
@proofs
,
each_serializer:
REST
::
IdentityProofSerializer
render
json:
[]
end
private
...
...
app/controllers/settings/identity_proofs_controller.rb
deleted
100644 → 0
View file @
12b3ff6c
# frozen_string_literal: true
class
Settings::IdentityProofsController
<
Settings
::
BaseController
before_action
:check_required_params
,
only: :new
def
index
@proofs
=
AccountIdentityProof
.
where
(
account:
current_account
).
order
(
provider: :asc
,
provider_username: :asc
)
@proofs
.
each
(
&
:refresh!
)
end
def
new
@proof
=
current_account
.
identity_proofs
.
new
(
token:
params
[
:token
],
provider:
params
[
:provider
],
provider_username:
params
[
:provider_username
]
)
if
current_account
.
username
.
casecmp
(
params
[
:username
]).
zero?
render
layout:
'auth'
else
redirect_to
settings_identity_proofs_path
,
alert:
I18n
.
t
(
'identity_proofs.errors.wrong_user'
,
proving:
params
[
:username
],
current:
current_account
.
username
)
end
end
def
create
@proof
=
current_account
.
identity_proofs
.
where
(
provider:
resource_params
[
:provider
],
provider_username:
resource_params
[
:provider_username
]).
first_or_initialize
(
resource_params
)
@proof
.
token
=
resource_params
[
:token
]
if
@proof
.
save
PostStatusService
.
new
.
call
(
current_user
.
account
,
text:
post_params
[
:status_text
])
if
publish_proof?
redirect_to
@proof
.
on_success_path
(
params
[
:user_agent
])
else
redirect_to
settings_identity_proofs_path
,
alert:
I18n
.
t
(
'identity_proofs.errors.failed'
,
provider:
@proof
.
provider
.
capitalize
)
end
end
def
destroy
@proof
=
current_account
.
identity_proofs
.
find
(
params
[
:id
])
@proof
.
destroy!
redirect_to
settings_identity_proofs_path
,
success:
I18n
.
t
(
'identity_proofs.removed'
)
end
private
def
check_required_params
redirect_to
settings_identity_proofs_path
unless
[
:provider
,
:provider_username
,
:username
,
:token
].
all?
{
|
k
|
params
[
k
].
present?
}
end
def
resource_params
params
.
require
(
:account_identity_proof
).
permit
(
:provider
,
:provider_username
,
:token
)
end
def
publish_proof?
ActiveModel
::
Type
::
Boolean
.
new
.
cast
(
post_params
[
:post_status
])
end
def
post_params
params
.
require
(
:account_identity_proof
).
permit
(
:post_status
,
:status_text
)
end
end
app/controllers/well_known/keybase_proof_config_controller.rb
deleted
100644 → 0
View file @
12b3ff6c
# frozen_string_literal: true
module
WellKnown
class
KeybaseProofConfigController
<
ActionController
::
Base
def
show
render
json:
{},
serializer:
ProofProvider
::
Keybase
::
ConfigSerializer
,
root:
'keybase_config'
end
end
end
app/javascript/mastodon/actions/identity_proofs.js
deleted
100644 → 0
View file @
12b3ff6c
import
api
from
'
../api
'
;
export
const
IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST
=
'
IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST
'
;
export
const
IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS
=
'
IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS
'
;
export
const
IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL
=
'
IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL
'
;
export
const
fetchAccountIdentityProofs
=
accountId
=>
(
dispatch
,
getState
)
=>
{
dispatch
(
fetchAccountIdentityProofsRequest
(
accountId
));
api
(
getState
).
get
(
`/api/v1/accounts/
${
accountId
}
/identity_proofs`
)
.
then
(({
data
})
=>
dispatch
(
fetchAccountIdentityProofsSuccess
(
accountId
,
data
)))
.
catch
(
err
=>
dispatch
(
fetchAccountIdentityProofsFail
(
accountId
,
err
)));
};
export
const
fetchAccountIdentityProofsRequest
=
id
=>
({
type
:
IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST
,
id
,
});
export
const
fetchAccountIdentityProofsSuccess
=
(
accountId
,
identity_proofs
)
=>
({
type
:
IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS
,
accountId
,
identity_proofs
,
});
export
const
fetchAccountIdentityProofsFail
=
(
accountId
,
err
)
=>
({
type
:
IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL
,
accountId
,
err
,
skipNotFound
:
true
,
});
app/javascript/mastodon/features/account/components/header.js
View file @
7de0ee7a
...
...
@@ -123,7 +123,7 @@ class Header extends ImmutablePureComponent {
}
render
()
{
const
{
account
,
intl
,
domain
,
identity_proofs
}
=
this
.
props
;
const
{
account
,
intl
,
domain
}
=
this
.
props
;
if
(
!
account
)
{
return
null
;
...
...
@@ -297,20 +297,8 @@ class Header extends ImmutablePureComponent {
<
div
className
=
'
account__header__extra
'
>
<
div
className
=
'
account__header__bio
'
>
{
(
fields
.
size
>
0
||
identity_proofs
.
size
>
0
)
&&
(
{
fields
.
size
>
0
&&
(
<
div
className
=
'
account__header__fields
'
>
{
identity_proofs
.
map
((
proof
,
i
)
=>
(
<
dl
key
=
{
i
}
>
<
dt
dangerouslySetInnerHTML
=
{{
__html
:
proof
.
get
(
'
provider
'
)
}}
/
>
<
dd
className
=
'
verified
'
>
<
a
href
=
{
proof
.
get
(
'
proof_url
'
)}
target
=
'
_blank
'
rel
=
'
noopener noreferrer
'
><
span
title
=
{
intl
.
formatMessage
(
messages
.
linkVerifiedOn
,
{
date
:
intl
.
formatDate
(
proof
.
get
(
'
updated_at
'
),
dateFormatOptions
)
})}
>
<
Icon
id
=
'
check
'
className
=
'
verified__mark
'
/>
<
/span></
a
>
<
a
href
=
{
proof
.
get
(
'
profile_url
'
)}
target
=
'
_blank
'
rel
=
'
noopener noreferrer
'
><
span
dangerouslySetInnerHTML
=
{{
__html
:
'
'
+
proof
.
get
(
'
provider_username
'
)
}}
/></
a
>
<
/dd
>
<
/dl
>
))}
{
fields
.
map
((
pair
,
i
)
=>
(
<
dl
key
=
{
i
}
>
<
dt
dangerouslySetInnerHTML
=
{{
__html
:
pair
.
get
(
'
name_emojified
'
)
}}
title
=
{
pair
.
get
(
'
name
'
)}
className
=
'
translate
'
/>
...
...
app/javascript/mastodon/features/account_timeline/components/header.js
View file @
7de0ee7a
...
...
@@ -11,7 +11,6 @@ export default class Header extends ImmutablePureComponent {
static
propTypes
=
{
account
:
ImmutablePropTypes
.
map
,
identity_proofs
:
ImmutablePropTypes
.
list
,
onFollow
:
PropTypes
.
func
.
isRequired
,
onBlock
:
PropTypes
.
func
.
isRequired
,
onMention
:
PropTypes
.
func
.
isRequired
,
...
...
@@ -92,7 +91,7 @@ export default class Header extends ImmutablePureComponent {
}
render
()
{
const
{
account
,
hideTabs
,
identity_proofs
}
=
this
.
props
;
const
{
account
,
hideTabs
}
=
this
.
props
;
if
(
account
===
null
)
{
return
null
;
...
...
@@ -104,7 +103,6 @@ export default class Header extends ImmutablePureComponent {
<
InnerHeader
account
=
{
account
}
identity_proofs
=
{
identity_proofs
}
onFollow
=
{
this
.
handleFollow
}
onBlock
=
{
this
.
handleBlock
}
onMention
=
{
this
.
handleMention
}
...
...
app/javascript/mastodon/features/account_timeline/containers/header_container.js
View file @
7de0ee7a
...
...
@@ -21,7 +21,6 @@ import { openModal } from '../../../actions/modal';
import
{
blockDomain
,
unblockDomain
}
from
'
../../../actions/domain_blocks
'
;
import
{
defineMessages
,
injectIntl
,
FormattedMessage
}
from
'
react-intl
'
;
import
{
unfollowModal
}
from
'
../../../initial_state
'
;
import
{
List
as
ImmutableList
}
from
'
immutable
'
;
const
messages
=
defineMessages
({
unfollowConfirm
:
{
id
:
'
confirmations.unfollow.confirm
'
,
defaultMessage
:
'
Unfollow
'
},
...
...
@@ -34,7 +33,6 @@ const makeMapStateToProps = () => {
const
mapStateToProps
=
(
state
,
{
accountId
})
=>
({
account
:
getAccount
(
state
,
accountId
),
domain
:
state
.
getIn
([
'
meta
'
,
'
domain
'
]),
identity_proofs
:
state
.
getIn
([
'
identity_proofs
'
,
accountId
],
ImmutableList
()),
});
return
mapStateToProps
;
...
...
app/javascript/mastodon/features/account_timeline/index.js
View file @
7de0ee7a
...
...
@@ -12,7 +12,6 @@ import ColumnBackButton from '../../components/column_back_button';
import
{
List
as
ImmutableList
}
from
'
immutable
'
;
import
ImmutablePureComponent
from
'
react-immutable-pure-component
'
;
import
{
FormattedMessage
}
from
'
react-intl
'
;
import
{
fetchAccountIdentityProofs
}
from
'
../../actions/identity_proofs
'
;
import
MissingIndicator
from
'
mastodon/components/missing_indicator
'
;
import
TimelineHint
from
'
mastodon/components/timeline_hint
'
;
import
{
me
}
from
'
mastodon/initial_state
'
;
...
...
@@ -80,7 +79,6 @@ class AccountTimeline extends ImmutablePureComponent {
const
{
accountId
,
withReplies
,
dispatch
}
=
this
.
props
;
dispatch
(
fetchAccount
(
accountId
));
dispatch
(
fetchAccountIdentityProofs
(
accountId
));
if
(
!
withReplies
)
{
dispatch
(
expandAccountFeaturedTimeline
(
accountId
));
...
...
app/javascript/mastodon/reducers/identity_proofs.js
deleted
100644 → 0
View file @
12b3ff6c
import
{
Map
as
ImmutableMap
,
fromJS
}
from
'
immutable
'
;
import
{
IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST
,
IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS
,
IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL
,
}
from
'
../actions/identity_proofs
'
;
const
initialState
=
ImmutableMap
();
export
default
function
identityProofsReducer
(
state
=
initialState
,
action
)
{
switch
(
action
.
type
)
{
case
IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST
:
return
state
.
set
(
'
isLoading
'
,
true
);
case
IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL
:
return
state
.
set
(
'
isLoading
'
,
false
);
case
IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS
:
return
state
.
update
(
identity_proofs
=>
identity_proofs
.
withMutations
(
map
=>
{
map
.
set
(
'
isLoading
'
,
false
);
map
.
set
(
'
loaded
'
,
true
);
map
.
set
(
action
.
accountId
,
fromJS
(
action
.
identity_proofs
));
}));
default
:
return
state
;
}
};
app/javascript/mastodon/reducers/index.js
View file @
7de0ee7a
...
...
@@ -32,7 +32,6 @@ import filters from './filters';
import
conversations
from
'
./conversations
'
;
import
suggestions
from
'
./suggestions
'
;
import
polls
from
'
./polls
'
;
import
identity_proofs
from
'
./identity_proofs
'
;
import
trends
from
'
./trends
'
;
import
missed_updates
from
'
./missed_updates
'
;
import
announcements
from
'
./announcements
'
;
...
...
@@ -69,7 +68,6 @@ const reducers = {
notifications
,
height_cache
,
custom_emojis
,
identity_proofs
,
lists
,
listEditor
,
listAdder
,
...
...
app/javascript/styles/mastodon/forms.scss
View file @
7de0ee7a
...
...
@@ -999,68 +999,6 @@ code {
}
}
.connection-prompt
{
margin-bottom
:
25px
;
.fa-link
{
background-color
:
darken
(
$ui-base-color
,
4%
);
border-radius
:
100%
;
font-size
:
24px
;
padding
:
10px
;
}
&
__column
{
align-items
:
center
;
display
:
flex
;
flex
:
1
;
flex-direction
:
column
;
flex-shrink
:
1
;
max-width
:
50%
;
&
-sep
{
align-self
:
center
;
flex-grow
:
0
;
overflow
:
visible
;
position
:
relative
;
z-index
:
1
;
}
p
{
word-break
:
break-word
;
}
}
.account__avatar
{
margin-bottom
:
20px
;
}
&
__connection
{
background-color
:
lighten
(
$ui-base-color
,
8%
);
box-shadow
:
0
0
15px
rgba
(
$base-shadow-color
,
0
.2
);
border-radius
:
4px
;
padding
:
25px
10px
;
position
:
relative
;
text-align
:
center
;
&
::after
{
background-color
:
darken
(
$ui-base-color
,
4%
);
content
:
''
;
display
:
block
;
height
:
100%
;
left
:
50%
;
position
:
absolute
;
top
:
0
;
width
:
1px
;
}
}
&
__row
{
align-items
:
flex-start
;
display
:
flex
;
flex-direction
:
row
;
}
}
.input.user_confirm_password
,
.input.user_website
{
&
:not
(
.field_with_errors
)
{
...
...
app/lib/activitypub/adapter.rb
View file @
7de0ee7a
...
...
@@ -18,7 +18,6 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
atom_uri:
{
'ostatus'
=>
'http://ostatus.org#'
,
'atomUri'
=>
'ostatus:atomUri'
},
conversation:
{
'ostatus'
=>
'http://ostatus.org#'
,
'inReplyToAtomUri'
=>
'ostatus:inReplyToAtomUri'
,
'conversation'
=>
'ostatus:conversation'
},
focal_point:
{
'toot'
=>
'http://joinmastodon.org/ns#'
,
'focalPoint'
=>
{
'@container'
=>
'@list'
,
'@id'
=>
'toot:focalPoint'
}
},
identity_proof:
{
'toot'
=>
'http://joinmastodon.org/ns#'
,
'IdentityProof'
=>
'toot:IdentityProof'
},
blurhash:
{
'toot'
=>
'http://joinmastodon.org/ns#'
,
'blurhash'
=>
'toot:blurhash'
},
discoverable:
{
'toot'
=>
'http://joinmastodon.org/ns#'
,
'discoverable'
=>
'toot:discoverable'
},
voters_count:
{
'toot'
=>
'http://joinmastodon.org/ns#'
,
'votersCount'
=>
'toot:votersCount'
},
...
...
app/lib/proof_provider.rb
deleted
100644 → 0
View file @
12b3ff6c
# frozen_string_literal: true
module
ProofProvider
SUPPORTED_PROVIDERS
=
%w(keybase)
.
freeze
def
self
.
find
(
identifier
,
proof
=
nil
)
case
identifier
when
'keybase'
ProofProvider
::
Keybase
.
new
(
proof
)
end
end
end
app/lib/proof_provider/keybase.rb
deleted
100644 → 0
View file @
12b3ff6c
# frozen_string_literal: true
class
ProofProvider::Keybase
BASE_URL
=
ENV
.
fetch
(
'KEYBASE_BASE_URL'
,
'https://keybase.io'
)
DOMAIN
=
ENV
.
fetch
(
'KEYBASE_DOMAIN'
,
Rails
.
configuration
.
x
.
web_domain
)
class
Error
<
StandardError
;
end
class
ExpectedProofLiveError
<
Error
;
end
class
UnexpectedResponseError
<
Error
;
end
def
initialize
(
proof
=
nil
)
@proof
=
proof
end
def
serializer_class
ProofProvider
::
Keybase
::
Serializer
end
def
worker_class
ProofProvider
::
Keybase
::
Worker
end
def
validate!
unless
@proof
.
token
&
.
size
==
66
@proof
.
errors
.
add
(
:base
,
I18n
.
t
(
'identity_proofs.errors.keybase.invalid_token'
))
return
end
# Do not perform synchronous validation for remote accounts
return
if
@proof
.
provider_username
.
blank?
||
!
@proof
.
account
.
local?
if
verifier
.
valid?
@proof
.
verified
=
true
@proof
.
live
=
false
else
@proof
.
errors
.
add
(
:base
,
I18n
.
t
(
'identity_proofs.errors.keybase.verification_failed'
,
kb_username:
@proof
.
provider_username
))
end
end
def
refresh!
worker_class
.
new
.
perform
(
@proof
)
rescue
ProofProvider
::
Keybase
::
Error
nil
end
def
on_success_path
(
user_agent
=
nil
)
verifier
.
on_success_path
(
user_agent
)
end
def
badge
@badge
||=
ProofProvider
::
Keybase
::
Badge
.
new
(
@proof
.
account
.
username
,
@proof
.
provider_username
,
@proof
.
token
,
domain
)
end
def
verifier
@verifier
||=
ProofProvider
::
Keybase
::
Verifier
.
new
(
@proof
.
account
.
username
,
@proof
.
provider_username
,
@proof
.
token
,
domain
)
end
private
def
domain
if
@proof
.
account
.
local?
DOMAIN
else
@proof
.
account
.
domain
end
end
end
app/lib/proof_provider/keybase/badge.rb
deleted
100644 → 0
View file @
12b3ff6c
# frozen_string_literal: true
class
ProofProvider::Keybase::Badge
include
RoutingHelper
def
initialize
(
local_username
,
provider_username
,
token
,
domain
)
@local_username
=
local_username
@provider_username
=
provider_username
@token
=
token
@domain
=
domain
end
def
proof_url
"
#{
ProofProvider
::
Keybase
::
BASE_URL
}
/
#{
@provider_username
}
/sigchain
\#
#{
@token
}
"
end
def
profile_url
"
#{
ProofProvider
::
Keybase
::
BASE_URL
}
/
#{
@provider_username
}
"
end
def
icon_url
"
#{
ProofProvider
::
Keybase
::
BASE_URL
}
/
#{
@provider_username
}
/proof_badge/
#{
@token
}
?username=
#{
@local_username
}
&domain=
#{
@domain
}
"
end
def
avatar_url
Rails
.
cache
.
fetch
(
"proof_providers/keybase/
#{
@provider_username
}
/avatar_url"
,
expires_in:
5
.
minutes
)
{
remote_avatar_url
}
||
default_avatar_url
end
private
def
remote_avatar_url
request
=
Request
.
new
(
:get
,
"
#{
ProofProvider
::
Keybase
::
BASE_URL
}
/_/api/1.0/user/pic_url.json"
,
params:
{
username:
@provider_username
})
request
.
perform
do
|
res
|
json
=
Oj
.
load
(
res
.
body_with_limit
,
mode: :strict
)
json
[
'pic_url'
]
if
json
.
is_a?
(
Hash
)
end
rescue
Oj
::
ParseError
,
HTTP
::
Error
,
OpenSSL
::
SSL
::
SSLError
nil
end
def
default_avatar_url
asset_pack_path
(
'media/images/proof_providers/keybase.png'
)
end
end
app/lib/proof_provider/keybase/config_serializer.rb
deleted
100644 → 0
View file @
12b3ff6c
# frozen_string_literal: true
class
ProofProvider::Keybase::ConfigSerializer
<
ActiveModel
::
Serializer
include
RoutingHelper
include
ActionView
::
Helpers
::
TextHelper
attributes
:version
,
:domain
,
:display_name
,
:username
,
:brand_color
,
:logo
,
:description
,
:prefill_url
,
:profile_url
,
:check_url
,
:check_path
,
:avatar_path
,
:contact
def
version
1
end
def
domain
ProofProvider
::
Keybase
::
DOMAIN
end
def
display_name
Setting
.
site_title
end
def
logo
{
svg_black:
full_asset_url
(
asset_pack_path
(
'media/images/logo_transparent_black.svg'
)),
svg_white:
full_asset_url
(
asset_pack_path
(
'media/images/logo_transparent_white.svg'
)),
svg_full:
full_asset_url
(
asset_pack_path
(
'media/images/logo.svg'
)),
svg_full_darkmode:
full_asset_url
(
asset_pack_path
(
'media/images/logo.svg'
)),
}
end
def
brand_color
'#282c37'
end
def
description
strip_tags
(
Setting
.
site_short_description
.
presence
||
I18n
.
t
(
'about.about_mastodon_html'
))
end
def
username
{
min:
1
,
max:
30
,
re:
'[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?'
}
end
def
prefill_url
params
=
{
provider:
'keybase'
,
token:
'%{sig_hash}'
,
provider_username:
'%{kb_username}'
,
username:
'%{username}'
,
user_agent:
'%{kb_ua}'
,
}
CGI
.
unescape
(
new_settings_identity_proof_url
(
params
))
end
def
profile_url
CGI
.
unescape
(
short_account_url
(
'%{username}'
))
end
def
check_url
CGI
.
unescape
(
api_proofs_url
(
username:
'%{username}'
,
provider:
'keybase'
))
end
def
check_path
[
'signatures'
]
end
def
avatar_path
[
'avatar'
]
end
def
contact
[
Setting
.
site_contact_email
.
presence
||
'unknown'
].
compact
end
end
app/lib/proof_provider/keybase/serializer.rb
deleted
100644 → 0
View file @
12b3ff6c
# frozen_string_literal: true
class
ProofProvider::Keybase::Serializer
<
ActiveModel
::
Serializer
include
RoutingHelper
attribute
:avatar
has_many
:identity_proofs
,
key: :signatures
def
avatar
full_asset_url
(
object
.
avatar_original_url
)
end
class
AccountIdentityProofSerializer
<
ActiveModel
::
Serializer
attributes
:sig_hash
,
:kb_username
def
sig_hash
object
.
token
end
def
kb_username
object
.
provider_username
end
end
end
app/lib/proof_provider/keybase/verifier.rb
deleted
100644 → 0
View file @
12b3ff6c
# frozen_string_literal: true
class
ProofProvider::Keybase::Verifier
def
initialize
(
local_username
,
provider_username
,
token
,
domain
)
@local_username
=
local_username
@provider_username
=
provider_username
@token
=
token
@domain
=
domain
end