added patch directory + patch on tmp_swap_file
and updated README.md to show the real version of FFSync running.
|
@ -1,10 +1,10 @@
|
|||
# Mozilla’s Sync Server for Yunohost
|
||||
|
||||
The Sync Server provides a replacement for Firefox’s default server (hosted at Mozilla). Its code is available on [the Sync-1.5 Server documentation](https://docs.services.mozilla.com/howtos/run-sync-1.5.html).
|
||||
The Sync Server provides a replacement for Firefox’s default server (hosted at Mozilla). Its code is available on [the Sync-1.5 Server documentation](https://docs.services.mozilla.com/howtos/run-sync-1.5.html) (no official documentation yet for the 1.6.x as it is really the bleeding edge version).
|
||||
|
||||
By default, a server set up will defer authentication to the Mozilla-hosted accounts server at [https://accounts.firefox.com](https://accounts.firefox.com). So you will still have to authenticate at Mozilla, but _the storage of your information will be done on your host_.
|
||||
|
||||
**Shipped version:** 1.5
|
||||
**Shipped version:** 1.6.2
|
||||
|
||||
## Configuring
|
||||
|
||||
|
|
14
patch/sources/requirements.txt
Normal file
|
@ -0,0 +1,14 @@
|
|||
pyramid_chameleon==0.3
|
||||
cornice==0.16.2
|
||||
gunicorn==19.6
|
||||
pyramid==1.5
|
||||
WebOb==1.4.1
|
||||
requests==2.13
|
||||
simplejson==3.10
|
||||
SQLAlchemy==1.1.5
|
||||
unittest2==1.1
|
||||
zope.component==4.2.1
|
||||
configparser==3.5
|
||||
mozsvc==0.9
|
||||
https://github.com/mozilla-services/tokenserver/archive/1.2.23.zip
|
||||
https://github.com/mozilla-services/server-syncstorage/archive/1.6.2.zip
|
193
patch/sources/syncserver/__init__.py
Normal file
|
@ -0,0 +1,193 @@
|
|||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
import os
|
||||
import logging
|
||||
from urlparse import urlparse, urlunparse
|
||||
|
||||
from pyramid.events import NewRequest, subscriber
|
||||
from pyramid.static import static_view
|
||||
from pyramid.view import view_config
|
||||
from pyramid.renderers import render, render_to_response
|
||||
from pyramid.response import Response
|
||||
|
||||
try:
|
||||
import requests.packages.urllib3.contrib.pyopenssl
|
||||
HAS_PYOPENSSL = True
|
||||
except ImportError:
|
||||
HAS_PYOPENSSL = False
|
||||
|
||||
import mozsvc.config
|
||||
|
||||
from tokenserver.util import _JSONError
|
||||
|
||||
logger = logging.getLogger("syncserver")
|
||||
|
||||
|
||||
def includeme(config):
|
||||
"""Install SyncServer application into the given Pyramid configurator."""
|
||||
# Set the umask so that files are created with secure permissions.
|
||||
# Necessary for e.g. created-on-demand sqlite database files.
|
||||
os.umask(0077)
|
||||
|
||||
# If PyOpenSSL is available, configure requests to use it.
|
||||
# This helps improve security on older python versions.
|
||||
if HAS_PYOPENSSL:
|
||||
requests.packages.urllib3.contrib.pyopenssl.inject_into_urllib3()
|
||||
|
||||
# Sanity-check the deployment settings and provide sensible defaults.
|
||||
settings = config.registry.settings
|
||||
public_url = settings.get("syncserver.public_url")
|
||||
if public_url is None:
|
||||
raise RuntimeError("you must configure syncserver.public_url")
|
||||
public_url = public_url.rstrip("/")
|
||||
settings["syncserver.public_url"] = public_url
|
||||
|
||||
secret = settings.get("syncserver.secret")
|
||||
if secret is None:
|
||||
secret = os.urandom(32).encode("hex")
|
||||
sqluri = settings.get("syncserver.sqluri")
|
||||
if sqluri is None:
|
||||
rootdir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
|
||||
sqluri = "sqlite:///" + os.path.join(rootdir, "syncserver.db")
|
||||
|
||||
# Configure app-specific defaults based on top-level configuration.
|
||||
settings.pop("config", None)
|
||||
if "tokenserver.backend" not in settings:
|
||||
# Default to our simple static node-assignment backend
|
||||
settings["tokenserver.backend"] =\
|
||||
"syncserver.staticnode.StaticNodeAssignment"
|
||||
settings["tokenserver.sqluri"] = sqluri
|
||||
settings["tokenserver.node_url"] = public_url
|
||||
settings["endpoints.sync-1.5"] = "{node}/storage/1.5/{uid}"
|
||||
if "tokenserver.monkey_patch_gevent" not in settings:
|
||||
# Default to no gevent monkey-patching
|
||||
settings["tokenserver.monkey_patch_gevent"] = False
|
||||
if "tokenserver.applications" not in settings:
|
||||
# Default to just the sync-1.5 application
|
||||
settings["tokenserver.applications"] = "sync-1.5"
|
||||
if "tokenserver.secrets.backend" not in settings:
|
||||
# Default to a single fixed signing secret
|
||||
settings["tokenserver.secrets.backend"] = "mozsvc.secrets.FixedSecrets"
|
||||
settings["tokenserver.secrets.secrets"] = [secret]
|
||||
if "tokenserver.allow_new_users" not in settings:
|
||||
allow_new_users = settings.get("syncserver.allow_new_users")
|
||||
if allow_new_users is not None:
|
||||
settings["tokenserver.allow_new_users"] = allow_new_users
|
||||
if "hawkauth.secrets.backend" not in settings:
|
||||
# Default to the same secrets backend as the tokenserver
|
||||
for key in settings.keys():
|
||||
if key.startswith("tokenserver.secrets."):
|
||||
newkey = "hawkauth" + key[len("tokenserver"):]
|
||||
settings[newkey] = settings[key]
|
||||
if "storage.backend" not in settings:
|
||||
# Default to sql syncstorage backend
|
||||
settings["storage.backend"] = "syncstorage.storage.sql.SQLStorage"
|
||||
settings["storage.sqluri"] = sqluri
|
||||
settings["storage.create_tables"] = True
|
||||
if "storage.batch_upload_enabled" not in settings:
|
||||
# Default the new batch-upload API to on
|
||||
settings["storage.batch_upload_enabled"] = True
|
||||
if "browserid.backend" not in settings:
|
||||
# Default to remote verifier, with base of public_url as only audience
|
||||
audience = urlunparse(urlparse(public_url)._replace(path=""))
|
||||
settings["browserid.backend"] = "tokenserver.verifiers.RemoteVerifier"
|
||||
settings["browserid.audiences"] = audience
|
||||
if "loggers" not in settings:
|
||||
# Default to basic logging config.
|
||||
root_logger = logging.getLogger("")
|
||||
if not root_logger.handlers:
|
||||
logging.basicConfig(level=logging.WARN)
|
||||
if "fxa.metrics_uid_secret_key" not in settings:
|
||||
# Default to a randomly-generated secret.
|
||||
# This setting isn't useful in a self-hosted setup
|
||||
# and setting a default avoids scary-sounding warnings.
|
||||
settings["fxa.metrics_uid_secret_key"] = os.urandom(16).encode("hex")
|
||||
|
||||
# Include the relevant sub-packages.
|
||||
config.scan("syncserver")
|
||||
config.include("syncstorage", route_prefix="/storage")
|
||||
config.include("tokenserver", route_prefix="/token")
|
||||
config.include('pyramid_chameleon')
|
||||
|
||||
# Add a top-level explaination view.
|
||||
# First view, available at http://localhost:6543/
|
||||
def page(request):
|
||||
result = render('page/index.pt',
|
||||
{'public_url':public_url},
|
||||
request=request)
|
||||
response = Response(result)
|
||||
return response
|
||||
config.add_route('page', '/')
|
||||
config.add_view(page, route_name='page')
|
||||
|
||||
www = static_view(
|
||||
os.path.realpath(os.path.dirname(__file__)+"/page/"),
|
||||
use_subpath=True
|
||||
)
|
||||
# Documentation for Hybrid routing can be found here
|
||||
# http://docs.pylonsproject.org/projects/pyramid/en/1.0-branch/narr/hybrid.html#using-subpath-in-a-route-pattern
|
||||
config.add_route('index', '/*subpath', 'www') # subpath is a reserved word
|
||||
config.add_view(www, route_name='index')
|
||||
|
||||
|
||||
@subscriber(NewRequest)
|
||||
def reconcile_wsgi_environ_with_public_url(event):
|
||||
"""Event-listener that checks and tweaks WSGI environ based on public_url.
|
||||
|
||||
This is a simple trick to help ensure that the configured public_url
|
||||
matches the actual deployed address. It fixes fixes parts of the WSGI
|
||||
environ where it makes sense (e.g. SCRIPT_NAME) and warns about any parts
|
||||
that seem obviously mis-configured (e.g. http:// versus https://).
|
||||
|
||||
It's very important to get public_url and WSGI environ matching exactly,
|
||||
since they're used for browserid audience checking and HAWK signature
|
||||
validation, so mismatches can easily cause strange and cryptic errors.
|
||||
"""
|
||||
request = event.request
|
||||
public_url = request.registry.settings["syncserver.public_url"]
|
||||
p_public_url = urlparse(public_url)
|
||||
# If we don't have a SCRIPT_NAME, take it from the public_url.
|
||||
# This is often the case if we're behind e.g. an nginx proxy that
|
||||
# is serving us at some sub-path.
|
||||
if not request.script_name:
|
||||
request.script_name = p_public_url.path.rstrip("/")
|
||||
# If the environ does not match public_url, requests are almost certainly
|
||||
# going to fail due to auth errors. We can either bail out early, or we
|
||||
# can forcibly clobber the WSGI environ with the values from public_url.
|
||||
# This is a security risk if you've e.g. mis-configured the server, so
|
||||
# it's not enabled by default.
|
||||
application_url = request.application_url
|
||||
if public_url != application_url:
|
||||
if not request.registry.settings.get("syncserver.force_wsgi_environ"):
|
||||
msg = "\n".join((
|
||||
"The public_url setting doesn't match the application url.",
|
||||
"This will almost certainly cause authentication failures!",
|
||||
" public_url setting is: %s" % (public_url,),
|
||||
" application url is: %s" % (application_url,),
|
||||
"You can disable this check by setting the force_wsgi_environ",
|
||||
"option in your config file, but do so at your own risk.",
|
||||
))
|
||||
logger.error(msg)
|
||||
raise _JSONError([msg], status_code=500)
|
||||
request.scheme = p_public_url.scheme
|
||||
request.host = p_public_url.netloc
|
||||
request.script_name = p_public_url.path.rstrip("/")
|
||||
|
||||
|
||||
def get_configurator(global_config, **settings):
|
||||
"""Load a SyncStorge configurator object from deployment settings."""
|
||||
config = mozsvc.config.get_configurator(global_config, **settings)
|
||||
config.begin()
|
||||
try:
|
||||
config.include(includeme)
|
||||
finally:
|
||||
config.end()
|
||||
return config
|
||||
|
||||
|
||||
def main(global_config, **settings):
|
||||
"""Load a SyncStorage WSGI app from deployment settings."""
|
||||
config = get_configurator(global_config, **settings)
|
||||
return config.make_wsgi_app()
|
663
patch/sources/syncserver/page/index.pt
Normal file
|
@ -0,0 +1,663 @@
|
|||
<!DOCTYPE html>
|
||||
<html class="linux x86 js x64 loaded" dir="ltr" data-latest-firefox="50.0.2" data-esr-versions="45.5.1" data-gtm-container-id="GTM-MW3R8V" lang="fr"><head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<meta charset="utf-8">
|
||||
|
||||
<script type="text/javascript" src="sync_files/site-bundle.js" charset="utf-8"></script>
|
||||
|
||||
|
||||
<!--
|
||||
_.-~-.
|
||||
7'' Q..\
|
||||
_7 (_
|
||||
_7 _/ _q. /
|
||||
_7 . ___ /VVvv-'_ .
|
||||
7/ / /~- \_\\ '-._ .-' / //
|
||||
./ ( /-~-/||'=.__ '::. '-~'' { ___ / // ./{
|
||||
V V-~-~| || __''_ ':::. ''~-~.___.-'' _/ // / {_ / { /
|
||||
VV/-~-~-|/ \ .'__'. '. ':: _ _ _ ''.
|
||||
/ /~~~~||VVV/ / \ ) \ _ __ ___ ___ ___(_) | | __ _ .::'
|
||||
/ (~-~-~\\.-' / \' \::::. | '_ ` _ \ / _ \_ / | | |/ _` | :::'
|
||||
/..\ /..\__/ ' '::: | | | | | | (_) / /| | | | (_| | ::'
|
||||
vVVv vVVv ': |_| |_| |_|\___/___|_|_|_|\__,_| ''
|
||||
|
||||
Hi there, nice to meet you!
|
||||
|
||||
Interested in having a direct impact on hundreds of millions of users? Join
|
||||
Mozilla, and become part of a global community that’s helping to build a
|
||||
brighter future for the Web.
|
||||
|
||||
Visit https://careers.mozilla.org to learn about our current job openings.
|
||||
Visit https://www.mozilla.org/contribute for more ways to get involved and
|
||||
help support Mozilla.
|
||||
-->
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
|
||||
<title>Firefox Sync Server — Keep Synced on your own</title>
|
||||
<meta name="description" content="">
|
||||
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="https://www.mozilla.org/media/img/firefox/ios-icon-180.7a8401f21915.png">
|
||||
<link rel="icon" type="image/png" sizes="196x196" href="https://www.mozilla.org/media/img/firefox/favicon-196.223e1bcaf067.png">
|
||||
<link rel="shortcut icon" href="https://www.mozilla.org/media/img/firefox/favicon.dc6635050bf5.ico">
|
||||
<link rel="canonical" hreflang="fr" href="https://www.mozilla.org/fr/firefox/sync/">
|
||||
<link rel="alternate" hreflang="x-default" href="https://www.mozilla.org/firefox/sync/">
|
||||
<link rel="alternate" hreflang="af" href="https://www.mozilla.org/af/firefox/sync/" title="Afrikaans">
|
||||
<link rel="alternate" hreflang="an" href="https://www.mozilla.org/an/firefox/sync/" title="aragonés">
|
||||
<link rel="alternate" hreflang="ar" href="https://www.mozilla.org/ar/firefox/sync/" title="عربي">
|
||||
<link rel="alternate" hreflang="as" href="https://www.mozilla.org/as/firefox/sync/" title="অসমীয়া">
|
||||
<link rel="alternate" hreflang="ast" href="https://www.mozilla.org/ast/firefox/sync/" title="Asturianu">
|
||||
<link rel="alternate" hreflang="az" href="https://www.mozilla.org/az/firefox/sync/" title="Azərbaycanca">
|
||||
<link rel="alternate" hreflang="bg" href="https://www.mozilla.org/bg/firefox/sync/" title="Български">
|
||||
<link rel="alternate" hreflang="bn-BD" href="https://www.mozilla.org/bn-BD/firefox/sync/" title="বাংলা (বাংলাদেশ)">
|
||||
<link rel="alternate" hreflang="bn-IN" href="https://www.mozilla.org/bn-IN/firefox/sync/" title="বাংলা (ভারত)">
|
||||
<link rel="alternate" hreflang="br" href="https://www.mozilla.org/br/firefox/sync/" title="Brezhoneg">
|
||||
<link rel="alternate" hreflang="ca" href="https://www.mozilla.org/ca/firefox/sync/" title="Català">
|
||||
<link rel="alternate" hreflang="cak" href="https://www.mozilla.org/cak/firefox/sync/" title="Maya Kaqchikel">
|
||||
<link rel="alternate" hreflang="cs" href="https://www.mozilla.org/cs/firefox/sync/" title="Čeština">
|
||||
<link rel="alternate" hreflang="cy" href="https://www.mozilla.org/cy/firefox/sync/" title="Cymraeg">
|
||||
<link rel="alternate" hreflang="da" href="https://www.mozilla.org/da/firefox/sync/" title="Dansk">
|
||||
<link rel="alternate" hreflang="de" href="https://www.mozilla.org/de/firefox/sync/" title="Deutsch">
|
||||
<link rel="alternate" hreflang="dsb" href="https://www.mozilla.org/dsb/firefox/sync/" title="Dolnoserbšćina">
|
||||
<link rel="alternate" hreflang="el" href="https://www.mozilla.org/el/firefox/sync/" title="Ελληνικά">
|
||||
<link rel="alternate" hreflang="en-GB" href="https://www.mozilla.org/en-GB/firefox/sync/" title="English (British)">
|
||||
<link rel="alternate" hreflang="en" href="https://www.mozilla.org/en-US/firefox/sync/" title="English">
|
||||
<link rel="alternate" hreflang="en-CA" href="https://www.mozilla.org/en-US/firefox/sync/" title="English (Canada)">
|
||||
<link rel="alternate" hreflang="eo" href="https://www.mozilla.org/eo/firefox/sync/" title="Esperanto">
|
||||
<link rel="alternate" hreflang="es-AR" href="https://www.mozilla.org/es-AR/firefox/sync/" title="Español (de Argentina)">
|
||||
<link rel="alternate" hreflang="es-CL" href="https://www.mozilla.org/es-CL/firefox/sync/" title="Español (de Chile)">
|
||||
<link rel="alternate" hreflang="es-ES" href="https://www.mozilla.org/es-ES/firefox/sync/" title="Español (de España)">
|
||||
<link rel="alternate" hreflang="es-MX" href="https://www.mozilla.org/es-MX/firefox/sync/" title="Español (de México)">
|
||||
<link rel="alternate" hreflang="et" href="https://www.mozilla.org/et/firefox/sync/" title="Eesti keel">
|
||||
<link rel="alternate" hreflang="eu" href="https://www.mozilla.org/eu/firefox/sync/" title="Euskara">
|
||||
<link rel="alternate" hreflang="fa" href="https://www.mozilla.org/fa/firefox/sync/" title="فارسی">
|
||||
<link rel="alternate" hreflang="fi" href="https://www.mozilla.org/fi/firefox/sync/" title="suomi">
|
||||
<link rel="alternate" hreflang="fr" href="https://www.mozilla.org/fr/firefox/sync/" title="Français">
|
||||
<link rel="alternate" hreflang="fy-NL" href="https://www.mozilla.org/fy-NL/firefox/sync/" title="Frysk">
|
||||
<link rel="alternate" hreflang="ga-IE" href="https://www.mozilla.org/ga-IE/firefox/sync/" title="Gaeilge">
|
||||
<link rel="alternate" hreflang="gd" href="https://www.mozilla.org/gd/firefox/sync/" title="Gàidhlig">
|
||||
<link rel="alternate" hreflang="gl" href="https://www.mozilla.org/gl/firefox/sync/" title="Galego">
|
||||
<link rel="alternate" hreflang="gn" href="https://www.mozilla.org/gn/firefox/sync/" title="Avañe'ẽ">
|
||||
<link rel="alternate" hreflang="gu-IN" href="https://www.mozilla.org/gu-IN/firefox/sync/" title="ગુજરાતી (ભારત)">
|
||||
<link rel="alternate" hreflang="hi-IN" href="https://www.mozilla.org/hi-IN/firefox/sync/" title="हिन्दी (भारत)">
|
||||
<link rel="alternate" hreflang="hr" href="https://www.mozilla.org/hr/firefox/sync/" title="Hrvatski">
|
||||
<link rel="alternate" hreflang="hsb" href="https://www.mozilla.org/hsb/firefox/sync/" title="Hornjoserbsce">
|
||||
<link rel="alternate" hreflang="hu" href="https://www.mozilla.org/hu/firefox/sync/" title="magyar">
|
||||
<link rel="alternate" hreflang="hy-AM" href="https://www.mozilla.org/hy-AM/firefox/sync/" title="Հայերեն">
|
||||
<link rel="alternate" hreflang="id" href="https://www.mozilla.org/id/firefox/sync/" title="Bahasa Indonesia">
|
||||
<link rel="alternate" hreflang="is" href="https://www.mozilla.org/is/firefox/sync/" title="íslenska">
|
||||
<link rel="alternate" hreflang="it" href="https://www.mozilla.org/it/firefox/sync/" title="Italiano">
|
||||
<link rel="alternate" hreflang="ja" href="https://www.mozilla.org/ja/firefox/sync/" title="日本語">
|
||||
<link rel="alternate" hreflang="ka" href="https://www.mozilla.org/ka/firefox/sync/" title="ქართული">
|
||||
<link rel="alternate" hreflang="kab" href="https://www.mozilla.org/kab/firefox/sync/" title="Taqbaylit">
|
||||
<link rel="alternate" hreflang="kk" href="https://www.mozilla.org/kk/firefox/sync/" title="Қазақ">
|
||||
<link rel="alternate" hreflang="kn" href="https://www.mozilla.org/kn/firefox/sync/" title="ಕನ್ನಡ">
|
||||
<link rel="alternate" hreflang="ko" href="https://www.mozilla.org/ko/firefox/sync/" title="한국어">
|
||||
<link rel="alternate" hreflang="lij" href="https://www.mozilla.org/lij/firefox/sync/" title="Ligure">
|
||||
<link rel="alternate" hreflang="lt" href="https://www.mozilla.org/lt/firefox/sync/" title="lietuvių kalba">
|
||||
<link rel="alternate" hreflang="lv" href="https://www.mozilla.org/lv/firefox/sync/" title="Latviešu">
|
||||
<link rel="alternate" hreflang="mk" href="https://www.mozilla.org/mk/firefox/sync/" title="Македонски">
|
||||
<link rel="alternate" hreflang="ms" href="https://www.mozilla.org/ms/firefox/sync/" title="Melayu">
|
||||
<link rel="alternate" hreflang="my" href="https://www.mozilla.org/my/firefox/sync/" title="မြန်မာဘာသာ">
|
||||
<link rel="alternate" hreflang="nb-NO" href="https://www.mozilla.org/nb-NO/firefox/sync/" title="Norsk bokmål">
|
||||
<link rel="alternate" hreflang="nl" href="https://www.mozilla.org/nl/firefox/sync/" title="Nederlands">
|
||||
<link rel="alternate" hreflang="nn-NO" href="https://www.mozilla.org/nn-NO/firefox/sync/" title="Norsk nynorsk">
|
||||
<link rel="alternate" hreflang="oc" href="https://www.mozilla.org/oc/firefox/sync/" title="occitan (lengadocian)">
|
||||
<link rel="alternate" hreflang="pa-IN" href="https://www.mozilla.org/pa-IN/firefox/sync/" title="ਪੰਜਾਬੀ (ਭਾਰਤ)">
|
||||
<link rel="alternate" hreflang="pl" href="https://www.mozilla.org/pl/firefox/sync/" title="Polski">
|
||||
<link rel="alternate" hreflang="pt-BR" href="https://www.mozilla.org/pt-BR/firefox/sync/" title="Português (do Brasil)">
|
||||
<link rel="alternate" hreflang="pt-PT" href="https://www.mozilla.org/pt-PT/firefox/sync/" title="Português (Europeu)">
|
||||
<link rel="alternate" hreflang="rm" href="https://www.mozilla.org/rm/firefox/sync/" title="rumantsch">
|
||||
<link rel="alternate" hreflang="ro" href="https://www.mozilla.org/ro/firefox/sync/" title="Română">
|
||||
<link rel="alternate" hreflang="ru" href="https://www.mozilla.org/ru/firefox/sync/" title="Русский">
|
||||
<link rel="alternate" hreflang="sk" href="https://www.mozilla.org/sk/firefox/sync/" title="slovenčina">
|
||||
<link rel="alternate" hreflang="sl" href="https://www.mozilla.org/sl/firefox/sync/" title="Slovenščina">
|
||||
<link rel="alternate" hreflang="son" href="https://www.mozilla.org/son/firefox/sync/" title="Soŋay">
|
||||
<link rel="alternate" hreflang="sq" href="https://www.mozilla.org/sq/firefox/sync/" title="Shqip">
|
||||
<link rel="alternate" hreflang="sr" href="https://www.mozilla.org/sr/firefox/sync/" title="Српски">
|
||||
<link rel="alternate" hreflang="sv-SE" href="https://www.mozilla.org/sv-SE/firefox/sync/" title="Svenska">
|
||||
<link rel="alternate" hreflang="te" href="https://www.mozilla.org/te/firefox/sync/" title="తెలుగు">
|
||||
<link rel="alternate" hreflang="tr" href="https://www.mozilla.org/tr/firefox/sync/" title="Türkçe">
|
||||
<link rel="alternate" hreflang="uk" href="https://www.mozilla.org/uk/firefox/sync/" title="Українська">
|
||||
<link rel="alternate" hreflang="uz" href="https://www.mozilla.org/uz/firefox/sync/" title="Oʻzbek tili">
|
||||
<link rel="alternate" hreflang="vi" href="https://www.mozilla.org/vi/firefox/sync/" title="Tiếng Việt">
|
||||
<link rel="alternate" hreflang="xh" href="https://www.mozilla.org/xh/firefox/sync/" title="isiXhosa">
|
||||
<link rel="alternate" hreflang="zh-CN" href="https://www.mozilla.org/zh-CN/firefox/sync/" title="中文 (简体)">
|
||||
<link rel="alternate" hreflang="zh-TW" href="https://www.mozilla.org/zh-TW/firefox/sync/" title="正體中文 (繁體)">
|
||||
|
||||
|
||||
<!--[if lte IE 8]>
|
||||
|
||||
<script src="/media/js/libs/html5shiv.d580a4cd1cb4.js"></script>
|
||||
|
||||
|
||||
<link href="/media/css/oldIE-bundle.62b3bbbe4890.css" rel="stylesheet" type="text/css" />
|
||||
<![endif]-->
|
||||
|
||||
<!--[if !lte IE 8]><!-->
|
||||
|
||||
|
||||
<link href="sync_files/responsive-bundle.css" rel="stylesheet" type="text/css">
|
||||
|
||||
|
||||
|
||||
|
||||
<link href="sync_files/firefox_sync-bundle.css" rel="stylesheet" type="text/css">
|
||||
<link href="sync_files/firefox_sync_anim-bundle.css" rel="stylesheet" type="text/css">
|
||||
|
||||
<!--<![endif]-->
|
||||
|
||||
<script type="text/javascript" src="sync_files/gtm-snippet-bundle.js" charset="utf-8"></script>
|
||||
|
||||
<!-- End Google Tag Manager -->
|
||||
|
||||
<style type="text/css"></style></head>
|
||||
|
||||
<body id="firefox-sync" class="html-ltr sky state-fx-31-signed-in">
|
||||
<div id="strings" data-global-close="Close" data-global-next="Next" data-global-previous="Previous" data-global-update-firefox="Update Firefox"></div>
|
||||
<div id="outer-wrapper" style='background:url("${public_url}/media/img/sandstone/bg-gradient-sky.7ea325995978.png") repeat-x,url("${public_url}/media/img/sandstone/grain.855f29e0c686.png") repeat,#eee;'>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="sticky-wrapper" style=""><header id="fxfamilynav-header" class="fxfamilynav-header dark">
|
||||
<div class="container">
|
||||
<a href="https://www.mozilla.org/fr/firefox/products/" class="fxfamilynav-logo" style="background-image:url('${public_url}/media/img/firefox/family/nav-sprite.56fbf5a8d218.png') !important;">Firefox</a>
|
||||
<nav id="fxfamilynav" class="fxfamilynav" role="navigation">
|
||||
<ul id="fxfamilynav-primary" class="primary-nav">
|
||||
<li class="related active">
|
||||
<a data-id="features" href="https://www.mozilla.org/fr/firefox/features/" class="primary-link" data-link-type="nav" data-link-name="Features"><div>Self-Hosted Synchronisation Server</div></a>
|
||||
</li>
|
||||
<li class="">
|
||||
<a data-id="features" style="width:300px;max-width:350px;" href="#howto" class="primary-link" data-link-type="nav" data-link-name="Features"><div>Running Mozilla’s Sync-1.5 Server</div></a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav><div id="fxfamilynav-adjunctnav" class="fxfamilynav-adjunctnav">
|
||||
|
||||
<div class="triangle"></div>
|
||||
<div class="triangle-border"></div>
|
||||
|
||||
<ul class="adjunctnav">
|
||||
<li><a href="https://www.mozilla.org/fr/firefox/channel/desktop/" data-link-type="nav" data-link-name="Side Menu: Pre-release downloads">Télécharger une préversion</a>
|
||||
</li><li><a href="https://www.mozilla.org/fr/firefox/dnt/" data-link-type="nav" data-link-name="Side Menu: Do Not Track">Ne pas me pister</a></li>
|
||||
<li><a href="https://www.mozilla.org/fr/firefox/interest-dashboard/" data-link-type="nav" data-link-name="Side Menu: Interest Dashboard">Tableau de bord des centres d’intérêt</a></li>
|
||||
<li><a rel="external" href="https://support.mozilla.org/kb/private-browsing-browse-web-without-saving-info" data-link-type="nav" data-link-name="Side Menu: Private Browsing">Navigation privée</a></li>
|
||||
<li><a rel="external" href="https://addons.mozilla.org/" data-link-type="nav" data-link-name="Side Menu: Add-ons">Modules</a></li>
|
||||
<li><a rel="external" href="https://github.com/abeudin/ffsync_ynh/issues" data-link-type="nav" data-link-name="Side Menu: Need help?">Need Help ?</a></li>
|
||||
</ul>
|
||||
|
||||
<ul class="adjunctnav">
|
||||
<li><a href="https://www.mozilla.org/fr/firefox/channel/android/" data-link-type="nav" data-link-name="Side Menu: Pre-release downloads">Télécharger une préversion</a>
|
||||
</li><li><a href="https://www.mozilla.org/fr/firefox/dnt/" data-link-type="nav" data-link-name="Side Menu: Do Not Track">Ne pas me pister</a></li>
|
||||
<li><a rel="external" href="https://www.youtube.com/watch?v=Ewk0YtFTBec&list=PLA8ABF6B7A66A0C5E&index=15" data-link-type="nav" data-link-name="Side Menu: Private Browsing">Navigation privée</a></li>
|
||||
<li><a rel="external" href="https://addons.mozilla.org/android/" data-link-type="nav" data-link-name="Side Menu: Android Add-ons">Modules</a></li>
|
||||
<li><a rel="external" href="https://support.mozilla.org/products/mobile" data-link-type="nav" data-link-name="Side Menu: Need help?">Besoin d’aide ?</a></li>
|
||||
</ul>
|
||||
|
||||
<ul class="adjunctnav">
|
||||
<li><a href="https://www.mozilla.org/fr/firefox/channel/ios/" data-link-type="nav" data-link-name="Side Menu: Pre-release downloads">Télécharger une préversion</a>
|
||||
</li><li><a rel="external" href="https://support.mozilla.org/products/ios" data-link-type="nav" data-link-name="Side Menu: Need help?">Besoin d’aide ?</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="fxfamilynav-cta-wrapper" class="fxfamilynav-cta-wrapper"></div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div id="tabzilla">
|
||||
<a href="https://www.mozilla.org/fr/" data-link-type="nav" data-link-name="tabzilla" style="background-image:url('${public_url}/media/img/tabzilla/tabzilla-static.953a65a1f4a4.png') !important;">Mozilla</a>
|
||||
</div>
|
||||
</div></header></div>
|
||||
|
||||
|
||||
<div id="wrapper">
|
||||
|
||||
<div class="sync-anim on complete">
|
||||
<div class="device laptop">
|
||||
<div class="inner">
|
||||
<div class="logo"></div>
|
||||
<div class="icon history"></div>
|
||||
<div class="icon bookmarks"></div>
|
||||
<div class="icon passwords"></div>
|
||||
</div>
|
||||
<div class="arrows"></div>
|
||||
</div>
|
||||
<div class="device tablet">
|
||||
<div class="inner">
|
||||
<div class="logo"></div>
|
||||
<div class="icon history"></div>
|
||||
<div class="icon bookmarks"></div>
|
||||
<div class="icon passwords"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="device phone">
|
||||
<div class="inner">
|
||||
<div class="logo"></div>
|
||||
<div class="icon history"></div>
|
||||
<div class="icon bookmarks"></div>
|
||||
<div class="icon passwords"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<header role="banner" class="intro container">
|
||||
<div class="show-fx-31-signed-in">
|
||||
<h1>Ready, Set, Sync</h1>
|
||||
<p>
|
||||
You’re signed up and ready to access <em>your</em> Firefox anywhere, anytime.
|
||||
</p>
|
||||
</div>
|
||||
<div class="show-fx-31-signed-out show-fx-29-30 show-fx-28-older show-fx-android show-not-fx show-default">
|
||||
<h1>Take your Web with you</h1>
|
||||
<p>
|
||||
Sync Firefox wherever you use it to access your bookmarks, passwords, tabs and more from any smartphone, tablet or computer.
|
||||
</p>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section class="primary">
|
||||
<div id="howto" class="inner-wrapper">
|
||||
<div class="container">
|
||||
|
||||
|
||||
<div class="show-fx-29-30 warning">
|
||||
<p>
|
||||
It looks like you’re running an older version of Firefox.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="show-fx-28-older warning">
|
||||
<p>
|
||||
The new version of Sync only works with the latest version of Firefox
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="show-not-fx warning">
|
||||
<p>
|
||||
|
||||
Sync is just one of the great features you’ll only get with Firefox.
|
||||
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="buttons">
|
||||
<div class="show-fx-31-signed-in">
|
||||
|
||||
<p class="button-footer">
|
||||
<a href="https://github.com/abeudin/ffsync_ynh/issues" class="ga-link" data-interaction="outbound link click">
|
||||
Need help?
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="show-fx-31-signed-out">
|
||||
|
||||
<button class="button" data-button-name="Get started with Sync" data-cta-position="Primary" id="cta-sync">
|
||||
Get started with Sync
|
||||
</button>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="show-fx-29-30">
|
||||
<a href="https://support.mozilla.org/kb/update-firefox-latest-version" class="button" data-interaction="button click" data-element-action="Sync CTA" id="cta-update">
|
||||
Update your Firefox
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="show-not-fx show-fx-28-older">
|
||||
|
||||
|
||||
|
||||
<div id="download-button-desktop-release" class="download-button">
|
||||
|
||||
<div class="nojs-download">
|
||||
|
||||
<div class="download download-dumb">
|
||||
<p role="heading" class="download-heading">
|
||||
|
||||
Download Firefox
|
||||
— English (US)
|
||||
</p>
|
||||
<ul>
|
||||
<li><a href="https://download-sha1.allizom.org/?product=firefox-stub&os=win&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="winsha1" data-download-os="Desktop">Windows (XP/Vista)</a>
|
||||
</li><li><a href="https://download.mozilla.org/?product=firefox-stub&os=win&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="win" data-download-os="Desktop">Windows</a>
|
||||
</li><li><a href="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=win64&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="win64" data-download-os="Desktop">Windows 64-bit</a>
|
||||
</li><li><a href="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=osx&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="osx" data-download-os="Desktop">OS X</a>
|
||||
</li><li><a href="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=linux&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="linux" data-download-os="Desktop">Linux</a>
|
||||
</li><li><a href="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=linux64&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="linux64" data-download-os="Desktop">Linux 64-bit</a>
|
||||
</li><li><a href="https://play.google.com/store/apps/details?id=org.mozilla.firefox&referrer=utm_source%3Dmozilla%26utm_medium%3DReferral%26utm_campaign%3Dmozilla-org" class="download-link button green" data-link-type="download" data-download-version="android" data-download-os="Android">Android</a>
|
||||
</li><li><a href="https://itunes.apple.com/us/app/apple-store/id989804926?pt=373246&mt=8" class="download-link button green" data-link-type="download" data-download-version="ios" data-download-os="iOS">iOS</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="unrecognized-download">
|
||||
<p>Your system may not meet the requirements for Firefox, but you can try one of these versions:</p>
|
||||
|
||||
<div class="download download-dumb">
|
||||
<p role="heading" class="download-heading">
|
||||
|
||||
Download Firefox
|
||||
— English (US)
|
||||
</p>
|
||||
<ul>
|
||||
<li><a href="https://download-sha1.allizom.org/?product=firefox-stub&os=win&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="winsha1" data-download-os="Desktop">Windows (XP/Vista)</a>
|
||||
</li><li><a href="https://download.mozilla.org/?product=firefox-stub&os=win&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="win" data-download-os="Desktop">Windows</a>
|
||||
</li><li><a href="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=win64&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="win64" data-download-os="Desktop">Windows 64-bit</a>
|
||||
</li><li><a href="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=osx&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="osx" data-download-os="Desktop">OS X</a>
|
||||
</li><li><a href="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=linux&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="linux" data-download-os="Desktop">Linux</a>
|
||||
</li><li><a href="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=linux64&lang=en-US" class="download-link button green" data-link-type="download" data-download-version="linux64" data-download-os="Desktop">Linux 64-bit</a>
|
||||
</li><li><a href="https://play.google.com/store/apps/details?id=org.mozilla.firefox&referrer=utm_source%3Dmozilla%26utm_medium%3DReferral%26utm_campaign%3Dmozilla-org" class="download-link button green" data-link-type="download" data-download-version="android" data-download-os="Android">Android</a>
|
||||
</li><li><a href="https://itunes.apple.com/us/app/apple-store/id989804926?pt=373246&mt=8" class="download-link button green" data-link-type="download" data-download-version="ios" data-download-os="iOS">iOS</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<p class="unsupported-download">
|
||||
Your system doesn't meet the <a href="/en-US/firefox/system-requirements/">requirements</a> to run Firefox.
|
||||
</p>
|
||||
<p class="unsupported-download-osx">
|
||||
Your system doesn't meet the <a href="https://support.mozilla.org/kb/firefox-osx">requirements</a> to run Firefox.
|
||||
</p>
|
||||
<p class="linux-arm-download">
|
||||
Please follow <a href="https://support.mozilla.org/kb/install-firefox-linux">these instructions</a> to install Firefox.
|
||||
</p>
|
||||
|
||||
<ul class="download-list" role="presentation">
|
||||
|
||||
<li class="os_winsha1">
|
||||
<a class="download-link button green" href="/firefox/new/?scene=2" data-direct-link="https://download-sha1.allizom.org/?product=firefox-stub&os=win&lang=en-US" data-link-type="download" data-display-name="Windows (XP/Vista)" data-download-version="winsha1" data-download-os="Desktop">
|
||||
<strong class="download-title">
|
||||
|
||||
|
||||
|
||||
Download Firefox
|
||||
|
||||
|
||||
|
||||
</strong>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="os_win">
|
||||
<a class="download-link button green" href="/firefox/new/?scene=2" data-direct-link="https://download.mozilla.org/?product=firefox-stub&os=win&lang=en-US" data-link-type="download" data-display-name="Windows" data-download-version="win" data-download-os="Desktop">
|
||||
<strong class="download-title">
|
||||
|
||||
|
||||
|
||||
Download Firefox
|
||||
|
||||
|
||||
|
||||
</strong>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="os_win64">
|
||||
<a class="download-link button green" href="/firefox/new/?scene=2" data-direct-link="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=win64&lang=en-US" data-link-type="download" data-display-name="Windows 64-bit" data-download-version="win64" data-download-os="Desktop">
|
||||
<strong class="download-title">
|
||||
|
||||
|
||||
|
||||
Download Firefox
|
||||
|
||||
|
||||
|
||||
</strong>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="os_osx">
|
||||
<a class="download-link button green" href="/firefox/new/?scene=2" data-direct-link="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=osx&lang=en-US" data-link-type="download" data-display-name="OS X" data-download-version="osx" data-download-os="Desktop">
|
||||
<strong class="download-title">
|
||||
|
||||
|
||||
|
||||
Download Firefox
|
||||
|
||||
|
||||
|
||||
</strong>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="os_linux">
|
||||
<a class="download-link button green" href="/firefox/new/?scene=2" data-direct-link="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=linux&lang=en-US" data-link-type="download" data-display-name="Linux" data-download-version="linux" data-download-os="Desktop">
|
||||
<strong class="download-title">
|
||||
|
||||
|
||||
|
||||
Download Firefox
|
||||
|
||||
|
||||
|
||||
</strong>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="os_linux64">
|
||||
<a class="download-link button green" href="/firefox/new/?scene=2" data-direct-link="https://download.mozilla.org/?product=firefox-50.0.2-SSL&os=linux64&lang=en-US" data-link-type="download" data-display-name="Linux 64-bit" data-download-version="linux64" data-download-os="Desktop">
|
||||
<strong class="download-title">
|
||||
|
||||
|
||||
|
||||
Download Firefox
|
||||
|
||||
|
||||
|
||||
</strong>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="os_android">
|
||||
<a class="download-link button green" href="https://play.google.com/store/apps/details?id=org.mozilla.firefox&referrer=utm_source%3Dmozilla%26utm_medium%3DReferral%26utm_campaign%3Dmozilla-org" data-link-type="download" data-display-name="Android" data-download-version="android" data-download-os="Android">
|
||||
<strong class="download-title">
|
||||
|
||||
|
||||
|
||||
<span>Firefox</span> for Android
|
||||
|
||||
|
||||
|
||||
</strong>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="os_ios">
|
||||
<a class="download-link button green" href="https://itunes.apple.com/us/app/apple-store/id989804926?pt=373246&mt=8" data-link-type="download" data-display-name="iOS" data-download-version="ios" data-download-os="iOS">
|
||||
<strong class="download-title">
|
||||
|
||||
|
||||
<span>Firefox</span> for iOS
|
||||
|
||||
|
||||
</strong>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<small class="fx-privacy-link">
|
||||
<a href="/en-US/privacy/firefox/">Firefox Privacy</a>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="show-fx-29-30 show-default instructions">
|
||||
<h3>Get started with Sync in four easy steps:</h3>
|
||||
<section>
|
||||
<ol>
|
||||
<li>Open the <a class="menu ga-link" data-interaction="outbound link click" href="https://support.mozilla.org/kb/learn-more-about-the-design-of-new-firefox#w_a-handy-new-menu">menu</a> in the top right of Firefox and select “<strong>Sign in to Sync.</strong>”</li>
|
||||
|
||||
<li>Click “<strong>Get started</strong>” in the tab that opens.</li>
|
||||
<li>Enter an email address and password to “<strong>Create a Firefox Account.</strong>”</li>
|
||||
<li>Click “<strong>Next</strong>” to get a verification sent to your email.</li>
|
||||
</ol>
|
||||
<p>After you check your email and click the verification link, you’ll be all set! Firefox will automatically sync in the background from then on.</p>
|
||||
</section>
|
||||
<aside role="complimentary">
|
||||
<ul class="unstyled">
|
||||
<li><a class="more ga-link" data-interaction="outbound link click" href="https://support.mozilla.org/kb/how-do-i-set-up-firefox-sync">Get more detailed instructions.</a></li>
|
||||
<li><a class="more ga-link" data-interaction="outbound link click" href="https://support.mozilla.org/kb/how-to-update-to-the-new-firefox-sync">Using an older version of Sync?</a></li>
|
||||
</ul>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="show-fx-28-older instructions">
|
||||
<ul class="unstyled">
|
||||
<li><a class="more ga-link" data-interaction="outbound link click" href="https://support.mozilla.org/kb/how-do-i-set-up-firefox-sync">Get more detailed instructions.</a></li>
|
||||
<li><a class="more ga-link" data-interaction="outbound link click" href="https://support.mozilla.org/kb/how-to-update-to-the-new-firefox-sync">Using an older version of Sync?</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="show-fx-android instructions">
|
||||
<h3>How to set up Sync in five easy steps:</h3>
|
||||
<section>
|
||||
<ol>
|
||||
|
||||
<li>Tap the <strong>Menu</strong> button (either below the screen or at the top right corner of the browser).</li>
|
||||
<li>Select <strong>Settings</strong> (you may need to tap <strong>More</strong> first).</li>
|
||||
<li>Tap <strong>Sync</strong> and then <strong>Get Started</strong>.</li>
|
||||
<li>The <strong>Create a Firefox Account page</strong> will open in a new tab.</li>
|
||||
<li>Fill out the form and click <strong>Next</strong>.</li>
|
||||
</ol>
|
||||
<p>After you check your email and click the verification link, you’ll be ready to go! Don’t forget to connect all your other devices to get the most of Sync.</p>
|
||||
</section>
|
||||
<aside role="complimentary">
|
||||
<ul class="unstyled">
|
||||
<li><a class="more ga-link" data-interaction="outbound link click" href="https://support.mozilla.org/kb/how-do-i-set-up-firefox-sync">Get more detailed instructions.</a></li>
|
||||
<li><a class="more ga-link" data-interaction="outbound link click" href="https://support.mozilla.org/kb/how-to-update-to-the-new-firefox-sync">Using an older version of Sync?</a></li>
|
||||
</ul>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<section class="secondary">
|
||||
<div class="inner-wrapper">
|
||||
<div class="container">
|
||||
<header style="text-align:justify;">
|
||||
<h2>How to sync your Firefox with this server instead of Mozilla’s?</h2>
|
||||
<p>
|
||||
You can safely use the Mozilla-hosted Firefox Accounts server in combination with a self-hosted sync storage server. The authentication and encryption protocols are designed so that the account server does not know the user’s plaintext password, and therefore cannot access their stored sync data.
|
||||
</p><p>
|
||||
Alternatively, you can also Run your own <a href="https://docs.services.mozilla.com/howtos/run-fxa.html">Firefox Accounts Server</a> to control all aspects of the system. The process for doing so is currently very experimental and not well documented.
|
||||
</p>
|
||||
<p>
|
||||
To configure Firefox to talk to your new Sync server, go to <code>"about:config"</code>,
|
||||
search for <code>"identity.sync.tokenserver.uri"</code> and change its value to the URL of your server
|
||||
with a path of <code>"token/1.0/sync/1.5"</code>:
|
||||
</p>
|
||||
<hr><code>
|
||||
identity.sync.tokenserver.uri: ${public_url}/token/1.0/sync/1.5
|
||||
</code>
|
||||
<hr><p>
|
||||
Since Firefox 33, Firefox for Android has supported custom sync servers,
|
||||
should be a breeze.
|
||||
</p>
|
||||
<h3>Solving problems with Android</h3>
|
||||
<p>The sure-fire way to know what Sync on Android is really doing is to
|
||||
observe the Android device log using adb logcat. You’ll want to bump
|
||||
your log-level:
|
||||
<hr><code>
|
||||
adb shell setprop log.tag.FxAccounts VERBOSE
|
||||
</code><hr>
|
||||
<p>
|
||||
Then, you can observe the log using:
|
||||
</p>
|
||||
<hr><code>
|
||||
adb logcat | grep FxAccounts
|
||||
</code><hr>
|
||||
<p>
|
||||
It’s best to observe the log while you force a sync from the Android Settings App. You should see output like:
|
||||
</p>
|
||||
<hr><pre style="overflow:auto;word-wrap:normal;white-space:pre">
|
||||
D FxAccounts(...) fennec :: BaseResource :: HTTP GET https://token.stage.mozaws.net/1.0/sync/1.5
|
||||
...
|
||||
D FxAccounts(...) fennec :: BaseResource :: HTTP GET https://sync-4-us-east-1.stage.mozaws.net/</pre><hr>
|
||||
See <a href="http://160.twinql.com/how-to-file-a-good-android-sync-bug/">how to file a good Android Sync bug</a> for details.
|
||||
|
||||
</p>
|
||||
</header>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="cta">
|
||||
<div class="inner-wrapper" style='background-image:url("${public_url}/media/img/firefox/sync/device-lineup.a60618c7dacb.png") !important;'>
|
||||
<div class="container">
|
||||
<header>
|
||||
<h3>Change the Sync server on each installation</h3>
|
||||
|
||||
</header>
|
||||
<aside>
|
||||
<p>
|
||||
To properly have all your data on that server, make sure each and every of your Firefox installations is setup to use this server. The list of connected devices can be seen on your Firefox Account page.
|
||||
</p>
|
||||
</aside>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div><!-- close #wrapper -->
|
||||
|
||||
|
||||
|
||||
|
||||
<footer id="colophon" class="">
|
||||
<nav class="row">
|
||||
<div class="col col-1">
|
||||
<div class="logo"><a href="https://www.mozilla.org/fr/" data-link-type="footer" data-link-name="Mozilla" style='background:url("${public_url}/media/img/sandstone/footer-mozilla.fafef0912042.png") !important;'>Mozilla</a></div>
|
||||
<p class="license">Portions of this content are ©1998–2016 by individual mozilla.org contributors. Content available under a <a href="https://www.mozilla.org/fr/foundation/licensing/website-content/">Creative Commons license</a>.</p>
|
||||
</div>
|
||||
<div class="col col-2">
|
||||
|
||||
|
||||
|
||||
<ul class="links-legal">
|
||||
<!--<li><a href="https://www.mozilla.org/fr/privacy/" data-link-type="footer" data-link-name="Privacy">Vie privée</a></li>-->
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col col-3">
|
||||
<div class="lang-switcher">
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</footer>
|
||||
|
||||
|
||||
</div><!-- close #outer-wrapper -->
|
||||
|
||||
<!--[if IE 9]>
|
||||
<script src="/media/js/libs/matchMedia.3fd01d1af18b.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
|
||||
<script type="text/javascript" src="sync_files/common-bundle.js" charset="utf-8"></script>
|
||||
|
||||
|
||||
<!--[if IE 9]>
|
||||
<script type="text/javascript" src="/media/js/matchmedia_addlistener-bundle.a6f70a2ac356.js" charset="utf-8"></script>
|
||||
<![endif]-->
|
||||
<script type="text/javascript" src="sync_files/firefox_sync-bundle.js" charset="utf-8"></script>
|
||||
|
||||
|
||||
|
||||
</body></html>
|
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 9.7 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 780 B |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 4.8 KiB |
142
patch/sources/syncserver/page/sync_files/btn-app-store.svg
Normal file
|
@ -0,0 +1,142 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="FR_Download_on_the_App_Store"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="135px" height="40px"
|
||||
viewBox="0 0 135 40" enable-background="new 0 0 135 40" xml:space="preserve">
|
||||
<g>
|
||||
<path fill="#A6A6A6" d="M130.229,40H4.76C2.153,40,0,37.872,0,35.267V4.726C0,2.12,2.153,0,4.76,0h125.468
|
||||
C132.834,0,135,2.12,135,4.726v30.541C135,37.872,132.834,40,130.229,40L130.229,40z"/>
|
||||
<path d="M134.032,35.268c0,2.116-1.714,3.83-3.834,3.83H4.729c-2.119,0-3.839-1.714-3.839-3.83V4.725
|
||||
c0-2.115,1.72-3.835,3.839-3.835h125.468c2.121,0,3.834,1.72,3.834,3.835L134.032,35.268L134.032,35.268z"/>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M30.159,19.784c-0.029-3.223,2.639-4.791,2.761-4.864c-1.511-2.203-3.853-2.504-4.676-2.528
|
||||
c-1.967-0.207-3.875,1.177-4.877,1.177c-1.022,0-2.565-1.157-4.228-1.123c-2.14,0.033-4.142,1.272-5.24,3.196
|
||||
c-2.266,3.923-0.576,9.688,1.595,12.859c1.086,1.553,2.355,3.287,4.016,3.226c1.625-0.067,2.232-1.036,4.193-1.036
|
||||
c1.943,0,2.513,1.036,4.207,0.997c1.744-0.028,2.842-1.56,3.89-3.127c1.255-1.78,1.759-3.533,1.779-3.623
|
||||
C33.539,24.924,30.192,23.647,30.159,19.784z"/>
|
||||
<path fill="#FFFFFF" d="M26.959,10.306c0.874-1.093,1.472-2.58,1.306-4.089C27,6.273,25.417,7.091,24.507,8.161
|
||||
c-0.806,0.942-1.526,2.486-1.34,3.938C24.588,12.205,26.047,11.382,26.959,10.306z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M45.175,31.504h-1.944V18.742h1.944V31.504z"/>
|
||||
<path fill="#FFFFFF" d="M50.251,19.048c-0.516,1.812-1.128,3.3-1.836,4.464l-1.206,0.126c0.528-1.44,0.906-2.91,1.134-4.41
|
||||
L50.251,19.048z"/>
|
||||
<path fill="#FFFFFF" d="M59.773,31.504h-2.07l-1.134-3.563h-3.942l-1.08,3.563h-2.016l3.906-12.132h2.412L59.773,31.504z
|
||||
M56.227,26.445l-1.026-3.168c-0.108-0.323-0.312-1.086-0.612-2.286h-0.036c-0.12,0.516-0.312,1.278-0.576,2.286l-1.008,3.168
|
||||
H56.227z"/>
|
||||
<path fill="#FFFFFF" d="M69.816,27.021c0,1.488-0.402,2.664-1.207,3.528c-0.72,0.769-1.614,1.152-2.682,1.152
|
||||
c-1.152,0-1.98-0.414-2.484-1.242h-0.036v4.608h-1.944v-9.433c0-0.937-0.024-1.896-0.072-2.88h1.71l0.108,1.387h0.036
|
||||
c0.648-1.045,1.632-1.566,2.952-1.566c1.032,0,1.893,0.408,2.583,1.224C69.471,24.616,69.816,25.689,69.816,27.021z
|
||||
M67.836,27.094c0-0.852-0.192-1.554-0.576-2.105c-0.42-0.576-0.984-0.864-1.692-0.864c-0.48,0-0.916,0.159-1.305,0.478
|
||||
c-0.39,0.317-0.645,0.734-0.765,1.25c-0.06,0.24-0.09,0.438-0.09,0.594v1.458c0,0.637,0.195,1.174,0.585,1.611
|
||||
c0.39,0.438,0.897,0.657,1.521,0.657c0.732,0,1.302-0.282,1.71-0.846C67.632,28.762,67.836,28.019,67.836,27.094z"/>
|
||||
<path fill="#FFFFFF" d="M79.879,27.021c0,1.488-0.402,2.664-1.207,3.528c-0.719,0.769-1.613,1.152-2.682,1.152
|
||||
c-1.152,0-1.98-0.414-2.484-1.242h-0.035v4.608h-1.945v-9.433c0-0.937-0.023-1.896-0.07-2.88h1.709l0.107,1.387h0.037
|
||||
c0.648-1.045,1.631-1.566,2.951-1.566c1.033,0,1.893,0.408,2.584,1.224C79.533,24.616,79.879,25.689,79.879,27.021z
|
||||
M77.898,27.094c0-0.852-0.191-1.554-0.576-2.105c-0.42-0.576-0.984-0.864-1.691-0.864c-0.48,0-0.916,0.159-1.305,0.478
|
||||
c-0.391,0.317-0.646,0.734-0.766,1.25c-0.061,0.24-0.09,0.438-0.09,0.594v1.458c0,0.637,0.195,1.174,0.584,1.611
|
||||
c0.391,0.438,0.898,0.657,1.521,0.657c0.732,0,1.303-0.282,1.711-0.846C77.693,28.762,77.898,28.019,77.898,27.094z"/>
|
||||
<path fill="#FFFFFF" d="M91.127,28.103c0,1.031-0.359,1.871-1.076,2.52c-0.791,0.708-1.893,1.062-3.305,1.062
|
||||
c-1.307,0-2.354-0.252-3.145-0.756l0.449-1.62c0.852,0.517,1.789,0.774,2.809,0.774c0.732,0,1.303-0.165,1.711-0.496
|
||||
c0.408-0.33,0.613-0.772,0.613-1.325c0-0.493-0.168-0.907-0.504-1.244c-0.336-0.336-0.895-0.649-1.674-0.938
|
||||
c-2.125-0.793-3.188-1.953-3.188-3.479c0-0.998,0.373-1.815,1.117-2.452c0.744-0.637,1.734-0.956,2.971-0.956
|
||||
c1.104,0,2.021,0.192,2.754,0.576l-0.486,1.583c-0.684-0.372-1.459-0.558-2.322-0.558c-0.684,0-1.219,0.168-1.602,0.504
|
||||
c-0.324,0.3-0.486,0.666-0.486,1.099c0,0.479,0.186,0.875,0.559,1.188c0.322,0.288,0.91,0.6,1.764,0.936
|
||||
c1.043,0.42,1.811,0.912,2.303,1.477S91.127,27.262,91.127,28.103z"/>
|
||||
<path fill="#FFFFFF" d="M97.553,24.214h-2.141v4.248c0,1.08,0.377,1.62,1.133,1.62c0.348,0,0.637-0.03,0.865-0.09l0.053,1.476
|
||||
c-0.383,0.145-0.887,0.216-1.512,0.216c-0.768,0-1.367-0.233-1.799-0.702c-0.434-0.468-0.648-1.253-0.648-2.357v-4.41h-1.279
|
||||
v-1.458h1.279v-1.602l1.908-0.576v2.178h2.141V24.214z"/>
|
||||
<path fill="#FFFFFF" d="M107.219,27.059c0,1.343-0.385,2.447-1.152,3.312c-0.805,0.888-1.871,1.332-3.203,1.332
|
||||
c-1.285,0-2.309-0.426-3.07-1.278c-0.762-0.852-1.143-1.926-1.143-3.222c0-1.356,0.393-2.466,1.18-3.33
|
||||
c0.785-0.864,1.844-1.296,3.176-1.296c1.285,0,2.316,0.426,3.096,1.277C106.846,24.682,107.219,25.75,107.219,27.059z
|
||||
M105.203,27.121c0-0.807-0.174-1.498-0.523-2.076c-0.408-0.697-0.988-1.047-1.746-1.047c-0.779,0-1.373,0.35-1.781,1.047
|
||||
c-0.348,0.578-0.521,1.281-0.521,2.111c0,0.808,0.174,1.499,0.521,2.076c0.42,0.698,1.008,1.048,1.764,1.048
|
||||
c0.744,0,1.326-0.355,1.746-1.065C105.021,28.625,105.203,27.927,105.203,27.121z"/>
|
||||
<path fill="#FFFFFF" d="M113.535,24.466c-0.191-0.036-0.395-0.054-0.611-0.054c-0.684,0-1.213,0.258-1.584,0.773
|
||||
c-0.324,0.457-0.486,1.033-0.486,1.729v4.59h-1.943l0.018-5.994c0-1.008-0.023-1.926-0.072-2.754h1.693l0.07,1.674h0.055
|
||||
c0.205-0.576,0.527-1.037,0.973-1.386c0.432-0.312,0.9-0.468,1.404-0.468c0.18,0,0.342,0.012,0.484,0.035V24.466z"/>
|
||||
<path fill="#FFFFFF" d="M122.23,26.716c0,0.349-0.025,0.642-0.072,0.882h-5.832c0.023,0.864,0.307,1.524,0.846,1.98
|
||||
c0.492,0.408,1.129,0.611,1.908,0.611c0.863,0,1.65-0.138,2.357-0.413l0.307,1.35c-0.828,0.36-1.807,0.54-2.934,0.54
|
||||
c-1.357,0-2.422-0.398-3.195-1.197c-0.773-0.798-1.16-1.869-1.16-3.213c0-1.32,0.359-2.418,1.078-3.294
|
||||
c0.758-0.937,1.777-1.403,3.061-1.403c1.26,0,2.215,0.467,2.863,1.403C121.973,24.706,122.23,25.624,122.23,26.716z
|
||||
M120.377,26.212c0.012-0.576-0.115-1.073-0.379-1.494c-0.336-0.54-0.852-0.81-1.549-0.81c-0.635,0-1.15,0.264-1.547,0.791
|
||||
c-0.324,0.421-0.516,0.925-0.576,1.513H120.377z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M47.84,7.778h-1.872v5.655H44.92V7.778h-1.862V6.896h4.782V7.778z"/>
|
||||
<path fill="#FFFFFF" d="M52.981,10.853c0,0.188-0.014,0.346-0.039,0.475h-3.143c0.013,0.466,0.164,0.821,0.455,1.067
|
||||
c0.266,0.22,0.608,0.33,1.028,0.33c0.466,0,0.89-0.074,1.271-0.223l0.164,0.728c-0.446,0.194-0.973,0.291-1.581,0.291
|
||||
c-0.73,0-1.305-0.215-1.722-0.645s-0.625-1.007-0.625-1.731c0-0.711,0.193-1.303,0.582-1.775
|
||||
c0.407-0.504,0.956-0.756,1.648-0.756c0.679,0,1.193,0.252,1.542,0.756C52.841,9.77,52.981,10.265,52.981,10.853z M51.981,10.582
|
||||
c0.007-0.311-0.062-0.579-0.203-0.805c-0.182-0.291-0.459-0.437-0.834-0.437c-0.343,0-0.621,0.142-0.835,0.427
|
||||
c-0.174,0.227-0.277,0.498-0.31,0.815H51.981z M52.409,6.74l-1.174,1.406h-0.728l0.844-1.406H52.409z"/>
|
||||
<path fill="#FFFFFF" d="M55.55,13.433h-1.048V6.556h1.048V13.433z"/>
|
||||
<path fill="#FFFFFF" d="M61.293,10.853c0,0.188-0.014,0.346-0.039,0.475h-3.143c0.013,0.466,0.164,0.821,0.455,1.067
|
||||
c0.266,0.22,0.608,0.33,1.028,0.33c0.466,0,0.89-0.074,1.271-0.223l0.164,0.728c-0.446,0.194-0.973,0.291-1.581,0.291
|
||||
c-0.73,0-1.305-0.215-1.722-0.645s-0.625-1.007-0.625-1.731c0-0.711,0.193-1.303,0.582-1.775
|
||||
c0.407-0.504,0.956-0.756,1.648-0.756c0.679,0,1.193,0.252,1.542,0.756C61.154,9.77,61.293,10.265,61.293,10.853z M60.293,10.582
|
||||
c0.007-0.311-0.062-0.579-0.203-0.805c-0.182-0.291-0.459-0.437-0.834-0.437c-0.343,0-0.621,0.142-0.835,0.427
|
||||
c-0.174,0.227-0.277,0.498-0.31,0.815H60.293z M60.721,6.74l-1.174,1.406H58.82l0.844-1.406H60.721z"/>
|
||||
<path fill="#FFFFFF" d="M66.181,8.845l-0.203,0.795c-0.266-0.129-0.569-0.194-0.912-0.194c-0.459,0-0.823,0.154-1.092,0.461
|
||||
c-0.268,0.307-0.402,0.697-0.402,1.169c0,0.498,0.141,0.892,0.422,1.183s0.639,0.437,1.072,0.437c0.323,0,0.64-0.064,0.95-0.194
|
||||
l0.146,0.786c-0.343,0.162-0.775,0.243-1.3,0.243c-0.718,0-1.29-0.218-1.717-0.655s-0.64-1.02-0.64-1.751
|
||||
c0-0.73,0.229-1.331,0.688-1.799s1.076-0.703,1.853-0.703C65.486,8.622,65.865,8.696,66.181,8.845z"/>
|
||||
<path fill="#FFFFFF" d="M71.709,13.433h-1.047v-2.68c0-0.845-0.316-1.268-0.951-1.268c-0.484,0-0.818,0.245-0.999,0.735
|
||||
c-0.032,0.103-0.049,0.229-0.049,0.377v2.835h-1.048V6.556h1.048v2.841h0.02c0.331-0.517,0.801-0.775,1.417-0.775
|
||||
c0.434,0,0.791,0.142,1.076,0.427c0.355,0.355,0.533,0.883,0.533,1.581V13.433z"/>
|
||||
<path fill="#FFFFFF" d="M77.084,13.433h-0.941l-0.078-0.543h-0.029c-0.322,0.433-0.781,0.65-1.377,0.65
|
||||
c-0.445,0-0.805-0.143-1.076-0.427c-0.246-0.258-0.369-0.579-0.369-0.96c0-0.576,0.24-1.015,0.723-1.319
|
||||
c0.482-0.304,1.16-0.453,2.033-0.446V10.3c0-0.621-0.326-0.931-0.979-0.931c-0.465,0-0.875,0.117-1.229,0.349l-0.213-0.688
|
||||
c0.438-0.271,0.979-0.407,1.617-0.407c1.232,0,1.85,0.65,1.85,1.95v1.736C77.016,12.78,77.039,13.155,77.084,13.433z
|
||||
M75.996,11.813v-0.727c-1.156-0.02-1.734,0.297-1.734,0.95c0,0.246,0.066,0.43,0.201,0.553c0.135,0.123,0.307,0.184,0.512,0.184
|
||||
c0.23,0,0.445-0.073,0.641-0.218c0.197-0.146,0.318-0.331,0.363-0.558C75.99,11.946,75.996,11.884,75.996,11.813z"/>
|
||||
<path fill="#FFFFFF" d="M81.342,9.641c-0.104-0.02-0.213-0.029-0.33-0.029c-0.367,0-0.652,0.139-0.854,0.417
|
||||
c-0.174,0.246-0.262,0.556-0.262,0.931v2.474H78.85l0.01-3.23c0-0.543-0.014-1.038-0.039-1.484h0.912l0.039,0.902h0.029
|
||||
c0.109-0.311,0.283-0.56,0.523-0.747c0.232-0.168,0.484-0.252,0.756-0.252c0.098,0,0.186,0.006,0.262,0.019V9.641z"/>
|
||||
<path fill="#FFFFFF" d="M86.812,8.719c-0.025,0.382-0.039,0.828-0.039,1.339v2.696c0,1.015-0.227,1.727-0.678,2.134
|
||||
c-0.414,0.375-0.996,0.562-1.746,0.562c-0.654,0-1.182-0.123-1.582-0.369l0.242-0.805c0.395,0.239,0.842,0.359,1.34,0.359
|
||||
c0.924,0,1.387-0.498,1.387-1.494v-0.456h-0.02c-0.291,0.479-0.754,0.718-1.387,0.718c-0.57,0-1.039-0.216-1.406-0.65
|
||||
c-0.369-0.433-0.553-0.983-0.553-1.649c0-0.756,0.213-1.368,0.639-1.833c0.395-0.433,0.877-0.65,1.445-0.65
|
||||
c0.641,0,1.1,0.249,1.379,0.747h0.018l0.039-0.65H86.812z M85.727,11.416v-0.834c0-0.317-0.1-0.588-0.297-0.815
|
||||
c-0.199-0.227-0.459-0.339-0.785-0.339c-0.357,0-0.65,0.148-0.881,0.446c-0.23,0.298-0.346,0.695-0.346,1.193
|
||||
c0,0.453,0.107,0.818,0.322,1.096c0.219,0.304,0.521,0.456,0.904,0.456c0.234,0,0.443-0.069,0.629-0.208
|
||||
c0.186-0.139,0.316-0.328,0.395-0.567C85.707,11.726,85.727,11.583,85.727,11.416z"/>
|
||||
<path fill="#FFFFFF" d="M92.516,10.853c0,0.188-0.014,0.346-0.039,0.475h-3.143c0.014,0.466,0.164,0.821,0.455,1.067
|
||||
c0.266,0.22,0.609,0.33,1.029,0.33c0.465,0,0.889-0.074,1.271-0.223l0.164,0.728c-0.447,0.194-0.973,0.291-1.582,0.291
|
||||
c-0.73,0-1.305-0.215-1.721-0.645c-0.418-0.43-0.625-1.007-0.625-1.731c0-0.711,0.193-1.303,0.582-1.775
|
||||
c0.406-0.504,0.955-0.756,1.648-0.756c0.678,0,1.193,0.252,1.541,0.756C92.377,9.77,92.516,10.265,92.516,10.853z M91.516,10.582
|
||||
c0.008-0.311-0.061-0.579-0.203-0.805c-0.182-0.291-0.459-0.437-0.834-0.437c-0.342,0-0.621,0.142-0.834,0.427
|
||||
c-0.174,0.227-0.277,0.498-0.311,0.815H91.516z"/>
|
||||
<path fill="#FFFFFF" d="M96.531,9.641c-0.104-0.02-0.213-0.029-0.33-0.029c-0.369,0-0.652,0.139-0.854,0.417
|
||||
c-0.174,0.246-0.262,0.556-0.262,0.931v2.474h-1.049l0.01-3.23c0-0.543-0.012-1.038-0.037-1.484h0.91l0.039,0.902h0.029
|
||||
c0.109-0.311,0.285-0.56,0.523-0.747c0.234-0.168,0.486-0.252,0.758-0.252c0.096,0,0.184,0.006,0.262,0.019V9.641z"/>
|
||||
<path fill="#FFFFFF" d="M104.893,13.433h-0.932l-0.049-0.757h-0.029c-0.297,0.576-0.801,0.864-1.512,0.864
|
||||
c-0.57,0-1.041-0.223-1.416-0.669s-0.562-1.025-0.562-1.736c0-0.763,0.203-1.381,0.609-1.853c0.395-0.44,0.881-0.66,1.455-0.66
|
||||
c0.635,0,1.078,0.213,1.33,0.64h0.02V6.556h1.047v5.607C104.854,12.622,104.867,13.045,104.893,13.433z M103.807,11.445v-0.786
|
||||
c0-0.136-0.01-0.246-0.029-0.33c-0.059-0.252-0.186-0.464-0.381-0.635s-0.428-0.257-0.701-0.257c-0.389,0-0.695,0.155-0.92,0.466
|
||||
s-0.336,0.708-0.336,1.193c0,0.466,0.107,0.844,0.322,1.135c0.227,0.31,0.531,0.465,0.914,0.465c0.344,0,0.621-0.129,0.828-0.388
|
||||
C103.705,12.069,103.807,11.781,103.807,11.445z"/>
|
||||
<path fill="#FFFFFF" d="M110.246,13.433h-0.941l-0.076-0.543h-0.029c-0.324,0.433-0.783,0.65-1.377,0.65
|
||||
c-0.447,0-0.807-0.143-1.078-0.427c-0.246-0.258-0.367-0.579-0.367-0.96c0-0.576,0.24-1.015,0.723-1.319
|
||||
c0.48-0.304,1.158-0.453,2.031-0.446V10.3c0-0.621-0.326-0.931-0.977-0.931c-0.465,0-0.875,0.117-1.23,0.349l-0.213-0.688
|
||||
c0.439-0.271,0.979-0.407,1.617-0.407c1.234,0,1.85,0.65,1.85,1.95v1.736C110.178,12.78,110.201,13.155,110.246,13.433z
|
||||
M109.16,11.813v-0.727c-1.158-0.02-1.736,0.297-1.736,0.95c0,0.246,0.068,0.43,0.203,0.553c0.135,0.123,0.305,0.184,0.51,0.184
|
||||
c0.232,0,0.445-0.073,0.643-0.218c0.195-0.146,0.316-0.331,0.361-0.558C109.154,11.946,109.16,11.884,109.16,11.813z"/>
|
||||
<path fill="#FFFFFF" d="M116.105,13.433h-1.049v-2.7c0-0.832-0.316-1.248-0.949-1.248c-0.311,0-0.562,0.114-0.758,0.343
|
||||
c-0.193,0.229-0.291,0.499-0.291,0.808v2.796h-1.047v-3.366c0-0.414-0.014-0.863-0.039-1.349h0.922l0.049,0.737h0.029
|
||||
c0.121-0.229,0.303-0.418,0.543-0.569c0.283-0.176,0.602-0.265,0.949-0.265c0.441,0,0.807,0.142,1.098,0.427
|
||||
c0.361,0.349,0.543,0.87,0.543,1.562V13.433z"/>
|
||||
<path fill="#FFFFFF" d="M120.83,12.079c0,0.438-0.162,0.79-0.484,1.055c-0.324,0.265-0.77,0.397-1.34,0.397
|
||||
c-0.537,0-0.992-0.107-1.367-0.32l0.223-0.776c0.363,0.22,0.748,0.33,1.154,0.33c0.537,0,0.805-0.197,0.805-0.592
|
||||
c0-0.174-0.057-0.318-0.174-0.432c-0.117-0.113-0.324-0.225-0.621-0.334c-0.84-0.311-1.26-0.763-1.26-1.358
|
||||
c0-0.407,0.154-0.747,0.465-1.019s0.721-0.407,1.232-0.407c0.465,0,0.863,0.095,1.193,0.285l-0.225,0.753
|
||||
c-0.303-0.181-0.623-0.271-0.959-0.271c-0.221,0-0.393,0.052-0.516,0.155c-0.121,0.104-0.184,0.235-0.184,0.397
|
||||
c0,0.161,0.064,0.293,0.193,0.396c0.111,0.097,0.324,0.203,0.641,0.319C120.422,10.966,120.83,11.44,120.83,12.079z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 14 KiB |
BIN
patch/sources/syncserver/page/sync_files/btn-google-play.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
21
patch/sources/syncserver/page/sync_files/common-bundle.js
Normal file
|
@ -0,0 +1 @@
|
|||
(function(){var e=document.getElementsByTagName("html")[0].getAttribute("data-gtm-container-id");typeof window._dntEnabled=="function"&&!window._dntEnabled()&&e&&function(e,t,n,r,i,s,o,u,a,f){e[r]=e[r]||[],e[r].push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),o=t.getElementsByTagName(n)[0],a=i.length,f="//www.googletagmanager.com/gtm.js?id=@&l="+(r||"dataLayer");while(a--)s=t.createElement(n),s.async=!0,s.src=f.replace("@",i[a]),o.parentNode.insertBefore(s,o)}(window,document,"script","dataLayer",[e])})();
|
1
patch/sources/syncserver/page/sync_files/site-bundle.js
Normal file
|
@ -0,0 +1 @@
|
|||
function _dntEnabled(e,t){"use strict";var n=e||navigator.doNotTrack||window.doNotTrack||navigator.msDoNotTrack,r=t||navigator.userAgent,i=["Windows NT 6.1","Windows NT 6.2","Windows NT 6.3"],s=r.match(/Firefox\/(\d+)/),o=/MSIE|Trident/i,u=o.test(r),a=r.match(/Windows.+?(?=;)/g);return u&&typeof Array.prototype.indexOf!="function"?!1:(s&&parseInt(s[1],10)<32?n="Unspecified":u&&a&&i.indexOf(a.toString())!==-1?n="Unspecified":n={0:"Disabled",1:"Enabled"}[n]||"Unspecified",n==="Enabled"?!0:!1)}(function(){"use strict";window.site={getPlatform:function(e,t){return t=t===""?"":t||navigator.platform,e=e||navigator.userAgent,/Win(16|9[x58]|NT( [1234]| 5\.0| [^0-9]|[^ -]|$))/.test(e)||/Windows ([MC]E|9[x58]|3\.1|4\.10|NT( [1234]\D| 5\.0| [^0-9]|[^ ]|$))/.test(e)||/Windows_95/.test(e)?"oldwin":t.indexOf("Win32")!==-1||t.indexOf("Win64")!==-1?"windows":/android/i.test(e)?"android":/linux/i.test(t)||/linux/i.test(e)?"linux":t.indexOf("MacPPC")!==-1?"oldmac":/Mac OS X 10.[0-5]\D/.test(e)?"oldmac":t.indexOf("iPhone")!==-1||t.indexOf("iPad")!==-1||t.indexOf("iPod")!==-1?"ios":e.indexOf("Mac OS X")!==-1?"osx":e.indexOf("MSIE 5.2")!==-1?"oldmac":t.indexOf("Mac")!==-1?"oldmac":t===""&&/Firefox/.test(e)?"fxos":"other"},getPlatformVersion:function(e){e=e||navigator.userAgent;var t=e.match(/Windows\ NT\ (\d+\.\d+)/)||e.match(/Mac\ OS\ X\ (\d+[\._]\d+)/)||e.match(/Android\ (\d+\.\d+)/);return t?t[1].replace("_","."):undefined},getArchType:function(e,t){t=t===""?"":t||navigator.platform,e=e||navigator.userAgent;var n;return/Windows/.test(e)&&/ARM/.test(e)?"armv7":navigator.cpuClass?navigator.cpuClass.toLowerCase():(n=/armv\d+/i,n.test(t)||n.test(e)?RegExp.lastMatch.toLowerCase():/aarch64/.test(t)?"armv8":(n=/PowerPC|PPC/i,n.test(t)||n.test(e)?"ppc":"x86"))},getArchSize:function(e,t){t=t===""?"":t||navigator.platform,e=e||navigator.userAgent;var n=/x64|x86_64|Win64|WOW64|aarch64/i;return n.test(t)||n.test(e)?64:32},needsSha1:function(e){e=e||navigator.userAgent;var t=/Windows (?:NT 5.1|XP|NT 5.2|NT 6.0)/,n=/\sFirefox/;return t.test(e)&&!n.test(e)},platform:"other",platformVersion:undefined,archType:"x64",archSize:32},function(){var e=document.documentElement,t=window.site.platform=window.site.getPlatform(),n=window.site.platformVersion=window.site.getPlatformVersion();t==="windows"?n&&parseFloat(n)>=6.1?e.className+=" win7up":window.site.needsSha1()&&(e.className+=" sha-1"):(e.className=e.className.replace("windows",t),t==="osx"&&n&&n.match(/^10\.[678]$/)&&(e.className+=" pre-mavericks"),t==="android"&&n&&parseFloat(n)===2.3&&(e.className+=" gingerbread"));var r=window.site.archType=window.site.getArchType(),i=window.site.archSize=window.site.getArchSize(),s=r.match(/armv(\d+)/);r!=="x86"&&(e.className=e.className.replace("x86",r),s&&(e.className+=" arm",parseFloat(s[1])>=7&&(e.className+=" armv7up"))),i===64&&(e.className+=" x64"),e.className=e.className.replace(/\bno-js\b/,"js")}()})();if(typeof Mozilla=="undefined")var Mozilla={};(function(){var e=window.dataLayer=window.dataLayer||[],t={};t.getPageId=function(e){var t=document.getElementsByTagName("html")[0].getAttribute("data-gtm-page-id"),n=e?e:document.location.pathname;return t?t:n.replace(/^(\/\w{2}\-\w{2}\/|\/\w{2,3}\/)/,"/")},e.push({event:"page-id-loaded",pageId:t.getPageId()}),Mozilla.Analytics=t})();
|
221
patch/sources/syncserver/staticnode.py
Normal file
|
@ -0,0 +1,221 @@
|
|||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
"""
|
||||
Simple node-assignment backend using a single, static node.
|
||||
|
||||
This is a greatly-simplified node-assignment backend. It keeps user records
|
||||
in an SQL database, but does not attempt to do any node management. All users
|
||||
are implicitly assigned to a single, static node.
|
||||
|
||||
XXX TODO: move this into the tokenserver repo.
|
||||
|
||||
"""
|
||||
import time
|
||||
import urlparse
|
||||
from mozsvc.exceptions import BackendError
|
||||
|
||||
from sqlalchemy import Column, Integer, String, BigInteger, Index
|
||||
from sqlalchemy import create_engine, Table, MetaData
|
||||
from sqlalchemy.pool import QueuePool
|
||||
from sqlalchemy.sql import text as sqltext
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
|
||||
from tokenserver.assignment import INodeAssignment
|
||||
from zope.interface import implements
|
||||
|
||||
|
||||
metadata = MetaData()
|
||||
|
||||
|
||||
users = Table(
|
||||
"users",
|
||||
metadata,
|
||||
Column("uid", Integer(), primary_key=True, autoincrement=True,
|
||||
nullable=False),
|
||||
Column("service", String(32), nullable=False),
|
||||
Column("email", String(255), nullable=False),
|
||||
Column("generation", BigInteger(), nullable=False),
|
||||
Column("client_state", String(32), nullable=False),
|
||||
Column("created_at", BigInteger(), nullable=False),
|
||||
Column("replaced_at", BigInteger(), nullable=True),
|
||||
Index('lookup_idx', 'email', 'service', 'created_at'),
|
||||
Index('clientstate_idx', 'email', 'service', 'client_state', unique=True),
|
||||
)
|
||||
|
||||
|
||||
_GET_USER_RECORDS = sqltext("""\
|
||||
select
|
||||
uid, generation, client_state
|
||||
from
|
||||
users
|
||||
where
|
||||
email = :email
|
||||
and
|
||||
service = :service
|
||||
order by
|
||||
created_at desc, uid desc
|
||||
limit
|
||||
20
|
||||
""")
|
||||
|
||||
|
||||
_CREATE_USER_RECORD = sqltext("""\
|
||||
insert into
|
||||
users
|
||||
(service, email, generation, client_state, created_at, replaced_at)
|
||||
values
|
||||
(:service, :email, :generation, :client_state, :timestamp, NULL)
|
||||
""")
|
||||
|
||||
|
||||
_UPDATE_GENERATION_NUMBER = sqltext("""\
|
||||
update
|
||||
users
|
||||
set
|
||||
generation = :generation
|
||||
where
|
||||
service = :service and email = :email and
|
||||
generation < :generation and replaced_at is null
|
||||
""")
|
||||
|
||||
|
||||
_REPLACE_USER_RECORDS = sqltext("""\
|
||||
update
|
||||
users
|
||||
set
|
||||
replaced_at = :timestamp
|
||||
where
|
||||
service = :service and email = :email
|
||||
and replaced_at is null and created_at < :timestamp
|
||||
""")
|
||||
|
||||
|
||||
def get_timestamp():
|
||||
"""Get current timestamp in milliseconds."""
|
||||
return int(time.time() * 1000)
|
||||
|
||||
|
||||
class StaticNodeAssignment(object):
|
||||
implements(INodeAssignment)
|
||||
|
||||
def __init__(self, sqluri, node_url, **kw):
|
||||
self.sqluri = sqluri
|
||||
self.node_url = node_url
|
||||
self.driver = urlparse.urlparse(sqluri).scheme.lower()
|
||||
sqlkw = {
|
||||
"logging_name": "syncserver",
|
||||
"connect_args": {},
|
||||
"poolclass": QueuePool,
|
||||
"pool_reset_on_return": True,
|
||||
}
|
||||
if self.driver == "sqlite":
|
||||
# We must mark it as safe to share sqlite connections between
|
||||
# threads. The pool will ensure there's on race conditions.
|
||||
sqlkw["connect_args"]["check_same_thread"] = False
|
||||
# If using a :memory: database, we must use a QueuePool of size
|
||||
# 1 so that a single connection is shared by all threads.
|
||||
if urlparse.urlparse(sqluri).path.lower() in ("/", "/:memory:"):
|
||||
sqlkw["pool_size"] = 1
|
||||
sqlkw["max_overflow"] = 0
|
||||
if "mysql" in self.driver:
|
||||
# Guard against the db closing idle conections.
|
||||
sqlkw["pool_recycle"] = 3600
|
||||
self._engine = create_engine(sqluri, **sqlkw)
|
||||
users.create(self._engine, checkfirst=True)
|
||||
|
||||
def get_user(self, service, email):
|
||||
params = {'service': service, 'email': email}
|
||||
res = self._engine.execute(_GET_USER_RECORDS, **params)
|
||||
try:
|
||||
row = res.fetchone()
|
||||
if row is None:
|
||||
return None
|
||||
# The first row is the most up-to-date user record.
|
||||
user = {
|
||||
'email': email,
|
||||
'uid': row.uid,
|
||||
'node': self.node_url,
|
||||
'generation': row.generation,
|
||||
'client_state': row.client_state,
|
||||
'old_client_states': {}
|
||||
}
|
||||
# Any subsequent rows are due to old client-state values.
|
||||
row = res.fetchone()
|
||||
while row is not None:
|
||||
user['old_client_states'][row.client_state] = True
|
||||
row = res.fetchone()
|
||||
return user
|
||||
finally:
|
||||
res.close()
|
||||
|
||||
def allocate_user(self, service, email, generation=0, client_state=''):
|
||||
params = {
|
||||
'service': service, 'email': email, 'generation': generation,
|
||||
'client_state': client_state, 'timestamp': get_timestamp()
|
||||
}
|
||||
try:
|
||||
res = self._engine.execute(_CREATE_USER_RECORD, **params)
|
||||
except IntegrityError:
|
||||
raise
|
||||
return self.get_user(service, email)
|
||||
else:
|
||||
res.close()
|
||||
return {
|
||||
'email': email,
|
||||
'uid': res.lastrowid,
|
||||
'node': self.node_url,
|
||||
'generation': generation,
|
||||
'client_state': client_state,
|
||||
'old_client_states': {}
|
||||
}
|
||||
|
||||
def update_user(self, service, user, generation=None, client_state=None):
|
||||
if client_state is None:
|
||||
# uid can stay the same, just update the generation number.
|
||||
if generation is not None:
|
||||
params = {
|
||||
'service': service,
|
||||
'email': user['email'],
|
||||
'generation': generation,
|
||||
}
|
||||
res = self._engine.execute(_UPDATE_GENERATION_NUMBER, **params)
|
||||
res.close()
|
||||
user['generation'] = max(generation, user['generation'])
|
||||
else:
|
||||
# reject previously-seen client-state strings.
|
||||
if client_state == user['client_state']:
|
||||
raise BackendError('previously seen client-state string')
|
||||
if client_state in user['old_client_states']:
|
||||
raise BackendError('previously seen client-state string')
|
||||
# need to create a new record for new client_state.
|
||||
if generation is not None:
|
||||
generation = max(user['generation'], generation)
|
||||
else:
|
||||
generation = user['generation']
|
||||
now = get_timestamp()
|
||||
params = {
|
||||
'service': service, 'email': user['email'],
|
||||
'generation': generation, 'client_state': client_state,
|
||||
'timestamp': now,
|
||||
}
|
||||
try:
|
||||
res = self._engine.execute(_CREATE_USER_RECORD, **params)
|
||||
except IntegrityError:
|
||||
user.update(self.get_user(service, user['email']))
|
||||
else:
|
||||
self.get_user(service, user['email'])
|
||||
user['uid'] = res.lastrowid
|
||||
user['generation'] = generation
|
||||
user['old_client_states'][user['client_state']] = True
|
||||
user['client_state'] = client_state
|
||||
res.close()
|
||||
# mark old records as having been replaced.
|
||||
# if we crash here, they are unmarked and we may fail to
|
||||
# garbage collect them for a while, but the active state
|
||||
# will be undamaged.
|
||||
params = {
|
||||
'service': service, 'email': user['email'], 'timestamp': now
|
||||
}
|
||||
res = self._engine.execute(_REPLACE_USER_RECORDS, **params)
|
||||
res.close()
|
19
patch/sources/syncserver/tests.ini
Normal file
|
@ -0,0 +1,19 @@
|
|||
[server:main]
|
||||
use = egg:gunicorn
|
||||
host = 0.0.0.0
|
||||
port = 5000
|
||||
workers = 1
|
||||
timeout = 30
|
||||
|
||||
[app:main]
|
||||
use = egg:SyncServer
|
||||
|
||||
[syncserver]
|
||||
# This must be edited to point to the public URL of your server.
|
||||
public_url = http://localhost:5000/
|
||||
|
||||
# This defines the database in which to store all server data.
|
||||
#sqluri = sqlite:////tmp/syncserver.db
|
||||
|
||||
# This is a secret key used for signing authentication tokens.
|
||||
#secret = INSERT_SECRET_KEY_HERE
|
|
@ -47,6 +47,9 @@ then
|
|||
sudo swapon $tmp_swap_file
|
||||
fi
|
||||
|
||||
# Patch the 'source' submodule with the 'patch' directory
|
||||
git submodule update --recursive
|
||||
sudo cp -a ../patch/sources/* ../sources
|
||||
|
||||
# Modify assets to take path into account
|
||||
sudo find ../sources/syncserver/page/sync_files/ -type f -exec sed -i -e "s@media\/img@$path\/media\/img@g" {} \;
|
||||
|
|
|
@ -36,6 +36,10 @@ then
|
|||
sudo swapon $tmp_swap_file
|
||||
fi
|
||||
|
||||
# Patch the 'source' submodule with the 'patch' directory
|
||||
git submodule update --recursive
|
||||
sudo cup -a ../patch/sources/* ../sources
|
||||
|
||||
# Modify assets to take path into account
|
||||
sudo find ../sources/syncserver/page/sync_files/ -type f -exec sed -i -e "s@media\/img@$path\/media\/img@g" {} \;
|
||||
|
||||
|
|