Commit 5176ede4 authored by Dank Gabs's avatar Dank Gabs

Merge branch 'develop' into styling/patch_fixes_for_theme_colors

parents 5cd0a404 a0a1c8d1
Authors
=======
Gab Social is available on our self-hosted
[GitLab](https://code.gab.com/gab/social/gab-social). And, that's where we have
to stop.
Gab Social by Gab.com is available on our self-hosted GitLab.
Gab does not publicly disclose the members of our team or their contributions to
this software. All Gab contributions should be regarded as anonymous.
## General Statements
The list of contributors from the
[Mastadon](https://github.com/tootsuite/mastodon) project has been removed from
the Gab Social fork of Mastodon to entirely prevent any misinterpretation of our
fork.
## General statements
The Gab Social fork is not endorsed by the Mastadon team. Gab is not receiving
support from the Mastodon team and did not request it.
There has been no communication between the Mastadon and Gab teams regarding
the Gab Social fork.
The [Gab Social](https://code.gab.com/gab/social/gab-social) fork is not endorsed by the Mastodon team. Gab is not receiving support from the Mastodon team and has not requested it. There has been no communication between the Mastodon and Gab teams regarding the Gab Social fork.
## Acknowledgement of accomplishments
Gab is grateful for the work performed by the Mastodon team. Their
accomplishments have inspired Gab to completely open the platform, federate the
social network, and take other steps forward in terms of user privacy, user data
control, and trust.
Gab is grateful for the work performed by the [Mastadon](https://github.com/tootsuite/mastodon) team. Their accomplishments have inspired Gab to completely open the platform, federate the social network, and take other steps forward in terms of user privacy, user data control, user freedom, and trust.
Our hope is that some day circumstances will allow a comprehensive list of
contributors to be displayed for this project because a lot of work went into
this system and it was done by a large number of people who deserve credit for
their accomplishments.
\ No newline at end of file
Our hope is that some day circumstances will allow a comprehensive list of contributors to be displayed for this project from both the Gab and Mastodon communities, because a lot of work has gone into, and will continue to go into, this system, which we believe will change the world, and for which the authors of contributions to this codebase deserve due credit.
\ No newline at end of file
......@@ -2,7 +2,7 @@
Gab Social is an open source and fully decentralized social network powered by the Gab Platform. It is the new social network of Gab.com. This change was made to further Gab's committment to it's users trust and privacy online. And, by offering decentralization and federation, Gab further demonstrates a lack of interest in the ownership of your data.
The Gab Social project is based on the [Gab Social](https://code.gab.com/gab/social/gab-social) project, and is licensed under the terms and conditions of AGPL-3.0. While we will be keeping this license, over time we will be keeping less and less of the original project's source code and approach.
The Gab Social project is based on the [Mastodon](https://github.com/tootsuite/mastodon) project, and is licensed under the terms and conditions of AGPL-3.0. While we will be keeping this license, over time we will be keeping less and less of the original project's source code and approach.
Our goal is to establish the foundation of a federated network of social networks. Our first step is our move to this technology, which immediately enables the construction of that network and provides the tools people will need to create and build. Over time, a new implementation of this system will emerge that is entirely based on Node.js, moves away from Postgres as it's database, and becomes part of the HYDRA family.
......
......@@ -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>;
}
};
......@@ -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;
}
}
......
......@@ -11,6 +11,7 @@ class Formatter
def format(status, **options)
raw_content = status.text
raw_content = ActionController::Base.helpers.strip_tags(raw_content) if status.id <= 11063737261633602 # #TODO: Migration fix
if status.reblog?
status = status.proper
......
......@@ -327,4 +327,14 @@ class User < ApplicationRecord
def validate_email_dns?
email_changed? && !(Rails.env.test? || Rails.env.development?)
end
# allow username or email address for login (Gab)
def self.find_for_database_authentication conditions
if conditions[:email].start_with? "@" or !conditions[:email].include? "@"
joins(:account).find_by(accounts: { domain: nil, username: conditions[:email].sub('@', '') })
else
super
end
end
end
......@@ -11,9 +11,19 @@ class REST::MediaAttachmentSerializer < ActiveModel::Serializer
object.id.to_s
end
def clean_migrated_url
object
.file_file_name
.sub("gab://media/", "")
.gsub("https://gabfiles.blob.core.windows.net/", "https://gab.com/media/")
.gsub("https://files.gab.com/file/files-gab/", "https://gab.com/media/")
.gsub("https://f002.backblazeb2.com/file/files-gab/", "https://gab.com/media/")
.split("|")
end
def url
if object.file_file_name and object.file_file_name.start_with? "gab://media/"
return object.file_file_name.sub("gab://media/", "").sub("https://gabfiles.blob.core.windows.net/", "https://gab.com/media/").sub("https://files.gab.com/file/files-gab/", "https://gab.com/media/").split("|")[1]
return clean_migrated_url[1]
end
if object.needs_redownload?
......@@ -29,7 +39,7 @@ class REST::MediaAttachmentSerializer < ActiveModel::Serializer
def preview_url
if object.file_file_name and object.file_file_name.start_with? "gab://media/"
return object.file_file_name.sub("gab://media/", "").sub("https://gabfiles.blob.core.windows.net/", "https://gab.com/media/").sub("https://files.gab.com/file/files-gab/", "https://gab.com/media/").split("|")[0]
return clean_migrated_url[0]
end
if object.needs_redownload?
......
- 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: