Compare commits

..

56 commits

Author SHA1 Message Date
jessopb
99c7b087d7
Merge pull request #1071 from lbryio/redirect2
prevent server side redirect
2020-06-11 12:30:31 -04:00
jessop
67e198db2f prevent server side redirect 2020-06-11 12:29:26 -04:00
jessopb
b410eb8c94
Merge pull request #1069 from lbryio/redirectTv
redirect content to lbry.tv
2020-06-10 17:12:46 -04:00
jessop
efc38529c7 redirect content to lbry.tv 2020-06-10 17:01:44 -04:00
Thomas Zarebczan
dfa6db6276
fix broken claims?
https://spee.ch/@Deterrence-Dispensed:2/AR22LR-MagazineKit-1.1
2020-06-05 16:46:39 -04:00
Thomas Zarebczan
9df4d29dda
Use only streams for channel
Maybe fix the repost bug where a channel won't load for now.
2020-06-04 21:14:42 -04:00
jessopb
7940c61b17
Merge pull request #1064 from lbryio/updateMessaging
update messaging, disable publish and channels
2020-05-15 14:11:00 -04:00
jessop
5ed72b0e14 update messaging, disable publish and channels 2020-04-22 20:24:23 -04:00
Jeremy Kauffman
922a53cc30
Merge pull request #1055 from ykris45/patch-5
Update LICENSE
2020-02-03 15:00:34 -05:00
YULIUS KURNIAWAN KRISTIANTO
d11ba6225e
Update LICENSE
update year
2020-02-03 04:41:19 +07:00
jessopb
3d23635bf5
Merge pull request #1052 from lbryio/fixesJan20
pagination (thanks Tom)
2020-01-12 19:39:50 -05:00
jessop
707e144eff pagination (thanks Tom) 2020-01-12 19:34:16 -05:00
Thomas Zarebczan
ad87e2b8a7
Update README.md 2019-12-08 09:44:22 -05:00
jessopb
01ae90fc15
fix customize link 2019-12-07 11:15:24 -05:00
Thomas Zarebczan
1e6cb2a7c6
Merge pull request #1042 from StrikerRUS/patch-1
removed deprecated field in Travis
2019-10-15 11:53:56 -04:00
jessopb
5dc89f0a91
Merge pull request #1043 from lbryio/dmca-fix
Update report route
2019-10-10 18:11:57 -04:00
Thomas Zarebczan
0974e6d6b0
Update report route
+ pass claim id

