Commit 3c8627e2 authored by Rob Colbert's avatar Rob Colbert

Merge branch 'develop' of https://code.gab.com/gab/social/gab-social into develop

app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb
parents b8a2baf9 a115471d
......@@ -3,7 +3,7 @@
class AboutController < ApplicationController
layout 'public'
before_action :set_instance_presenter, only: [:show, :more, :terms, :privacy, :investors, :guidelines]
before_action :set_instance_presenter, only: [:show, :more, :terms, :privacy, :investors, :dmca, :sales]
def show
if user_signed_in?
......@@ -17,6 +17,8 @@ class AboutController < ApplicationController
def terms; end
def privacy; end
def investors; end
def dmca; end
def sales; end
private
......
......@@ -4,74 +4,52 @@ class Api::V1::Statuses::FavouritedByAccountsController < Api::BaseController
include Authorization
before_action -> { authorize_if_got_token! :read, :'read:accounts' }
before_action :set_status
after_action :insert_pagination_headers
respond_to :json
def index
# @accounts = load_accounts
# render json: @accounts, each_serializer: REST::AccountSerializer
render json: {}, status: :ok
end
private
def load_accounts
default_accounts.merge(paginated_favourites).to_a
#
end
def default_accounts
Account
.includes(:favourites, :account_stat)
.references(:favourites)
.where(favourites: { status_id: @status.id })
#
end
def paginated_favourites
Favourite.paginate_by_max_id(
limit_param(DEFAULT_ACCOUNTS_LIMIT),
params[:max_id],
params[:since_id]
)
end
def insert_pagination_headers
set_pagination_headers(next_path, prev_path)
#
end
def next_path
if records_continue?
api_v1_status_favourited_by_index_url pagination_params(max_id: pagination_max_id)
end
#
end
def prev_path
unless @accounts.empty?
api_v1_status_favourited_by_index_url pagination_params(since_id: pagination_since_id)
end
#
end
def pagination_max_id
@accounts.last.favourites.last.id
#
end
def pagination_since_id
@accounts.first.favourites.first.id
#
end
def records_continue?
@accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
#
end
def set_status
@status = Status.find(params[:status_id])
authorize @status, :show?
rescue GabSocial::NotPermittedError
# Reraise in order to get a 404 instead of a 403 error code
raise ActiveRecord::RecordNotFound
#
end
def pagination_params(core_params)
params.slice(:limit).permit(:limit).merge(core_params)
#
end
end
......@@ -16,12 +16,18 @@ class Settings::ProfilesController < Settings::BaseController
end
def update
if UpdateAccountService.new.call(@account, account_params)
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
redirect_to settings_profile_path, notice: I18n.t('generic.changes_saved_msg')
# if verified and display_name is different, return flash error and redirect back
if @account.is_verified && @account.display_name != params[:account][:display_name]
flash[:alert] = 'Unable to change Display name for verified account'
redirect_to settings_profile_path
else
@account.build_fields
render :show
if UpdateAccountService.new.call(@account, account_params)
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
redirect_to settings_profile_path, notice: I18n.t('generic.changes_saved_msg')
else
@account.build_fields
render :show
end
end
end
......
......@@ -262,7 +262,7 @@ class StatusActionBar extends ImmutablePureComponent {
</div>
<div className='status__action-bar__counter'>
<IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} />
{favoriteCount !== 0 && <Link to={`/${status.getIn(['account', 'acct'])}/posts/${status.get('id')}/favorites`} className='detailed-status__link'>{favoriteCount}</Link>}
{favoriteCount !== 0 && <span className='detailed-status__link'>{favoriteCount}</span>}
</div>
{shareButton}
......
......@@ -37,13 +37,11 @@ const messages = defineMessages({
showReblogs: { id: 'account.show_reblogs', defaultMessage: 'Show reposts from @{name}' },
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' },
mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' },
endorse: { id: 'account.endorse', defaultMessage: 'Feature on profile' },
unendorse: { id: 'account.unendorse', defaultMessage: 'Don\'t feature on profile' },
add_or_remove_from_list: { id: 'account.add_or_remove_from_list', defaultMessage: 'Add or Remove from lists' },
admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
});
......@@ -118,7 +116,6 @@ class Header extends ImmutablePureComponent {
menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences' });
menu.push(null);
menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' });
menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' });
menu.push(null);
menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes' });
menu.push({ text: intl.formatMessage(messages.blocks), to: '/blocks' });
......@@ -132,7 +129,6 @@ class Header extends ImmutablePureComponent {
}
menu.push({ text: intl.formatMessage(account.getIn(['relationship', 'endorsed']) ? messages.unendorse : messages.endorse), action: this.props.onEndorseToggle });
menu.push({ text: intl.formatMessage(messages.add_or_remove_from_list), action: this.props.onAddToList });
menu.push(null);
}
......
......@@ -10,7 +10,6 @@ import { meUsername } from 'gabsocial/initial_state';
const messages = defineMessages({
profile: { id: 'account.profile', defaultMessage: 'Profile' },
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' },
......@@ -44,7 +43,6 @@ class ActionBar extends React.PureComponent {
let menu = [];
menu.push({ text: intl.formatMessage(messages.profile), to: `/${meUsername}` });
menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' });
menu.push(null);
menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' });
menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes' });
......@@ -53,7 +51,7 @@ class ActionBar extends React.PureComponent {
menu.push({ text: intl.formatMessage(messages.filters), to: '/filters' });
menu.push(null);
menu.push({ text: intl.formatMessage(messages.keyboard_shortcuts), action: this.handleHotkeyClick });
menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences', newTab: true });
menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences' });
menu.push({ text: intl.formatMessage(messages.logout), href: '/auth/sign_out', isLogout: true });
return (
......
......@@ -168,25 +168,14 @@ export default class DetailedStatus extends ImmutablePureComponent {
);
}
if (this.context.router) {
favouriteLink = (
<Link to={`/${status.getIn(['account', 'acct'])}/posts/${status.get('id')}/favorites`} className='detailed-status__link'>
<Icon id='star' />
<span className='detailed-status__favorites'>
<FormattedNumber value={status.get('favourites_count')} />
</span>
</Link>
);
} else {
favouriteLink = (
<a href={`/interact/${status.get('id')}?type=favourite`} className='detailed-status__link' onClick={this.handleModalLink}>
<Icon id='star' />
<span className='detailed-status__favorites'>
<FormattedNumber value={status.get('favourites_count')} />
</span>
</a>
);
}
favouriteLink = (
<span className='detailed-status__link'>
<Icon id='star' />
<span className='detailed-status__favorites'>
<FormattedNumber value={status.get('favourites_count')} />
</span>
</span>
);
return (
<div style={outerStyle}>
......
......@@ -19,13 +19,14 @@ const mapDispatchToProps = (dispatch) => ({
const LinkFooter = ({ onOpenHotkeys, account }) => (
<div className='getting-started__footer'>
<ul>
{(invitesEnabled && account) && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>}
{(invitesEnabled && account) && <li><a href='/invites'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>}
{account && <li><a href='#' onClick={onOpenHotkeys}><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></a> · </li>}
{account && <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li>}
<li><a href='/about'><FormattedMessage id='navigation_bar.info' defaultMessage='About' /></a> · </li>
<li><a href='/settings/applications' target='_blank'><FormattedMessage id='getting_started.developers' defaultMessage='Developers' /></a> · </li>
<li><a href='/about/guidelines'><FormattedMessage id='getting_started.guidelines' defaultMessage='Guidelines' /></a> · </li>
<li><a href='/settings/applications'><FormattedMessage id='getting_started.developers' defaultMessage='Developers' /></a> · </li>
<li><a href='/about/tos'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of Service' /></a> · </li>
<li><a href='/about/dmca'><FormattedMessage id='getting_started.dmca' defaultMessage='DMCA' /></a> · </li>
<li><a href='/about/sales'><FormattedMessage id='getting_started.terms_of_sale' defaultMessage='Terms of Sale' /></a> · </li>
<li><a href='/about/privacy'><FormattedMessage id='getting_started.privacy' defaultMessage='Privacy Policy' /></a></li>
{account && <li> · <a href='/auth/sign_out' data-method='delete'><FormattedMessage id='navigation_bar.logout' defaultMessage='Logout' /></a></li>}
</ul>
......
......@@ -49,12 +49,10 @@ import {
FollowRequests,
GenericNotFound,
FavouritedStatuses,
ListTimeline,
Blocks,
DomainBlocks,
Mutes,
PinnedStatuses,
Lists,
Search,
Explore,
Groups,
......@@ -190,8 +188,8 @@ class SwitchingColumnsArea extends React.PureComponent {
<WrappedRoute path='/tags/:id' component={HashtagTimeline} content={children} />
<WrappedRoute path='/lists' layout={LAYOUT.DEFAULT} component={Lists} content={children} />
<WrappedRoute path='/list/:id' layout={LAYOUT.HOME} component={ListTimeline} content={children} />
<Redirect from='/lists' to='/home' />
<Redirect from='/list' to='/home' />
<WrappedRoute path='/notifications' layout={LAYOUT.DEFAULT} component={Notifications} content={children} />
......@@ -232,9 +230,6 @@ class SwitchingColumnsArea extends React.PureComponent {
<Redirect from='/@:username/posts/:statusId/reblogs' to='/:username/posts/:statusId/reblogs' />
<WrappedRoute path='/:username/posts/:statusId/reblogs' layout={LAYOUT.STATUS} component={Reblogs} content={children} />
<Redirect from='/@:username/posts/:statusId/favorites' to='/:username/posts/:statusId/favorites' />
<WrappedRoute path='/:username/posts/:statusId/favorites' layout={LAYOUT.STATUS} component={Favourites} content={children} />
<WrappedRoute layout={LAYOUT.EMPTY} component={GenericNotFound} content={children} />
</Switch>
);
......
......@@ -5,6 +5,6 @@ export const shortNumberFormat = number => {
if (number < 1000) {
return <FormattedNumber value={number} />;
} else {
return <Fragment><FormattedNumber value={number / 1000} maximumFractionDigits={1} />K</Fragment>;
return <span><FormattedNumber value={number / 1000} maximumFractionDigits={1} />K</span>;
}
};
......@@ -2571,7 +2571,8 @@ a.status-card.compact:hover {
}
.column-header__collapsible-inner {
background: #e6e6e6;
background: #3f3f3f;
body.theme-gabsocial-light & {background: #e6e6e6;}
padding: 15px;
}
......
......@@ -108,7 +108,7 @@
padding: 16px 22px;
text-align: center;
@media screen and (max-width:1190px) {padding: 16px;}
span {
> span {
display: block;
&:first-of-type {
color: $primary-text-color;
......
......@@ -14,6 +14,10 @@
display: block;
height: 112px;
width: 100%;
background: lighten($gab-background-container, 4%);
body.theme-gabsocial-light & {
background: darken($gab-background-container-light, 4%);
}
img {
display: block;
......@@ -36,7 +40,7 @@
height: 82px;
border: 6px solid $gab-background-base;
body.theme-gabsocial-light & {border: 6px solid $gab-background-base-light;}
background-size: 82px 82px;
background-size: cover;
}
}
......
......@@ -180,7 +180,7 @@ p {
p {
font-size: 15px;
line-height: 23px;
color: $ui-primary-color;
color: #fff;
mso-line-height-rule: exactly;
text-rendering: optimizelegibility;
}
......@@ -514,7 +514,7 @@ ul {
color: lighten($ui-base-color, 26%);
span {
color: $ui-primary-color;
color: #fff;
}
}
}
......
- content_for :page_title do
= t('terms.title', instance: site_hostname)
.content
.box-widget
.rich-formatting
%h1 GAB AI INC
%h2 COPYRIGHT POLICY
%h3 Reporting Claims of Copyright Infringement
%p We take claims of copyright infringement seriously. We will respond to notices of alleged copyright infringement that comply with applicable law. If you believe any materials accessible on or from this site (the “Website”) infringe your copyright, you may request removal of those materials (or access to them) from the Website by submitting written notification to our copyright agent designated below. In accordance with the Online Copyright Infringement Liability Limitation Act of the Digital Millennium Copyright Act (17 U.S.C. § 512) (”DMCA”), the written notice (the “DMCA Notice”) must include substantially the following:
%ul
%li Your physical or electronic signature.
%li Identification of the copyrighted work you believe to have been infringed or, if the claim involves multiple works on the Website, a representative list of such works.
%li Identification of the material you believe to be infringing in a sufficiently precise manner to allow us to locate that material.
%li Adequate information by which we can contact you (including your name, postal address, telephone number, and, if available, email address).
%li A statement that you have a good faith belief that use of the copyrighted material is not authorized by the copyright owner, its agent, or the law.
%li A statement that the information in the written notice is accurate.
%li A statement, under penalty of perjury, that you are authorized to act on behalf of the copyright owner.
%p Please send copyright notices to
%p
Gab AI Inc
%br
700 N State Street
%br
Clarks Summit, PA 18411
%p Or via any contact form at the bottom of this page.
%p If you fail to comply with all of the requirements of Section 512(c)(3) of the DMCA, your DMCA Notice may not be effective.
%p Please be aware that if you knowingly materially misrepresent that material or activity on the Website is infringing your copyright, you may be held liable for damages (including costs and attorneys’ fees) under Section 512(f) of the DMCA.
%h3 Counter Notification Procedures
%p If you believe that material you posted on the Website was removed or access to it was disabled by mistake or misidentification, you may file a counter notification with us (a “Counter Notice”) by submitting written notification to our DMCA address (above) Pursuant to the DMCA, the Counter Notice must include substantially the following:
%ul
%li Your physical or electronic signature.
%li An identification of the material that has been removed or to which access has been disabled and the location at which the material appeared before it was removed or access disabled.
%li Adequate information by which we can contact you (including your name, postal address, telephone number, and, if available, email address).
%li A statement under penalty of perjury by you that you have a good faith belief that the material identified above was removed or disabled as a result of a mistake or misidentification of the material to be removed or disabled.
%li A statement that you will consent to the jurisdiction of the Federal District Court for the judicial district in which your address is located (or if you reside outside the United States for any judicial district in which the Website may be found) and that you will accept service from the person (or an agent of that person) who provided the Website with the complaint at issue.
%p The DMCA allows us to restore the removed content if the party filing the original DMCA Notice does not file a court action against you within ten business days of receiving the copy of your Counter Notice.
%p Please be aware that if you knowingly materially misrepresent that material or activity on the Website was removed or disabled by mistake or misidentification, you may be held liable for damages (including costs and attorneys’ fees) under Section 512(f) of the DMCA.
%h3 Repeat Infringers
%p It is our policy in appropriate circumstances to disable and/or terminate the accounts of users who are repeat infringers.
%hr
= mail_to 'support@gab.com'
- content_for :page_title do
= t('terms.title', instance: site_hostname)
.content
.box-widget
.rich-formatting= @instance_presenter.site_terms.html_safe.presence || t('terms.body_html')
......@@ -3,4 +3,11 @@
.content
.box-widget
.rich-formatting= @instance_presenter.site_terms.html_safe.presence || t('terms.body_html')
.rich-formatting
%h2 Investors
%p
= link_to 'Invest in Gab', 'https://invest.gab.com'
%p
= link_to '2018 Annual Report', 'https://www.sec.gov/Archives/edgar/data/1709244/000114420419021378/tv519744_annualreport.pdf'
%p
= link_to '2017 Annual Report', 'https://www.sec.gov/Archives/edgar/data/1709244/000170924418000001/GAB_-_Annual_Report_-_2018.pdf'
......@@ -18,3 +18,4 @@
%p Gab Social is a fresh take on one of the Internet's most popular applications: social networking. Originally forked from the Mastodon project, Gab's codebase is free and open-source, licensed under the GNU Affero General Public License version 3 (AGPL3).
%p As a result, you, the user, have a choice when using Gab Social: you can either have an account on Gab.com, or, if you don't like what we're doing on Gab.com or simply want to manage your own experience, you can spin up your own Gab Social server that you control, that allows you to communicate with millions of users on their own federated servers from around the world, including users on Gab.
%p Gab.com strives to be the home of free speech online. We work on Gab Social 100% of the time as our full-time jobs. We positively encourage you to either join us on Gab.com or to spin up your own Gab Social server that you control to help take back control of the Web for the People.
= link_to "https://code.gab.com/gab/social/gab-social", "https://code.gab.com/gab/social/gab-social"
......@@ -3,4 +3,127 @@
.content
.box-widget
.rich-formatting= @instance_presenter.site_terms.html_safe.presence || t('terms.body_html')
.rich-formatting
%h1 GAB AI INC
%h2 PRIVACY POLICY
%h3 DATE: 24 JUNE 2019
%p GAB AI INC (”Company” or “We”) respect your privacy and are committed to protecting it through our compliance with this policy.
%p
This policy describes the types of information we may collect from you or that you may provide when you visit the website
= link_to 'GAB.COM', 'https://gab.com'
,
= link_to 'DISSENTER.COM', 'https://dissenter.com'
and any other online properties of Gab AI Inc (each a “Website”) and our practices for collecting, using, maintaining, protecting, and disclosing that information.
%p This policy applies to information we collect:
%p On the Website.
%p In email, text, and other electronic messages between you and this Website.
%p Through mobile and desktop applications you download from this Website, which provide dedicated non-browser-based interaction between you and this Website.
%p When you interact with our advertising and applications on third-party websites and services, if those applications or advertising include links to this policy.
%p It does not apply to information collected by:
%ul
%li Us offline or through any other means, including on any other website operated by Company or any third party (including our affiliates and subsidiaries); or
%li Any third party (including our affiliates and subsidiaries), including through any application or content (including advertising) that may link to or be accessible from from the Website.
%li Please read this policy carefully to understand our policies and practices regarding your information and how we will treat it. If you do not agree with our policies and practices, your choice is not to use our Website. By accessing or using this Website, you agree to this privacy policy. This policy may change from time to time (see Changes to our Privacy Policy, below). Your continued use of this Website after we make changes is deemed to be acceptance of those changes, so please check the policy periodically for updates.
%h3 Children Under the Age of 18
%p Our Website is not intended for children under 18 years of age. No one under age 18 may provide any information to or on the Website. We do not knowingly collect personal information from children under 18. If you are under 18, do not use or provide any information on this Website, register on the Website, make any purchases through the Website, use any of the interactive or public comment features of this Website, or provide any information about yourself to us, including your name, address, telephone number, email address, or any screen name or user name you may use. If we learn we have collected or received personal information from a child under 18 without verification of parental consent, we will delete that information and any associated accounts. If you believe we might have any information from or about a child under 18, please contact us at support [at] gab [dot] com.
%p California residents under 16 years of age may have additional rights regarding the collection and sale of their personal information. Please see Your California Privacy Rights (below) for more information.
%h3 Information We Collect About You and How We Collect It
%p We collect several types of information from and about users of our Website, including information:
%ul
%li By which you may be personally identified, such as an e-mail address (”personal information”);
%li That is about you but individually does not identify you, such as the content of your user profile; and/or
%li About your internet connection, the equipment you use to access our Website, and usage details.
%ul
%li We collect this information:
%li Directly from you when you provide it to us.
%li Automatically as you navigate through the site. Information collected automatically may include usage details and IP addresses.
%li From third parties, for example, our business partners.
%h3 Information You Provide to Us
%p The information we collect on or through our Website may include:
%p Information that you provide by filling in forms on our Website. This includes information provided at the time of registering to use our Website, subscribing to our service, posting material, or requesting further services. We may also ask you for information when you report a problem with our Website.
%p Records and copies of your correspondence (including email addresses), if you contact us.
%p Details of transactions you carry out through our Website and of the fulfillment of your orders. You may be required to provide financial information before placing an order through our Website.
%p You also may provide information to be published or displayed (hereinafter, “posted”) on public areas of the Website, or transmitted to other users of the Website or third parties (collectively, “User Contributions”). The overwhelming majority of User Contributions are public and may be seen by any person who navigates to them. Your User Contributions are posted on and transmitted to others at your own risk. Although you may set certain privacy settings for such information by logging into your account profile, please be aware that no security measures are perfect or impenetrable. Additionally, we cannot control the actions of other users of the Website with whom you may choose to share your User Contributions. Therefore, we cannot and do not guarantee that your User Contributions will not be viewed by unauthorized persons.
%h3 Information We Collect Through Automatic Data Collection
%p As you navigate through and interact with our Website, we may use automatic data collection technologies to collect certain information about your equipment, browsing actions, and patterns, including:
%ul
%li Details of your visits to our Website, including traffic data, logs, and other communication data and the resources that you access and use on the Website.
%li Information about your computer and internet connection, including your IP address, operating system, and browser type.
%p The information we collect automatically may be only statistical data and may not include personal information. It helps us to improve our Website and to deliver a better and more personalized service, including by enabling us to:
%ul
%li Estimate our audience size and usage patterns.
%li Store information about your preferences, allowing us to customize our Website according to your individual interests.
%li Speed up your searches.
%li Recognize you when you return to our Website.
%p The technologies we use for this automatic data collection may include:
%ul
%li Cookies (or browser cookies). A cookie is a small file placed on the hard drive of your computer. You may refuse to accept browser cookies by activating the appropriate setting on your browser. However, if you select this setting you may be unable to access certain parts of our Website. Unless you have adjusted your browser setting so that it will refuse cookies, our system will issue cookies when you direct your browser to our Website.
%li We do not collect personal information automatically, but we may tie this information to personal information about you that we collect from other sources or you provide to us.
%h3 How We Use Your Information
%p We use information that we collect about you or that you provide to us, including any personal information:
%ul
%li To present our Website and its contents to you.
%li To provide you with information about our products or services.
%li To fulfill any other purpose for which you provide it.
%li To provide you with notices about your account, including expiration and renewal notices.
%li To carry out our obligations and enforce our rights arising from any contracts entered into between you and us, including for billing and collection.
%li To notify you about changes to our Website or any products or services we offer or provide though it.
%li To allow you to participate in interactive features on our Website.
%li In any other way we may describe when you provide the information.
%li For any other purpose with your consent.
%p We may also use your information to contact you about our own and third-parties’ goods and services that may be of interest to you.
%h3 Disclosure of Your Information
%p We may disclose aggregated information about our users, and information that does not identify any individual, without restriction.
%p It is the policy of the Company to not provide any user data to any person unless compelled by a court order issued by a U.S. court, except in cases of life-threatening emergency. The Company reserves the right to change or deviate from this policy at any time, in its sole and absolute discretion, with or without notice to you.
%p We may disclose personal information that we collect or you provide as described in this privacy policy:
%ul
%li To our subsidiaries and affiliates.
%li To contractors, service providers, and other third parties we use to support our business and who are bound by contractual obligations to keep personal information confidential and use it only for the purposes for which we disclose it to them.
%li To a buyer or other successor in the event of a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Gab AI Inc’s assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which personal information held by Gab AI Inc about our Website users is among the assets transferred.
%li To fulfill the purpose for which you provide it.
%li For any other purpose disclosed by us when you provide the information.
%li With your consent.
%li We may also disclose your personal information:
%li To comply with any court order, law, or legal process, including to respond to any government or regulatory request.
%li To enforce or apply our terms of use and sale and other agreements, including for billing and collection purposes.
%li If we believe disclosure is necessary or appropriate to protect the rights, property, or safety of Gab AI Inc, our employees, our customers, or any other person.
%h3 Accessing, Correcting and Deleting Your Information
%p You can review and change your personal information by logging into the Website and visiting your account profile page.
%p You may also send us an email at support [at] gab [dot] com to request access to, correct or delete any personal information that you have provided to us. We cannot delete your personal information except by also deleting your user account. We may not accommodate a request to change information if we believe the change would violate any law or legal requirement or cause the information to be incorrect.
%p If you delete your User Contributions from the Website, copies of your User Contributions may remain viewable in cached and archived pages, or might have been copied or stored by other Website users. Proper access and use of information provided on the Website, including User Contributions, is governed by our Terms of Use.
%h3 Data Security
%p We have implemented measures designed to secure your personal information from accidental loss and from unauthorized access, use, alteration, and disclosure. All information you provide to us is stored on our secure servers behind firewalls. Any payment transactions will be encrypted using SSL.
%p The safety and security of your information also depends on you. Most information on the Website is public. Where we have given you (or where you have chosen) a password for access to certain parts of our Website, you are responsible for keeping this password confidential. We ask you not to share your password with anyone. We urge you to be careful about giving out information in public areas of the Website like message boards. The information you share in public areas may be viewed by any user of the Website, whether that user is registered on the site or not.
%p Unfortunately, the transmission of information via the internet is not completely secure. Although we do our best to protect your personal information, we cannot guarantee the security of your personal information transmitted to our Website. Any transmission of personal information is at your own risk. We are not responsible for circumvention of any privacy settings or security measures contained on the Website.
%h3 Changes to Our Privacy Policy
%p It is our policy to post any changes we make to our privacy policy on this page with a notice that the privacy policy has been updated on the Website home page. If we make material changes to how we treat our users’ personal information, we will notify you through a notice on the Website home page. The date the privacy policy was last revised is identified at the top of the page. You are responsible for ensuring we have an up-to-date active and deliverable email address for you, and for periodically visiting our Website and this privacy policy to check for any changes.
%h3 Contact Information
%p To ask questions or comment about this privacy policy and our privacy practices, contact us at
%p
Gab AI Inc
%br
700 N State Street
%br
Clarks Summit, PA 18411
%p Or by any contact form at the bottom of this page.
%hr
= mail_to 'support@gab.com'
- content_for :page_title do
= t('terms.title', instance: site_hostname)
.content
.box-widget
.rich-formatting
%h2 Terms of Sale
%p Gab AI Inc (“We” or “Gab”) hereby allow you to access certain premium features or content in exchange for a one-time or recurring fee, as applicable to the relevant features or content, such as our “GabPro” enhanced social media offering (collectively, each a “Paid Service” and collectively the "Paid Services"). Your transactions and any other use of the Paid Services are subject to these Gab Paid Service Terms of Service ("Terms”).
%h3 1. Your Acceptance
%p By using a Paid Service, you signify your agreement to (1) these Terms of Sale; and (2) Gab AI Inc’s Terms of Service, Privacy Notice, and Copyright Notice, and all other terms and conditions that generally apply to the Website (as such term is defined in the Terms of Service).  Please read the Terms carefully. If you do not understand the Terms, or do not accept any part of them, then you may not use the Paid Services.
%p Each time you place an order for a Paid Service (including when you order individual subscriptions or items of content), you enter into a separate contract for services on these Terms. When you complete a purchase, you signify that you wish to enter into a binding contract for the provision of the applicable Paid Services.
%h3 2. Payment, Refund and Cancellation Policy
%p Gab accepts payment via the current payment method indicated prior to purchase, which may include Bitcoin and/or any other form of payment that we make available to you from time to time. You must tender valid payment or have a valid accepted form of payment on file in order to purchase Paid Services or participate in free trial offers or other free offers related to the Paid Services. You agree to abide by any relevant Terms of Service or other legal agreement, whether with Gab or a third party, that governs your use of a given payment processing method. Prices for any Paid Service may change at any time, and Gab does not provide price protection or refunds in the event of a price reduction or promotional offering. You agree to pay for any Paid Service that you order. Gab will charge your credit card or other form of payment for the price listed on the relevant Paid Service offer, along with any additional amounts relating to applicable taxes, bank fees and currency fluctuations. If you purchase any automatically renewing subscriptions, you agree that Gab will charge the payment method on file on the first day of each billing period for the relevant subscription, and if the payment method on file becomes invalid due to an expired credit card or other similar reason and we are unable to charge you on the next billing period, Gab reserves the right to immediately revoke your access to any Paid Service you have ordered until you update your payment method. If you fail to update your payment method within a reasonable amount of time, Gab may cancel your subscription.
%p If Gab is required to collect or pay any taxes in connection with your purchase of a Paid Service, such taxes will be charged to you at the time of each purchase transaction. Additionally, if required by law, you are responsible for reporting and paying certain taxes in connection with your purchase and use of a Paid Service. Such taxes may include duties, customs fees, or other taxes (other than income tax), along with any related penalties or interest, as applicable to your purchase or country of purchase.
%p
%b REFUNDS:
all purchases are final.
%p
%b SUBSCRIPTION CANCELLATIONS:
you purchase a subscription to a Paid Service that automatically renews, you may cancel the subscription any time before the end of the current billing period and the cancellation will take effect on the next billing period. You will retain access to the Paid Service from the time you cancel until the start of the next billing period, and will not receive a refund or credit for any remaining days in your current billing period.
%p
%b FREE TRIALS:
Gab may offer free trials to new Paid Service subscribers. If you purchase a subscription to a Paid Service that includes a free trial, you will receive free access to such Paid Service for the duration of the free trial period. At the end of the applicable free trial period, you will be charged the price of the subscription and will continue to be charged until you cancel your subscription. To avoid any charges, you must cancel before the end of the free trial period.
%h3 3. Accessing Paid Services.
%p Certain types of Paid Services may require you to use a device that meets the system and compatibility requirements for such Paid Service, which may change from time to time. You shall have sole responsibility for obtaining a device which satisfies those requirements.
%h3 4. License
%p Your use of the Paid Services must be only for personal, non-commercial use. You agree not to use any Paid Service, in whole or in part in connection with any public presentation even if no fee is charged (except where such use would not constitute a copyright infringement). You are receiving a non-exclusive license to access the Paid Service and all rights, title and interest in the Paid Services (including any content offered through the Paid Services) not expressly granted to you in these Terms are reserved by Gab and its licensors. If Gab reasonably determines that you violated any of the terms and conditions of the Paid Service Terms, your rights under this Section 4 will immediately terminate and Gab may terminate your access to the Paid Service and/or your Gab account without notice and without refund to you.
%h3 5. Restrictions
%p When you use the Paid Service, you may not (or attempt to):
%ul
%li violate the Terms of Service;
%li use the Paid Service in an illegal manner or for an illegal purpose;
%li share your account password with someone else to allow them to access any Paid Service that such person did not order;
%li copy, sell, rent, or sublicense the Paid Services to any third party;
%li circumvent, reverse-engineer, modify, disable, or otherwise tamper with any se