Example: https://lbry.com/dmca/116d62d14d8efc311e1f8a9de92dcbc17deb259a
2019-10-10 13:42:29 -04:00
Nikita Titov
64d7afd278
removed deprecated field in Travis 2019-10-09 00:16:24 +03:00
jessopb
648639e6c6
Merge pull request #1041 from lbryio/cors2
applies open cors to publish routes
2019-10-08 09:45:53 -04:00
jessop
8ded28beb3 applies open cors to publish routes 2019-10-08 09:06:33 -04:00
jessopb
9e76553f0a
Merge pull request #1039 from lbryio/speechCors
moves whitelist to config and catches errors
2019-10-01 15:39:38 -04:00
jessop
f4a50d0c85 moves whitelist to config and catches errors 2019-10-01 15:19:31 -04:00
jessopb
23953a32e8
Merge pull request #1037 from lbryio/cors
Cors
2019-09-29 15:06:43 -04:00
jessop
aa4a43a1a5 cors 2019-09-29 14:54:17 -04:00
Thomas Zarebczan
eba7fd596f
Merge pull request #1035 from lbryio/dependabot/npm_and_yarn/mixin-deep-1.3.2
Bump mixin-deep from 1.3.1 to 1.3.2
2019-09-18 11:45:54 -04:00
dependabot[bot]
9130b6f609
Bump mixin-deep from 1.3.1 to 1.3.2
Bumps [mixin-deep](https://github.com/jonschlinkert/mixin-deep) from 1.3.1 to 1.3.2.
- [Release notes](https://github.com/jonschlinkert/mixin-deep/releases)
- [Commits](https://github.com/jonschlinkert/mixin-deep/compare/1.3.1...1.3.2)

Signed-off-by: dependabot[bot] <support@github.com>
2019-08-27 22:24:31 +00:00
jessopb
1fd0ec1fc2
Merge pull request #1030 from lbryio/revert-1025-dependabot/npm_and_yarn/sequelize-5.3.0
Revert "Bump sequelize from 4.41.1 to 5.3.0"
2019-08-09 09:55:15 -04:00
jessopb
53e0d2a0db
Revert "Bump sequelize from 4.41.1 to 5.3.0" 2019-08-09 09:51:45 -04:00
jessopb
5b2108796c
Merge pull request #1025 from lbryio/dependabot/npm_and_yarn/sequelize-5.3.0
Bump sequelize from 4.41.1 to 5.3.0
2019-08-07 10:42:32 -04:00
jessopb
200903827a
Merge pull request #1022 from lbryio/dependabot/npm_and_yarn/lodash.mergewith-4.6.2
Bump lodash.mergewith from 4.6.1 to 4.6.2
2019-08-07 10:39:37 -04:00
jessopb
993b1d31e9
Merge pull request #1023 from lbryio/dependabot/npm_and_yarn/axios-0.18.1
Bump axios from 0.18.0 to 0.18.1
2019-08-07 10:39:22 -04:00
jessopb
8891f298ae
Merge pull request #1024 from lbryio/dependabot/npm_and_yarn/lodash-4.17.13
Bump lodash from 4.17.11 to 4.17.13
2019-08-07 10:39:11 -04:00
jessopb
9bd779775a
Merge pull request #1026 from lbryio/dependabot/npm_and_yarn/handlebars-4.1.2
Bump handlebars from 4.1.0 to 4.1.2
2019-08-07 10:38:27 -04:00
jessopb
322b8a147d
Merge pull request #1027 from lbryio/dependabot/npm_and_yarn/fstream-1.0.12
Bump fstream from 1.0.11 to 1.0.12
2019-08-07 10:38:14 -04:00
jessopb
424827ea15
Merge pull request #1028 from lbryio/dependabot/npm_and_yarn/js-yaml-3.13.1
Bump js-yaml from 3.13.0 to 3.13.1
2019-08-07 10:38:03 -04:00
dependabot[bot]
15e7456a88
Bump fstream from 1.0.11 to 1.0.12
Bumps [fstream](https://github.com/npm/fstream) from 1.0.11 to 1.0.12.
- [Release notes](https://github.com/npm/fstream/releases)
- [Commits](https://github.com/npm/fstream/compare/v1.0.11...v1.0.12)

Signed-off-by: dependabot[bot] <support@github.com>
2019-08-05 18:45:42 +00:00
dependabot[bot]
d4e38db1ae
Bump js-yaml from 3.13.0 to 3.13.1
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.13.0 to 3.13.1.
- [Release notes](https://github.com/nodeca/js-yaml/releases)
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/3.13.0...3.13.1)

Signed-off-by: dependabot[bot] <support@github.com>
2019-08-05 18:45:42 +00:00
dependabot[bot]
d3f4c0aefb
Bump handlebars from 4.1.0 to 4.1.2
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.1.0 to 4.1.2.
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.1.0...v4.1.2)

Signed-off-by: dependabot[bot] <support@github.com>
2019-08-05 18:45:33 +00:00
dependabot[bot]
ee004405a6
Bump sequelize from 4.41.1 to 5.3.0
Bumps [sequelize](https://github.com/sequelize/sequelize) from 4.41.1 to 5.3.0.
- [Release notes](https://github.com/sequelize/sequelize/releases)
- [Commits](https://github.com/sequelize/sequelize/compare/v4.41.1...v5.3.0)

Signed-off-by: dependabot[bot] <support@github.com>
2019-08-05 18:45:25 +00:00
dependabot[bot]
6313c7eeff
Bump lodash from 4.17.11 to 4.17.13
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.13.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.13)

Signed-off-by: dependabot[bot] <support@github.com>
2019-08-05 18:45:24 +00:00
dependabot[bot]
ee1b5c68bc
Bump axios from 0.18.0 to 0.18.1
Bumps [axios](https://github.com/axios/axios) from 0.18.0 to 0.18.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v0.18.1/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.18.0...v0.18.1)

Signed-off-by: dependabot[bot] <support@github.com>
2019-08-05 18:45:20 +00:00
dependabot[bot]
962d07a6c9
Bump lodash.mergewith from 4.6.1 to 4.6.2
Bumps [lodash.mergewith](https://github.com/lodash/lodash) from 4.6.1 to 4.6.2.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2019-08-05 18:45:11 +00:00
jessopb
b9b4333b55
Merge pull request #1018 from lbryio/ipWhitelist
adds ip whitelist
2019-07-03 18:08:46 -04:00
jessop
ac3e9d1e67 adds ip whitelist 2019-07-03 17:55:33 -04:00
Jeremy Kauffman
bd0c3fd4c3
Merge pull request #1017 from AlessandroSpallina/master
Fixed broken link
2019-06-25 16:09:33 -04:00
AlessandroSpallina
85cc743f90 Fixed broken link 2019-06-25 21:46:00 +02:00
jessopb
a66511caaf
Merge pull request #1014 from lbryio/lenientPublishLimits
changes max publishes to 20
2019-06-21 15:23:12 -04:00
jessop
39095c16a9 changes max publishes to 20 2019-06-21 14:40:07 -04:00
Jeremy Kauffman
3d4ad3d827
Merge pull request #1013 from lbryio/noMetrics
stops logging metrics to localdb
2019-06-05 11:02:09 -04:00
Jessop Breth
6992b87033 stops logging metrics to localdb 2019-06-05 10:08:13 -04:00
jessopb
75818e47fe
Merge pull request #1012 from lbryio/fix-abandon
fix: abandoning claims
2019-05-31 15:23:10 -04:00
jessopb
4cfb85fed3
Merge pull request #1011 from ProfessorDey/patch-1
Added Server Response Error Handling
2019-05-31 14:36:09 -04:00
ProfessorDey
8a6cd2db13
Tab Removal & Check Abstraction
Per Jessop's request: https://github.com/lbryio/spee.ch/pull/1011#pullrequestreview-243975520
Corrected tabs and added the clarified abstraction to the request state check.
2019-05-31 00:15:27 +01:00
Tom
dee61b5b6f fix: abandoning claims
Confirmed working locally. File/claims table has outpoint. Claim was abandoned by the sdk.
2019-05-30 14:57:47 -04:00
ProfessorDey
82ab3b47b1
Added Server Response Error Handling
Presently the spee.ch client will error out if it received an unexpected response, resulting in hangs and a very vague JSON parsing error. This failsafe will catch the known issue of server request size limits causing 413 responses if misconfigured, making things easier to diagnose, as well as catching any other unexpected responses cleanly. Further specific behaviours can be added to ensure administrators spend less time debugging simple configuration issues.

The 413 error response should be fairly self explanatory, sufficient to not need further documentation, though adding an addendum to the README.md would aid other developers have a smooth experience.
2019-05-30 14:33:53 +01:00
jessopb
68d2f303c1
Merge pull request #1008 from lbryio/0.37-fixes
Support for 0.37 SDK
2019-05-26 18:34:21 -04:00
26 changed files with 279 additions and 215 deletions

View file

@ -1,4 +1,3 @@
sudo: true
dist: xenial
#addons:
# apt:
@ -9,7 +8,7 @@ dist: xenial
# - mysql-client
language: node_js
node_js:
- "lts/*"
- "lts/dubnium"
cache:
directories:
- "node_modules"

View file

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2017-2019 LBRY Inc.
Copyright (c) 2017-2020 LBRY Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish,

View file

@ -3,6 +3,8 @@
spee.ch provides a user-friendly, custom-designed, image and video hosting site backed by a decentralized network and
blockchain ([LBRY](https://lbry.tech/)). Via just a small set of config files, you can spin your an entire spee.ch site back up including assets.
**Please note: the spee.ch code base and setup instructions are no longer actively maintained now that we have lbry.tv. Proceed at your own caution. Setup will require dev ops skills.**
![App GIF](https://spee.ch/e/speechgif.gif)
For a completely open, unrestricted example of a spee.ch site, check out https://www.spee.ch.
@ -105,7 +107,7 @@ $ npm run start
#### Customize your app
Check out the [customization guide](https://github.com/lbryio/spee.ch/blob/readme-update/customize.md) to change your app's appearance and components
Check out the [customization guide](https://github.com/lbryio/spee.ch/blob/master/customize.md) to change your app's appearance and components
#### (optional) add custom components and update the styles

View file

@ -1,6 +1,6 @@
import Request from '../utils/request';
export function getLongClaimId (host, name, modifier) {
export function getLongClaimId(host, name, modifier) {
let body = {};
// create request params
if (modifier) {
@ -13,40 +13,40 @@ export function getLongClaimId (host, name, modifier) {
}
body['claimName'] = name;
const params = {
method : 'POST',
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body : JSON.stringify(body),
body: JSON.stringify(body),
};
// create url
const url = `${host}/api/claim/long-id`;
// return the request promise
return Request(url, params);
};
}
export function getShortId (host, name, claimId) {
export function getShortId(host, name, claimId) {
const url = `${host}/api/claim/short-id/${claimId}/${name}`;
return Request(url);
};
}
export function getClaimData (host, name, claimId) {
export function getClaimData(host, name, claimId) {
const url = `${host}/api/claim/data/${name}/${claimId}`;
return Request(url);
};
}
export function checkClaimAvailability (claim) {
export function checkClaimAvailability(claim) {
const url = `/api/claim/availability/${claim}`;
return Request(url);
}
export function getClaimViews (claimId) {
export function getClaimViews(claimId) {
const url = `/api/claim/views/${claimId}`;
return Request(url);
}
export function doAbandonClaim (claimId) {
export function doAbandonClaim(outpoint) {
const params = {
method : 'POST',
body : JSON.stringify({claimId}),
method: 'POST',
body: JSON.stringify({ outpoint }),
headers: new Headers({
'Content-Type': 'application/json',
}),

View file

@ -16,7 +16,7 @@ import EditPage from '@pages/EditPage';
const App = () => {
return (
<Switch>
<Route exact path='/' component={HomePage} />
<Route exact path='/' component={AboutPage} />
<Route exact path='/about' component={AboutPage} />
<Route exact path='/tos' component={TosPage} />
<Route exact path='/faq' component={FaqPage} />

View file

@ -22,14 +22,29 @@ export const makePublishRequestChannel = (fd, isUpdate) => {
xhr.upload.addEventListener('load', onLoad);
// set state change handler
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
const response = JSON.parse(xhr.response);
if ((xhr.status === 200) && response.success) {
emitter({success: response});
emitter(END);
} else {
emitter({error: new Error(response.message)});
emitter(END);
if (xhr.readyState === XMLHttpRequest.DONE) {
switch (xhr.status) {
case 413:
emitter({error: new Error("Unfortunately it appears this web server " +
"has been misconfigured, please inform the service administrators " +
"that they must set their nginx/apache request size maximums higher " +
"than their file size limits.")});
emitter(END);
break;
case 200:
var response = JSON.parse(xhr.response);
if (response.success) {
emitter({success: response});
emitter(END);
} else {
emitter({error: new Error(response.message)});
emitter(END);
}
break;
default:
emitter({error: new Error("Received an unexpected response from " +
"server: " + xhr.status)});
emitter(END);
}
}
};

View file

@ -1,32 +1,13 @@
import React from 'react';
import Row from '@components/Row';
import {Link} from 'react-router-dom';
const AboutSpeechDetails = () => {
return (
<div>
<Row>
<p className={'text--large'}>
<Link className={'link--primary'} to='/tos'>Terms of Service</Link>
<br />
<Link className={'link--primary'} to='/faq'>Frequently Asked Questions</Link>
</p>
</Row>
<Row>
<p className={'text--large'}>
Spee.ch is a media-hosting site that reads from and publishes content to the <a className='link--primary' href='https://lbry.com'>LBRY</a> blockchain.
</p>
<p className={'text--large'}>
Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the <a className='link--primary' href='https://lbry.com/get'>LBRY</a> network. This means that your images are stored in multiple locations without a single point of failure.
</p>
</Row>
<Row>
<h3>Contribute</h3>
<p className={'text--large'}>
If you have an idea for your own spee.ch-like site on top of LBRY, fork our <a className='link--primary' href='https://github.com/lbryio/spee.ch'>github repo</a> and go to town!
</p>
<p className={'text--large'}>
If you want to improve spee.ch, join our <a className='link--primary' href='https://chat.lbry.com'>discord channel</a> or solve one of our <a className='link--primary' href='https://github.com/lbryio/spee.ch/issues'>github issues</a>.
Spee.ch's journey may be on hold, but LBRY is still on mission. We'd like to thank all of our testers and early adopters for helping us explore this use case.
We're really excited about <a className='link--primary' href='https://lbry.tv' target='_blank'>lbry.tv</a> and can't wait to see you over there for a fully featured experience.
</p>
</Row>
</div>

View file

@ -5,14 +5,13 @@ const AboutSpeechOverview = () => {
return (
<div>
<Row>
<p className={'text--extra-large'}>Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.</p>
<p className={'text--extra-large'}>Lbry is no longer supporting Spee.ch. However, we're excited to show you <a className='link--primary' href='https://lbry.tv' target='_blank'>lbry.tv</a>!</p>
</Row>
<Row>
<div className={'text--large'}>
<a className='link--primary' target='_blank' href='https://twitter.com/spee_ch'>TWITTER</a><br/>
<a className='link--primary' target='_blank' href='https://github.com/lbryio/spee.ch'>GITHUB</a><br/>
<a className='link--primary' target='_blank' href='https://twitter.com/lbry'>TWITTER</a><br/>
<a className='link--primary' target='_blank' href='https://github.com/lbryio/'>GITHUB</a><br/>
<a className='link--primary' target='_blank' href='https://discord.gg/YjYbwhS'>DISCORD CHANNEL</a><br/>
<a className='link--primary' target='_blank' href='https://github.com/lbryio/spee.ch/blob/master/README.md'>DOCUMENTATION</a><br/>
</div>
</Row>
</div>

View file

@ -194,7 +194,7 @@ class AssetInfo extends React.Component {
<a
className={'link--primary'}
target='_blank'
href='https://lbry.com/dmca'
href={`https://lbry.com/dmca/${claimId}`}
>
Report
</a>

View file

@ -33,14 +33,14 @@ class NavigationLinks extends React.Component {
const { channelName, showPublish, closedRegistration } = this.props;
return (
<div className='navigation-links'>
{showPublish && <NavLink
className='nav-bar-link link--nav'
activeClassName='link--nav-active'
to='/'
exact
>
Publish
</NavLink>}
{/*{showPublish && <NavLink*/}
{/* className='nav-bar-link link--nav'*/}
{/* activeClassName='link--nav-active'*/}
{/* to='/'*/}
{/* exact*/}
{/*>*/}
{/* Publish*/}
{/*</NavLink>}*/}
<NavLink
className='nav-bar-link link--nav'
activeClassName='link--nav-active'
@ -48,24 +48,24 @@ class NavigationLinks extends React.Component {
>
About
</NavLink>
{ channelName ? (
<NavBarChannelOptionsDropdown
channelName={this.props.channelName}
handleSelection={this.handleSelection}
defaultSelection={this.props.channelName}
VIEW={VIEW}
LOGOUT={LOGOUT}
/>
) : !closedRegistration && (
<NavLink
id='nav-bar-login-link'
className='nav-bar-link link--nav'
activeClassName='link--nav-active'
to='/login'
>
Channel
</NavLink>
)}
{/*{ channelName ? (*/}
{/* <NavBarChannelOptionsDropdown*/}
{/* channelName={this.props.channelName}*/}
{/* handleSelection={this.handleSelection}*/}
{/* defaultSelection={this.props.channelName}*/}
{/* VIEW={VIEW}*/}
{/* LOGOUT={LOGOUT}*/}
{/* />*/}
{/*) : !closedRegistration && (*/}
{/* <NavLink*/}
{/* id='nav-bar-login-link'*/}
{/* className='nav-bar-link link--nav'*/}
{/* activeClassName='link--nav-active'*/}
{/* to='/login'*/}
{/* >*/}
{/* Channel*/}
{/* </NavLink>*/}
{/*)}*/}
</div>
);
}

View file

@ -7,6 +7,9 @@ class PublishDisabledMessage extends React.Component {
<div className={'publish-disabled-message'}>
<div className={'message'}>
<p className={'text--secondary'}>Publishing is currently disabled.</p>
<p className={'text--secondary'}>
Try <a className='link--primary' href='https://lbry.tv' target='_blank'>lbry.tv</a>
</p>
<p className={'text--secondary'}>{message}</p>
</div>
</div>

View file

@ -3,7 +3,7 @@ import ErrorPage from '@pages/ErrorPage';
import ShowAssetLite from '@pages/ShowAssetLite';
import ShowAssetDetails from '@pages/ShowAssetDetails';
import ShowChannel from '@pages/ShowChannel';
import { withRouter } from 'react-router-dom';
import { withRouter, Redirect } from 'react-router-dom';
import {
CHANNEL,
@ -15,15 +15,24 @@ import {
class ContentPageWrapper extends React.Component {
componentDidMount () {
const { onHandleShowPageUri, match, homeChannel } = this.props;
onHandleShowPageUri(homeChannel ? { claim: homeChannel } : match.params);
//onHandleShowPageUri(homeChannel ? { claim: homeChannel } : match.params);
}
componentWillReceiveProps (nextProps) {
if (nextProps.match.params !== this.props.match.params) {
this.props.onHandleShowPageUri(nextProps.match.params);
//this.props.onHandleShowPageUri(nextProps.match.params);
}
}
render () {
const { error, requestType } = this.props;
const { error, requestType, match } = this.props;
const { params } = match;
const { claim, identifier } = params;
if (identifier && claim) {
return <Redirect to={`https://lbry.tv/${identifier}/${claim}`} />;
} else if (identifier) {
// return <Redirect to={`https://lbry.tv/${identifier}/`} />
} else {
return <Redirect to={`https://lbry.tv/${claim}`} />;
}
if (error) {
return (
<ErrorPage error={error} />
@ -31,13 +40,13 @@ class ContentPageWrapper extends React.Component {
}
switch (requestType) {
case CHANNEL:
return <ShowChannel />;
// return <ShowChannel />;
case ASSET_LITE:
return <ShowAssetLite />;
// return <ShowAssetLite />;
case ASSET_DETAILS:
return <ShowAssetDetails />;
// return <ShowAssetDetails />;
case SPECIAL_ASSET:
return <ShowChannel />;
// return <ShowChannel />;
default:
return <p>loading...</p>;
}

View file

@ -5,17 +5,19 @@ import { updatePublishStatus, clearFile } from '../actions/publish';
import { removeAsset } from '../actions/show';
import { doAbandonClaim } from '../api/assetApi';
function * abandonClaim (action) {
function* abandonClaim(action) {
const { claimData, history } = action.data;
const { claimId } = claimData;
const { outpoint } = claimData;
const confirm = window.confirm('Are you sure you want to abandon this claim? This action cannot be undone.');
const confirm = window.confirm(
'Are you sure you want to abandon this claim? This action cannot be undone.'
);
if (!confirm) return;
yield put(updatePublishStatus(publishStates.ABANDONING, 'Your claim is being abandoned...'));
try {
yield call(doAbandonClaim, claimId);
yield call(doAbandonClaim, outpoint);
} catch (error) {
return console.log('abandon error:', error.message);
}
@ -25,6 +27,6 @@ function * abandonClaim (action) {
return history.push('/');
}
export function * watchAbandonClaim () {
export function* watchAbandonClaim() {
yield takeLatest(actions.ABANDON_CLAIM, abandonClaim);
};
}

View file

@ -1,6 +1,6 @@
# Configure your own spee.ch
_note: this guide assumes you have done the [quickstart](https://github.com/lbryio/spee.ch/blob/readme-update/README.md) or [fullstart](https://github.com/lbryio/spee.ch/blob/readme-update/fullstart.md) guide and have a working spee.ch server_
_note: this guide assumes you have done the [quickstart](https://github.com/lbryio/spee.ch/blob/master/README.md) or [fullstart](https://github.com/lbryio/spee.ch/blob/master/fullstart.md) guide and have a working spee.ch server_
## Custom Components
The components used by spee.ch are taken from the `client/` folder, but you can override those components by defining your own in the `site/custom/` folder.

170
package-lock.json generated
View file

@ -1729,7 +1729,7 @@
},
"util": {
"version": "0.10.3",
"resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz",
"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
"integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
"dev": true,
"requires": {
@ -1755,14 +1755,6 @@
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
"dev": true
},
"async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
"integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
"requires": {
"lodash": "^4.17.11"
}
},
"async-each": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
@ -1811,12 +1803,19 @@
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
},
"axios": {
"version": "0.18.0",
"resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
"integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
"version": "0.18.1",
"resolved": "http://registry.npmjs.org/axios/-/axios-0.18.1.tgz",
"integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==",
"requires": {
"follow-redirects": "^1.3.0",
"is-buffer": "^1.1.5"
"follow-redirects": "1.5.10",
"is-buffer": "^2.0.2"
},
"dependencies": {
"is-buffer": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
"integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw=="
}
}
},
"babel-eslint": {
@ -2617,6 +2616,7 @@
"resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
"integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
"dev": true,
"optional": true,
"requires": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
@ -3611,6 +3611,15 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"requires": {
"object-assign": "^4",
"vary": "^1"
}
},
"cosmiconfig": {
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz",
@ -3946,7 +3955,7 @@
"dependencies": {
"pify": {
"version": "2.3.0",
"resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true,
"optional": true
@ -3958,6 +3967,7 @@
"resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
"integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
"dev": true,
"optional": true,
"requires": {
"file-type": "^5.2.0",
"is-stream": "^1.1.0",
@ -3992,6 +4002,7 @@
"resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
"integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
"dev": true,
"optional": true,
"requires": {
"decompress-tar": "^4.1.1",
"file-type": "^5.2.0",
@ -4013,14 +4024,14 @@
"dependencies": {
"file-type": {
"version": "3.9.0",
"resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
"integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
"dev": true,
"optional": true
},
"get-stream": {
"version": "2.3.1",
"resolved": "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
"integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
"dev": true,
"optional": true,
@ -4031,7 +4042,7 @@
},
"pify": {
"version": "2.3.0",
"resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true,
"optional": true
@ -5147,7 +5158,7 @@
},
"external-editor": {
"version": "2.2.0",
"resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
"integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
"requires": {
"chardet": "^0.4.0",
@ -5382,7 +5393,8 @@
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
"integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
"dev": true
"dev": true,
"optional": true
},
"fill-range": {
"version": "4.0.0",
@ -5499,11 +5511,11 @@
}
},
"follow-redirects": {
"version": "1.5.7",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.7.tgz",
"integrity": "sha512-NONJVIFiX7Z8k2WxfqBjtwqMifx7X42ORLFrOZ2LTKGj71G3C0kfdyTqGqr8fx5zSX6Foo/D95dgGWbPUiwnew==",
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
"requires": {
"debug": "^3.1.0"
"debug": "=3.1.0"
}
},
"for-in": {
@ -5580,7 +5592,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"dev": true
"dev": true,
"optional": true
},
"fs-extra": {
"version": "5.0.0",
@ -5613,8 +5626,7 @@
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"fsevents": {
"version": "1.2.4",
@ -5636,7 +5648,8 @@
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
@ -6051,7 +6064,8 @@
"safe-buffer": {
"version": "5.1.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
@ -6107,6 +6121,7 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@ -6150,20 +6165,21 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"yallist": {
"version": "3.0.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
}
}
},
"fstream": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
"integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
"dev": true,
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
"integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
"requires": {
"graceful-fs": "^4.1.2",
"inherits": "~2.0.0",
@ -6237,7 +6253,7 @@
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
@ -6424,7 +6440,7 @@
},
"pify": {
"version": "2.3.0",
"resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true
}
@ -6517,16 +6533,21 @@
"dev": true
},
"handlebars": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz",
"integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==",
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
"integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==",
"requires": {
"async": "^2.5.0",
"neo-async": "^2.6.0",
"optimist": "^0.6.1",
"source-map": "^0.6.1",
"uglify-js": "^3.1.4"
},
"dependencies": {
"neo-async": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
"integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@ -6801,7 +6822,7 @@
},
"http-errors": {
"version": "1.6.3",
"resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
"requires": {
"depd": "~1.1.2",
@ -7702,9 +7723,9 @@
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"js-yaml": {
"version": "3.13.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz",
"integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==",
"version": "3.13.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
@ -8103,9 +8124,9 @@
}
},
"lodash": {
"version": "4.17.11",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
"version": "4.17.13",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.13.tgz",
"integrity": "sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA=="
},
"lodash.assign": {
"version": "4.2.0",
@ -8137,9 +8158,9 @@
"dev": true
},
"lodash.mergewith": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
"integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
"integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
"dev": true
},
"lodash.tail": {
@ -8382,7 +8403,7 @@
},
"load-json-file": {
"version": "1.1.0",
"resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true,
"requires": {
@ -8421,7 +8442,7 @@
},
"pify": {
"version": "2.3.0",
"resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true
},
@ -8593,9 +8614,9 @@
}
},
"mixin-deep": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
"integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
"integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
"dev": true,
"requires": {
"for-in": "^1.0.2",
@ -8982,7 +9003,7 @@
},
"semver": {
"version": "5.3.0",
"resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
"integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
"dev": true
}
@ -9075,7 +9096,7 @@
},
"chalk": {
"version": "1.1.3",
"resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
@ -9112,7 +9133,7 @@
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
@ -10093,17 +10114,6 @@
"resolved": false,
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"fstream": {
"version": "1.0.11",
"resolved": false,
"integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
"requires": {
"graceful-fs": "^4.1.2",
"inherits": "~2.0.0",
"mkdirp": ">=0.5 0",
"rimraf": "2"
}
},
"gauge": {
"version": "2.7.4",
"resolved": false,
@ -13858,7 +13868,6 @@
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
"requires": {
"glob": "^7.0.5"
},
@ -13867,7 +13876,6 @@
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@ -14025,7 +14033,7 @@
},
"load-json-file": {
"version": "1.1.0",
"resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true,
"requires": {
@ -14038,7 +14046,7 @@
},
"os-locale": {
"version": "1.4.0",
"resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
"dev": true,
"requires": {
@ -14067,7 +14075,7 @@
},
"pify": {
"version": "2.3.0",
"resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true
},
@ -14105,7 +14113,7 @@
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
@ -14241,7 +14249,7 @@
"dependencies": {
"commander": {
"version": "2.8.1",
"resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
"integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
"dev": true,
"optional": true,
@ -15161,6 +15169,7 @@
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
"integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
"dev": true,
"optional": true,
"requires": {
"bl": "^1.0.0",
"buffer-alloc": "^1.2.0",
@ -15423,7 +15432,8 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
"integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
"dev": true
"dev": true,
"optional": true
},
"to-fast-properties": {
"version": "2.0.0",
@ -16598,7 +16608,7 @@
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
@ -16700,7 +16710,7 @@
"dependencies": {
"async": {
"version": "1.0.0",
"resolved": "http://registry.npmjs.org/async/-/async-1.0.0.tgz",
"resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
"integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
}
}

View file

@ -36,11 +36,12 @@
"@fortawesome/fontawesome-svg-core": "^1.2.8",
"@fortawesome/free-solid-svg-icons": "^5.5.0",
"@fortawesome/react-fontawesome": "^0.1.3",
"axios": "^0.18.0",
"axios": "^0.18.1",
"bcrypt": "^3.0.3",
"body-parser": "^1.18.3",
"connect-multiparty": "^2.2.0",
"cookie-session": "^2.0.0-beta.3",
"cors": "^2.8.5",
"express": "^4.16.4",
"express-handlebars": "^3.0.0",
"express-http-context": "^1.2.0",
@ -52,7 +53,7 @@
"inquirer": "^5.2.0",
"ip": "^1.1.5",
"isbot": "^2.2.1",
"lodash": "^4.17.11",
"lodash": "^4.17.13",
"make-dir": "^1.3.0",
"mime-types": "^2.1.21",
"module-alias": "^2.1.0",

View file

@ -82,6 +82,7 @@ export default (db, table, sequelize) => ({
};
const selectWhere = {
...whereClause,
claim_type: 1,
publisher_id: channelClaimId,
};
return await table
@ -103,6 +104,7 @@ export default (db, table, sequelize) => ({
.findAll({
where: {
name: claimName,
claim_type: 1,
publisher_id: channelClaimId,
bid_state: { [sequelize.Op.or]: ['Controlling', 'Active', 'Accepted'] },
},
@ -201,6 +203,10 @@ export default (db, table, sequelize) => ({
}
return claimArray[0];
})
.catch(error => {
logger.verbose(`resolveClaim failed: ${error}`)
reject(error);
});
},
@ -210,6 +216,7 @@ export default (db, table, sequelize) => ({
.findAll({
where: {
name: claimName,
claim_type: 1,
publisher_id: channelId,
},
})

View file

@ -9,28 +9,28 @@ const authenticateUser = require('../publish/authentication.js');
*/
const claimAbandon = async (req, res) => {
const {claimId} = req.body;
const {user} = req;
const { outpoint } = req.body;
const { user } = req;
try {
const [channel, claim] = await Promise.all([
authenticateUser(user.channelName, null, null, user),
db.Claim.findOne({where: {claimId}}),
db.Claim.findOne({ where: { outpoint } }),
]);
if (!claim) throw new Error('That channel does not exist');
if (!channel.channelName) throw new Error('You don\'t own this channel');
if (!channel.channelName) throw new Error("You don't own this channel");
await abandonClaim({claimId});
const file = await db.File.findOne({where: {claimId}});
await abandonClaim({ outpoint });
const file = await db.File.findOne({ where: { outpoint } });
await Promise.all([
deleteFile(file.filePath),
db.File.destroy({where: {claimId}}),
db.Claim.destroy({where: {claimId}}),
db.File.destroy({ where: { outpoint } }),
db.Claim.destroy({ where: { outpoint } }),
]);
logger.debug(`Claim abandoned: ${claimId}`);
logger.debug(`Claim abandoned: ${outpoint}`);
res.status(200).json({
success: true,
message: `Claim with id ${claimId} abandonded`,
message: `Claim with outpoint ${outpoint} abandonded`,
});
} catch (error) {
logger.error('abandon claim error:', error);

View file

@ -64,18 +64,19 @@ const getClaimIdAndServeAsset = (
claimDataValues.outpoint ||
`${claimDataValues.transaction_hash_id}:${claimDataValues.vout}`;
logger.debug('Outpoint:', outpoint);
return db.Blocked.isNotBlocked(outpoint).then(() => {
return db.Blocked.isNotBlocked(outpoint)
// .then(() => {
// If content was found, is approved, and not blocked - log a view.
if (headers && headers['user-agent'] && /LBRY/.test(headers['user-agent']) === false) {
db.Views.create({
time: Date.now(),
isChannel: false,
claimId: claimDataValues.claim_id || claimDataValues.claimId,
publisherId: claimDataValues.publisher_id || claimDataValues.certificateId,
ip,
});
}
});
// if (headers && headers['user-agent'] && /LBRY/.test(headers['user-agent']) === false) {
// db.Views.create({
// time: Date.now(),
// isChannel: false,
// claimId: claimDataValues.claim_id || claimDataValues.claimId,
// publisherId: claimDataValues.publisher_id || claimDataValues.certificateId,
// ip,
// });
// }
// });
})
.then(() => {
return db.File.findOne({

View file

@ -20,10 +20,7 @@ const { setupBlockList } = require('./utils/blockList');
const speechPassport = require('./speechPassport');
const processTrending = require('./utils/processTrending');
const {
logMetricsMiddleware,
setRouteDataInContextMiddleware,
} = require('./middleware/logMetricsMiddleware');
const { setRouteDataInContextMiddleware } = require('./middleware/httpContextMiddleware');
const {
details: { port: PORT, blockListEndpoint },
@ -145,7 +142,7 @@ function Server() {
app[routeMethod](
routePath,
logMetricsMiddleware,
// logMetricsMiddleware,
setRouteDataInContextMiddleware(routePath, routeData),
...controllers
);

View file

@ -73,13 +73,14 @@ module.exports = {
});
});
},
async abandonClaim({ claimId }) {
logger.debug(`lbryApi >> Abandon claim "${claimId}"`);
async abandonClaim({ outpoint }) {
logger.debug(`lbryApi >> Abandon claim "${outpoint}"`);
const gaStartTime = Date.now();
const [txid, nout] = outpoint.split(':');
try {
const abandon = await axios.post(lbrynetUri, {
method: 'claim_abandon',
params: { claim_id: claimId },
method: 'stream_abandon',
params: { txid: txid, nout: Number(nout) },
});
sendGATimingEvent('lbrynet', 'abandonClaim', 'ABANDON_CLAIM', gaStartTime, Date.now());
return abandon.data;

View file

@ -5,11 +5,13 @@ const {
publishing: { publishingChannelWhitelist },
} = require('@config/siteConfig');
const ipBanFile = './site/config/ipBan.txt';
const ipWhitelist = './site/config/ipWhitelist.txt';
const forbiddenMessage =
'<h1>Forbidden</h1>If you are seeing this by mistake, please contact us using <a href="https://chat.lbry.com/">https://chat.lbry.com/</a>';
const maxPublishesInTenMinutes = 20;
let ipCounts = {};
let blockedAddresses = [];
let whitelistedAddresses = [];
if (fs.existsSync(ipBanFile)) {
const lineReader = require('readline').createInterface({
@ -23,9 +25,28 @@ if (fs.existsSync(ipBanFile)) {
});
}
// If a file called ipWhitelist.txt exists
// Please comment above each whitelisted IP why/who/when etc
// # Jim because he's awesome - January 2018
if (fs.existsSync(ipWhitelist)) {
const lineReader = require('readline').createInterface({
input: require('fs').createReadStream(ipWhitelist),
});
lineReader.on('line', line => {
if (line && line !== '' && line[0] !== '#') {
whitelistedAddresses.push(line);
}
});
}
const autoblockPublishMiddleware = (req, res, next) => {
let ip = (req.headers['x-forwarded-for'] || req.connection.remoteAddress).split(/,\s?/)[0];
if (whitelistedAddresses.indexOf(ip) !== -1) {
next();
return;
}
if (blockedAddresses.indexOf(ip) !== -1) {
res.status(403).send(forbiddenMessage);
res.end();
@ -44,7 +65,7 @@ const autoblockPublishMiddleware = (req, res, next) => {
}
}, 600000 /* 10 minute retainer */);
if (count === 10) {
if (count === maxPublishesInTenMinutes) {
logger.error(`Banning IP: ${ip}`);
blockedAddresses.push(ip);
res.status(403).send(forbiddenMessage);

View file

@ -0,0 +1,13 @@
const httpContext = require('express-http-context');
function setRouteDataInContextMiddleware(routePath, routeData) {
return function(req, res, next) {
httpContext.set('routePath', routePath);
httpContext.set('routeData', routeData);
next();
};
}
module.exports = {
setRouteDataInContextMiddleware,
};

View file

@ -25,6 +25,7 @@ const publishingConfig = require('../../controllers/api/config/site/publishing')
const getTorList = require('../../controllers/api/tor');
const getBlockedList = require('../../controllers/api/blocked');
const getOEmbedData = require('../../controllers/api/oEmbed');
const cors = require('cors');
export default {
// homepage routes
@ -43,10 +44,10 @@ export default {
'/api/claim/data/:claimName/:claimId' : { controller: [ torCheckMiddleware, claimData ] },
'/api/claim/get/:name/:claimId' : { controller: [ torCheckMiddleware, claimGet ] },
'/api/claim/list/:name' : { controller: [ torCheckMiddleware, claimList ] },
'/api/claim/long-id' : { method: 'post', controller: [ torCheckMiddleware, claimLongId ] }, // note: should be a 'get'
'/api/claim/publish' : { method: 'post', controller: [ torCheckMiddleware, autoblockPublishMiddleware, multipartMiddleware, autoblockPublishBodyMiddleware, claimPublish ] },
'/api/claim/update' : { method: 'post', controller: [ torCheckMiddleware, multipartMiddleware, claimUpdate ] },
'/api/claim/abandon' : { method: 'post', controller: [ torCheckMiddleware, multipartMiddleware, claimAbandon ] },
'/api/claim/long-id' : { method: 'post', controller: [ cors(), torCheckMiddleware, claimLongId ] }, // note: should be a 'get'
'/api/claim/publish' : { method: 'post', controller: [ cors(), torCheckMiddleware, autoblockPublishMiddleware, multipartMiddleware, autoblockPublishBodyMiddleware, claimPublish ] },
'/api/claim/update' : { method: 'post', controller: [ cors(), torCheckMiddleware, multipartMiddleware, claimUpdate ] },
'/api/claim/abandon' : { method: 'post', controller: [ cors(), torCheckMiddleware, multipartMiddleware, claimAbandon ] },
'/api/claim/resolve/:name/:claimId' : { controller: [ torCheckMiddleware, claimResolve ] },
'/api/claim/short-id/:longId/:name' : { controller: [ torCheckMiddleware, claimShortId ] },
'/api/claim/views/:claimId' : { controller: [ torCheckMiddleware, claimViews ] },
@ -55,7 +56,7 @@ export default {
// user routes
'/api/user/password/' : { method: 'put', controller: [ torCheckMiddleware, userPassword ] },
// configs
'/api/config/site/publishing' : { controller: [ torCheckMiddleware, publishingConfig ] },
'/api/config/site/publishing' : { controller: [ cors(), torCheckMiddleware, publishingConfig ] },
// tor
'/api/tor' : { controller: [ torCheckMiddleware, getTorList ] },
// blocked

View file

@ -2,6 +2,6 @@ module.exports = {
...require('./pages').default,
...require('./api').default,
...require('./auth').default,
...require('./assets').default,
// ...require('./assets').default,
...require('./fallback').default,
};

View file

@ -13,8 +13,10 @@ const awaitFileSize = (outpoint, size, interval, timeout) => {
function checkFileList() {
logger.debug('checkFileList');
return getFileListFileByOutpoint(outpoint).then(result => {
logger.debug('File List Result', result);
if (result[0]['completed'] === true || result[0]['written_bytes'] > size) {
const { items: fileInfos } = result;
const fileInfo = fileInfos[0];
logger.debug('File List Result', fileInfo);
if (fileInfo.completed === true || fileInfo.written_bytes > size) {
logger.debug('FILE READY');
return 'ready';
} else if (timeout !== 0 && Date.now() - start > timeout) {