Merge branch 'master' of github.com:bil-elmoussaoui/Gnome-TwoFactorAuth

This commit is contained in:
alpha 2016-06-20 12:27:16 +03:00
commit ce5bd3759a
64 changed files with 6094 additions and 744 deletions

View file

@ -1,13 +1,15 @@
![Status](https://img.shields.io/badge/status-stable-green.svg) [![Version](https://img.shields.io/badge/version-0.1beta2-green.svg)](https://github.com/bil-elmoussaoui/Gnome-TwoFactorAuth/releases) ![Python
![Status](https://img.shields.io/badge/status-stable-green.svg) [![Version](https://img.shields.io/badge/version-0.1beta2-green.svg)](https://github.com/bil-elmoussaoui/Gnome-TwoFactorAuth/releases) ![Python
version](https://img.shields.io/badge/python-3.3%2B-blue.svg)
# Gnome TwoFactorAuth
Two-factor authentication code generator for Gnome <br>
For translators : https://www.transifex.com/twofactorauth/twofactorauth/
### Dependecies
### Dependecies
- `Python 3.3+`
- `Gtk 3.16+`
- `PyOTP`
- `zbarlight`
- `yaml`
- `GnomeKeyring`
<sub>PS: The application was only tested on Arch with Gtk 3.20+, but it should work nicely with older versions too. Keyboard shortcuts widget won't be shown for older versions.</sub>
@ -21,10 +23,11 @@ For translators : https://www.transifex.com/twofactorauth/twofactorauth/
- On Arch :
```bash
yaourt -S gnome-twofactourauth
```
```
### Credits
- Websites and application icons are from Paper theme, created by [Sam Hewitt](https://github.com/snwh)
- Applications/Websites database are from [twofactorauth](https://github.com/2factorauth/twofactorauth), by 2factorauth team
### How to build from source
1 - Clone the repository
@ -35,15 +38,24 @@ For translators : https://www.transifex.com/twofactorauth/twofactorauth/
```bash
sudo pip install pyotp
```
3 - Install `zbarlight`
```bash
sudo pip install zbarlight
```
4 - Install `yaml`
```bash
sudo pip install pyyaml
```
<sub>PS : In some distributions you will need to use `pip3` instead of `pip` to install the compatible version of the package with Python 3.</sub> <br>
3 - Afterwards
5 - Afterwards
```bash
./autogen.sh
make
sudo make install
```
4 - You can run the application from the desktop file or from terminal using
6 - You can run the application from the desktop file or from terminal using
```bash
gnome-twofactorauth
```
<sub>Arch users can build from source directly using AUR `yaourt -S gnome-twofactorauth-git`</sub>
<sub>Arch users can build from source directly using AUR `yaourt -S gnome-twofactorauth-git`</sub>

View file

@ -1,5 +1,6 @@
app_PYTHON = \
application.py \
utils.py \
__init__.py
appdir = $(pythondir)/TwoFactorAuth

View file

@ -4,9 +4,10 @@ require_version("Gtk", "3.0")
require_version("GnomeKeyring", "1.0")
from gi.repository import Gtk, GLib, Gio, Gdk, GObject, GnomeKeyring as GK
from TwoFactorAuth.widgets.window import Window
from TwoFactorAuth.models.authenticator import Authenticator
from TwoFactorAuth.models.database import Database
from TwoFactorAuth.widgets.settings import SettingsWindow
from TwoFactorAuth.models.settings import SettingsReader
from TwoFactorAuth.utils import *
import logging
import signal
from gettext import gettext as _
@ -16,12 +17,10 @@ class Application(Gtk.Application):
win = None
alive = True
locked = False
menu = Gio.Menu()
auth = Authenticator()
use_GMenu = True
settings_window = None
settings_action = None
def __init__(self):
Gtk.Application.__init__(self,
application_id="org.gnome.TwoFactorAuth",
@ -29,19 +28,15 @@ class Application(Gtk.Application):
GLib.set_application_name(_("TwoFactorAuth"))
GLib.set_prgname("Gnome-TwoFactorAuth")
current_desktop = env.get("XDG_CURRENT_DESKTOP")
if current_desktop:
self.use_GMenu = current_desktop.lower() == "gnome"
else:
self.use_GMenu = False
self.menu = Gio.Menu()
self.db = Database()
self.cfg = SettingsReader()
self.locked = self.cfg.read("state", "login")
result = GK.unlock_sync("Gnome-TwoFactorAuth", None)
if result == GK.Result.CANCELLED:
self.quit()
self.cfg = SettingsReader()
if self.cfg.read("state", "login"):
self.locked = True
cssProviderFile = Gio.File.new_for_uri('resource:///org/gnome/TwoFactorAuth/style.css')
cssProvider = Gtk.CssProvider()
screen = Gdk.Screen.get_default()
@ -95,26 +90,21 @@ class Application(Gtk.Application):
action.connect("activate", self.on_quit)
self.add_action(action)
if self.use_GMenu:
if is_gnome():
self.set_app_menu(self.menu)
logging.debug("Adding gnome shell menu")
def do_activate(self, *args):
self.win = Window(self)
self.win.show_all()
self.add_window(self.win)
if not self.win:
self.win = Window(self)
self.win.show_all()
self.add_window(self.win)
else:
self.win.present()
def refresh_menu(self):
if self.use_GMenu:
self.settings_action.set_enabled(
not self.settings_action.get_enabled())
def on_toggle_lock(self, *args):
if not self.locked:
self.locked = not self.locked
self.win.password_entry.grab_focus_without_selecting()
self.refresh_menu()
self.win.refresh_window()
is_enabled = self.settings_action.get_enabled()
self.settings_action.set_enabled(not is_enabled)
def on_shortcuts(self, *args):
"""
@ -143,8 +133,11 @@ class Application(Gtk.Application):
"""
Shows settings window
"""
settings_window = SettingsWindow(self.win)
settings_window.show_window()
if not self.settings_window:
self.settings_window = SettingsWindow(self.win)
self.settings_window.show_window()
else:
self.settings_window.present()
def on_quit(self, *args):
"""

View file

@ -2,5 +2,6 @@ appdir = $(pythondir)/TwoFactorAuth/models
app_PYTHON = \
code.py \
authenticator.py \
database.py \
qr_reader.py \
settings.py

View file

@ -1,29 +1,15 @@
import sqlite3
import logging
from os import path, mknod, makedirs, environ as env
from gi.repository import GdkPixbuf, Gtk
from gi.repository import GnomeKeyring as GK
from hashlib import sha256
from TwoFactorAuth.utils import create_file, get_home_path
class Authenticator:
class Database:
def __init__(self):
home = path.expanduser("~")
database_file = home + '/.config/TwoFactorAuth/database.db'
# Create missing folders
if not (path.isfile(database_file) and path.exists(database_file)):
dirs = database_file.split("/")
i = 0
while i < len(dirs) - 1:
directory = "/".join(dirs[0:i + 1]).strip()
if not path.exists(directory) and len(directory) != 0:
makedirs(directory)
logging.debug("Creating directory %s " % directory)
i += 1
# create database file
mknod(database_file)
database_file = get_home_path() + '/.config/TwoFactorAuth/database.db'
if create_file(database_file):
logging.debug("Creating database file %s " % database_file)
# Connect to database
self.conn = sqlite3.connect(database_file)
if not self.is_table_exists():
logging.debug(
@ -134,28 +120,6 @@ class Authenticator:
logging.error("SQL: Couldn't fetch accounts list %s" % str(e))
return None
@staticmethod
def get_auth_icon(image):
"""
Generate a GdkPixbuf image
:param image: icon name or image path
:return: GdkPixbux Image
"""
directory = path.join(env.get("DATA_DIR"), "applications") + "/"
theme = Gtk.IconTheme.get_default()
if path.isfile(directory + image) and path.exists(directory + image):
icon = GdkPixbuf.Pixbuf.new_from_file(directory + image)
elif path.isfile(image) and path.exists(image):
icon = GdkPixbuf.Pixbuf.new_from_file(image)
elif theme.has_icon(path.splitext(image)[0]):
icon = theme.load_icon(path.splitext(image)[0], 48, 0)
else:
icon = theme.load_icon("image-missing", 48, 0)
if icon.get_width() != 48 or icon.get_height() != 48:
icon = icon.scale_simple(48, 48,
GdkPixbuf.InterpType.BILINEAR)
return icon
def get_latest_id(self):
"""
Get the latest uid on accounts table

View file

@ -0,0 +1,41 @@
from PIL import Image
import zbarlight
from urllib.parse import urlparse, parse_qsl
import logging
from os import remove, path
from TwoFactorAuth.models.code import Code
class QRReader:
def __init__(self, filename):
self.filename = filename
def read(self):
with open(self.filename, 'rb') as image_file:
image = Image.open(image_file)
image.load()
self.codes = zbarlight.scan_codes('qrcode', image)
if self.codes:
otpauth_url = self.codes[0].decode()
self.codes = dict(parse_qsl(urlparse(otpauth_url)[4]))
return self.codes
else:
logging.error("Invalid QR image")
return None
def remove(self):
"""
remove image file for security reasons
"""
if path.isfile(self.filename):
remove(filename)
logging.debug("QR code image was removed for security reasons")
def is_valid(self):
if isinstance(self.codes, dict):
if set(["issuer", "secret"]).issubset(self.codes.keys()):
return Code.is_valid(self.codes["secret"])
else:
return False
else:
return False

66
TwoFactorAuth/utils.py Normal file
View file

@ -0,0 +1,66 @@
from os import path, mknod, makedirs, environ as env
from gi.repository import GdkPixbuf, Gtk
import logging
from subprocess import PIPE, Popen, call
from time import strftime
def is_gnome():
return env.get("XDG_CURRENT_DESKTOP").lower() == "gnome"
def get_home_path():
return path.expanduser("~")
def get_icon(image):
"""
Generate a GdkPixbuf image
:param image: icon name or image path
:return: GdkPixbux Image
"""
directory = path.join(env.get("DATA_DIR"), "applications") + "/"
theme = Gtk.IconTheme.get_default()
if path.isfile(directory + image) and path.exists(directory + image):
icon = GdkPixbuf.Pixbuf.new_from_file(directory + image)
elif path.isfile(image) and path.exists(image):
icon = GdkPixbuf.Pixbuf.new_from_file(image)
elif theme.has_icon(path.splitext(image)[0]):
icon = theme.load_icon(path.splitext(image)[0], 48, 0)
else:
icon = theme.load_icon("image-missing", 48, 0)
if icon.get_width() != 48 or icon.get_height() != 48:
icon = icon.scale_simple(48, 48, GdkPixbuf.InterpType.BILINEAR)
return icon
def create_file(file_path):
if not (path.isfile(file_path) and path.exists(file_path)):
dirs = file_path.split("/")
i = 0
while i < len(dirs) - 1:
directory = "/".join(dirs[0:i + 1]).strip()
if not path.exists(directory) and len(directory) != 0:
makedirs(directory)
logging.debug("Creating directory %s " % directory)
i += 1
mknod(file_path)
return True
else:
return False
def screenshot_area(file_name):
ink_flag = call(['which', 'gnome-screenshot'], stdout=PIPE, stderr=PIPE)
if ink_flag == 0:
p = Popen(["gnome-screenshot", "-a" , "-f", file_name],
stdout=PIPE, stderr=PIPE)
output, error = p.communicate()
if error:
error = error.decode("utf-8").split("\n")
logging.debug("\n".join([e for e in error]))
if not path.isfile(file_name):
logging.debug("The screenshot was not token")
return False
return True
else:
logging.error("Couldn't find gnome-screenshot, please install it first")
return False
def current_date_time():
return strftime("%d_%m_%Y-%H:%M:%S")

View file

@ -4,9 +4,14 @@ app_PYTHON = \
add_account.py \
confirmation.py \
account_row.py \
accounts_list.py \
accounts_window.py \
login_window.py \
headerbar.py \
applications_list.py \
application_row.py \
change_password.py \
no_account_window.py \
search_bar.py \
settings.py \
window.py

View file

@ -1,9 +1,11 @@
from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk, GObject, GLib
from gi.repository import Gtk, Gdk, GLib
from TwoFactorAuth.models.code import Code
from TwoFactorAuth.models.authenticator import Authenticator
from TwoFactorAuth.models.settings import SettingsReader
from TwoFactorAuth.models.database import Database
from TwoFactorAuth.widgets.confirmation import ConfirmationMessage
from TwoFactorAuth.utils import get_icon
from threading import Thread
from time import sleep
import logging
@ -18,24 +20,25 @@ class AccountRow(Thread, Gtk.ListBoxRow):
code_generated = True
alive = True
def __init__(self, parent, uid, name, secret_code, logo):
def __init__(self, parent, window, app):
Thread.__init__(self)
Gtk.ListBoxRow.__init__(self)
# Read default values
cfg = SettingsReader()
self.counter_max = cfg.read("refresh-time", "preferences")
self.counter = self.counter_max
self.window = window
self.parent = parent
self.id = uid
self.name = name
self.secret_code = Authenticator.fetch_secret_code(secret_code)
self.id = app[0]
self.name = app[1]
self.secret_code = Database.fetch_secret_code(app[2])
if self.secret_code:
self.code = Code(self.secret_code)
else:
self.code_generated = False
logging.error(
"Could not read the secret code from, the keyring keys were reset manually")
self.logo = logo
self.logo = app[3]
# Create needed widgets
self.code_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
self.revealer = Gtk.Revealer()
@ -46,6 +49,7 @@ class AccountRow(Thread, Gtk.ListBoxRow):
# Create the list row
self.create_row()
self.start()
self.window.connect("key-press-event", self.__on_key_press)
GLib.timeout_add_seconds(1, self.refresh_listbox)
def get_id(self):
@ -94,16 +98,23 @@ class AccountRow(Thread, Gtk.ListBoxRow):
"""
self.alive = False
def copy_code(self, event_box, box):
def copy_code(self, *args):
"""
Copy code shows the code box for a while (10s by default)
"""
self.timer = 0
self.parent.copy_code(event_box)
code = self.get_code().get_secret_code()
try:
clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
clipboard.clear()
clipboard.set_text(code, len(code))
logging.debug("Secret code copied to clipboard")
except Exception as e:
logging.error(str(e))
self.code_box.set_visible(True)
self.code_box.set_no_show_all(False)
self.code_box.show_all()
GObject.timeout_add_seconds(1, self.update_timer)
GLib.timeout_add_seconds(1, self.update_timer)
def update_timer(self, *args):
"""
@ -133,7 +144,7 @@ class AccountRow(Thread, Gtk.ListBoxRow):
h_box.pack_start(self.checkbox, False, True, 0)
# account logo
auth_icon = Authenticator.get_auth_icon(self.logo)
auth_icon = get_icon(self.logo)
auth_logo = Gtk.Image(xalign=0)
auth_logo.set_from_pixbuf(auth_icon)
h_box.pack_start(auth_logo, False, True, 6)
@ -158,12 +169,11 @@ class AccountRow(Thread, Gtk.ListBoxRow):
# Remove button
remove_event = Gtk.EventBox()
remove_button = Gtk.Image(xalign=0)
remove_button.set_from_icon_name(
"user-trash-symbolic", Gtk.IconSize.SMALL_TOOLBAR)
remove_button.set_from_icon_name("user-trash-symbolic",
Gtk.IconSize.SMALL_TOOLBAR)
remove_button.set_tooltip_text(_("Remove the account"))
remove_event.add(remove_button)
remove_event.connect("button-press-event",
self.parent.remove_account)
remove_event.connect("button-press-event", self.remove)
h_box.pack_end(remove_event, False, True, 6)
self.timer_label.set_label(_("Expires in %s seconds") % self.counter)
@ -187,7 +197,7 @@ class AccountRow(Thread, Gtk.ListBoxRow):
self.toggle_code_box()
def run(self):
while self.code_generated and self.parent.app.alive and self.alive:
while self.code_generated and self.window.app.alive and self.alive:
self.counter -= 1
if self.counter == 0:
self.counter = self.counter_max
@ -199,8 +209,7 @@ class AccountRow(Thread, Gtk.ListBoxRow):
sleep(1)
def refresh_listbox(self):
self.parent.list_box.hide()
self.parent.list_box.show_all()
self.window.accounts_list.refresh()
return self.code_generated
def regenerate_code(self):
@ -221,5 +230,38 @@ class AccountRow(Thread, Gtk.ListBoxRow):
label.set_text(_("Couldn't generate the secret code"))
self.code_generated = False
def __on_key_press(self, widget, event):
keyname = Gdk.keyval_name(event.keyval).lower()
if not self.window.is_locked():
if self.parent.get_selected_row_id() == self.get_id():
is_search_bar = self.window.search_bar.is_visible()
if keyname == "delete" and not is_search_bar:
self.remove()
return True
if keyname == "return":
self.toggle_code_box()
return True
if event.state & Gdk.ModifierType.CONTROL_MASK:
if keyname == 'c':
self.copy_code()
return True
return False
def remove(self, *args):
"""
Remove an account
"""
message = _("Do you really want to remove this account?")
confirmation = ConfirmationMessage(self.window, message)
confirmation.show()
if confirmation.get_confirmation():
self.kill()
self.window.accounts_list.remove(self)
self.window.app.db.remove_by_id(self.get_id())
confirmation.destroy()
self.window.refresh_window()
def update_timer_label(self):
self.timer_label.set_label(_("Expires in %s seconds") % self.counter)

View file

@ -0,0 +1,150 @@
from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk, Gio, Gdk, GObject, GLib
from TwoFactorAuth.widgets.confirmation import ConfirmationMessage
from TwoFactorAuth.widgets.account_row import AccountRow
import logging
from gettext import gettext as _
from hashlib import sha256
class AccountsList(Gtk.ListBox):
scrolled_win = None
selected_count = 0
def __init__(self, application, window):
self.app = application
self.window = window
self.generate()
self.window.connect("key-press-event", self.on_key_press)
def generate(self):
Gtk.ListBox.__init__(self)
# Create a ScrolledWindow for accounts
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
self.get_style_context().add_class("applications-list")
self.set_adjustment()
self.set_selection_mode(Gtk.SelectionMode.SINGLE)
box.pack_start(self, True, True, 0)
self.scrolled_win = Gtk.ScrolledWindow()
self.scrolled_win.add_with_viewport(box)
apps = self.app.db.fetch_apps()
count = len(apps)
for app in apps:
self.add(AccountRow(self, self.window, app))
if count != 0:
self.select_row(self.get_row_at_index(0))
self.show_all()
def on_key_press(self, app, key_event):
"""
Keyboard Listener handling
"""
keyname = Gdk.keyval_name(key_event.keyval).lower()
if not self.window.is_locked():
if not self.window.no_account_box.is_visible():
if keyname == "up" or keyname == "down":
count = self.app.db.count()
dx = -1 if keyname == "up" else 1
selected_row = self.get_selected_row()
if selected_row is not None:
index = selected_row.get_index()
index = (index + dx)%count
self.select_row(self.get_row_at_index(index))
return True
return False
def toggle_select_mode(self):
is_select_mode = self.window.is_select_mode
if is_select_mode:
self.set_selection_mode(Gtk.SelectionMode.MULTIPLE)
else:
self.set_selection_mode(Gtk.SelectionMode.SINGLE)
self.select_row(self.get_row_at_index(0))
for row in self.get_children():
checkbox = row.get_checkbox()
code_label = row.get_code_label()
visible = checkbox.get_visible()
selected = checkbox.get_active()
style_context = code_label.get_style_context()
if is_select_mode:
self.select_account(checkbox)
style_context.add_class("application-secret-code-select-mode")
else:
style_context.remove_class(
"application-secret-code-select-mode")
checkbox.set_visible(not visible)
checkbox.set_no_show_all(visible)
def append(self, app):
"""
Add an element to the ListBox
"""
app[2] = sha256(app[2].encode('utf-8')).hexdigest()
self.add(AccountRow(self, self.window, app))
self.show_all()
def remove_selected(self, *args):
"""
Remove selected accounts
"""
for row in self.get_selected_rows():
checkbox = row.get_checkbox()
if checkbox.get_active():
row.remove()
self.unselect_all()
self.window.toggle_select()
self.window.refresh_window()
def select_account(self, checkbutton):
"""
Select an account
:param checkbutton:
"""
is_active = checkbutton.get_active()
is_visible = checkbutton.get_visible()
listbox_row = checkbutton.get_parent().get_parent().get_parent()
if is_active:
self.select_row(listbox_row)
if is_visible:
self.selected_count += 1
else:
self.unselect_row(listbox_row)
if is_visible:
self.selected_count -= 1
self.window.hb.remove_button.set_sensitive(self.selected_count > 0)
def get_selected_row_id(self):
selected_row = self.get_selected_row()
if selected_row:
return selected_row.get_id()
else:
return None
def get_scrolled_win(self):
return self.scrolled_win
def toggle(self, visible):
self.set_visible(visible)
self.set_no_show_all(not visible)
def is_visible(self):
return self.get_visible()
def hide(self):
self.toggle(False)
def show(self):
self.toggle(True)
def refresh(self):
self.scrolled_win.hide()
self.scrolled_win.show_all()

View file

@ -0,0 +1,55 @@
from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk, Gio, Gdk, GObject, GLib
from TwoFactorAuth.widgets.accounts_list import AccountsList
from TwoFactorAuth.widgets.search_bar import SearchBar
import logging
from gettext import gettext as _
from hashlib import sha256
class AccountsWindow(Gtk.Box):
def __init__(self, application, window):
Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL)
self.app = application
self.window = window
self.generate()
def generate(self):
self.generate_accounts_list()
self.generate_search_bar()
self.pack_start(self.search_bar, False, True, 0)
self.pack_start(self.scrolled_win, True, True, 0)
def generate_accounts_list(self):
"""
Generate an account ListBox inside of a ScrolledWindow
"""
self.accounts_list = AccountsList(self.app, self.window)
self.scrolled_win = self.accounts_list.get_scrolled_win()
def generate_search_bar(self):
"""
Generate search bar box and entry
"""
self.search_bar = SearchBar(self.accounts_list, self.window,
self.window.hb.search_button)
def get_accounts_list(self):
return self.accounts_list
def get_search_bar(self):
return self.search_bar
def toggle(self, visible):
self.set_visible(visible)
self.set_no_show_all(not visible)
def is_visible(self):
return self.get_visible()
def hide(self):
self.toggle(False)
def show(self):
self.toggle(True)

View file

@ -1,10 +1,12 @@
from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk
from gi.repository import Gtk, Gdk, Gio
import logging
from TwoFactorAuth.utils import screenshot_area, current_date_time
from TwoFactorAuth.widgets.applications_list import ApplicationChooserWindow
from TwoFactorAuth.models.code import Code
from TwoFactorAuth.models.authenticator import Authenticator
from TwoFactorAuth.models.qr_reader import QRReader
from TwoFactorAuth.utils import get_icon
from gettext import gettext as _
@ -13,9 +15,9 @@ class AddAccount(Gtk.Window):
def __init__(self, window):
self.parent = window
self.selected_image = None
self.selected_logo = None
self.step = 1
self.logo_image = Gtk.Image(xalign=0)
self.account_image = Gtk.Image(xalign=0)
self.secret_code = Gtk.Entry()
self.name_entry = Gtk.Entry()
self.hb = Gtk.HeaderBar()
@ -28,9 +30,9 @@ class AddAccount(Gtk.Window):
Gtk.Window.__init__(self, type=Gtk.WindowType.TOPLEVEL, title=_("Add a new account"),
modal=True, destroy_with_parent=True)
self.connect("delete-event", self.close_window)
self.resize(410, 300)
self.resize(420, 300)
self.set_border_width(18)
self.set_size_request(410, 300)
self.set_size_request(420, 300)
self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT)
self.set_resizable(False)
self.set_transient_for(self.parent)
@ -54,6 +56,15 @@ class AddAccount(Gtk.Window):
self.apply_button.get_style_context().add_class("suggested-action")
self.apply_button.connect("clicked", self.add_account)
self.apply_button.set_sensitive(False)
qr_button = Gtk.Button()
qr_icon = Gio.ThemedIcon(name="camera-photo-symbolic")
qr_image = Gtk.Image.new_from_gicon(qr_icon, Gtk.IconSize.BUTTON)
qr_button.set_tooltip_text(_("Scan a QR code"))
qr_button.set_image(qr_image)
qr_button.connect("clicked", self.on_qr_scan)
right_box.add(qr_button)
right_box.add(self.apply_button)
self.hb.pack_start(left_box)
@ -68,51 +79,75 @@ class AddAccount(Gtk.Window):
labels_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
logo_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
hbox_title = Gtk.Box(
hbox_name = Gtk.Box(
orientation=Gtk.Orientation.HORIZONTAL, spacing=18)
title_label = Gtk.Label()
title_label.set_text(_("Account Name"))
account_name = Gtk.Label()
account_name.set_text(_("Account Name"))
hbox_title.pack_end(self.name_entry, False, True, 0)
hbox_title.pack_end(title_label, False, True, 0)
hbox_name.pack_end(self.name_entry, False, True, 0)
hbox_name.pack_end(account_name, False, True, 0)
hbox_two_factor = Gtk.Box(
hbox_secret_code = Gtk.Box(
orientation=Gtk.Orientation.HORIZONTAL, spacing=18)
two_factor_label = Gtk.Label()
two_factor_label.set_text(_("Secret Code"))
secret_code_label = Gtk.Label()
secret_code_label.set_text(_("Secret Code"))
self.secret_code.connect("changed", self.validate_ascii_code)
hbox_two_factor.pack_end(self.secret_code, False, True, 0)
hbox_two_factor.pack_end(two_factor_label, False, True, 0)
hbox_secret_code.pack_end(self.secret_code, False, True, 0)
hbox_secret_code.pack_end(secret_code_label, False, True, 0)
auth_icon = Authenticator.get_auth_icon("image-missing")
self.logo_image.set_from_pixbuf(auth_icon)
self.logo_image.get_style_context().add_class("application-logo-add")
logo_box.pack_start(self.logo_image, True, False, 6)
account_logo = get_icon("image-missing")
self.account_image.set_from_pixbuf(account_logo)
self.account_image.get_style_context().add_class("application-logo-add")
logo_box.pack_start(self.account_image, True, False, 6)
logo_box.set_property("margin-bottom", 20)
vbox.add(hbox_title)
vbox.add(hbox_two_factor)
vbox.add(hbox_name)
vbox.add(hbox_secret_code)
labels_box.pack_start(vbox, True, False, 6)
main_box.pack_start(logo_box, False, True, 6)
main_box.pack_start(labels_box, False, True, 6)
self.add(main_box)
def on_qr_scan(self, *args):
filename = "/tmp/TwoFactorAuth-%s.png" % current_date_time()
if screenshot_area(filename):
qr = QRReader(filename)
data = qr.read()
if qr.is_valid():
self.name_entry.set_text(data["issuer"])
self.secret_code.set_text(data["secret"])
self.apply_button.set_sensitive(True)
def on_key_press(self, key, key_event):
"""
Keyboard Listener handler
"""
if Gdk.keyval_name(key_event.keyval) == "Escape":
key_name = Gdk.keyval_name(key_event.keyval).lower()
if key_name == "escape":
self.close_window()
return True
if key_name == "return":
if self.apply_button.get_sensitive():
self.add_account()
return True
if key_event.state & Gdk.ModifierType.CONTROL_MASK:
if key_name == 's':
self.on_qr_scan()
return True
return False
def update_logo(self, image):
"""
Update image logo
"""
self.selected_image = image
auth_icon = Authenticator.get_auth_icon(image)
self.logo_image.clear()
self.logo_image.set_from_pixbuf(auth_icon)
self.selected_logo = image
account_icon = get_icon(image)
self.account_image.clear()
self.account_image.set_from_pixbuf(account_icon)
def validate_ascii_code(self, entry):
"""
@ -132,15 +167,13 @@ class AddAccount(Gtk.Window):
"""
Add a new application to the database
"""
name_entry = self.name_entry.get_text()
secret_entry = self.secret_code.get_text()
image_entry = self.selected_image if self.selected_image else "image-missing"
name = self.name_entry.get_text()
secret_code = self.secret_code.get_text()
logo = self.selected_logo if self.selected_logo else "image-missing"
try:
self.parent.app.auth.add_account(name_entry, secret_entry,
image_entry)
uid = self.parent.app.auth.get_latest_id()
self.parent.append_list_box(
uid, name_entry, secret_entry, image_entry)
self.parent.app.db.add_account(name, secret_code, logo)
uid = self.parent.app.db.get_latest_id()
self.parent.accounts_list.append([uid, name, secret_code, logo])
self.parent.refresh_window()
self.close_window()
except Exception as e:
@ -151,6 +184,7 @@ class AddAccount(Gtk.Window):
if self.step == 1:
applications_choose_window = ApplicationChooserWindow(self)
applications_choose_window.show_window()
applications_choose_window.present()
self.step = 2
else:
self.show_all()

View file

@ -1,16 +1,17 @@
from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk
from TwoFactorAuth.utils import get_icon
import logging
from gettext import gettext as _
class ApplicationRow(Gtk.ListBoxRow):
def __init__(self, name, logo):
def __init__(self, name, image):
Gtk.ListBoxRow.__init__(self)
self.name = name
self.logo = logo
self.image = image
# Create the list row
self.create_row()
@ -21,6 +22,9 @@ class ApplicationRow(Gtk.ListBoxRow):
"""
return self.name
def get_icon_name(self):
return self.image
def create_row(self):
"""
Create ListBoxRow
@ -30,8 +34,9 @@ class ApplicationRow(Gtk.ListBoxRow):
hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
# Application logo
application_logo = get_icon(self.image)
application_image = Gtk.Image(xalign=0)
application_image.set_from_pixbuf(self.logo)
application_image.set_from_pixbuf(application_logo)
hbox.pack_start(application_image, False, True, 6)
# Application name

View file

@ -1,27 +1,24 @@
from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gio, Gdk
from TwoFactorAuth.models.authenticator import Authenticator
from TwoFactorAuth.widgets.search_bar import SearchBar
from TwoFactorAuth.widgets.application_row import ApplicationRow
from os import path, listdir, environ as env
from os import path, environ as env
from gettext import gettext as _
import yaml
from glob import glob
class ApplicationChooserWindow(Gtk.Window):
db = []
def __init__(self, window):
# directory that contains the main icons
directory = path.join(env.get("DATA_DIR"), "applications") + "/"
self.logos = listdir(directory)
self.logos.sort()
self.parent = window
self.search_button = Gtk.ToggleButton()
self.listbox = Gtk.ListBox()
self.main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
if len(self.db) == 0:
self.read_database()
self.generate_window()
self.generate_search_bar()
self.generate_components()
@ -48,24 +45,27 @@ class ApplicationChooserWindow(Gtk.Window):
Generate window compenents
"""
box_outer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
if len(self.logos) > 0:
if len(self.db) > 0:
# Create a ScrolledWindow for installed applications
scrolled_win = Gtk.ScrolledWindow()
scrolled_win.add_with_viewport(box_outer)
self.main_box.pack_start(scrolled_win, True, True, 0)
self.scrolled_win = Gtk.ScrolledWindow()
self.scrolled_win.add_with_viewport(box_outer)
self.main_box.pack_start(self.scrolled_win, True, True, 0)
self.listbox.get_style_context().add_class("applications-list")
self.listbox.set_adjustment()
self.listbox.set_selection_mode(Gtk.SelectionMode.SINGLE)
box_outer.pack_start(self.listbox, True, True, 0)
i = 0
while i < len(self.logos):
img_path = self.logos[i]
app_name = path.splitext(img_path)[0].strip(".").title()
directory = path.join(env.get("DATA_DIR"), "applications") + "/images/"
self.db = sorted(self.db, key=lambda k: k['name'].lower())
while i < len(self.db):
img_path = directory + self.db[i]["img"]
app_name = self.db[i]["name"]
# Application logo
app_logo = Authenticator.get_auth_icon(img_path)
self.listbox.add(ApplicationRow(app_name, app_logo))
self.listbox.add(ApplicationRow(app_name, img_path))
i += 1
self.listbox.select_row(self.listbox.get_row_at_index(0))
def generate_header_bar(self):
"""
@ -90,7 +90,7 @@ class ApplicationChooserWindow(Gtk.Window):
next_button = Gtk.Button.new_with_label(_("Next"))
next_button.get_style_context().add_class("suggested-action")
next_button.connect("clicked", self.select_logo)
next_button.connect("clicked", self.select_application)
right_box.pack_start(self.search_button, False, False, 6)
right_box.pack_start(next_button, False, False, 6)
@ -103,35 +103,59 @@ class ApplicationChooserWindow(Gtk.Window):
"""
Generate the search bar
"""
self.search_bar = SearchBar(self.listbox)
self.search_button.connect("toggled", self.search_bar.toggle)
self.search_bar = SearchBar(self.listbox, self, self.search_button)
self.main_box.pack_start(self.search_bar, False, True, 0)
def read_database(self):
db_dir = path.join(env.get("DATA_DIR"), "applications") + "/data/*.yml"
db_files = glob(db_dir)
for db_file in db_files:
with open(db_file, 'r') as data:
try:
websites = yaml.load(data)["websites"]
for app in websites:
if self.is_valid_app(app):
self.db.append(app)
except yaml.YAMLError as error:
logging.error("Error loading yml file : %s " % str(error))
def is_valid_app(self, app):
if set(["tfa", "software"]).issubset(app.keys()):
return app["tfa"] and app["software"]
else:
return False
def on_key_press(self, label, key_event):
"""
Keyboard listener handling
"""
key_pressed = Gdk.keyval_name(key_event.keyval).lower()
if key_pressed == "escape":
if self.search_bar.is_visible():
self.search_bar.toggle()
else:
self.close_window()
elif key_pressed == "f":
if key_event.state == Gdk.ModifierType.CONTROL_MASK:
self.search_button.set_active(
not self.search_button.get_active())
elif key_pressed == "return":
self.select_logo()
keyname = Gdk.keyval_name(key_event.keyval).lower()
def select_logo(self, *args):
if keyname == "escape":
if not self.search_bar.is_visible():
self.close_window()
return True
if keyname == "up" or keyname == "down":
dx = -1 if keyname == "up" else 1
index = self.listbox.get_selected_row().get_index()
index = (index + dx)%len(self.db)
selected_row = self.listbox.get_row_at_index(index)
self.listbox.select_row(selected_row)
return True
if keyname == "return":
self.select_application()
return True
return False
def select_application(self, *args):
"""
Select a logo and return its path to the add application window
"""
index = self.listbox.get_selected_row().get_index()
if len(self.logos) > 0:
img_path = self.logos[index]
selected_row = self.listbox.get_selected_row()
if selected_row:
img_path = selected_row.get_icon_name()
self.parent.update_logo(img_path)
self.parent.show_window()
self.close_window()

View file

@ -0,0 +1,195 @@
from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk, Gio
import logging
from gettext import gettext as _
from TwoFactorAuth.utils import *
class HeaderBar(Gtk.HeaderBar):
search_button = Gtk.ToggleButton()
add_button = Gtk.Button()
settings_button = Gtk.Button()
remove_button = Gtk.Button()
cancel_button = Gtk.Button()
select_button = Gtk.Button()
lock_button = Gtk.Button()
popover = None
def __init__(self, app, window):
self.app = app
self.window = window
Gtk.HeaderBar.__init__(self)
self.generate()
def generate(self):
self.set_show_close_button(True)
right_box = self.generate_right_box()
left_box = self.generate_left_box()
if not is_gnome():
# add settings menu
self.generate_popover(right_box)
self.pack_start(left_box)
self.pack_end(right_box)
def generate_left_box(self):
left_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
remove_icon = Gio.ThemedIcon(name="user-trash-symbolic")
remove_image = Gtk.Image.new_from_gicon(
remove_icon, Gtk.IconSize.BUTTON)
self.remove_button.set_tooltip_text(_("Remove selected accounts"))
self.remove_button.set_image(remove_image)
self.remove_button.set_sensitive(False)
self.toggle_remove_button(False)
add_icon = Gio.ThemedIcon(name="list-add-symbolic")
add_image = Gtk.Image.new_from_gicon(add_icon, Gtk.IconSize.BUTTON)
self.add_button.set_tooltip_text(_("Add a new account"))
self.add_button.set_image(add_image)
pass_enabled = self.app.cfg.read("state", "login")
can_be_locked = not self.app.locked and pass_enabled
lock_icon = Gio.ThemedIcon(name="changes-prevent-symbolic")
lock_image = Gtk.Image.new_from_gicon(lock_icon, Gtk.IconSize.BUTTON)
self.lock_button.set_tooltip_text(_("Lock the Application"))
self.lock_button.set_image(lock_image)
self.toggle_lock_button(can_be_locked)
left_box.add(self.remove_button)
left_box.add(self.add_button)
left_box.add(self.lock_button)
return left_box
def generate_right_box(self):
count = self.app.db.count()
right_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
select_icon = Gio.ThemedIcon(name="object-select-symbolic")
select_image = Gtk.Image.new_from_gicon(
select_icon, Gtk.IconSize.BUTTON)
self.select_button.set_tooltip_text(_("Selection mode"))
self.select_button.set_image(select_image)
self.toggle_select_button(count > 0)
search_icon = Gio.ThemedIcon(name="system-search-symbolic")
search_image = Gtk.Image.new_from_gicon(
search_icon, Gtk.IconSize.BUTTON)
self.search_button.set_tooltip_text(_("Search"))
self.search_button.set_image(search_image)
self.toggle_search_button(count > 0)
self.cancel_button.set_label(_("Cancel"))
self.toggle_cancel_button(False)
right_box.add(self.search_button)
right_box.add(self.select_button)
right_box.add(self.cancel_button)
return right_box
def generate_popover(self, box):
settings_icon = Gio.ThemedIcon(name="open-menu-symbolic")
settings_image = Gtk.Image.new_from_gicon(
settings_icon, Gtk.IconSize.BUTTON)
self.settings_button.set_tooltip_text(_("Settings"))
self.settings_button.set_image(settings_image)
self.settings_button.connect("clicked", self.toggle_popover)
self.popover = Gtk.Popover.new_from_model(
self.settings_button, self.app.menu)
self.popover.props.width_request = 200
box.add(self.settings_button)
def toggle_popover(self, *args):
if self.popover:
if self.popover.get_visible():
self.popover.hide()
else:
self.popover.show_all()
def toggle_select_mode(self):
is_select_mode = self.window.is_select_mode
pass_enabled = self.app.cfg.read("state", "login")
self.toggle_remove_button(is_select_mode)
self.toggle_cancel_button(is_select_mode)
self.set_show_close_button(not is_select_mode)
self.toggle_settings_button(not is_select_mode)
self.toggle_lock_button(not is_select_mode and pass_enabled)
self.toggle_add_button(not is_select_mode)
self.toggle_select_button(not is_select_mode)
if is_select_mode:
self.get_style_context().add_class("selection-mode")
else:
self.get_style_context().remove_class("selection-mode")
def toggle_search(self):
self.search_button.set_active(not self.search_button.get_active())
def toggle_search_button(self, visible):
self.search_button.set_visible(visible)
self.search_button.set_no_show_all(not visible)
def toggle_select_button(self, visible):
self.select_button.set_visible(visible)
self.select_button.set_no_show_all(not visible)
def toggle_settings_button(self, visible):
if not is_gnome():
self.settings_button.set_visible(visible)
self.settings_button.set_no_show_all(not visible)
def toggle_lock_button(self, visible):
self.lock_button.set_visible(visible)
self.lock_button.set_no_show_all(not visible)
def toggle_add_button(self, visible):
self.add_button.set_visible(visible)
self.add_button.set_no_show_all(not visible)
def toggle_cancel_button(self, visible):
self.cancel_button.set_visible(visible)
self.cancel_button.set_no_show_all(not visible)
def toggle_remove_button(self, visible):
self.remove_button.set_visible(visible)
self.remove_button.set_no_show_all(not visible)
def hide(self):
self.toggle_add_button(False)
self.toggle_lock_button(False)
self.toggle_cancel_button(False)
self.toggle_remove_button(False)
self.toggle_search_button(False)
self.toggle_settings_button(True)
self.toggle_select_button(False)
def refresh(self):
is_locked = self.app.locked
pass_enabled = self.app.cfg.read("state", "login")
can_be_locked = not is_locked and pass_enabled
count = self.app.db.count()
if is_locked:
self.hide()
else:
if count == 0:
self.toggle_add_button(True)
self.toggle_select_button(False)
self.toggle_remove_button(False)
self.toggle_search_button(False)
self.toggle_lock_button(can_be_locked)
self.toggle_settings_button(True)
self.toggle_cancel_button(False)
else:
self.toggle_add_button(True)
self.toggle_select_button(True)
self.toggle_remove_button(False)
self.toggle_search_button(True)
self.toggle_lock_button(can_be_locked)
self.toggle_settings_button(True)
self.toggle_cancel_button(False)

View file

@ -0,0 +1,88 @@
from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk
import logging
from hashlib import sha256
from gettext import gettext as _
class LoginWindow(Gtk.Box):
password_entry = None
unlock_button = None
def __init__(self, application, window):
Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL)
self.app = application
self.window = window
self.password_entry = Gtk.Entry()
self.unlock_button = Gtk.Button()
self.generate()
self.window.connect("key-press-event", self.__on_key_press)
def generate(self):
password_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.password_entry.set_visibility(False)
self.password_entry.set_placeholder_text(_("Enter your password"))
password_box.pack_start(self.password_entry, False, False, 6)
self.unlock_button.set_label(_("Unlock"))
self.unlock_button.connect("clicked", self.on_unlock)
password_box.pack_start(self.unlock_button, False, False, 6)
self.pack_start(password_box, True, False, 6)
def on_unlock(self, *args):
"""
Password check and unlock
"""
typed_pass = self.password_entry.get_text()
ecrypted_pass = sha256(typed_pass.encode("utf-8")).hexdigest()
login_pass = self.app.cfg.read("password", "login")
if ecrypted_pass == login_pass or login_pass == typed_pass == "":
self.password_entry.set_icon_from_icon_name(
Gtk.EntryIconPosition.SECONDARY, None)
self.toggle_lock()
self.password_entry.set_text("")
else:
self.password_entry.set_icon_from_icon_name(
Gtk.EntryIconPosition.SECONDARY, "dialog-error-symbolic")
def __on_key_press(self, widget, event):
keyname = Gdk.keyval_name(event.keyval).lower()
if self.window.is_locked():
if keyname == "return":
self.on_unlock()
return True
else:
pass_enabled = self.app.cfg.read("state", "login")
if keyname == "l" and pass_enabled:
if event.state & Gdk.ModifierType.CONTROL_MASK:
self.toggle_lock()
return True
return False
def toggle_lock(self, *args):
"""
Lock/unlock the application
"""
pass_enabled = self.app.cfg.read("state", "login")
if pass_enabled:
self.app.locked = not self.app.locked
if self.app.locked:
self.focus()
self.app.refresh_menu()
self.app.win.refresh_window()
def toggle(self, visible):
self.set_visible(visible)
self.set_no_show_all(not visible)
def hide(self):
self.toggle(False)
def show(self):
self.toggle(True)
def focus(self):
self.password_entry.grab_focus_without_selecting()

View file

@ -0,0 +1,35 @@
from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk
import logging
from gettext import gettext as _
class NoAccountWindow(Gtk.Box):
def __init__(self):
Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL,
spacing=6)
self.generate()
def generate(self):
logo_image = Gtk.Image()
logo_image.set_from_icon_name("dialog-information-symbolic",
Gtk.IconSize.DIALOG)
no_apps_label = Gtk.Label()
no_apps_label.set_text(_("There's no account at the moment"))
self.pack_start(logo_image, False, False, 6)
self.pack_start(no_apps_label, False, False, 6)
def toggle(self, visible):
self.set_visible(visible)
self.set_no_show_all(not visible)
def is_visible(self):
return self.get_visible()
def hide(self):
self.toggle(False)
def show(self):
self.toggle(True)

View file

@ -1,41 +1,42 @@
from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk, Gio
from gi.repository import Gtk, Gio, Gdk
import logging
class SearchBar(Gtk.Box):
class SearchBar(Gtk.Revealer):
def __init__(self, list_accounts):
self.search_entry = Gtk.Entry()
self.list_accounts = list_accounts
def __init__(self, listbox, window, search_button):
self.search_entry = Gtk.SearchEntry()
self.listbox = listbox
self.search_button = search_button
self.window = window
self.generate()
self.search_button.connect("toggled", self.toggle)
self.window.connect("key-press-event", self.__on_key_press)
def generate(self):
Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL)
self.revealer = Gtk.Revealer()
Gtk.Revealer.__init__(self)
box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
self.search_entry.set_width_chars(28)
self.search_entry.connect("changed", self.filter_applications)
self.search_entry.set_icon_from_icon_name(Gtk.EntryIconPosition.PRIMARY,
"system-search-symbolic")
self.search_entry.connect("search-changed", self.filter_applications)
box.pack_start(self.search_entry, True, False, 12)
box.props.margin = 6
self.revealer.add(box)
self.revealer.set_reveal_child(False)
self.pack_start(self.revealer, True, False, 0)
self.add(box)
self.set_reveal_child(False)
def toggle(self, *args):
if self.revealer.get_reveal_child():
self.revealer.set_reveal_child(False)
if self.is_visible():
self.set_reveal_child(False)
self.search_entry.set_text("")
self.list_accounts.set_filter_func(lambda x, y, z: True,
self.listbox.set_filter_func(lambda x, y, z: True,
None, False)
else:
self.revealer.set_reveal_child(True)
self.search_entry.grab_focus_without_selecting()
self.set_reveal_child(True)
self.focus()
def filter_func(self, row, data, notify_destroy):
"""
@ -48,23 +49,35 @@ class SearchBar(Gtk.Box):
else:
return True
def __on_key_press(self, widget, event):
keyname = Gdk.keyval_name(event.keyval).lower()
if keyname == 'escape' and self.search_button.get_active():
if self.search_entry.is_focus():
self.search_button.set_active(False)
else:
self.focus()
if not "is_locked" in dir(self.window) or not self.window.is_locked():
if keyname == "backspace":
if self.is_empty():
self.search_button.set_active(False)
return True
if event.state & Gdk.ModifierType.CONTROL_MASK:
if keyname == 'f':
self.search_button.set_active(not self.search_button.get_active())
return True
return False
def focus(self):
self.search_entry.grab_focus_without_selecting()
def is_visible(self):
return self.revealer.get_reveal_child()
return self.get_reveal_child()
def is_empty(self):
return len(self.search_entry.get_text()) == 0
def on_icon_pressed(self, entry, icon_pos, event):
if icon_pos == Gtk.EntryIconPosition.SECONDARY:
self.search_entry.set_text("")
def filter_applications(self, entry):
data = entry.get_text().strip()
if len(data) != 0:
entry.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY,
"edit-clear-symbolic")
entry.connect("icon-press", self.on_icon_pressed)
else:
entry.set_icon_from_icon_name(
Gtk.EntryIconPosition.SECONDARY, None)
self.list_accounts.set_filter_func(self.filter_func, data, False)
self.listbox.set_filter_func(self.filter_func, data, False)

View file

@ -2,49 +2,27 @@ from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk, Gio, Gdk, GObject, GLib
from TwoFactorAuth.widgets.add_account import AddAccount
from TwoFactorAuth.widgets.confirmation import ConfirmationMessage
from TwoFactorAuth.widgets.account_row import AccountRow
from TwoFactorAuth.widgets.search_bar import SearchBar
from TwoFactorAuth.widgets.accounts_window import AccountsWindow
from TwoFactorAuth.widgets.login_window import LoginWindow
from TwoFactorAuth.widgets.no_account_window import NoAccountWindow
from TwoFactorAuth.widgets.headerbar import HeaderBar
import logging
from hashlib import sha256
from gettext import gettext as _
class Window(Gtk.ApplicationWindow):
app = None
selected_app_idx = None
selected_count = 0
counter = 0
hb = Gtk.HeaderBar()
main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
login_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
no_apps_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
apps_list_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
apps_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
list_box = Gtk.ListBox()
search_button = Gtk.ToggleButton()
add_button = Gtk.Button()
settings_button = Gtk.Button()
remove_button = Gtk.Button()
cancel_button = Gtk.Button()
select_button = Gtk.Button()
lock_button = Gtk.Button()
popover = None
settings_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
pop_settings = Gtk.ModelButton.new()
password_entry = Gtk.Entry()
is_select_mode = False
def __init__(self, application):
self.app = application
self.generate_window()
self.generate_header_bar()
self.generate_search_bar()
self.generate_accounts_list()
self.generate_no_apps_box()
self.generate_login_form()
self.generate_accounts_box()
self.generate_no_accounts_box()
self.generate_login_box()
self.refresh_window()
GLib.timeout_add_seconds(60, self.refresh_counter)
@ -68,50 +46,21 @@ class Window(Gtk.ApplicationWindow):
"""
Keyboard Listener handling
"""
keypress = Gdk.keyval_name(key_event.keyval).lower()
if not self.app.locked:
control_mask = Gdk.ModifierType.CONTROL_MASK
count = self.app.auth.count()
if keypress == "c":
if key_event.state == control_mask:
self.copy_code()
elif keypress == "f":
if key_event.state == control_mask:
self.search_button.set_active(
not self.search_button.get_active())
elif keypress == "s":
if key_event.state == control_mask:
self.toggle_select()
elif keypress == "n":
if key_event.state == control_mask:
keyname = Gdk.keyval_name(key_event.keyval).lower()
if not self.is_locked():
if not self.no_account_box.is_visible():
if keyname == "s" or keyname == "escape":
if key_event.state == Gdk.ModifierType.CONTROL_MASK or not self.hb.select_button.get_visible():
self.toggle_select()
return True
if keyname == "n":
if key_event.state == Gdk.ModifierType.CONTROL_MASK:
self.add_account()
elif keypress == "delete" and not self.search_bar.is_visible():
self.remove_account()
elif keypress == "return":
if count > 0:
if self.list_box.get_selected_row():
index = self.list_box.get_selected_row().get_index()
else:
index = 0
self.list_box.get_row_at_index(index).toggle_code_box()
elif keypress == "backspace":
if self.search_bar.is_empty():
self.search_button.set_active(False)
elif keypress == "escape":
if self.search_bar.is_visible():
self.search_button.set_active(False)
if not self.select_button.get_visible():
self.toggle_select()
elif keypress == "up" or keypress == "down":
dx = -1 if keypress == "up" else 1
if count != 0:
index = self.list_box.get_selected_row().get_index()
index = (index + dx)%count
selected_row = self.list_box.get_row_at_index(index)
self.list_box.select_row(selected_row)
else:
if keypress == "return":
self.on_unlock_clicked()
return True
return False
def refresh_counter(self):
"""
@ -122,193 +71,35 @@ class Window(Gtk.ApplicationWindow):
if self.app.cfg.read("auto-lock", "preferences"):
if self.counter == self.app.cfg.read("auto-lock-time", "preferences") - 1:
self.counter = 0
self.toggle_app_lock()
self.toggle_lock()
return True
def generate_search_bar(self):
"""
Generate search bar box and entry
"""
self.search_bar = SearchBar(self.list_box)
self.search_button.connect("toggled", self.search_bar.toggle)
self.apps_box.pack_start(self.search_bar, False, True, 0)
self.main_box.pack_start(self.apps_box, True, True, 0)
def remove_selected(self, *args):
"""
Remove selected accounts
"""
message = _("Do you really want to remove selected accounts?")
confirmation = ConfirmationMessage(self, message)
confirmation.show()
if confirmation.get_confirmation():
for row in self.list_box.get_children():
checkbox = row.get_checkbox()
if checkbox.get_active():
label_id = row.get_id()
row.kill()
self.app.auth.remove_by_id(label_id)
self.list_box.remove(row)
self.list_box.unselect_all()
confirmation.destroy()
self.toggle_select()
self.refresh_window()
def generate_login_form(self):
def generate_login_box(self):
"""
Generate login form
"""
password_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.password_entry.set_visibility(False)
self.password_entry.set_placeholder_text(_("Enter your password"))
password_box.pack_start(self.password_entry, False, False, 6)
unlock_button = Gtk.Button()
unlock_button.set_label(_("Unlock"))
unlock_button.connect("clicked", self.on_unlock_clicked)
password_box.pack_start(unlock_button, False, False, 6)
self.login_box.pack_start(password_box, True, False, 6)
self.login_box = LoginWindow(self.app, self)
self.hb.lock_button.connect("clicked", self.login_box.toggle_lock)
self.main_box.pack_start(self.login_box, True, False, 0)
def on_unlock_clicked(self, *args):
"""
Password check and unlock
"""
typed_pass = self.password_entry.get_text()
ecrypted_pass = sha256(typed_pass.encode("utf-8")).hexdigest()
login_pass = self.app.cfg.read("password", "login")
if ecrypted_pass == login_pass or login_pass == typed_pass:
self.password_entry.set_icon_from_icon_name(
Gtk.EntryIconPosition.SECONDARY, None)
self.toggle_app_lock()
self.password_entry.set_text("")
else:
self.password_entry.set_icon_from_icon_name(
Gtk.EntryIconPosition.SECONDARY, "dialog-error-symbolic")
def toggle_app_lock(self):
"""
Lock/unlock the application
"""
self.app.locked = not self.app.locked
self.app.refresh_menu()
self.refresh_window()
def toggle_boxes(self, apps_box, no_apps_box, login_box):
"""
Change the status of all the boxes in one time
:param apps_box: bool
:param no_apps_box: bool
:param login_box: bool
:return:
"""
self.login_box.set_visible(login_box)
self.login_box.set_no_show_all(not login_box)
self.apps_box.set_visible(apps_box)
self.apps_box.set_no_show_all(not apps_box)
self.no_apps_box.set_visible(no_apps_box)
self.no_apps_box.set_no_show_all(not no_apps_box)
def hide_header_bar(self):
"""
Hide all buttons on the header bar
"""
self.toggle_hb_buttons(False, False, False, False, False, False, False)
def generate_accounts_box(self):
self.accounts_box = AccountsWindow(self.app, self)
self.accounts_list = self.accounts_box.get_accounts_list()
self.hb.remove_button.connect("clicked", self.accounts_list.remove_selected)
self.search_bar = self.accounts_box.get_search_bar()
self.main_box.pack_start(self.accounts_box, True, True, 0)
def generate_header_bar(self):
"""
Generate a header bar box
"""
count = self.app.auth.count()
self.hb.set_show_close_button(True)
left_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
right_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
remove_icon = Gio.ThemedIcon(name="user-trash-symbolic")
remove_image = Gtk.Image.new_from_gicon(
remove_icon, Gtk.IconSize.BUTTON)
self.remove_button.set_tooltip_text(_("Remove selected accounts"))
self.remove_button.set_image(remove_image)
self.remove_button.set_sensitive(False)
self.remove_button.set_no_show_all(True)
self.remove_button.connect("clicked", self.remove_selected)
add_icon = Gio.ThemedIcon(name="list-add-symbolic")
add_image = Gtk.Image.new_from_gicon(add_icon, Gtk.IconSize.BUTTON)
self.add_button.set_tooltip_text(_("Add a new account"))
self.add_button.set_image(add_image)
self.add_button.connect("clicked", self.add_account)
pass_enabled = self.app.cfg.read("state", "login")
can_be_locked = not self.app.locked and pass_enabled
lock_icon = Gio.ThemedIcon(name="changes-prevent-symbolic")
lock_image = Gtk.Image.new_from_gicon(lock_icon, Gtk.IconSize.BUTTON)
self.lock_button.set_tooltip_text(_("Lock the Application"))
self.lock_button.set_image(lock_image)
self.lock_button.connect("clicked", self.app.on_toggle_lock)
self.lock_button.set_no_show_all(not can_be_locked)
self.lock_button.set_visible(can_be_locked)
left_box.add(self.remove_button)
left_box.add(self.add_button)
left_box.add(self.lock_button)
select_icon = Gio.ThemedIcon(name="object-select-symbolic")
select_image = Gtk.Image.new_from_gicon(
select_icon, Gtk.IconSize.BUTTON)
self.select_button.set_tooltip_text(_("Selection mode"))
self.select_button.set_image(select_image)
self.select_button.connect("clicked", self.toggle_select)
self.select_button.set_no_show_all(not count > 0)
self.select_button.set_visible(count > 0)
search_icon = Gio.ThemedIcon(name="system-search-symbolic")
search_image = Gtk.Image.new_from_gicon(
search_icon, Gtk.IconSize.BUTTON)
self.search_button.set_tooltip_text(_("Search"))
self.search_button.set_image(search_image)
self.search_button.set_no_show_all(not count > 0)
self.search_button.set_visible(count > 0)
self.cancel_button.set_label(_("Cancel"))
self.cancel_button.connect("clicked", self.toggle_select)
self.cancel_button.set_no_show_all(True)
right_box.add(self.search_button)
right_box.add(self.select_button)
right_box.add(self.cancel_button)
if not self.app.use_GMenu:
self.generate_popover(right_box)
self.hb.pack_start(left_box)
self.hb.pack_end(right_box)
self.hb = HeaderBar(self.app, self)
# connect signals
self.hb.cancel_button.connect("clicked", self.toggle_select)
self.hb.select_button.connect("clicked", self.toggle_select)
self.hb.add_button.connect("clicked", self.add_account)
self.set_titlebar(self.hb)
def generate_popover(self, box):
settings_icon = Gio.ThemedIcon(name="open-menu-symbolic")
settings_image = Gtk.Image.new_from_gicon(
settings_icon, Gtk.IconSize.BUTTON)
self.settings_button.set_tooltip_text(_("Settings"))
self.settings_button.set_image(settings_image)
self.settings_button.connect("clicked", self.toggle_popover)
self.popover = Gtk.Popover.new_from_model(
self.settings_button, self.app.menu)
self.popover.props.width_request = 200
box.add(self.settings_button)
def toggle_popover(self, *args):
if self.popover:
if self.popover.get_visible():
self.popover.hide()
else:
self.popover.show_all()
def add_account(self, *args):
"""
Create add application window
@ -320,231 +111,39 @@ class Window(Gtk.ApplicationWindow):
"""
Toggle select mode
"""
is_visible = self.remove_button.get_visible()
self.is_select_mode = not self.is_select_mode
self.hb.toggle_select_mode()
self.accounts_list.toggle_select_mode()
self.remove_button.set_visible(not is_visible)
self.remove_button.set_no_show_all(is_visible)
self.hb.set_show_close_button(is_visible)
self.cancel_button.set_visible(not is_visible)
self.remove_button.set_visible(not is_visible)
if not self.app.use_GMenu:
self.settings_button.set_visible(is_visible)
pass_enabled = self.app.cfg.read("state", "login")
self.lock_button.set_visible(is_visible and pass_enabled)
self.add_button.set_visible(is_visible)
self.select_button.set_visible(is_visible)
if not is_visible:
self.list_box.set_selection_mode(Gtk.SelectionMode.MULTIPLE)
self.hb.get_style_context().add_class("selection-mode")
else:
self.list_box.set_selection_mode(Gtk.SelectionMode.SINGLE)
self.hb.get_style_context().remove_class("selection-mode")
if self.selected_app_idx:
index = self.selected_app_idx
else:
index = 0
list_row_box = self.list_box.get_row_at_index(index)
self.list_box.select_row(list_row_box)
for row in self.list_box.get_children():
checkbox = row.get_checkbox()
code_label = row.get_code_label()
visible = checkbox.get_visible()
selected = checkbox.get_active()
if not is_visible:
self.select_account(checkbox)
code_label.get_style_context().add_class("application-secret-code-select-mode")
else:
code_label.get_style_context().remove_class(
"application-secret-code-select-mode")
checkbox.set_visible(not visible)
checkbox.set_no_show_all(visible)
def select_account(self, checkbutton):
"""
Select an account
:param checkbutton:
"""
is_active = checkbutton.get_active()
is_visible = checkbutton.get_visible()
listbox_row = checkbutton.get_parent().get_parent().get_parent()
if is_active:
self.list_box.select_row(listbox_row)
if is_visible:
self.selected_count += 1
else:
self.list_box.unselect_row(listbox_row)
if is_visible:
self.selected_count -= 1
self.remove_button.set_sensitive(self.selected_count > 0)
def select_row(self, list_box, listbox_row):
"""
Select row @override the clicked event by default for ListBoxRow
"""
index = listbox_row.get_index()
button_visible = self.remove_button.get_visible()
checkbox = listbox_row.get_checkbox()
if button_visible:
checkbox.set_active(not checkbox.get_active())
else:
if self.selected_app_idx:
selected_row = self.list_box.get_row_at_index(
self.selected_app_idx)
if selected_row:
self.list_box.unselect_row(selected_row)
self.selected_app_idx = index
self.list_box.select_row(self.list_box.get_row_at_index(index))
def generate_accounts_list(self):
"""
Generate an account ListBox inside of a ScrolledWindow
"""
count = self.app.auth.count()
# Create a ScrolledWindow for accounts
self.list_box.get_style_context().add_class("applications-list")
self.list_box.set_adjustment()
self.list_box.connect("row_activated", self.select_row)
self.list_box.set_selection_mode(Gtk.SelectionMode.SINGLE)
self.apps_list_box.pack_start(self.list_box, True, True, 0)
scrolled_win = Gtk.ScrolledWindow()
scrolled_win.add_with_viewport(self.apps_list_box)
self.apps_box.pack_start(scrolled_win, True, True, 0)
apps = self.app.auth.fetch_apps()
i = 0
count = len(apps)
while i < count:
self.list_box.add(AccountRow(self, apps[i][0], apps[i][1], apps[i][2],
apps[i][3]))
i += 1
def generate_no_apps_box(self):
def generate_no_accounts_box(self):
"""
Generate a box with no accounts message
"""
logo_image = Gtk.Image()
logo_image.set_from_icon_name("dialog-information-symbolic",
Gtk.IconSize.DIALOG)
no_apps_label = Gtk.Label()
no_apps_label.set_text(_("There's no account at the moment"))
self.no_apps_box.pack_start(logo_image, False, False, 6)
self.no_apps_box.pack_start(no_apps_label, False, False, 6)
self.main_box.pack_start(self.no_apps_box, True, False, 0)
def append_list_box(self, uid, name, secret_code, image):
"""
Add an element to the ListBox
:param uid: account id
:param name: account name
:param secret_code: account secret code
:param image: account image path or icon name
"""
secret_code = sha256(secret_code.encode('utf-8')).hexdigest()
self.list_box.add(AccountRow(self, uid, name, secret_code, image))
self.list_box.show_all()
def copy_code(self, *args):
"""
Copy the secret code to clipboard
"""
if len(args) > 0:
# if the code is called by clicking on copy button, select the
# right ListBowRow
row = args[0].get_parent().get_parent().get_parent()
self.list_box.select_row(row)
selected_row = self.list_box.get_selected_row()
code = selected_row.get_code()
try:
clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
clipboard.clear()
clipboard.set_text(code, len(code))
logging.debug("Secret code copied to clipboard")
except Exception as e:
logging.error(str(e))
self.no_account_box = NoAccountWindow()
self.main_box.pack_start(self.no_account_box, True, False, 0)
def refresh_window(self):
"""
Refresh windows components
"""
count = self.app.auth.count()
is_locked = self.app.locked
pass_enabled = self.app.cfg.read("state", "login")
can_be_locked = not is_locked and pass_enabled
if is_locked:
self.toggle_boxes(False, False, True)
self.hide_header_bar()
count = self.app.db.count()
if self.is_locked():
self.login_box.show()
self.no_account_box.hide()
self.accounts_box.hide()
else:
self.login_box.hide()
if count == 0:
self.toggle_boxes(False, True, False)
self.toggle_hb_buttons(
False, True, False, False, False, True, can_be_locked)
self.no_account_box.show()
self.accounts_box.hide()
else:
self.toggle_boxes(True, False, False)
self.toggle_hb_buttons(
False, True, True, True, False, True, can_be_locked)
self.pop_settings.set_sensitive(not is_locked)
self.accounts_box.show()
self.no_account_box.hide()
self.hb.refresh()
self.main_box.show_all()
self.list_box.set_selection_mode(Gtk.SelectionMode.SINGLE)
def toggle_hb_buttons(self, remove, add, search, select, cancel, settings, lock):
"""
Toggle header bar buttons visibility
:param remove: (bool)
:param add: (bool)
:param search: (bool)
:param select: (bool)
:param cancel: (bool)
:param settings: (bool)
:param lock: (bool)
"""
self.add_button.set_visible(add)
self.add_button.set_no_show_all(not add)
self.remove_button.set_visible(remove)
self.remove_button.set_no_show_all(not remove)
self.cancel_button.set_visible(cancel)
self.cancel_button.set_no_show_all(not cancel)
self.select_button.set_visible(select)
self.select_button.set_no_show_all(not select)
self.search_button.set_visible(search)
self.search_button.set_no_show_all(not search)
self.lock_button.set_visible(lock)
self.lock_button.set_no_show_all(not lock)
if not self.app.use_GMenu:
self.settings_button.set_visible(settings)
self.settings_button.set_no_show_all(not settings)
def remove_account(self, *args):
"""
Remove an application
"""
if len(args) > 0:
row = args[0].get_parent().get_parent().get_parent()
self.list_box.select_row(row)
message = _("Do you really want to remove this account?")
confirmation = ConfirmationMessage(self, message)
confirmation.show()
if confirmation.get_confirmation():
if self.list_box.get_selected_row():
selected_row = self.list_box.get_selected_row()
app_id = selected_row.get_id()
selected_row.kill()
self.list_box.remove(selected_row)
self.app.auth.remove_by_id(app_id)
confirmation.destroy()
self.refresh_window()
def is_locked(self):
return self.app.locked
def save_window_state(self):
"""

View file

@ -28,6 +28,8 @@ AC_CONFIG_FILES([
Makefile
data/Makefile
data/applications/Makefile
data/applications/images/Makefile
data/applications/data/Makefile
data/gnome-twofactorauth.desktop
TwoFactorAuth/Makefile
TwoFactorAuth/models/Makefile

View file

@ -1,15 +1,2 @@
applicationsdir = $(pkgdatadir)/applications
applications_DATA = amazon.png \
dropbox.png \
facebook.png \
flickr.png \
foursquare.png \
gitter.png \
google.png \
microsoft.png \
owncloud.png \
pocket.png \
reddit.png \
slack.png \
twitter.png \
yahoo.png
SUBDIRS = images \
data

View file

@ -0,0 +1,25 @@
yamldir = $(pkgdatadir)/applications/data
yaml_DATA = backup.yml \
banking.yml \
cloud.yml \
communication.yml \
cryptocurrencies.yml \
developer.yml \
domains.yml \
education.yml \
email.yml \
entertainment.yml \
finance.yml \
food.yml \
gaming.yml \
health.yml \
hosting.yml \
investing.yml \
other.yml \
payments.yml \
remote.yml \
retail.yml \
security.yml \
social.yml \
transport.yml \
utilities.yml

View file

@ -0,0 +1,213 @@
websites:
- name: AeroFS
url: https://www.aerofs.com/
tfa: Yes
software: Yes
img: aerofs.png
doc: https://blog.aerofs.com/two-factor-authentication-for-hybrid-and-private-cloud/
- name: Apple iCloud
url: https://www.icloud.com
img: icloud.png
tfa: Yes
sms: Yes
software: Yes
exceptions:
text: "See http://support.apple.com/kb/HT5593 for a list of supported SMS carriers."
doc: http://support.apple.com/kb/ht5570
- name: Backblaze
url: http://www.backblaze.com
img: backblaze.png
tfa: Yes
sms: Yes
doc: https://www.backblaze.com/blog/two-factor-verification-for-backblaze/
- name: Bitcasa
url: http://www.bitcasa.com/
twitter: Bitcasa
img: bitcasa.png
tfa: No
- name: Box
url: https://app.box.com/
img: box.png
tfa: Yes
sms: Yes
doc: https://support.box.com/hc/en-us/articles/200526658-Can-I-enable-2-step-verification-for-my-account-
- name: CloudApp
url: http://www.getcloudapp.com/
twitter: cloudapp
img: cloudapp.png
tfa: No
- name: CrashPlan
url: http://www.crashplan.com
twitter: crashplan
img: crashplan.png
tfa: No
- name: Dropbox
url: https://www.dropbox.com
img: dropbox.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
doc: https://www.dropbox.com/help/363/en
- name: Evernote
url: https://evernote.com
img: evernote.png
tfa: Yes
sms: Yes
software: Yes
doc: http://blog.evernote.com/blog/2013/10/04/two-step-verification-available-to-all-users/
- name: FileThis
url: https://filethis.com
twitter: FileThisCompany
img: filethis.png
tfa: No
- name: Frostbox
url: http://frostbox.com
img: frostbox.png
tfa: Yes
software: Yes
doc: https://app.frostbox.com/main.php?action=2fa
- name: Google Drive
url: https://drive.google.com
img: drive.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
hardware: Yes
doc: http://www.google.com/intl/en-US/landing/2step/features.html
- name: hubiC
url: https://hubic.com/
twitter: hubic
img: hubic.png
tfa: No
- name: IDrive
url: https://www.idrive.com
twitter: IDriveBackup
img: idrive.png
tfa: No
- name: JustCloud
url: https://www.justcloud.com
twitter: justcloudcom
img: justcloud.png
tfa: No
- name: Mega
url: https://mega.co.nz/
twitter: MEGAprivacy
img: mega.png
tfa: No
- name: OneDrive
url: https://onedrive.live.com
img: onedrive.png
tfa: Yes
sms: Yes
software: Yes
doc: http://windows.microsoft.com/en-us/windows/two-step-verification-faq
- name: Pogoplug
url: https://pogoplug.com/
twitter: pogoplug
img: pogoplug.png
tfa: No
status: https://twitter.com/pogoplug/status/486192568745476096
- name: QNAP
url: https://www.qnap.com
img: qnap.png
tfa: Yes
email: Yes
software: Yes
doc: https://www.qnap.com/i/useng/tutorial/con_show.php?op=showone&cid=151
- name: SmartBox
url: https://www.panterranetworks.com/smartbox/smartbox_overview.php
img: smartbox.png
tfa: Yes
email: Yes
software: Yes
doc: https://www.panterranetworks.com/smartbox/sb_features/sbf_security.php
- name: SpiderOak
url: https://spideroak.com
twitter: spideroak
img: spideroak.png
tfa: No
- name: SugarSync
twitter: SugarSync
url: https://www.sugarsync.com/
img: sugarsync.png
tfa: No
- name: Sync
url: https://sync.com
img: sync.png
software: Yes
email: Yes
tfa: Yes
doc: https://www.sync.com/help/how-do-i-setup-two-factor-authentication/
- name: Synology
url: https://www.synology.com/
img: synology.png
tfa: Yes
software: Yes
email: Yes
doc: https://originwww.synology.com/en-us/knowledgebase/tutorials/615#t5
- name: ThisData
url: https://thisdata.com
img: thisdata.png
tfa: Yes
sms: Yes
software: Yes
doc: https://thisdata.com/blog/how-to-enable-two-factor-authentication/
- name: Tresorit
url: https://tresorit.com/
img: tresorit.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
email: Yes
doc: https://support.tresorit.com/entries/104192996-How-to-set-up-two-step-verification
- name: XXL Cloud
url: https://xxlcloud.com
twitter: xxlcloud
img: xxlcloud.png
tfa: No
status: https://xxlcloud.com/en/blog/2factorauthentication
- name: Yandex.Disk
url: https://disk.yandex.com
img: yandexdisk.png
tfa: Yes
software: Yes
exceptions:
text: "SMS-capable phone required for initial setup."
doc: https://yandex.com/support/passport/authorization/twofa.xml
- name: Zetta.net
url: http://zetta.net/
img: zetta.png
tfa: Yes
software: Yes
doc: http://www.zetta.net/blog/set-zetta-net-two-factor-authentication/

View file

@ -0,0 +1,540 @@
websites:
- name: Actors Federal Credit Union
url: http://www.actorsfcu.com/
twitter: ActorsFCU
img: actorsfcu.png
tfa: No
- name: Ally Bank
url: http://www.ally.com/
img: allybank.png
tfa: Yes
sms: Yes
email: Yes
doc: http://www.ally.com/messages/sms/index.html
- name: Altra Federal Credit Union
url: https://www.altra.org/
twitter: AltraCU
img: altrafcu.png
tfa: No
- name: American Express
url: https://www.americanexpress.com/
twitter: AmericanExpress
img: americanexpress.png
tfa: No
- name: America First Credit Union
url: https://www.americafirst.com/
twitter: AFCU
img: americafirstcu.png
tfa: No
- name: Banca Mediolanum
url: https://www.bmedonline.it
img: mediolanum.png
tfa: No
twitter: BancaMediolanum
- name: Bank Central Asia (BCA)
url: http://www.bca.co.id/en/individual/individual.jsp
img: bankcentralasia.png
tfa: Yes
hardware: Yes
doc: http://www.bca.co.id/en/individual/produk_dan_layanan/e-banking/klikbca/klikbca-keybca/klikbca-keybca.jsp
- name: Bank of America
url: https://www.bankofamerica.com/
img: bankofamerica.png
tfa: Yes
sms: Yes
hardware: Yes
doc: https://www.bankofamerica.com/privacy/online-mobile-banking-privacy/safepass.go
- name: Bank of China (Hong Kong)
url: http://www.bochk.com
img: BOCHK.png
tfa: Yes
hardware: Yes
doc: https://www.bochk.com/en/security/2factorauthentication.html
- name: Barclays UK
url: http://www.barclays.co.uk/
img: barclays.png
tfa: Yes
hardware: Yes
software: Yes
doc: https://ask.barclays.co.uk/help/security/protection
- name: Barclays US
url: https://www.banking.barclaysus.com/index.html
img: barclays.png
tfa: Yes
sms: Yes
phone: Yes
email: Yes
- name: BMO Bank of Montreal
url: https://www.bmo.com/
twitter: BMO
img: bmo.png
tfa: No
- name: BMO Harris Bank
url: https://www.bmoharris.com/
twitter: BMOHarrisBank
img: bmo.png
tfa: No
- name: Boeing Employee Credit Union
url: https://www.becu.org/
twitter: BECU
img: becu.png
tfa: No
- name: Capital One
url: https://www.capitalone.com/
twitter: CapitalOne
img: capitalone.png
tfa: No
- name: Capital One 360
url: https://home.capitalone360.com/
twitter: CapitalOne360
img: capitalone360.png
tfa: No
- name: CDC Federal Credit Union
url: https://www.cdcfcu.com
twitter: CDCCreditUnion
img: cdcfcu.png
tfa: No
- name: Chase
url: https://www.chase.com/
img: chase.png
tfa: Yes
sms: Yes
phone: Yes
email: Yes
doc: /notes/chase/
- name: CIBC
url: http://www.cibc.ca
twitter: cibc
img: cibc.png
tfa: No
- name: Citibank
url: https://online.citibank.com/US/Welcome.c
twitter: Citibank
img: citibank.png
tfa: No
- name: Citibank Australia
url: https://www.citibank.com.au/
img: citibank.png
tfa: Yes
software: Yes
sms: Yes
doc: http://www.citibank.com.au/otp/
- name: Citizens Bank
url: https://www.citizensbank.com
twitter: citizensbank
img: citizensbank.png
tfa: No
- name: comdirect
url: https://www.comdirect.de/
twitter: comdirect
img: comdirect.png
tfa: No
- name: Commonwealth Bank of Australia
url: https://www.commbank.com.au/
img: commbank.png
tfa: Yes
sms: Yes
doc: https://www.commbank.com.au/security-privacy/netcode.html
- name: Discover
url: https://www.discover.com/
img: discover.png
tfa: no
twitter: Discover
- name: DNB
url: https://www.dnb.no/
img: dnb.png
tfa: Yes
hardware: Yes
software: Yes
doc: https://www.dnb.no/privat/kundeservice/innlogging-nettbank.html
- name: everbank.com
url: https://everbank.com
img: everbank.png
tfa: Yes
phone: Yes
sms: Yes
- name: Fairwinds
url: https://www.fairwinds.org
img: fairwinds.png
tfa: Yes
sms: Yes
email: Yes
phone: Yes
doc: "https://www.fairwinds.org/inside/privacy/security_we.asp#multifactor-auth"
- name: Fifth Third Bank
url: https://www.53.com/
twitter: fifththird
img: fifththird.png
tfa: No
- name: First Direct
url: http://www1.firstdirect.com/
img: firstdirect.png
tfa: Yes
hardware: Yes
software: Yes
doc: http://www1.firstdirect.com/1/2/securekey/
- name: First Republic Bank
url: https://www.firstrepublic.com/
img: first-republic.png
tfa: Yes
sms: Yes
phone: Yes
email: Yes
doc: https://www.firstrepublic.com/resource/banking-online-faqs#su10
- name: First Tech Federal Credit Union
url: https://www.firsttechfed.com/
img: firsttechfcu.png
tfa: Yes
hardware: Yes
software: Yes
doc: https://www.firsttechfed.com/OnlineServices/bankonlinesecurely/SecurityKey
- name: GE Capital Bank
url: https://www.gecapitalbank.com
twitter: GECapital
img: GECapitalBank.png
tfa: No
- name: Halifax
url: http://www.halifax.co.uk
twitter: AskHalifaxBank
img: halifax.png
tfa: No
- name: Handelsbanken
url: https://www.handelsbanken.se/
img: handelsbanken.png
tfa: Yes
hardware: Yes
software: Yes
doc: https://www.handelsbanken.se/shb/INeT/ICentSv.nsf/Default/qAE99695C4C1D033DC12579120036EB43?Opendocument
- name: HSBC
url: https://www.hsbc.com
img: hsbc.png
tfa: Yes
hardware: Yes
software: Yes
doc: https://www.hsbc.co.uk/1/2/customer-support/online-banking-security/secure-key
- name: Huntington National Bank
url: https://www.huntington.com
twitter: Huntington_Bank
img: huntingtonnationalbank.png
tfa: No
- name: Intesa Sanpaolo
url: https://www.intesasanpaolo.com
img: intesasanpaolo.png
tfa: Yes
hardware: Yes
doc: http://www.intesasanpaolo.com/servizi-multicanale/sicurezza.jsp
- name: LendingClub
url: https://www.lendingclub.com/
twitter: lendingclub
img: lendingclub.png
tfa: No
- name: Lloyds Bank
url: http://www.lloydsbank.com/
twitter: AskLloydsBank
img: lloydsbank.png
tfa: No
- name: MandT Bank
url: https://www.mtb.com/
img: mtbank.png
tfa: No
twitter: MandT_Help
- name: MBNA Canada
url: http://www.mbna.ca
img: mbnacanada.png
tfa: No
- name: Meridian Credit Union
url: https://www.meridiancu.ca
img: meridian.png
twitter: meridiancu
tfa: No
- name: Nationwide Building Society
url: http://www.nationwide.co.uk/
img: nationwide.png
tfa: Yes
hardware: Yes
doc: http://www.nationwide.co.uk/support/security-centre/internet-banking-security/card-reader-and-security-questions
- name: Natwest UK
url: https://www.natwest.com/personal.ashx
img: natwest.png
tfa: Yes
hardware: Yes
doc: http://www.natwest.com/personal/online-banking/g1/banking-safely-online/card-reader.ashx
- name: Navy Federal Credit Union
url: https://www.navyfederal.org/
img: navyfederal.png
tfa: No
twitter: NavyFederal
- name: Nordea Sverige
url: https://www.nordea.se/
img: nordea.png
tfa: Yes
hardware: Yes
software: Yes
doc: http://www.nordea.se/privat/vardagstjanster/internet-mobil-telefon/bank-id.html
- name: Nordnet
url: https://www.nordnet.fi/
img: nordnet.png
tfa: No
twitter: nordnetFI
- name: Pacific Continental
url: https://www.therightbank.com/
img: pcb.png
tfa: Yes
sms: Yes
phone: Yes
doc: https://www.therightbank.com/sites/www.therightbank.com/files/files/online-services-instructions.pdf
- name: Partners Federal Credit Union
url: https://partnersfcu.org/
img: partners.png
tfa: No
- name: Patelco Credit Union
url: https://www.patelco.org/
img: patelco.png
tfa: Yes
sms: Yes
email: Yes
phone: Yes
doc: https://www.patelco.org/Privacy-Security/Protection
- name: PenFed
url: https://www.penfed.org/
twitter: PenFed
img: penfed.png
tfa: No
- name: PNC Bank
url: https://www.pnc.com/
twitter: pncnews
img: pncbank.png
tfa: No
- name: Postbank
url: https://www.postbank.com/
twitter: postbank
img: postbank.png
tfa: No
- name: Raiffeisen Bank CZ
url: http://www.rb.cz/
img: raiffeisenbank_cz.png
doc: http://www.rb.cz/firemni-finance/podnikatele-a-male-firmy/prime-bankovnictvi/sluzby-pro-firemni-ucty/bezpecnost-internetoveho-bankovnictvi/
tfa: Yes
hardware: Yes
- name: RBC Royal Bank
url: http://www.rbcroyalbank.com
twitter: RBC_Canada
img: rbc.png
tfa: No
- name: San Diego County Credit Union
url: https://www.sdccu.com
twitter: sdccu
img: sdccu.png
tfa: No
- name: San Francisco Fire Credit Union
url: https://www.sffirecu.org
twitter: SFFireCU
img: sffirecu.png
tfa: No
status: https://twitter.com/sffirecu/status/577532435228991488
- name: Santa Clara County Federal Credit Union
url: https://www.sccfcu.org/
twitter: SCCFCU
img: sccfcu.png
tfa: No
- name: SchoolsFirst FCU
url: https://www.schoolsfirstfcu.org/
twitter: SchoolsFirstFCU
img: schoolsfirst.png
tfa: No
- name: SEB
url: http://www.seb.se/pow/default.asp
img: seb.png
tfa: Yes
hardware: Yes
doc: http://www.seb.se/pow/wcp/index.asp?ss=/pow/wcp/templates/sebcollection.cfmc.asp%3FDUID%3DDUID_623697DCF55C4576C1256DEF00637BE3
- name: Simple
url: https://www.simple.com/
twitter: simple
img: simple.png
tfa: No
- name: State Bank of India
url: https://www.onlinesbi.com/
img: sbi.png
tfa: Yes
sms: Yes
software: Yes
doc: https://www.onlinesbi.com/sbijava/mobile/sbsecure_otp_app_faq.html
- name: SunTrust
url: https://www.suntrust.com/
twitter: SunTrust
img: suntrust.png
tfa: No
- name: Swedbank
url: https://www.swedbank.se/
img: swedbank.png
tfa: Yes
hardware: Yes
software: Yes
doc: http://hjalp.swedbank.se/logga-in/index.htm
- name: Tangerine
url: http://www.tangerine.ca/
twitter: tangerinebank
img: tangerine.png
tfa: No
- name: TARGOBANK
url: https://www.targobank.de/
img: targobank.png
tfa: No
twitter: TARGOBANK
- name: TBC Bank
url: http://www.tbcbank.ge
img: tbcbank.png
tfa: Yes
sms: Yes
software: Yes
doc: http://old.tbcbank.ge/en/private/banking/tbc_digipass/
- name: TD Bank
url: https://www.tdbank.com
twitter: TDBank_US
img: tdbank.png
tfa: No
- name: TD Canada Trust
url: https://www.tdcanadatrust.com
twitter: TD_Canada
img: tdbank.png
tfa: No
- name: Triodos Bank Deutschland
url: https://www.triodos.de
twitter: triodosde
img: triodosbank.png
tfa: No
- name: Umpqua Bank
url: https://www.umpquabank.com/
twitter: askumpquabank
img: umpqua.png
tfa: No
- name: Union Bank
url: https://www.unionbank.com/
twitter: UnionBank
img: unionbank.png
tfa: No
- name: US Bank
url: https://www.usbank.com/
twitter: usbank
img: usbank.png
tfa: No
- name: USAA
url: https://www.usaa.com/
img: usaa.png
tfa: Yes
sms: Yes
hardware: Yes
software: Yes
doc: https://www.usaa.com/inet/pages/security_token_logon_options
- name: UW Credit Union
url: http://www.uwcu.org/
img: uwcu.png
tfa: Yes
sms: Yes
software: Yes
phone: Yes
doc: http://www.uwcu.org/OnlineBanking/OnlineSecurity/VerifyU.aspx
- name: Wells Fargo
url: https://www.wellsfargo.com/
img: wellsfargo.png
tfa: Yes
sms: Yes
software: Yes
phone: Yes
hardware: Yes
doc: https://www.wellsfargo.com/privacy-security/advanced-access
- name: Wescom Credit Union
url: https://www.wescom.org/
twitter: Liz_Wescom
img: wescom.png
tfa: No
- name: Zag Bank
url: https://www.zagbank.ca/
twitter: zagbank
img: zagbank.png
tfa: No
- name: ZenBanx
url: http://zenbanx.ca/
twitter: ZenBanx
img: zenbanx.png
tfa: No

View file

@ -0,0 +1,189 @@
websites:
- name: appFog
url: https://www.appfog.com/
twitter: appfog
img: appfog.png
tfa: No
- name: Amazon Web Services
url: https://aws.amazon.com
img: aws.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
doc: http://aws.amazon.com/iam/details/mfa/
- name: Cloud 66
url: http://www.cloud66.com
img: cloud66.png
tfa: Yes
software: Yes
doc: http://blog.cloud66.com/two-factor-authentication-for-your-accounts/
- name: cloud.ca
url: https://cloud.ca
img: cloudca.png
tfa: Yes
software: Yes
doc: https://cloud.ca/two-factor-authentication-is-now-available-on-cloud-ca/
- name: Datapipe
url: https://www.datapipe.com/
img: datapipe.png
tfa: Yes
software: Yes
doc: https://www.datapipe.com/security_compliance/managed_security/two_factor_authentication/
- name: DigitalOcean
url: https://www.digitalocean.com/
img: digitalocean.png
tfa: Yes
software: Yes
exceptions:
text: "SMS-capable phone required."
doc: https://www.digitalocean.com/company/blog/introducing-two-factor-authentication/
- name: EngineYard
url: https://www.engineyard.com
img: engineyard.png
tfa: Yes
software: Yes
exceptions:
text: "Currently in beta as of June 5th 2014. Create a support ticket to request 2FA added to your organization"
doc: https://support.cloud.engineyard.com/entries/40538256-Two-factor-authentication
- name: fortrabbit
url: http://www.fortrabbit.com/
img: fortrabbit.png
tfa: Yes
software: Yes
doc: http://help.fortrabbit.com/security#toc-two-factor-authentication
- name: Google Cloud Platform
url: https://cloud.google.com
img: googlecloud.png
tfa: Yes
sms: Yes
software: Yes
phone: Yes
hardware: Yes
doc: http://www.google.com/intl/en-US/landing/2step/features.html
- name: Heroku
url: https://www.heroku.com/
img: heroku.png
tfa: Yes
software: Yes
doc: https://devcenter.heroku.com/articles/two-factor-authentication
- name: IBM BlueMix
url: https://bluemix.net
img: ibmbluemix.png
tfa: No
twitter: IBMBluemix
- name: Joyent
url: http://www.joyent.com/
img: joyent.png
tfa: Yes
software: Yes
doc: https://docs.joyent.com/public-cloud/getting-started/2fa
- name: LeaseWeb
url: https://www.leaseweb.com/
img: leaseweb.png
tfa: Yes
sms: Yes
exceptions:
text: "As of February 23, 2016, only for CDN customer accounts; dedicated/virtual server accounts not included, but in development."
doc: https://kb.leaseweb.com/display/KB/Two+factor+authentication%3A+Cyber+Security
- name: Linode
url: https://www.linode.com/
img: linode.png
tfa: Yes
software: Yes
doc: https://www.linode.com/docs/security/linode-manager-security-controls
- name: Microsoft Azure
url: http://azure.microsoft.com/
img: microsoftazure.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
doc: https://azure.microsoft.com/en-us/documentation/articles/multi-factor-authentication/
- name: OpenShift
url: https://www.openshift.com/
twitter: openshift
img: openshift.png
tfa: No
- name: Packet
url: https://www.packet.net/
img: packet.png
tfa: Yes
sms: Yes
doc: https://www.packet.net/help/kb/account-management-and-billing/how-do-i-enable-two-factor-authentication-/
- name: Rackspace
url: https://www.rackspace.com/
img: rackspace.png
tfa: Yes
sms: Yes
software: Yes
doc: http://www.rackspace.com/knowledge_center/article/multi-factor-authentication-from-the-cloud-control-panel
- name: RightScale
url: http://www.rightscale.com/
img: rightscale.png
tfa: No
twitter: RightScale
- name: Scaleway
url: https://www.scaleway.com
twitter: scaleway
img: scaleway.png
tfa: No
- name: Scalr
url: http://www.scalr.com
img: scalr.png
tfa: Yes
software: Yes
doc: https://scalr-wiki.atlassian.net/wiki/display/docs/Two-Factor+Authentication
- name: SingleHop
url: http://www.singlehop.com
img: singlehop.png
tfa: Yes
software: Yes
doc: http://library.singlehop.com/assets_project_development/Two_Factor_Instructions.pdf
- name: Tilaa
url: https://www.tilaa.com
img: tilaa.png
tfa: Yes
software: Yes
hardware: Yes
exceptions:
text: "SMS-capable phone required."
doc: http://blog.tilaa.com/post/128110588046/two-factor-authentication-and-session-management
- name: Userify
url: https://userify.com
img: userify.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://userify.com/docs/multifactor-authentication/
- name: Vultr
url: https://www.vultr.com
img: vultr.png
tfa: yes
software: yes
hardware: yes
doc: https://www.vultr.com/docs/using-two-factor-authentication-to-login-to-vultr-control-panel

View file

@ -0,0 +1,166 @@
websites:
- name: Basecamp
url: https://basecamp.com/
img: basecamp.png
tfa: Yes
sms: Yes
doc: https://basecamp.com/help/guides/you/phone-verification
- name: Campfire
url: https://campfirenow.com/
img: campfire.png
tfa: Yes
sms: Yes
doc: https://help.37signals.com/sign-in/questions/460-how-do-i-set-up-and-use-phone-verification-for-logging-in
- name: Customer.io
url: http://customer.io
twitter: customerio
img: customerio.png
tfa: No
- name: Discord
url: https://discordapp.com/
img: discord.png
tfa: Yes
software: Yes
doc: https://support.discordapp.com/hc/en-us/articles/219576828
- name: Disqus
url: https://disqus.com
twitter: disqus
img: disqus.png
tfa: No
- name: Fleep
url: https://fleep.io
twitter: fleepio
img: fleep.png
tfa: No
- name: Flowdock
url: https://www.flowdock.com
twitter: flowdock
img: flowdock.png
tfa: No
- name: HipChat
url: https://www.hipchat.com
twitter: HipChat
img: hipchat.png
tfa: No
- name: MailChimp
url: https://mailchimp.com/
img: mailchimp.png
tfa: Yes
software: Yes
doc: http://kb.mailchimp.com/integrations/other-integrations/set-up-google-authenticator
- name: Mailgun
url: https://mailgun.com
twitter: Mail_Gun
img: mailgun.png
tfa: No
- name: Maxemail
url: https://maxemail.emailcenteruk.com/
img: maxemail.png
tfa: Yes
hardware: Yes
doc: http://www.emailcenteruk.com/software/security-collaboration-2/
- name: Peerio
url: https://peerio.com
img: peerio.png
tfa: Yes
software: Yes
doc: https://peerio.zendesk.com/hc/en-us/articles/202933829-How-do-I-setup-two-factor-authentication-
- name: Ryver
url: http://www.ryver.com/
img: ryver.png
twitter: ryverapp
tfa: No
- name: Salesforce
url: http://www.salesforce.com
img: salesforce.png
tfa: Yes
sms: Yes
software: Yes
email: Yes
doc: https://help.salesforce.com/HTViewHelpDoc?id=security_require_two_factor_authentication.htm
- name: SendGrid
url: https://sendgrid.com/
img: sendgrid.png
tfa: Yes
sms: Yes
doc: https://sendgrid.com/docs/User_Guide/two_factor_authentication.html
- name: Sendloop
url: http://app.sendloop.com
img: sendloop.png
tfa: Yes
software: Yes
doc: http://app.sendloop.com/help/article/account-003/how-can-i-make-my-account-more-secure
- name: Skype (via Microsoft Account)
url: https://www.skype.com
img: skype.png
tfa: Yes
sms: Yes
software: Yes
doc: http://windows.microsoft.com/en-au/windows/two-step-verification-faq
exceptions:
text: "Two-factor authentication is available only when logging in using Microsoft Account, not Skype's stand-alone account."
- name: Slack
url: https://slack.com/
img: slack.png
tfa: Yes
sms: Yes
software: Yes
doc: https://slack.zendesk.com/hc/en-us/articles/204509068-Enabling-two-factor-authentication
- name: SocketLabs
url: https://socketlabs.com/
img: socketlabs.png
sms: Yes
tfa: Yes
software: Yes
doc: https://support.socketlabs.com/kb/145
- name: SparkPost
url: https://sparkpost.com/
img: sparkpost.png
tfa: Yes
software: Yes
doc: https://support.sparkpost.com/customer/portal/articles/1948449
- name: Telegram
url: https://telegram.org/
img: telegram.png
tfa: Yes
sms: Yes
phone: Yes
doc: https://telegram.org/blog/sessions-and-2-step-verification
- name: ToutApp
url: http://www1.toutapp.com/
twitter: toutapp
img: toutapp.png
tfa: No
- name: WhatsApp
url: https://www.whatsapp.com/
twitter: whatsapp
img: whatsapp.png
tfa: No
- name: Yammer
url: https://yammer.com
twitter: yammer
img: yammer.png
tfa: No

View file

@ -0,0 +1,263 @@
websites:
- name: BitBay
url: http://bitbay.net
img: bitbay.png
tfa: Yes
sms: Yes
software: Yes
doc: https://www.youtube.com/watch?v=KFvoNHgl9Pw
- name: Bitcoins Norway
url: https://bitcoinsnorway.com
img: bitcoinsnorway.png
tfa: Yes
software: Yes
- name: Bitcoin.de
url: https://bitcoin.de
img: bitcoinde.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://www.bitcoin.de/de/faq/was-ist-die-2-step-verification-2-faktor-authentifizierung/46.html
- name: Bitcoin-Central
url: https://bitcoin-central.net
img: bitcoincentral.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://bitcoin-central.net/page/profile/security
- name: BitGo
url: https://www.bitgo.com
img: bitgo.png
tfa: Yes
sms: Yes
software: Yes
doc: https://bitgo.zendesk.com/hc/en-us/sections/201009049-Two-Factor-Authentication-Help-Page
- name: Bitlish
url: https://bitlish.com
img: bitlish.png
tfa: Yes
sms: Yes
software: Yes
doc: https://bitlish.com/how#mfa
- name: Bitpay
url: https://bitpay.com
img: bitpay.png
tfa: Yes
software: Yes
doc: https://bitpay.com/two-factor
- name: Bitreserve
url: https://bitreserve.org
img: bitreserve.png
tfa: Yes
sms: Yes
software: Yes
doc: https://support.bitreserve.org/hc/en-us/articles/202409609-How-does-phone-number-verification-work-
- name: Bitstamp
url: https://bitstamp.net
img: bitstamp.png
tfa: Yes
software: Yes
doc: https://www.bitstamp.net/s/documents/bitstamp_2_factor_authentication_guide.pdf
- name: BTC-E
url: https://btc-e.com
img: btc-e.png
tfa: Yes
software: Yes
doc: https://support.btc-e.com/index.php?/Knowledgebase/Article/View/97/25/how-do-i-set-2-factor-authentication-to-my-btc-e-account
- name: BTCJam
url: https://www.btcjam.com
img: btcjam.png
tfa: Yes
software: Yes
doc: http://help.btcjam.com/customer/portal/articles/1987686
- name: Blockchain
url: https://blockchain.info/
img: blockchain.png
tfa: Yes
sms: Yes
email: Yes
software: Yes
hardware: Yes
doc: https://blockchain.info/wallet/support-pages
- name: CampBX
url: https://campbx.com/
img: campbx.png
tfa: Yes
software: Yes
doc: https://campbx.com/faq.php#security-compliance
- name: CEX.IO
url: https://cex.io/
img: cex.png
tfa: Yes
sms: Yes
software: Yes
doc: https://cex.io/guide#4
- name: ChangeTip
url: https://www.changetip.com/
img: changetip.png
tfa: Yes
sms: Yes
software: Yes
doc: https://blog.changetip.com/changetip-adds-two-factor-authentication-2fa-security/
- name: Circle
url: https://circle.com
img: circle.png
tfa: Yes
sms: Yes
software: Yes
doc: https://support.circle.com/hc/en-us/articles/204624600-What-is-two-factor-authentication-2FA-
- name: CleverCoin
url: https://clevercoin.com
img: clevercoin.png
tfa: Yes
software: Yes
- name: Coinapult
url: https://coinapult.com
img: coinapult.png
tfa: Yes
software: Yes
doc: https://coinapult.com/faq
- name: Coinbase
url: https://coinbase.com/
img: coinbase.png
tfa: Yes
sms: Yes
software: Yes
phone: Yes
doc: http://blog.coinbase.com/post/25677574019/coinbase-now-offers-two-factor-authentication
- name: Coin Cafe
url: https://coincafe.com
img: coincafe.png
tfa: Yes
software: Yes
email: Yes
doc: http://blog.coincafe.com/2016/01/08/2fa/
- name: Coinfloor
url: https://www.coinfloor.co.uk/
img: coinfloor.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
doc: https://www.coinfloor.co.uk/security
- name: Coinify (Merchants)
url: https://coinify.com/merchants
img: coinify.png
tfa: Yes
software: Yes
hardware: Yes
exceptions:
text: "While Coinify has aquired BIPS to allow for trading, only merchant accounts support TFA at this time. Trading is done through a separate account. Hardware support is limited to a print-out character matrix."
- name: Coinjar
url: https://coinjar.com
img: coinjar.png
tfa: Yes
software: Yes
sms: Yes
doc: https://support.coinjar.com/kb/using-coinjar/keeping-your-coinjar-secure-with-multi-factor-authentication
- name: Coinkite
url: https://coinkite.com
img: coinkite.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
doc: https://coinkite.com/settings/pws
- name: Coinsetter
url: https://www.coinsetter.com
img: coinsetter.png
tfa: Yes
software: Yes
doc: https://www.coinsetter.com/my/security
- name: Coins.ph
url: https://coins.ph/
img: coinsph.png
tfa: Yes
software: Yes
doc: https://coinsph.zendesk.com/hc/en-us/sections/200557900-Two-factor-authentication
- name: Cryptsy
url: https://cryptsy.com/
img: cryptsy.png
tfa: Yes
software: Yes
doc: https://www.cryptsy.com/pages/security
- name: Eclipse Mining Consortium
url: https://eclipsemc.com
img: eclipsemc.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://eclipsemc.com/single-news.php?id=20
- name: Justcoin Exchange
url: https://justcoin.com/
img: justcoinexchange.png
tfa: Yes
software: Yes
doc: https://twitter.com/jstcoin/status/445900548743897088
- name: Kraken
url: https://www.kraken.com/
img: kraken.png
doc: https://www.kraken.com/security/practices#two-factor-authentication
tfa: Yes
software: Yes
- name: LocalBitcoins
url: https://localbitcoins.com/
img: localbitcoins.png
tfa: Yes
software: Yes
doc: http://localbitcoins.blogspot.fi/2013/05/using-two-factor-authentication-on.html
- name: Uphold
url: https://uphold.com/
img: uphold.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
doc: https://support.uphold.com/hc/en-us/articles/206119683-How-does-phone-number-verification-work-
- name: WeMineLTC.com
url: https://www.wemineltc.com
img: wemineltc.png
tfa: Yes
software: Yes
doc: https://twitter.com/jstcoin/status/445900548743897088
- name: Xapo
url: https://xapo.com
img: xapo.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
doc: https://support.xapo.com/how-do-i-enable-second-factor-authentication/view=faq

View file

@ -0,0 +1,331 @@
websites:
- name: Aha!
url: https://www.aha.io/
img: aha.png
tfa: Yes
sms: Yes
phone: Yes
hardware: Yes
software: Yes
doc: http://support.aha.io/hc/en-us/articles/202000957-Add-two-factor-authentication-2FA-
- name: Airbrake
url: https://airbrake.io
twitter: airbrake
img: airbrake.png
tfa: No
- name: aTech Media
url: https://atechmedia.com
img: atechmedia.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://atechmedia.com/blog/general/launches/two-factor-authentication
- name: Balsamiq
url: https://balsamiq.com
twitter: balsamiq
img: balsamiq.png
tfa: No
- name: Bitbucket
url: https://bitbucket.org
img: bitbucket.png
tfa: Yes
software: Yes
doc: https://confluence.atlassian.com/x/425QLg
- name: Bugsnag
url: https://bugsnag.com
img: bugsnag.png
tfa: Yes
software: Yes
doc: https://bugsnag.com/blog/two-factor-authentication
- name: Cedexis
url: http://www.cedexis.com/
img: cedexis.png
tfa: No
twitter: Cedexis
- name: Cloud9
url: https://c9.io
twitter: Cloud9IDE
img: cloud9.png
tfa: No
exceptions:
text: "TFA available by signing up using GitHub"
- name: CM Telecom
url: https://www.cmtelecom.com/
img: cmtelecom.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
doc: https://help.onlinesmsgateway.com/en/accounts-and-payments/how-do-i-enable-two-factor-authentication
- name: Codeanywhere
url: https://codeanywhere.com
img: codeanywhere.png
tfa: Yes
sms: Yes
doc: https://blog.codeanywhere.com/codeanywhere-now-offers-two-factor-authentication/
exceptions:
text: "Only available on paid accounts at $7/10 per month (annual/monthly) or more."
- name: Code Climate
url: https://codeclimate.com
img: codeclimate.png
tfa: Yes
sms: Yes
software: Yes
doc: https://docs.codeclimate.com/docs/enabling-two-factor-authentication
- name: Codeship
url: https://codeship.io/
twitter: codeship
img: codeship.png
tfa: No
- name: Compose.io
url: https://www.compose.io/
img: composeio.png
tfa: Yes
sms: Yes
software: Yes
doc: https://docs.compose.io/security/compose-two-factor-authentication.html
- name: Deploybot
url: http://deploybot.com/
twitter: deploybothq
img: deploybot.png
tfa: No
- name: Docker
url: https://docker.com/
twitter: docker
img: docker.png
tfa: No
- name: Esri
url: https://www.esri.com
img: esri.png
tfa: Yes
software: Yes
doc: https://doc.arcgis.com/en/arcgis-online/reference/multifactor.htm
- name: 'FogBugz & Kiln'
url: https://www.fogcreek.com/fogbugz
img: fogbugz.png
tfa: Yes
software: Yes
doc: http://help.fogcreek.com/10892/two-factor-authentication
- name: GitHub
url: https://github.com
img: github.png
tfa: Yes
sms: Yes
hardware: Yes
software: Yes
doc: https://help.github.com/articles/about-two-factor-authentication
- name: GitLab
url: https://gitlab.com
img: gitlab.png
tfa: Yes
software: Yes
doc: http://doc.gitlab.com/ee/profile/two_factor_authentication.html
- name: Hashicorp Atlas
url: https://atlas.hashicorp.com/
img: hashicorp-atlas.png
tfa: Yes
software: Yes
sms: Yes
doc: https://atlas.hashicorp.com/help/user-accounts/authentication#two-factor-authentication
- name: Infobip
url: http://www.infobip.com/
img: infobip.png
tfa: Yes
sms: Yes
doc: http://www.infobip.com/messaging/enterprise/2_factor_authentication/
- name: Jidoteki
url: https://jidoteki.com
img: jidoteki.png
tfa: Yes
software: Yes
doc: 'https://jidoteki.com/documentation#authentication'
- name: Koding
url: https://koding.com
img: koding.png
tfa: Yes
software: Yes
doc: http://learn.koding.com/guides/2-factor-auth/
- name: Launchpad
url: https://launchpad.net
img: launchpad.png
tfa: Yes
hardware: Yes
software: Yes
doc: https://help.ubuntu.com/community/SSO/FAQs/2FA
- name: Looker
url: http://looker.com/
img: looker.png
tfa: Yes
software: Yes
doc: http://www.looker.com/docs/admin/security/two-factor-authentication
- name: Mapbox
url: https://www.mapbox.com
img: mapbox.png
tfa: Yes
software: Yes
doc: https://www.mapbox.com/help/two-step-verification/
- name: MongoDB Cloud Manager
url: https://cloud.mongodb.com
img: mongodbmms.png
tfa: Yes
sms: Yes
software: Yes
phone: Yes
doc: https://docs.cloud.mongodb.com/core/two-factor-authentication/
- name: New Relic
url: https://newrelic.com
twitter: newrelic
img: newrelic.png
tfa: No
- name: Nexmo
url: https://www.nexmo.com/
img: nexmo.png
tfa: Yes
sms: Yes
phone: Yes
- name: Papertrail
url: https://papertrailapp.com/
twitter: papertrailapp
img: papertrail.png
tfa: No
- name: Phacility
url: https://phacility.com/
img: phacility.png
tfa: Yes
software: Yes
- name: Pivotal Tracker
url: https://www.pivotaltracker.com
twitter: pivotaltracker
img: pivotaltracker.png
tfa: No
- name: Plivo
url: https://www.plivo.com
twitter: plivo
img: plivo.png
tfa: No
- name: PyPI
url: https://pypi.python.org/
twitter: pypi
img: pypi.png
tfa: No
- name: PythonAnywhere
url: https://www.pythonanywhere.com
twitter: pythonanywhere
img: pythonanywhere.png
tfa: No
- name: RBCommons
url: https://rbcommons.com
img: rbcommons.png
tfa: Yes
sms: Yes
software: Yes
doc: http://support.beanbaginc.com/support/solutions/articles/3000006998-enabling-two-factor-authentication
- name: Semaphore
url: https://semaphoreci.com
img: semaphore.png
tfa: Yes
doc: https://semaphoreci.com/docs/two-step-verification.html
software: Yes
- name: SourceForge
url: http://sourceforge.net/
twitter: sourceforge
img: sourceforge.png
tfa: No
- name: Status.io
url: https://status.io/
img: statusio.png
tfa: Yes
hardware: Yes
doc: http://blog.status.io/2014/03/01/yubikey/
- name: StatusCake
url: https://statuscake.com/
img: statuscake.png
tfa: Yes
sms: Yes
- name: StatusPage.io
url: https://www.statuspage.io
twitter: statuspageio
img: statuspageio.png
tfa: No
- name: Taiga.io
url: https://taiga.io
twitter: taigaio
img: taigaio.png
tfa: No
- name: Twilio
url: https://www.twilio.com/
img: twilio.png
tfa: Yes
sms: Yes
doc: https://www.twilio.com/help/faq/twilio-basics/what-happens-when-i-enable-two-factor-authentication
- name: Unfuddle
url: https://unfuddle.com/
img: unfuddle.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
doc: https://unfuddle.com/blog/2014/07/140721-two-factor-authentication
- name: Uptime Robot
url: https://uptimerobot.com
twitter: uptimerobot
img: uptimerobot.png
tfa: No
- name: Visual Studio Online
url: http://www.visualstudio.com/
img: visualstudio.png
tfa: Yes
sms: Yes
software: Yes
doc: http://windows.microsoft.com/en-us/windows/two-step-verification-faq
- name: Zapier
url: https://www.zapier.com
twitter: zapier
img: zapier.png
tfa: No

View file

@ -0,0 +1,403 @@
websites:
- name: 007Names
url: https://www.007names.com
img: 007names.png
tfa: Yes
software: Yes
doc: https://www.007names.com/info/two-step.xhtml
- name: 1and1
url: https://www.1and1.com/
img: 1and1.png
tfa: No
twitter: 1and1
- name: 10Dollar
url: https://10dollar.ca/
img: 10dollar.png
twitter: 10dollar_ca
tfa: No
- name: 101domain
url: https://101domain.com
img: 101domain.png
tfa: Yes
software: Yes
hardware: Yes
doc: http://www.101domain.com/vip_security_card.htm
- name: Above.com
url: https://www.above.com
img: above.png
tfa: Yes
software: Yes
doc: http://domains.above.com/manual-two-step-authentication.html
- name: Badger
url: http://badger.com
img: badger.png
tfa: No
twitter: badger
- name: CloudFlare
url: https://cloudflare.com
img: cloudflare.png
tfa: Yes
software: Yes
doc: https://support.cloudflare.com/hc/en-us/articles/200167866-What-is-Authy-2-Factor-Authentication-
- name: ClouDNS
url: https://www.cloudns.net/
img: cloudns.png
tfa: No
twitter: ClouDNS
- name: Crazy Domains
url: https://www.crazydomains.com
img: crazydomains.png
tfa: No
twitter: CrazyDomains
- name: Directnic
url: https://directnic.com
img: directnic.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://directnic.com/knowledge/article/137:how+do+i+set+up+two-factor+authentication%3F
- name: DNS Made Easy
url: http://www.dnsmadeeasy.com
img: dnsmadeeasy.png
tfa: Yes
software: Yes
doc: http://www.dnsmadeeasy.com/press-release/dns-made-easy-adds-two-factor-authentication-with-time-based-passwords/
- name: DNSimple
url: https://dnsimple.com/
img: dnsimple.png
tfa: Yes
software: Yes
doc: http://blog.dnsimple.com/2012/08/protect-your-dnsimple-account-with-two-factor-authentication-from-authy/
- name: Domain.com
url: http://www.domain.com/
twitter: DomainDotCom
img: domaindotcom.png
tfa: No
- name: domainFACTORY
url: http://www.df.eu
img: domainfactory.png
twitter: domainfactory
tfa: No
- name: Domain Monster
url: https://www.domainmonster.com/
img: domainmonster.png
twitter: domainmonster
tfa: No
- name: DomainsAtCost
url: https://www.domainsatcost.ca/
twitter: domainsatcost
img: domainsatcost.png
tfa: No
- name: Domeny.tv
url: http://www.domeny.tv/en
img: domenytv.png
tfa: Yes
software: Yes
doc: http://www.domeny.tv/en/two-factor-authentication
- name: Dyn
url: http://dyn.com/
img: dyn.png
tfa: Yes
sms: Yes
software: Yes
exceptions:
text: "Currently only supported for the Managed DNS & Email Delivery platforms (via DynID). Eventually DynID (and 2FA) will be rolled out to all platforms (no ETA)."
doc: https://help.dyn.com/2-factor-authentication/
- name: Dynadot
url: http://dynadot.com/
img: dynadot.png
tfa: Yes
sms: Yes
software: Yes
doc: http://dynadot.com/domain/security.html
- name: easyDNS
url: https://easydns.com
img: easydns.png
tfa: Yes
sms: Yes
doc: http://docs.easydns.com/2-factor-authentication/
- name: eNom
url: http://enom.com/
img: enom.png
tfa: Yes
software: Yes
doc: http://www.enom.com/news/article.aspx?p=978&
- name: EuroDNS
url: https://www.eurodns.com
img: eurodns.png
tfa: Yes
software: Yes
doc: http://help.eurodns.com/customer/en/portal/articles/1633106-how-do-i-activate-two-step-verification-on-my-account-
- name: Fabulous
url: http://fabulous.com
img: fabulous.png
tfa: yes
hardware: yes
doc: http://fabulous.com/informationcenter/index.htm?formdata%5Bqid%5D=1194
- name: Fasthosts
url: https://www.fasthosts.co.uk/
twitter: Fasthosts
img: fasthosts.png
tfa: No
- name: Gandi
url: https://gandi.net
img: gandi.png
tfa: Yes
software: Yes
doc: https://wiki.gandi.net/en/contacts/login/2-factor-activation
- name: GoDaddy
img: godaddy.png
url: http://www.godaddy.com/
tfa: yes
sms: Yes
doc: https://www.godaddy.com/help/enabling-two-step-authentication-for-your-godaddy-account-7502
- name: Google Domains
url: https://domains.google.com
img: googledomains.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
hardware: Yes
doc: http://www.google.com/intl/en-US/landing/2step/features.html
- name: Heart Internet
url: https://www.heartinternet.uk/
img: heartinternet.png
tfa: No
twitter: HeartInternet
- name: Hover.com
img: hover.png
url: http://www.hover.com/
tfa: Yes
sms: Yes
software: Yes
doc: https://help.hover.com/entries/26677644
- name: Hurricane Electric
url: http://www.he.net/
img: hurricane.png
tfa: Yes
software: Yes
- name: Incapsula
url: https://www.incapsula.com/
img: incapsula.png
tfa: Yes
email: Yes
software: Yes
sms: Yes
doc: https://incapsula.zendesk.com/hc/en-us/articles/204795664-Incapsula-s-Password-Policy
- name: Internet.bs
url: http://www.internet.bs
img: internetbs.png
tfa: Yes
software: Yes
doc: /notes/internetbs/
- name: InterNetworX (INWX)
url: https://www.inwx.de/en/
img: internetworx.png
tfa: Yes
software: Yes
doc: https://www.inwx.de/en/offer/mobiletan
- name: iWantMyName
url: https://iwantmyname.com/
img: iwantmyname.png
tfa: Yes
software: Yes
doc: http://help.iwantmyname.com/customer/portal/articles/1139898
- name: Loopia
url: https://www.loopia.se/
img: loopia.png
tfa: Yes
software: Yes
doc: http://blogg.loopia.se/2015/03/16/nu-kan-du-logga-in-med-tvafaktorsautentiering-hos-loopia-genom-bankid/
exceptions:
text: "TFA only available for Swedish citizens"
- name: MarkMonitor
url: https://www.markmonitor.com
img: markmonitor.png
tfa: Yes
hardware: Yes
sms: Yes
software: Yes
- name: Metaname
url: http://metaname.net/
img: metaname.png
tfa: Yes
sms: Yes
doc: https://metaname.net/public/two_factor_authentication
- name: Moniker
url: http://www.moniker.com/
img: moniker.png
tfa: No
twitter: monikersnap
- name: MyDomain
url: http://www.mydomain.com/
twitter: mydomaindotcom
img: mydomain.png
tfa: No
- name: Name.com
url: http://www.name.com/
img: namecom.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://www.name.com/services/two-step-verification
- name: Namecheap
url: https://www.namecheap.com/
img: namecheap.png
tfa: Yes
sms: Yes
phone: Yes
doc: https://www.namecheap.com/support/knowledgebase/article.aspx/9253/45/how-to-two-factor-authentication
- name: NameSilo.com
url: http://www.namesilo.com/
img: namesilo.png
tfa: Yes
software: Yes
doc: https://www.namesilo.com/Support/2~Factor-Authentication
- name: NamesPro.ca
url: http://www.namespro.ca/
twitter: namespro
img: namespro.png
tfa: No
- name: NearlyFreeSpeech.net
url: https://www.nearlyfreespeech.net/
img: nfsn.png
tfa: Yes
sms: Yes
software: Yes
doc: https://blog.nearlyfreespeech.net/2014/02/28/price-cuts-more-security-and-recovery-options/
- name: Netfirms
url: https://www.netfirms.com
twitter: netfirms
img: netfirms.png
tfa: No
- name: Netim
url: http://www.netim.com/
twitter: Netim_com
img: netim.png
tfa: No
- name: Netregistry
url: http://www.netregistry.com.au/
twitter: netregistry
img: netregistry.png
tfa: No
- name: Network Solutions
url: https://www.networksolutions.com/
twitter: netsolcares
img: networksolutions.png
tfa: No
- name: No-IP
url: https://www.noip.com/
img: noip.png
tfa: No
twitter: NoIPcom
- name: Nominet
url: http://www.nominet.uk/
img: nominet.png
tfa: Yes
software: Yes
doc: http://registrars.nominet.org.uk/sites/default/files/two_factor_authentication_userguide.pdf
- name: Openprovider
url: https://www.openprovider.co.uk
img: openprovider.png
tfa: Yes
software: Yes
doc: https://www.openprovider.co.uk/about-openprovider/news/secure-your-account-with-two-factor-authentication
- name: OpenSRS
url: https://opensrs.com
img: opensrs.png
tfa: Yes
software: Yes
sms: Yes
doc: https://help.opensrs.com/hc/en-us/articles/209618017-Two-Factor-Authentication-2FA-for-Reseller-Account-Access
- name: pairNIC
url: https://www.pairnic.com/
img: pairnic.png
tfa: Yes
sms: Yes
doc: https://www.pairnic.com/faq_security.html
- name: PointDNS
url: https://pointhq.com/
twitter: pointdns
img: pointdns.png
tfa: No
- name: Registro.br
url: https://registro.br
img: registrobr.png
tfa: Yes
hardware: Yes
software: Yes
doc: https://registro.br/ajuda.html?secao=GerenciamentoConta&item=310
- name: Register4Less
url: https://register4less.com/
img: register4less.png
tfa: Yes
software: Yes
doc: http://blog.register4less.com/?p=43
- name: STRATO
url: https://www.strato.de/
twitter: STRATO_AG
img: strato.png
tfa: No
- name: Verio
url: https://www.verio.com/
twitter: Verio
img: verio.png
tfa: No

View file

@ -0,0 +1,124 @@
websites:
- name: Academic Earth
url: http://academicearth.org/
twitter: academicearth
img: academicearth.png
tfa: No
- name: Antagning.se
url: https://www.antagning.se
img: antagning.png
twitter: antagningse
tfa: No
- name: Clever
url: https://www.clever.com
img: clever.png
tfa: Yes
sms: Yes
software: Yes
doc: https://support.clever.com/hc/en-us/articles/202062333-Two-Factor-Authentication
- name: CSN
url: https://www.csn.se
img: csn.png
tfa: Yes
hardware: Yes
software: Yes
doc: https://www.csn.se/bas/vanligaFragor.do
- name: Codecademy
url: http://www.codecademy.com/
twitter: codecademy
img: codecademy.png
tfa: No
- name: Code School
url: https://www.codeschool.com/
twitter: codeschool
img: codeschool.png
tfa: No
- name: Coursera
url: https://www.coursera.org/
twitter: coursera
img: coursera.png
tfa: No
- name: Duolingo
url: https://www.duolingo.com
img: duolingo.png
twitter: duolingo
tfa: No
- name: Edmodo
url: https://www.edmodo.com/
twitter: edmodo
img: edmodo.png
tfa: No
- name: edX
url: https://www.edx.org/
twitter: edXOnline
img: edx.png
tfa: No
- name: Montclair State University
url: http://www.montclair.edu/employee-services/
twitter: montclairstateu
img: montclair.png
tfa: No
- name: My Study Life
url: https://www.mystudylife.com/
twitter: mystudylife
img: mystudylife.png
tfa: No
- name: Oplerno
url: https://enroll.oplerno.com/
img: oplerno.png
tfa: Yes
software: Yes
- name: PushCoin
url: https://pushcoin.com
img: pushcoin.png
tfa: Yes
hardware: Yes
exceptions:
text: "U2F support only for school admin accounts. 2FA for parent accounts is in progress."
doc: http://knowhow.pushcoin.com/using-security-key-for-2-step-verification/
- name: Robert Morris University
url: https://sentry.rmu.edu/login
twitter: rmu
img: rmu.png
tfa: No
- name: SchoolSoft
url: http://schoolsoft.se/
img: schoolsoft.png
tfa: No
- name: Udacity
url: https://www.udacity.com/
twitter: udacity
img: udacity.png
tfa: No
- name: Udemy
url: https://www.udemy.com/
twitter: udemy
img: udemy.png
tfa: No
- name: Virginia Tech
url: https://www.vt.edu/
img: virginiatech.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
hardware: Yes
doc: http://it.vt.edu/2factor/index.php

View file

@ -0,0 +1,161 @@
websites:
- name: Aol Mail
url: https://mail.aol.com
img: aol.png
tfa: Yes
sms: Yes
phone: Yes
exceptions:
text: "Currently U.S. only. International support coming soon."
doc: https://help.aol.com/articles/2-factor-authentication-stronger-than-your-password-alone
- name: FastMail
url: https://www.fastmail.fm/
img: fastmail.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
doc: https://www.fastmail.fm/help/features_alternative_logins.html
- name: Gmail
url: https://gmail.com
img: gmail.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
hardware: Yes
doc: http://www.google.com/intl/en-US/landing/2step/features.html
- name: GMX
url: https://www.gmx.com/
twitter: gmxmail
img: gmx.png
tfa: No
- name: Hushmail
url: https://www.hushmail.com
img: hushmail.png
tfa: Yes
sms: Yes
email: Yes
software: Yes
doc: https://help.hushmail.com/entries/63282756-Two-step-verification
- name: Mail.com
url: https://www.mail.com/
twitter: maildotcom
img: maildotcom.png
tfa: No
- name: Mail.Ru
url: https://mail.ru/
img: mailru.png
tfa: Yes
sms: Yes
software: Yes
doc: https://help.mail.ru/enmail-help/settings/2auth
- name: mailbox.org
url: https://www.mailbox.org/
img: mailbox.png
tfa: Yes
hardware: Yes
doc: https://mailbox.org/en/one-time-passwords-for-secure-login-to-our-webmailer/
- name: Mailstache
url: https://mailstache.io
twitter: mailstache
img: mailstache.png
tfa: No
- name: Outlook.com
url: https://outlook.com
img: outlook.png
tfa: Yes
sms: Yes
software: Yes
doc: http://windows.microsoft.com/en-us/windows/two-step-verification-faq
- name: Pobox
url: https://www.pobox.com/
img: pobox.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://pobox.com/helpspot/index.php?pg=kb.chapter&id=65
- name: Posteo
url: https://posteo.de/
img: posteo.png
tfa: Yes
software: Yes
doc: https://posteo.de/en/help/what-is-two-factor-authentication-and-how-do-i-set-it-up
- name: ProtonMail
url: https://protonmail.com/
twitter: ProtonMail
img: protonmail.png
tfa: No
- name: Riseup Mail
url: https://mail.riseup.net
twitter: riseupnet
img: riseup.png
tfa: No
- name: Runbox
url: https://runbox.com
twitter: Runbox
img: runbox.png
tfa: No
- name: Thexyz
url: https://www.thexyz.com/
img: thexyz.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://www.thexyz.com/account/knowledgebase/15/Enabling-two-factor-authentication.html
- name: Yahoo Mail
url: https://mail.yahoo.com/
img: yahoomail.png
tfa: Yes
sms: Yes
doc: https://help.yahoo.com/kb/SLN5013.html
- name: Yahoo Japan Mail
url: https://mail.yahoo.co.jp/
img: yahoojapanmail.png
tfa: Yes
email: Yes
software: Yes
doc: http://id.yahoo.co.jp/security/otp.html
- name: Yandex.Mail
url: https://mail.yandex.com/
img: yandexmail.png
tfa: Yes
software: Yes
exceptions:
text: "SMS-capable phone required for initial setup."
doc: https://yandex.com/support/passport/authorization/twofa.xml
- name: Zimbra
url: https://www.zimbra.com/
img: zimbra.png
tfa: Yes
software: Yes
exceptions:
text: "Available in Zimbra Collaboration 8.7 and above, Network Edition only"
doc: https://blog.zimbra.com/2016/02/zimbra-collaboration-8-7-two-factor-authentication-2fa-technical-preview/
- name: Zoho Mail
url: https://www.zoho.com/mail/
img: zoho.png
tfa: Yes
sms: Yes
software: Yes
doc: https://adminconsole.wiki.zoho.com/mail/Two-Factor-Authentication.html

View file

@ -0,0 +1,124 @@
websites:
- name: Bandcamp
url: https://bandcamp.com
twitter: bandcamp
img: bandcamp.png
tfa: No
- name: CD Baby
url: https://www.cdbaby.com/
twitter: cdbaby
img: cdbaby.png
tfa: No
- name: Google Play
url: https://play.google.com
img: googleplay.png
tfa: Yes
sms: Yes
phone: Yes
hardware: Yes
software: Yes
doc: http://www.google.com/intl/en-US/landing/2step/features.html
- name: hitbox
url: http://www.hitbox.tv/
twitter: hitboxliveHelp
img: hitbox.png
tfa: No
- name: Hulu
url: http://www.hulu.com/
twitter: hulu_support
img: hulu.png
tfa: No
- name: IMDb
url: https://www.imdb.com
img: imdb.png
twitter: IMDb
tfa: No
- name: Last.fm
url: http://www.last.fm/
twitter: lastfmsupport
img: lastfm.png
tfa: No
- name: Netflix
url: https://www.netflix.com/us/
twitter: Netflixhelps
img: netflix.png
tfa: No
- name: Plex
url: https://www.plex.tv
twitter: plexapp
img: plex.png
tfa: No
- name: Sling TV
url: https://www.sling.com/
twitter: slinganswers
img: sling.png
tfa: No
- name: SoundCloud
url: https://soundcloud.com/
twitter: SCsupport
img: soundcloud.png
tfa: No
- name: Spotify
url: https://www.spotify.com/
twitter: spotifycares
img: spotify.png
tfa: No
- name: TIDAL
url: http://tidal.com/
twitter: TIDALHiFi
img: tidal.png
tfa: No
- name: TiVo
url: https://www.tivo.com/
twitter: TiVo
img: tivo.png
tfa: No
- name: Twitch
url: http://www.twitch.tv/
img: twitch.png
tfa: Yes
sms: Yes
software: Yes
doc: http://blog.twitch.tv/2015/11/two-factor-authentication-now-available-on-your-twitch-account/
- name: Ustream
url: http://www.ustream.tv/
twitter: UstreamSupport
img: ustream.png
tfa: No
- name: YouTube
url: https://www.youtube.com/
img: youtube.png
tfa: Yes
sms: Yes
software: Yes
phone: Yes
hardware: Yes
doc: http://www.google.com/intl/en-US/landing/2step/features.html
- name: Vessel
url: https://www.vessel.com/
twitter: Vessel
img: vessel.png
tfa: No
- name: Vimeo
url: https://vimeo.com/
twitter: vimeo
img: vimeo.png
tfa: No

View file

@ -0,0 +1,184 @@
websites:
- name: ADP
url: https://www.adp.com
twitter: adp
img: adp.png
tfa: No
- name: Credit Karma
url: https://www.creditkarma.com
twitter: creditkarma
img: creditkarma.png
tfa: No
- name: FreeAgent
url: http://www.freeagent.com
img: freeagent.png
twitter: freeagent
tfa: No
- name: FreshBooks
url: https://www.freshbooks.com
img: freshbooks.png
twitter: freshbooks
tfa: No
- name: Geico
url: https://www.geico.com/
img: geico.png
twitter: geico_service
tfa: No
- name: HelloWallet
url: https://www.hellowallet.com
twitter: HelloWallet
img: hellowallet.png
tfa: No
- name: InEx Finance
url: https://www.inexfinance.com/
twitter: InexFinance
img: inex.png
tfa: No
- name: Intuit TurboTax
url: https://turbotax.intuit.com/
img: turbotax.png
tfa: Yes
sms: Yes
phone: Yes
email: Yes
software: Yes
doc: https://ttlc.intuit.com/questions/2902682-what-is-two-step-verification
- name: Kiva
url: https://www.kiva.org
twitter: kiva
img: kiva.png
tfa: No
- name: Kualto
url: https://www.kualto.com
twitter: kualtoapp
img: kualto.png
tfa: No
- name: LevelUp
url: https://www.thelevelup.com
twitter: TheLevelUp
img: levelup.png
tfa: No
- name: Mint
url: https://www.mint.com
img: mint.png
tfa: Yes
sms: Yes
email: Yes
software: Yes
- name: Mint Bills (formerly Check)
url: https://bills.mint.com
twitter: mintbills
img: mintbills.png
tfa: No
- name: Paychex
url: https://www.paychex.com
img: paychex.png
tfa: Yes
sms: Yes
phone: Yes
- name: Pocketsmith
url: https://www.pocketsmith.com
img: pocketsmith.png
tfa: Yes
software: Yes
doc: https://www.pocketsmith.com/blog/2014/07/18/2fa-orginal-merchant-and-other-updates
- name: Popmoney
url: https://www.popmoney.com
twitter: popmoney
img: popmoney.png
tfa: No
- name: Progressive
url: https://www.progressive.com
twitter: progressive
img: progressive.png
tfa: No
- name: Quickbooks Online
url: http://www.quickbooks.com
img: quickbooks.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
doc: https://community.intuit.com/articles/1164912-multi-factor-authentication-faq
- name: QuickFile
url: http://www.quickfile.co.uk
img: quickfile.png
tfa: Yes
software: Yes
doc: http://help.quickfile.co.uk/main/1/2-factor_authentication.htm
- name: Ripple Trade
url: https://www.rippletrade.com/
img: rippletrade.png
tfa: Yes
sms: Yes
doc: https://ripple.com/knowledge_center/using-two-factor-authentication-2fa/
- name: Shoeboxed
url: https://www.shoeboxed.com/
twitter: Shoeboxed
img: shoeboxed.png
tfa: No
- name: SimpleTax
url: https://simpletax.ca/
img: simpletax.png
tfa: Yes
email: Yes
doc: https://help.simpletax.ca/questions/two-factor-authentication
- name: Treasury Direct
url: https://www.treasurydirect.gov
img: treasurydirect.png
tfa: Yes
email: Yes
- name: Valic
url: https://www.valic.com/
twitter: VALIC_retire
img: valic.png
tfa: No
- name: Xero
url: https://www.xero.com/
img: xero.png
tfa: Yes
software: Yes
doc: https://help.xero.com/nz/MyXero_Two-Step_About
- name: Yodlee Moneycenter
url: https://yodleemoneycenter.com/
twitter: Yodlee
img: yodlee.png
tfa: no
- name: You Need A Budget (YNAB)
url: https://www.youneedabudget.com/
twitter: ynab
img: ynab.png
tfa: no
- name: ZenPayroll
url: https://www.zenpayroll.com
img: zenpayroll.png
tfa: Yes
sms: Yes
doc: http://help.zenpayroll.com/customer/portal/articles/969452-two-step-authentication

View file

@ -0,0 +1,24 @@
websites:
- name: Dutch Bros
url: http://www.dutchbros.com/
img: dutchbros.png
tfa: No
twitter: DutchBros
- name: Max
url: https://max.se/
img: max.png
tfa: No
twitter: maxhamburgare
- name: Starbucks
url: http://www.starbucks.com/
img: starbucks.png
tfa: No
twitter: Starbucks
- name: Taco Bell
url: https://www.tacobell.com
img: tacobell.png
tfa: No
twitter: tacobell

View file

@ -0,0 +1,228 @@
websites:
- name: Ankama
url: http://www.ankama.com
img: ankama.png
tfa: Yes
email: Yes
software: Yes
doc: https://support.ankama.com/hc/en-us/categories/200093427-DOFUS-Security
- name: Blizzard
url: http://blizzard.com
img: blizzard.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
doc: http://us.battle.net/en/security/
- name: Black Desert Online
url: https://www.blackdesertonline.com/
img: bdo.png
twitter: BDO_News
tfa: No
- name: Blade & Soul
url: http://www.bladeandsoul.com/
img: bladeandsoul.png
tfa: Yes
software: Yes
doc: https://support.bladeandsoul.com/hc/en-us/articles/207578553-Supported-Two-Step-OTP-Authentication-Verification-Methods
- name: Desura
url: http://www.desura.com/
img: desura.png
tfa: No
twitter: desura
- name: Elder Scrolls Online
url: http://www.elderscrollsonline.com/
img: eso.png
tfa: Yes
email: Yes
doc: /notes/eso/
- name: Enjin
url: http://www.enjin.com/
img: enjin.png
tfa: Yes
sms: Yes
software: Yes
exceptions:
text: "2FA is only available on paid plans."
doc: http://support.enjin.com/hc/en-us/articles/201090770-2-Factor-Authentication-Authy-
- name: EVE Online
url: http://www.eveonline.com/
img: eveonline.png
tfa: Yes
email: Yes
software: Yes
doc: https://community.eveonline.com/news/dev-blogs/two-factor-authentication/
exceptions:
text: "This does not prevent people from logging into the game client by circumventing the launcher. That is a legacy issue that the developers have acknowledged."
- name: Garena Online
url: http://garena.com
img: garena.png
tfa: Yes
software: Yes
doc: http://www.garena.com/account/
exceptions:
text: "A mobile phone and Garena account level 3 or higher is required for 2FA."
- name: GOG.com
url: https://www.gog.com
img: gog.png
tfa: Yes
email: Yes
doc: https://www.gog.com/support/support_view/twostep_login_faq
- name: GREE
url: http://product.gree.net/
img: gree.png
tfa: Yes
software: Yes
doc: /notes/gree/
- name: Guild Wars 2
url: https://www.guildwars2.com
img: guildwars2.png
sms: Yes
tfa: Yes
email: Yes
phone: Yes
software: Yes
doc: http://help.guildwars2.com/entries/95446157-Securing-Your-Account-With-Authentication
- name: Humble Bundle
url: https://www.humblebundle.com/
img: humble.png
tfa: Yes
sms: Yes
software: Yes
doc: https://support.humblebundle.com/hc/en-us/articles/202421374
- name: Itch.io
url: https://itch.io/
img: itchio.png
tfa: Yes
software: Yes
doc: http://itch.io/developers/two-factor-authentication
- name: League of Legends
url: http://leagueoflegends.com
twitter: leagueoflegends
img: leagueoflegends.png
tfa: No
- name: Mojang
url: https://mojang.com/
twitter: MojangSupport
img: mojang.png
tfa: No
- name: Nintendo Network
url: http://www.nintendo.com/
twitter: NintendoAmerica
img: nintendo.png
tfa: No
- name: Origin
url: https://www.origin.com/
img: origin.png
tfa: Yes
email: Yes
sms: Yes
software: Yes
doc: http://help.ea.com/en/article/origin-login-verification-information/
- name: Playstation Network
url: https://www.playstation.com/
twitter: AskPlayStation
img: psn.png
tfa: No
status: http://www.polygon.com/2016/4/20/11470660/psn-two-factor-authentication-playstation-network
- name: Rockstar Games Social Club
url: http://socialclub.rockstargames.com
twitter: RockstarSupport
img: rockstargames.png
tfa: No
- name: RuneScape
url: http://www.runescape.com/
img: runescape.png
tfa: Yes
software: Yes
doc: http://services.runescape.com/m=rswiki/en/Authenticator_FAQ
- name: "Star Wars: The Old Republic"
url: http://www.swtor.com/
img: swtor.png
tfa: Yes
software: Yes
hardware: Yes
doc: http://www.swtor.com/info/security-key
- name: Steam
url: http://store.steampowered.com/
img: steam.png
tfa: Yes
email: Yes
software: Yes
doc: https://support.steampowered.com/kb_article.php?ref=8625-WRAH-9030
exceptions:
text: "Software implementation requires use of the Steam Mobile app. It does not support multiple accounts on the same device. It does not support multiple accounts using the same phone number for SMS. Authentication on non-phone devices is not officially supported. SMS support is limited to receiving account recovery codes for password resets."
- name: Square Enix
url: http://na.square-enix.com/
img: squarenix.png
tfa: Yes
software: Yes
hardware: Yes
doc: http://www.square-enix.com/na/account/otp/
exceptions:
text: "Software implementation requires you to have purchased either Final Fantasy XI or Final Fantasy XIV and registered the game."
- name: Tibia
url: http://www.tibia.com/
img: tibia.png
tfa: Yes
software: Yes
doc: http://www.tibia.com/support/?subtopic=faq&question=authenticator
- name: Trion Worlds
url: http://www.trionworlds.com/en/
img: trionworlds.png
tfa: Yes
software: Yes
doc: https://store.trionworlds.com/account/profile/manage-game
- name: Uplay
url: http://uplay.ubi.com/
twitter: UplayUbisoft
img: uplay.png
tfa: No
- name: Wargaming
url: http://wargaming.net/
twitter: wargaming_net
img: wargaming.png
tfa: No
- name: WildStar
url: https://www.wildstar-online.com/
img: wildstar.png
tfa: Yes
software: Yes
doc: https://support.wildstar-online.com/hc/en-us/articles/203982369-Two-Step-Verification-FAQ
- name: Xbox Live
url: https://www.xbox.com/live
img: xbox.png
tfa: Yes
sms: Yes
email: Yes
software: Yes
doc: http://windows.microsoft.com/en-us/windows/two-step-verification-faq

View file

@ -0,0 +1,89 @@
websites:
- name: 23andMe
url: http://www.23andme.com
twitter: 23andMe
img: 23andme.png
tfa: No
- name: CVS/Caremark
url: https://www.caremark.com
twitter: cvshealth
img: cvscaremark.png
tfa: No
- name: drchrono
url: https://www.drchrono.com
img: drchrono.png
tfa: Yes
software: Yes
doc: https://www.drchrono.com/blog/two-factor-authentication-extra-security-for-your-health-records/
- name: Drugs.com
url: http://www.drugs.com
twitter: DrugsCom
img: drugscom.png
tfa: No
status: https://twitter.com/Drugscom/status/493856207572975620
- name: Google Fit
url: https://fit.google.com
img: googlefit.png
tfa: Yes
sms: Yes
phone: Yes
hardware: Yes
software: Yes
doc: http://www.google.com/intl/en-US/landing/2step/features.html
- name: FitBit
url: http://www.fitbit.com
twitter: fitbit
img: fitbit.png
tfa: No
- name: FollowMyHealth
url: https://www.followmyhealth.com/
img: followmyhealth.png
tfa: Yes
sms: Yes
email: Yes
software: Yes
doc: http://support.followmyhealth.com/customer/portal/articles/1309938-fmh-secure-login-2-step-verification---break-down
- name: Healthcare.gov
url: http://healthcare.gov
twitter: HealthCareGov
img: healthcaregov.png
tfa: No
- name: HealthVault (w/Microsoft Account)
url: https://www.healthvault.com
img: healthvault.png
tfa: Yes
sms: Yes
software: Yes
doc: http://windows.microsoft.com/en-au/windows/two-step-verification-faq
- name: Misfit
url: http://misfit.com/
twitter: Misfit
img: misfit.png
tfa: No
- name: myfitnesspal
url: http://www.myfitnesspal.com
twitter: myfitnesspal
img: myfitnesspal.png
tfa: No
- name: WebMD
url: http://www.webmd.com
twitter: WebMD
img: webmd.png
tfa: No
- name: Withings
url: http://www.withings.com
twitter: Withings
img: withings.png
tfa: No

View file

@ -0,0 +1,259 @@
websites:
- name: ARP Networks
url: https://arpnetworks.com/
img: arpnetworks.png
tfa: No
twitter: arpnetworks
- name: Binary Lane
url: https://www.binarylane.com.au/
img: binarylane.png
tfa: Yes
software: yes
doc: https://www.binarylane.com.au/support/solutions/articles/1000199372-two-factor-authentication
- name: Bluehost
url: https://www.bluehost.com/
img: bluehost.png
tfa: No
twitter: bluehostsupport
- name: ChunkHost
url: https://chunkhost.com
img: chunkhost.png
tfa: Yes
software: Yes
- name: CloudAtCost
url: http://cloudatcost.com
img: cloudatcost.png
twitter: cloudatcost
tfa: no
- name: CloudShards
url: https://www.cloudshards.com/
img: cloudshards.png
twitter: CloudShards
tfa: No
- name: cyon
url: https://www.cyon.ch
img: cyon.png
tfa: Yes
software: Yes
doc: https://www.cyon.ch/support/a/225/wie-aktiviere-ich-die-zwei-schritt-verifizierung
- name: Dreamhost
url: https://dreamhost.com
img: dreamhost.png
tfa: Yes
software: Yes
doc: http://wiki.dreamhost.com/Enabling_Multifactor_Authentication
- name: Fastly
url: https://www.fastly.com
img: fastly.png
tfa: Yes
software: Yes
doc: https://docs.fastly.com/guides/getting-started/enabling-and-disabling-twofactor-authentication
- name: Glesys
url: http://glesys.com/
img: glesys.png
tfa: Yes
software: Yes
hardware: Yes
- name: Globat
url: https://www.globat.com/
img: globat.png
tfa: No
twitter: globat
- name: ICUK
url: https://icuk.net
img: icuk.png
tfa: Yes
software: Yes
doc: https://www.icuk.net/reseller/security.asp
- name: Infomaniak
url: https://www.infomaniak.com/
img: infomaniak.png
tfa: Yes
software: Yes
doc: https://www.infomaniak.ch/en/support/faq/1940
- name: InMotion Hosting
url: https://www.inmotionhosting.com/
twitter: inmotionhosting
img: inmotion.png
tfa: No
- name: Hetzner Online
url: https://www.hetzner.de/
img: hetzner.png
tfa: Yes
software: Yes
hardware: Yes
- name: iPage
url: http://www.ipage.com/ipage/index.html
twitter: iPage
img: ipage.png
tfa: No
- name: Liquid Web
url: https://www.liquidweb.com
img: liquidweb.png
tfa: Yes
software: Yes
doc: https://www.liquidweb.com/kb/how-to-enable-two-factor-authentication-2fa/
- name: Mammoth Networks
url: https://www.mammoth.net.au/
img: mammothnetworks.png
tfa: Yes
software: Yes
doc: https://www.mammoth.net.au/news/2012/10/22/two-factor-authentication-now-available
- name: MaxCDN
url: https://www.maxcdn.com
img: maxcdn.png
tfa: Yes
software: Yes
doc: https://www.maxcdn.com/one/tutorial/enable-two-step-verification/
- name: Media Temple
url: http://mediatemple.net/
twitter: mediatemple
img: mediatemple.png
tfa: No
- name: Netcup
url: https://netcup.eu/
img: netcup.png
tfa: Yes
software: Yes
doc: http://www.netcup-wiki.de/wiki/Stammdaten_CCP#Zwei-Faktor-Authentifizierung_.282FA.29
- name: NearlyFreeSpeech.NET
url: https://www.nearlyfreespeech.net/
img: nfsn.png
tfa: Yes
sms: Yes
software: Yes
doc: https://blog.nearlyfreespeech.net/2014/02/28/price-cuts-more-security-and-recovery-options/
- name: One.com
url: https://www.one.com/
twitter: onecom
img: onecom.png
tfa: No
- name: Online
url: https://www.online.net/
img: online.png
tfa: Yes
sms: Yes
software: Yes
- name: OVH
url: http://www.ovh.com/
img: ovh.png
tfa: Yes
sms: Yes
software: Yes
- name: PlanetHoster
url: https://planethoster.net
img: PlanetHoster.png
tfa: Yes
software: Yes
doc: http://blog.planethoster.net/securite-espace-client-planethoster/
- name: Rackspace
url: https://www.rackspace.com/
img: rackspace.png
tfa: Yes
sms: Yes
doc: http://www.rackspace.com/knowledge_center/article/myrackspace-two-factor-authentication
- name: RamNode
url: http://www.ramnode.com
img: ramnode.png
tfa: Yes
software: Yes
doc: https://clientarea.ramnode.com/knowledgebase.php?action=displayarticle&id=70
- name: Scaleway
url: https://www.scaleway.com/
twitter: scaleway
img: scaleway.png
tfa: No
- name: Site5
url: http://www.site5.com/
twitter: site5
img: site5.png
tfa: No
- name: Softlayer
url: https://www.softlayer.com
img: softlayer.png
tfa: Yes
software: Yes
doc: http://knowledgelayer.softlayer.com/procedure/configure-portal-account-one-time-password-access-manage
- name: SpeedIT Solutions
url: https://www.speedit.org/
img: speedit.png
tfa: Yes
software: Yes
doc: https://www.speedit.org/faq/#accordian_item_937
- name: Squarespace
url: https://squarespace.com/
twitter: squarespace
img: squarespace.png
tfa: No
- name: UKFast
url: http://www.ukfast.co.uk/
img: ukfast.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
- name: Vultr
url: https://www.vultr.com/
img: vultr.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://www.vultr.com/faq/#authy
- name: WebFaction
url: https://www.webfaction.com
img: webfaction.png
tfa: Yes
software: Yes
doc: https://docs.webfaction.com/user-guide/control_panel.html#two-step-login
- name: Ukraine
url: https://www.ukraine.com.ua/
img: ukraine.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
hardware: Yes
doc: https://www.ukraine.com.ua/faq/rekomendatsii-po-zashchite-ot-vzloma-uchetnoj-zapisi.html
- name: Easy
url: https://easy.gr/
img: easy.png
tfa: Yes
software: Yes
doc: https://easy.gr/el/faq

View file

@ -0,0 +1,136 @@
websites:
- name: Bitium
url: https://www.bitium.com
img: bitium.png
tfa: Yes
hardware: Yes
software: Yes
doc: https://support.bitium.com/customer/portal/articles/1417358-enabling-two-factor-authentication-2fa-
- name: Centrify
url: http://www.centrify.com
img: centrify.png
tfa: Yes
sms: Yes
email: Yes
phone: Yes
software: Yes
doc: http://www.centrify.com/products/identity-service/multi-factor-authentication/
- name: Clavid
url: http://www.clavid.com/
img: clavid.png
tfa: Yes
software: Yes
hardware: Yes
sms: Yes
doc: http://www.clavid.com/index.php?option=com_content&view=article&id=85&Itemid=128&lang=en
- name: CloudEntr
url: http://www.cloudentr.com/
img: cloudentr.png
tfa: Yes
software: Yes
doc: http://www.cloudentr.com/product/two-factor-authentication/
- name: Dashlane
url: https://www.dashlane.com
img: dashlane.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://support.dashlane.com/hc/en-us/articles/202625042-Protect-your-account-using-Two-Factor-Authentication#title3
- name: Keeper
url: https://keepersecurity.com/
img: keeper.png
tfa: Yes
software: Yes
phone: Yes
sms: Yes
doc: https://www.keepersecurity.com/security#twoFactor
- name: Keybase
url: https://keybase.io
twitter: KeybaseIO
img: keybase.png
tfa: No
- name: LastPass
url: https://lastpass.com/
img: lastpass.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://helpdesk.lastpass.com/security-options/multifactor-authentication-options/
- name: Monkey Box
url: https://monkeybox.com
img: monkeybox.png
tfa: Yes
software: Yes
doc: https://support.monkeybox.com/knowledgebase/topics/71602-security
- name: MyDigipass.com
url: https://mydigipass.com/
img: mydigipass.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
doc: https://www.mydigipass.com/en/fp/signup
- name: Okta
url: https://www.okta.com/
img: okta.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
doc: http://www.okta.com/what-we-do/multifactor-authentication.html
- name: OneLogin
url: http://www.onelogin.com
img: onelogin.png
tfa: Yes
hardware: Yes
software: Yes
doc: http://www.onelogin.com/product/strong-authentication/two-factor-authentication/
- name: Persowna
url: https://persowna.net
img: persowna.png
tfa: Yes
software: Yes
- name: Passpack
url: https://www.passpack.com/
img: passpack.png
tfa: Yes
email: Yes
hardware: Yes
doc: https://help.passpack.com/knowledgebase/idx.php/44/0/
- name: RoboForm
url: http://www.roboform.com/
img: roboform.png
tfa: Yes
email: Yes
sms: Yes
doc: http://www.roboform.com/blog/stay-protected-with-mulitfactor-authentication
- name: SAASPASS
url: https://www.saaspass.com
img: saaspass.png
tfa: Yes
sms: Yes
software: Yes
- name: SecureSafe
url: http://www.securesafe.com
img: securesafe.png
tfa: Yes
sms: Yes
exceptions:
text: "2FA is only available on paid plans."
doc: http://www.securesafe.com/en/faq/security.html

View file

@ -0,0 +1,183 @@
websites:
- name: Acorns
url: https://www.acorns.com/
twitter: acorns
img: acorns.png
tfa: No
- name: Betterment
url: https://www.betterment.com/
twitter: betterment
img: betterment.png
tfa: No
- name: Charles Schwab
url: https://www.schwab.com/
img: charlesschwab.png
tfa: Yes
hardware: Yes
- name: COL Financial
url: https://www.colfinancial.com
twitter: COLfinancial
img: colfinancial.png
tfa: no
- name: E*Trade
url: https://www.etrade.com/
img: etrade.png
tfa: Yes
software: Yes
hardware: Yes
doc: https://us.etrade.com/e/t/jumppage/viewjumppage?PageName=secureid_enter#
- name: Fidelity Investments
url: https://www.fidelity.com
img: fidelity.png
tfa: Yes
software: Yes
hardware: Yes
exceptions:
text: "Only available for some account types"
doc: /notes/fidelity/
- name: HealthEquity
url: http://www.healthequity.com/
twitter: healthequity
img: healthequity.png
tfa: No
- name: Interactive Brokers
url: https://www.interactivebrokers.com
img: interactivebrokers.png
tfa: Yes
hardware: Yes
software: Yes
doc: https://www.interactivebrokers.com/en/index.php?f=ibgStrength&p=log
- name: Loyal3
url: https://www.loyal3.com/
twitter: loyal3
img: loyal3.png
tfa: No
- name: Manulife
url: http://www.manulife.ca
twitter: Manulife
img: manulife.png
tfa: No
- name: Merrill Edge
url: https://www.merrilledge.com/
twitter: MerrillLynch
img: merrilledge.png
tfa: No
- name: MotifInvesting
url: https://www.motifinvesting.com/
img: motif.png
tfa: Yes
sms: Yes
phone: Yes
doc: https://www.motifinvesting.com/security
- name: Nutmeg
url: https://www.nutmeg.com/
twitter: thenutmegteam
img: nutmeg.png
tfa: No
- name: OptionsHouse
img: optionshouse.png
url: https://www.optionshouse.com
tfa: No
twitter: OptionsHouse
- name: OptionsXpress
url: http://www.optionsxpress.com/
twitter: optionsXpress
img: optionsxpress.png
tfa: No
- name: Personal Capital
url: https://www.personalcapital.com
img: personalcapital.png
tfa: Yes
email: Yes
phone: Yes
doc: https://www.personalcapital.com/safety-and-security
- name: RBC Direct Investing
url: http://www.rbcdirectinvesting.com
twitter: RBC
img: rbc.png
tfa: No
- name: Robinhood
url: https://www.robinhood.com/
img: robinhood.png
tfa: No
twitter: RobinhoodApp
- name: Scottrade
url: https://www.scottrade.com/
twitter: scottrade
img: scottrade.png
tfa: No
- name: Sharebuilder
url: https://www.sharebuilder.com/
twitter: sharebuilder
img: sharebuilder.png
tfa: No
- name: SigFig
url: https://www.sigfig.com/
twitter: sigfiginsights
img: sigfig.png
tfa: No
- name: TD Ameritrade
url: https://www.tdameritrade.com
twitter: TDAmeritrade
img: tdameritrade.png
tfa: No
- name: TD Waterhouse
url: https://www.tdwaterhouse.ca
twitter: TD_Canada
img: tdameritrade.png
tfa: No
- name: TradeKing
url: https://www.tradeking.com
twitter: tradeking
img: tradeking.png
tfa: No
- name: TIAA-CREF
url: https://www.tiaa-cref.org
twitter: TC_Talks
img: tiaacref.png
tfa: no
- name: Vanguard
url: https://www.vanguard.com/
img: vanguard.png
tfa: Yes
sms: Yes
doc: https://personal.vanguard.com/us/insights/article/Account-security-092015
- name: Wealthfront
url: https://www.wealthfront.com/
img: wealthfront.png
tfa: Yes
sms: Yes
software: Yes
doc: https://pages.wealthfront.com/faqs/how-do-i-enable-two-step-authentication-on-my-account/
- name: WiseBanyan
url: https://www.wisebanyan.com/
twitter: WiseBanyan
img: wisebanyan.png
tfa: No

View file

@ -0,0 +1,306 @@
websites:
- name: ActiveCollab
url: https://www.activecollab.com/
twitter: activecollab
img: activecollab.png
tfa: No
- name: Adobe ID
url: https://accounts.adobe.com/
twitter: adobecare
img: adobe.png
tfa: No
- name: Aerohive Networks
url: https://www.aerohive.com/
img: aerohive.png
tfa: No
twitter: aerohive
- name: Airbnb
url: https://www.airbnb.com/
img: airbnb.png
tfa: No
twitter: airbnb
- name: Asana
url: https://www.asana.com
img: asana.png
tfa: No
twitter: asana
- name: Automater
url: http://automater.pl/en/
img: automater.png
tfa: Yes
software: Yes
doc: http://www.youtube.com/watch?v=5OLcvjVhhuI
- name: Azendoo
url: https://app.azendoo.com
img: azendoo.png
tfa: No
twitter: Azendoo
- name: BuiltWith
url: https://builtwith.com
img: builtwith.png
tfa: Yes
software: Yes
doc: https://kb.builtwith.com/account-management/how-to-enable-2fa-on-builtwith/
- name: Cisco Meraki
url: https://meraki.cisco.com/
img: meraki.png
tfa: Yes
sms: Yes
software: Yes
doc: https://documentation.meraki.com/zGeneral_Administration/Managing_Dashboard_Access/Using_Google_Authenticator_for_Two-factor_Authentication_in_Dashboard
- name: Clio
url: https://goclio.com
img: clio.png
tfa: Yes
email: Yes
doc: https://support.goclio.com/hc/en-us/articles/203184210-Two-Factor-Authentication
- name: Cloudinary
url: http://cloudinary.com
img: cloudinary.png
tfa: Yes
software: Yes
- name: Cosmolex
url: https://www.cosmolex.com/
img: cosmolex.png
tfa: Yes
sms: Yes
doc: http://support.cosmolex.com/customer/portal/articles/2158628
- name: Delighted
url: https://delightedapp.com/
img: delighted.png
tfa: Yes
sms: Yes
- name: Delicious
url: http://del.icio.us/
img: delicious.png
twitter: Delicious
tfa: No
- name: DirectAdmin
url: http://www.directadmin.com
img: directadmin.png
tfa: Yes
software: Yes
doc: http://directadmin.com/features.php?id=1754
- name: DoorDash
url: https://www.doordash.com
img: doordash.png
twitter: doordash
tfa: No
- name: Envato
url: http://envato.com
img: envato.png
twitter: envato
tfa: No
- name: Everlaw
url: https://everlaw.com
img: everlaw.png
tfa: Yes
software: Yes
email: Yes
doc: https://everlaw.zendesk.com/hc/en-us/articles/206312165-Two-Factor-Authentication
- name: Formstack
url: https://www.formstack.com/
img: formstack.png
tfa: Yes
sms: Yes
software: Yes
doc: https://support.formstack.com/customer/portal/articles/1833071-two-factor-authentication
- name: fruux
url: https://fruux.com
img: fruux.png
twitter: fruux
tfa: No
- name: IFTTT
url: https://ifttt.com
img: ifttt.png
tfa: Yes
sms: Yes
software: Yes
doc: https://ifttt.com/settings#two-step-verification
- name: Kayako
url: https://www.kayako.com
img: kayako.png
twitter: kayako
tfa: No
- name: Kickstarter
url: https://www.kickstarter.com
img: kickstarter.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
doc: https://www.kickstarter.com/help/faq/backer+questions#faq_63004
- name: Mandrill
url: https://mandrill.com/
img: mandrill.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
exceptions:
text: "SMS only available in the United States, the United Kingdom, Canada or some Caribbean islands."
doc: http://help.mandrill.com/entries/57465557
- name: Mixpanel
url: https://mixpanel.com/
img: mixpanel.png
tfa: Yes
sms: Yes
software: Yes
- name: Nest
url: https://nest.com
twitter: nestsupport
img: nest.png
tfa: No
- name: Office 365
url: http://office.microsoft.com/en-us/business/
img: office365.png
tfa: Yes
software: Yes
sms: Yes
phone: Yes
doc: https://support.office.com/en-US/article/Set-up-multi-factor-authentication-for-Office-365-8f0454b2-f51a-4d9c-bcde-2c48e41621c6
- name: Onshape
url: https://www.onshape.com/
img: onshape.png
tfa: Yes
software: Yes
doc: https://cad.onshape.com/help/Content/twofactorauthentication.htm
- name: Patreon
url: https://www.patreon.com/
img: patreon.png
tfa: Yes
software: Yes
doc: https://patreon.zendesk.com/hc/en-us/articles/206538086-How-Do-I-Set-Up-2-Factor-Authorization
- name: PhraseApp
url: https://phraseapp.com
img: phraseapp.png
software: Yes
tfa: Yes
doc: http://blog.phraseapp.com/post/97556438392/extra-secure-user-accounts-in-phraseapp-with
- name: Pinboard
url: https://pinboard.in/
twitter: Pinboard
img: pinboard.png
tfa: No
- name: Pocket
url: https://www.getpocket.com
twitter: Pocket
img: pocket.png
tfa: No
- name: Pozible
url: https://www.pozible.com
img: pozible.png
twitter: pozible
tfa: No
- name: Skatteverket
url: https://www.skatteverket.se
img: skatteverket.png
tfa: Yes
hardware: Yes
software: Yes
doc: http://www.skatteverket.se/privat/sjalvservice/allaetjanster/omelegitimation.4.18e1b10334ebe8bc80004811.html
- name: StartJOIN
url: https://www.startjoin.com/
img: startjoin.png
tfa: Yes
software: Yes
- name: Todoist
url: https://todoist.com
twitter: todoist
img: todoist.png
tfa: No
- name: Total Connect Comfort
url: https://www.mytotalconnectcomfort.com
twitter: Honeywell_Home
img: totalconnect.png
tfa: No
- name: Trello
url: https://trello.com
img: trello.png
tfa: Yes
sms: Yes
doc: http://help.trello.com/article/993-enabling-two-factor-authentication-for-your-trello-account
- name: Usabilla
url: https://www.usabilla.com
img: usabilla.png
tfa: Yes
software: Yes
doc: http://support.usabilla.com/customer/portal/articles/2098444-2-step-authentication
- name: US Internal Revenue Service
url: http://www.irs.gov/Individuals/Get-Transcript
twitter: IRSnews
img: irs.png
tfa: No
- name: US Social Security Administration
url: http://www.ssa.gov
img: usssa.png
tfa: Yes
sms: Yes
doc: https://secure.ssa.gov/RIL/HpsView.do#question3
- name: Webmin
url: http://www.webmin.com/
img: webmin.png
tfa: Yes
software: Yes
doc: http://doxfer.webmin.com/Webmin/Enhanced_Authentication
- name: Wikipedia
url: https://www.wikipedia.org/
twitter: Wikipedia
img: wikipedia.png
tfa: No
- name: Wunderlist
url: https://www.wunderlist.com
twitter: Wunderlist
img: wunderlist.png
tfa: No
- name: Zendesk
url: http://www.zendesk.com
img: zendesk.png
tfa: Yes
software: Yes
sms: Yes
doc: https://support.zendesk.com/hc/en-us/articles/203824246

View file

@ -0,0 +1,138 @@
websites:
- name: Amazon Payments
url: https://payments.amazon.com
twitter: AmazonPayments
img: amazon.png
tfa: No
- name: Braintree
img: braintree.png
url: https://www.braintreepayments.com/
tfa: Yes
sms: Yes
software: Yes
doc: https://articles.braintreepayments.com/reference/security/two-factor-authentication
- name: Buycraft
url: http://buycraft.net
img: buycraft.png
tfa: Yes
software: Yes
sms: Yes
exceptions:
text: "SMS-capable phone required."
doc: http://server.buycraft.net/tfa
- name: Dwolla
url: https://www.dwolla.com
img: dwolla.png
tfa: Yes
software: Yes
doc: http://help.dwolla.com/customer/portal/articles/2068158-two-factor-authentication-faq?b_id=5438
- name: Flattr
img: flattr.png
url: https://flattr.com
twitter: flattr
tfa: No
- name: GoCardless
img: gocardless.png
url: https://gocardless.com/
twitter: GoCardless
tfa: No
- name: Google Wallet
url: http://www.google.se/wallet/
img: googlewallet.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
hardware: Yes
doc: http://www.google.com/intl/en-US/landing/2step/features.html
- name: Klarna
url: https://www.klarna.com
img: klarna.png
tfa: Yes
email: Yes
software: Yes
exceptions:
text: "Software 2FA is only available for Swedish citizens with BankID."
- name: Litle & Co
img: litleco.png
twitter: litleco
tfa: No
url: https://www.litle.com
- name: Payoneer
url: http://www.payoneer.com/
twitter: Payoneer
img: payoneer.png
tfa: No
- name: PayPal
url: https://www.paypal.com/
img: paypal.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
exceptions:
text: "2FA is only available in a few countries. Contact PayPal on twitter for an up to date list of available countries."
doc: https://www.paypal.com/us/cgi-bin?cmd=xpt/Marketing_CommandDriven/securitycenter/PayPalSecurityKey-outside&bn_r=o
- name: Paysafecard
url: https://www.paysafecard.com/
img: paysafecard.png
tfa: No
twitter: paysafecard
- name: Privacy
url: https://privacy.com/
img: privacy.png
tfa: Yes
software: Yes
doc: https://privacy.com/faq
- name: Skrill
url: https://skrill.com/
img: skrill.png
tfa: Yes
hardware: Yes
doc: https://help.skrill.com/pkb_sc_article_FAQ?id=kA0D0000000Ci3x&l=en_GB
- name: Stripe
img: stripe.png
url: https://www.stripe.com/
tfa: Yes
sms: Yes
software: Yes
doc: https://support.stripe.com/questions/how-do-i-enable-two-step-verification
- name: Square
url: https://squareup.com
img: squareup.png
tfa: Yes
sms: Yes
exceptions:
text: "Currently only US merchants, protects only Dashboard access"
doc: https://squareup.com/help/us/en/article/5593-2-step-verification
- name: Venmo
url: https://venmo.com
img: venmo.png
tfa: Yes
sms: Yes
doc: https://help.venmo.com/hc/en-us/articles/217532397--Confirm-my-identity-on-sign-in-Why
- name: Yandex.Money
url: https://money.yandex.ru
img: yandexmoney.png
tfa: Yes
sms: Yes
software: Yes
hardware: Yes
doc: https://money.yandex.ru/doc.xml?id=524852

View file

@ -0,0 +1,40 @@
websites:
- name: Amazon AWS WorkSpaces
url: https://aws.amazon.com/workspaces/
doc: https://aws.amazon.com/blogs/aws/multi-factor-auth-for-workspaces/
tfa: Yes
hardware: Yes
software: Yes
img: awsworkspaces.png
- name: join.me (w/ LogMeIn account)
url: https://join.me/
img: joinme.png
tfa: Yes
sms: Yes
software: Yes
doc: https://secure.logmein.com/welcome/webhelp/EN/Pro/LogMeIn/c_common_Security_TwoStep.html
- name: LogMeIn
url: https://secure.logmein.com/
img: logmein.png
tfa: Yes
sms: Yes
email: Yes
software: Yes
hardware: Yes
doc: https://secure.logmein.com/welcome/webhelp/EN/Pro/LogMeIn/c_Common_Account_Security.html
- name: O&O Syspectr
url: https://www.syspectr.com
img: oosyspectr.png
tfa: Yes
software: Yes
doc: https://www.syspectr.com/en/faq/how-do-i-activate-deactivate-two-factor-authentication-for-my-account
- name: TeamViewer
url: https://www.teamviewer.com
img: teamviewer.png
tfa: Yes
software: Yes
doc: https://www.teamviewer.com/en/help/402-How-do-I-activate-deactivate-two-factor-authentication-for-my-TeamViewer-account.aspx

View file

@ -0,0 +1,127 @@
websites:
- name: Amazon
url: https://www.amazon.com
img: amazon.png
tfa: Yes
software: Yes
sms: Yes
exceptions:
text: "SMS or phone call required to enable 2FA."
doc: https://www.amazon.com/gp/help/customer/display.html?nodeId=201596330
- name: Apple
url: https://appleid.apple.com
img: apple.png
tfa: Yes
sms: Yes
software: Yes
exceptions:
text: "See http://support.apple.com/kb/HT5593 for a list of supported SMS carriers."
doc: http://support.apple.com/kb/ht5570
- name: Comixology
url: https://www.comixology.com/
img: comixology.png
tfa: No
twitter: comixology
- name: eBay
url: http://ebay.com
img: ebay.png
tfa: Yes
hardware: Yes
software: Yes
exceptions:
text: "eBay only supports 2FA in some countries."
doc: http://pages.ebay.com/securitykey/faq.html
- name: Etsy
url: http://www.etsy.com/
img: etsy.png
sms: Yes
tfa: Yes
doc: http://www.etsy.com/help/article/3335
- name: Everlane
url: http://www.everlane.com/
twitter: everlane
img: everlane.png
tfa: No
- name: Gilt
url: https://www.gilt.com
twitter: gilt
img: gilt.png
tfa: No
- name: Hudson's Bay
url: http://www.thebay.com
img: bay.png
twitter: hudsonsbay
tfa: No
- name: Jet
url: https://jet.com
twitter: JetHeads
img: jet.png
tfa: No
- name: Lazada
url: http://www.lazada.com/
twitter: asklazadasg
img: lazada.png
tfa: No
- name: Macy's
url: http://www.macys.com/
twitter: macys
img: macys.png
tfa: No
- name: Massdrop
url: https://www.massdrop.com
twitter: Massdrop
img: massdrop.png
tfa: No
- name: Newegg
url: http://www.newegg.com
twitter: newegg
img: newegg.png
tfa: No
- name: Stack Social
url: https://stacksocial.com
twitter: StackSocial
img: stacksocial.png
tfa: No
- name: Target
url: http://www.target.com/
twitter: target
img: target.png
tfa: No
- name: Walgreens
url: http://www.walgreens.com
twitter: walgreens
img: walgreens.png
tfa: No
- name: Walmart
url: http://www.walmart.com/
twitter: walmartlabs
img: walmart.png
tfa: No
- name: Warby Parker
url: https://www.warbyparker.com
twitter: WarbyParkerHelp
img: warbyparker.png
tfa: No
- name: Zappos
url: http://www.zappos.com/
twitter: Zappos
img: zappos.png
tfa: No

View file

@ -0,0 +1,149 @@
websites:
- name: Air VPN
url: https://airvpn.org/
img: airvpn.png
tfa: No
twitter: airvpn
- name: Blur
url: https://www.abine.com/
img: blur.png
tfa: Yes
software: Yes
doc: https://dnt.abine.com/#help/faq/faq-enabletwoFactor
- name: BolehVPN
url: https://www.bolehvpn.net/
img: bolehvpn.png
tfa: No
twitter: bolehvpn
- name: CAcert
url: http://www.cacert.org/
img: cacert.png
tfa: Yes
hardware: Yes
exceptions:
text: "Requires X.509-capable cryptotoken or smartcard."
- name: Cobalt
url: https://www.cobalt.io/
img: cobalt.png
tfa: Yes
software: Yes
doc: https://cobalt.io/blog/new-feature-two-factor-auth/
- name: CyberGhost
url: https://www.cyberghostvpn.com
img: cyberghost.png
twitter: cyberghost_EN
tfa: No
- name: DigiCert
url: http://www.digicert.com/
img: digicert.png
tfa: Yes
software: Yes
doc: https://www.digicert.com/two-factor-authentication.htm
- name: Dome9 Security
url: http://www.dome9.com/
img: dome9.png
tfa: Yes
software: Yes
hardware: Yes
doc: http://www.dome9.com/overview/strong-2-factor-authentication
- name: Entrust
img: entrust.png
url: http://www.entrust.net
tfa: Yes
software: Yes
hardware: Yes
doc: http://www.entrust.net/certificate-services/cms-authentication.htm
- name: FoxVPN
url: https://www.foxvpn.net/
img: foxvpn.png
tfa: Yes
software: Yes
doc: https://www.foxvpn.net/help/enable-two-factor-authentication/
- name: GeoTrust
url: http://www.geotrust.com/
img: geotrust.png
tfa: Yes
email: Yes
- name: GoGetSSL
url: https://gogetssl.com/
img: gogetssl.png
tfa: No
twitter: gogetssl
- name: Imperva Incapsula
url: https://www.incapsula.com/
img: incapsula.png
tfa: Yes
email: Yes
sms: Yes
software: Yes
doc: https://docs.incapsula.com/Content/Management%20Console%20and%20Settings/accountsettings.htm
- name: Norton
url: http://us.norton.com
img: norton.png
tfa: Yes
software: Yes
sms: Yes
phone: Yes
doc: https://login.norton.com/sso/embedded/learn2fa
- name: OpenDNS
url: http://www.opendns.com/
img: opendns.png
tfa: Yes
sms: Yes
software: Yes
exceptions:
text: "Only available for enterprise accounts."
doc: http://engineering.opendns.com/2014/05/22/launching-two-step-verification/
- name: SSLTrust
url: http://ssltrust.com.au/
img: ssltrust.png
tfa: Yes
software: Yes
doc: http://www.ssltrust.com.au/enable-two-factor-authentication.html
- name: ThreatMetrix
url: https://www.threatmetrix.com/
img: threatmetrix.png
tfa: No
twitter: ThreatMetrix
- name: ThreatSim
url: http://login.threatsim.com
img: threatsim.png
tfa: Yes
sms: Yes
doc: http://threatsim.com/features/
- name: Tinfoil Security
url: https://www.tinfoilsecurity.com
img: tinfoil.png
tfa: Yes
software: Yes
doc: http://support.tinfoilsecurity.com/customer/portal/articles/1559364-do-you-support-two-factor-authentication-how-do-i-set-it-up-
- name: VPN Unlimited
url: https://vpnunlimitedapp.com/
img: vpnunlimited.png
twitter: vpnunlimited
tfa: No
- name: Webroot
url: http://www.webroot.com
img: webroot.png
twitter: Webroot
tfa: No

View file

@ -0,0 +1,207 @@
websites:
- name: about.me
url: https://about.me
twitter: aboutdotme
img: aboutme.png
tfa: No
- name: App.net
url: https://join.app.net
img: appnet.png
tfa: Yes
software: Yes
doc: https://mml.desk.com/customer/portal/articles/1039728-how-do-i-set-up-two-factor-authentication-
- name: Bitly
url: https://bitly.com/
img: bitly.png
tfa: Yes
sms: Yes
exceptions:
text: "SMS-capable phone required."
doc: http://blog.bitly.com/post/90381427894/introducing-2-step-verification-for-all-users
- name: Buffer
url: https://bufferapp.com
img: bufferapp.png
tfa: Yes
sms: Yes
software: Yes
doc: https://blog.bufferapp.com/introducing-the-safest-social-media-publishing-on-the-web
- name: DeviantArt
url: https://www.deviantart.com
twitter: deviantart
img: deviantart.png
tfa: No
- name: Facebook
url: https://facebook.com
img: facebook.png
tfa: Yes
sms: Yes
software: Yes
exceptions:
text: "SMS required for 2FA. 1 account per phone number."
doc: https://www.facebook.com/help/148233965247823
- name: Flipboard
url: https://flipboard.com
img: flipboard.png
twitter: FlipboardCS
tfa: No
- name: Foursquare
url: https://foursquare.com
twitter: foursquare
img: foursquare.png
tfa: No
- name: Goodreads
url: https://www.goodreads.com
twitter: goodreads
img: goodreads.png
tfa: No
- name: Google+
url: https://plus.google.com
img: g+.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
hardware: Yes
doc: https://www.google.com/intl/en-US/landing/2step/features.html
- name: HootSuite
url: https://hootsuite.com
img: hootsuite.png
tfa: Yes
software: Yes
doc: https://help.hootsuite.com/entries/22527304-Managing-Google-Authenticator
- name: Instagram
url: https://www.instagram.com
twitter: instagram
img: instagram.png
tfa: No
- name: LinkedIn
url: https://linkedin.com
img: linkedin.png
tfa: Yes
sms: Yes
doc: https://help.linkedin.com/app/answers/detail/a_id/531/related/1
- name: Medium
url: https://medium.com
img: medium.png
tfa: Yes
email: Yes
exceptions:
text: "Medium doesn't use passwords, instead emails a link to user to login"
- name: Meetup
url: https://www.meetup.com
twitter: meetup_support
img: meetup.png
tfa: No
- name: Nextdoor
url: https://nextdoor.com
twitter: Nextdoor
img: nextdoor.png
tfa: No
- name: Pinterest
url: https://pinterest.com
twitter: Pinterest
img: pinterest.png
tfa: No
- name: Quora
url: https://www.quora.com
img: quora.png
tfa: No
twitter: quora
- name: Reddit
url: https://www.reddit.com/
twitter: reddit
img: reddit.png
tfa: No
- name: Snapchat
url: https://www.snapchat.com/
img: snapchat.png
tfa: Yes
sms: Yes
software: Yes
doc: https://support.snapchat.com/ca/login-verification
- name: Stack Exchange
url: https://stackexchange.com/
twitter: StackExchange
img: stack_exchange.png
tfa: No
- name: Tumblr
url: https://www.tumblr.com/
img: tumblr.png
tfa: Yes
sms: Yes
software: Yes
doc: https://www.tumblr.com/docs/en/two_factor_auth
- name: Twitter
url: https://twitter.com
img: twitter.png
tfa: Yes
sms: Yes
exceptions:
text: "SMS only available on select providers. SMS required for 2FA. 10 accounts per phone number, 1 phone number per account."
software: Yes
doc: https://support.twitter.com/articles/20170388
- name: VanillaForums.com
url: https://vanillaforums.com
img: vanilla.png
tfa: No
twitter: vanilla
- name: Viadeo
url: http://www.viadeo.com
img: viadeo.png
tfa: No
twitter: Viadeo
- name: VK
url: https://vk.com
img: vk.png
tfa: Yes
sms: Yes
software: Yes
doc: https://vk.com/page-59800369_47885415
- name: WordPress.com
url: https://wordpress.com
img: wordpress.png
tfa: Yes
sms: Yes
software: Yes
exceptions:
text: "SMS-capable phone required."
doc: https://en.support.wordpress.com/security/two-step-authentication/
- name: XING
url: https://www.xing.com
img: xing.png
tfa: No
twitter: XING_com
- name: Zocle
url: https://zocle.com/
img: zocle.png
tfa: Yes
sms: Yes
doc: http://university.zocle.com/2015/03/30/new-security-feature-two-step-verification/

View file

@ -0,0 +1,180 @@
websites:
- name: American Airlines
url: https://www.aa.com/
twitter: AmericanAir
img: aa.png
tfa: No
- name: Air Canada
url: https://www.aircanada.com/
twitter: AirCanada
img: aircanada.png
tfa: No
- name: Alaska Airlines
url: https://www.alaskaair.com
twitter: AlaskaAir
img: alaska.png
tfa: No
- name: Air France
url: http://www.airfrance.com
twitter: airfrance
img: airfrance.png
tfa: No
- name: Amtrak
url: https://www.amtrak.com/
twitter: Amtrak
img: amtrak.png
tfa: No
- name: British Airways
url: https://www.britishairways.com/
twitter: British_Airways
img: ba.png
tfa: No
- name: Clipper
url: https://www.clippercard.com
twitter: BayAreaClipper
img: clipper.png
tfa: No
- name: Delta
url: https://www.delta.com/
twitter: Delta
img: delta.png
tfa: No
- name: Deutsche Bahn (DB)
url: https://www.bahn.com
twitter: DB_Bahn
img: db.png
tfa: No
- name: easyJet
url: https://www.easyjet.com
twitter: easyJet
img: easyjet.png
tfa: No
- name: Greyhound
url: https://www.greyhound.com
twitter: GHoundBusHelp
img: greyhound.png
tfa: No
- name: Frontier
url: https://www.flyfrontier.com
twitter: FrontierCare
img: frontier.png
tfa: No
- name: Hailo
url: https://www.hailoapp.com/
twitter: Hailo
img: hailo.png
tfa: No
- name: JetBlue
url: https://www.jetblue.com
twitter: JetBlue
img: jetblue.png
tfa: No
- name: Hawaiian Airlines
url: https://www.hawaiianairlines.com
twitter: HawaiianAir
img: hawaiian.png
tfa: No
- name: JetSmarter
url: https://jetsmarter.com/
twitter: JetSmarter
img: jetsmarter.png
tfa: No
- name: Lufthansa
url: https://www.lufthansa.com
twitter: lufthansa
img: lufthansa.png
tfa: No
- name: Lyft
url: https://www.lyft.com/
twitter: AskLyft
img: lyft.png
tfa: No
- name: Norwegian
url: https://www.norwegian.com/
twitter: Fly_Norwegian
img: norwegian.png
tfa: No
- name: NSB
url: https://www.nsb.no
img: nsb.png
twitter: nsb_no
tfa: No
- name: Ryanair
url: https://www.ryanair.com
twitter: Ryanair
img: ryanair.png
tfa: No
- name: Transport for London
url: https://tfl.gov.uk/
twitter: tflwaystopay
img: tfl.png
tfa: No
- name: SAS
url: https://www.flysas.com/
twitter: SAS
img: sas.png
tfa: No
- name: SJ
url: https://www.sj.se/
twitter: SJ_AB
img: sj.png
tfa: No
- name: SL
url: http://sl.se/
twitter: SL_AB
img: sl.png
tfa: No
- name: Southwest
url: https://www.southwest.com/
twitter: SouthwestAir
img: southwest.png
tfa: No
- name: Spirit
url: https://www.spirit.com
twitter: SpiritAirlines
img: spirit.png
tfa: No
- name: Uber
url: https://www.uber.com/
twitter: uber_support
img: uber.png
tfa: No
- name: United
url: https://www.united.com/
twitter: united
img: united.png
tfa: No
- name: WestJet
url: https://www.westjet.com/
twitter: WestJet
img: westjet.png
tfa: No

View file

@ -0,0 +1,199 @@
websites:
- name: American Electric Power
url: https://www.aep.com
twitter: AEPnews
img: aep.png
tfa: No
- name: AT&T
url: https://www.att.com/
img: att.png
tfa: No
twitter: ATTCustomerCare
- name: CallCentric
url: https://www.callcentric.com/
img: callcentric.png
tfa: Yes
email: Yes
doc: http://www.callcentric.com/features/two_point_authentication
- name: CenturyLink
url: https://www.centurylink.com/
img: centurylink.png
tfa: No
twitter: CenturyLink
- name: Charter Communications
url: http://www.charter.net/
img: charter.png
tfa: No
twitter: CharterCom
- name: Comcast
url: https://www.comcast.com/
img: comcast.png
tfa: No
twitter: ComcastCares
- name: Con Edison
url: https://www.coned.com
img: coned.png
twitter: ConEdison
tfa: No
- name: Cox
url: http://www.cox.com/
img: cox.png
tfa: No
twitter: CoxHelp
- name: DIRECTV
url: http://www.directv.com/
img: directv.png
tfa: No
twitter: DIRECTVService
- name: DISH Network
url: http://www.dish.com/
img: dish.png
tfa: No
twitter: DISH_Answers
- name: Dominion
url: https://www.dom.com
img: dom.png
twitter: DOMVAPower
tfa: No
- name: EE
url: http://www.ee.co.uk/
img: ee.png
tfa: No
twitter: EE
- name: Florida Power and Light
url: https://www.fpl.com
img: fpl.png
twitter: insideFPL
tfa: No
- name: Google Fiber
url: https://fiber.google.com
img: googlefiber.png
tfa: Yes
sms: Yes
phone: Yes
software: Yes
hardware: Yes
doc: http://www.google.com/intl/en-US/landing/2step/features.html
- name: Halebop
url: https://www.halebop.se
img: halebop.png
twitter: halebop_sverige
tfa: No
- name: Pacific Gas and Electric Company PG&E
url: http://www.pge.com/
img: pge.png
tfa: No
twitter: pge4me
- name: Optus
url: http://www.optus.com.au/
img: optus.png
tfa: No
twitter: Optus
- name: RCN
url: https://www.rcn.com/
img: rcn.png
tfa: No
twitter: rcnconnects
- name: Rogers
url: https://www.rogers.com
twitter: RogersHelps
img: rogers.png
tfa: No
- name: San Diego Gas & Electric
url: https://www.sdge.com
twitter: SDGE
img: sdge.png
tfa: No
- name: Sonic
url: https://www.sonic.net/
img: sonic.png
tfa: No
twitter: sonic
- name: Southern California Edison
url: https://www.sce.com
img: sce.png
twitter: SCE
tfa: No
- name: Sprint
url: http://www.sprint.com/
img: sprint.png
tfa: No
twitter: sprint
- name: Three UK
url: http://www.three.co.uk/
img: three.png
tfa: No
twitter: ThreeUK
- name: Time Warner Cable
url: https://www.timewarnercable.com/
img: timewarner.png
tfa: No
twitter: TWC_Help
- name: Ting
url: https://ting.com/
img: ting.png
tfa: Yes
sms: Yes
software: Yes
doc: https://help.ting.com/hc/en-us/articles/209351258-Two-Factor-Authentication
- name: T-Mobile
url: https://www.t-mobile.com/
img: tmobile.png
tfa: No
twitter: TMobileHelp
- name: Verizon
url: https://www.verizon.com/
img: verizon.png
tfa: No
twitter: VerizonSupport
- name: Verizon Wireless
url: https://www.verizonwireless.com/
img: verizon.png
tfa: No
twitter: VZWSupport
- name: Vimla
url: https://www.vimla.se
img: vimla.png
twitter: vimla_se
tfa: No
- name: Virgin Mobile
url: https://www.virgin.com/gateways/mobile
img: virginmobile.png
tfa: No
twitter: virgin
- name: VoIP.ms
url: https://voip.ms/
img: voipms.png
tfa: No
twitter: voipms

View file

@ -0,0 +1,15 @@
imagesdir = $(pkgdatadir)/applications/images
images_DATA = amazon.png \
dropbox.png \
facebook.png \
flickr.png \
foursquare.png \
gitter.png \
google.png \
microsoft.png \
owncloud.png \
pocket.png \
reddit.png \
slack.png \
twitter.png \
yahoo.png

View file

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

Before

Width:  |  Height:  |  Size: 790 B

After

Width:  |  Height:  |  Size: 790 B

View file

Before

Width:  |  Height:  |  Size: 1,001 B

After

Width:  |  Height:  |  Size: 1,001 B

View file

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

Before

Width:  |  Height:  |  Size: 668 B

After

Width:  |  Height:  |  Size: 668 B

View file

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 2 KiB

View file

Before

Width:  |  Height:  |  Size: 626 B

After

Width:  |  Height:  |  Size: 626 B

View file

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -6,7 +6,7 @@
<object class="GtkShortcutsSection">
<property name="visible">True</property>
<property name="section-name">shortcuts</property>
<property name="max-height">10</property>
<property name="max-height">5</property>
<child>
<object class="GtkShortcutsGroup">
<property name="visible">True</property>
@ -18,13 +18,6 @@
<property name="accelerator">&lt;Primary&gt;F</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes" context="shortcut window">Copy</property>
<property name="accelerator">&lt;Primary&gt;C</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
@ -32,25 +25,6 @@
<property name="accelerator">&lt;Primary&gt;N</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes" context="shortcut window">Delete</property>
<property name="accelerator">Delete</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkShortcutsGroup">
<property name="visible">True</property>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes" context="shortcut window">Select next/previous account</property>
<property name="accelerator">Up Down</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
@ -58,10 +32,64 @@
<property name="accelerator">&lt;Primary&gt;S</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes" context="shortcut window">Lock the application</property>
<property name="accelerator">&lt;Primary&gt;L</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkShortcutsGroup">
<property name="visible">True</property>
<property name="title" translatable="yes" context="shortcut window">Account list</property>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes" context="shortcut window">Copy</property>
<property name="accelerator">&lt;Primary&gt;C</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes" context="shortcut window">Delete</property>
<property name="accelerator">Delete</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes" context="shortcut window">Select next/previous account</property>
<property name="accelerator">Up Down</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkShortcutsGroup">
<property name="visible">True</property>
<property name="title" translatable="yes" context="shortcut window">Add Account</property>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes" context="shortcut window">Scan QR code</property>
<property name="accelerator">&lt;Primary&gt;S</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes" context="shortcut window">Close</property>
<property name="accelerator">Escape</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-06-12 14:18+0200\n"
"POT-Creation-Date: 2016-06-19 15:33+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -52,6 +52,11 @@ msgctxt "shortcut window"
msgid "Selection mode"
msgstr ""
#: data/shortcuts.ui:64
msgctxt "shortcut window"
msgid "Lock the application"
msgstr ""
#: data/about.ui:14
msgid "Simple application to generate two-factor authentication code"
msgstr ""
@ -63,68 +68,58 @@ msgid ""
"later</a> for details."
msgstr ""
#: TwoFactorAuth/widgets/window.py:142
msgid "Do you really want to remove selected accounts?"
msgstr ""
#: TwoFactorAuth/widgets/window.py:165
msgid "Enter your password"
msgstr ""
#: TwoFactorAuth/widgets/window.py:169
msgid "Unlock"
msgstr ""
#: TwoFactorAuth/widgets/window.py:235
#: TwoFactorAuth/widgets/headerbar.py:44
msgid "Remove selected accounts"
msgstr ""
#: TwoFactorAuth/widgets/window.py:243 TwoFactorAuth/widgets/add_account.py:28
#: TwoFactorAuth/widgets/add_account.py:43
#: TwoFactorAuth/widgets/headerbar.py:51
#: TwoFactorAuth/widgets/add_account.py:30
#: TwoFactorAuth/widgets/add_account.py:45
msgid "Add a new account"
msgstr ""
#: TwoFactorAuth/widgets/window.py:251
#: TwoFactorAuth/widgets/headerbar.py:58
msgid "Lock the Application"
msgstr ""
#: TwoFactorAuth/widgets/window.py:263
#: TwoFactorAuth/widgets/headerbar.py:74
msgid "Selection mode"
msgstr ""
#: TwoFactorAuth/widgets/window.py:272
#: TwoFactorAuth/widgets/applications_list.py:88
#: TwoFactorAuth/widgets/headerbar.py:81
#: TwoFactorAuth/widgets/applications_list.py:89
msgid "Search"
msgstr ""
#: TwoFactorAuth/widgets/window.py:277 TwoFactorAuth/widgets/add_account.py:48
#: TwoFactorAuth/widgets/headerbar.py:85
#: TwoFactorAuth/widgets/add_account.py:50
#: TwoFactorAuth/widgets/change_password.py:143
#: TwoFactorAuth/widgets/applications_list.py:80
#: TwoFactorAuth/widgets/applications_list.py:81
msgid "Cancel"
msgstr ""
#: TwoFactorAuth/widgets/window.py:296 TwoFactorAuth/widgets/settings.py:24
#: TwoFactorAuth/application.py:65
#: TwoFactorAuth/widgets/headerbar.py:97 TwoFactorAuth/widgets/settings.py:24
#: TwoFactorAuth/application.py:60
msgid "Settings"
msgstr ""
#: TwoFactorAuth/widgets/window.py:438
#: TwoFactorAuth/widgets/no_account_window.py:19
msgid "There's no account at the moment"
msgstr ""
#: TwoFactorAuth/widgets/window.py:536
msgid "Do you really want to remove this account?"
msgstr ""
#: TwoFactorAuth/widgets/add_account.py:53
#: TwoFactorAuth/widgets/add_account.py:55
msgid "Add"
msgstr ""
#: TwoFactorAuth/widgets/add_account.py:74
#: TwoFactorAuth/widgets/add_account.py:64
msgid "Scan a QR code"
msgstr ""
#: TwoFactorAuth/widgets/add_account.py:87
msgid "Account Name"
msgstr ""
#: TwoFactorAuth/widgets/add_account.py:82
#: TwoFactorAuth/widgets/add_account.py:95
msgid "Secret Code"
msgstr ""
@ -148,36 +143,48 @@ msgstr ""
msgid "Repeat new password"
msgstr ""
#: TwoFactorAuth/widgets/applications_list.py:75
#: TwoFactorAuth/widgets/applications_list.py:76
msgid "Select an application"
msgstr ""
#: TwoFactorAuth/widgets/applications_list.py:91
#: TwoFactorAuth/widgets/applications_list.py:92
msgid "Next"
msgstr ""
#: TwoFactorAuth/widgets/account_row.py:153
#: TwoFactorAuth/widgets/login_window.py:25
msgid "Enter your password"
msgstr ""
#: TwoFactorAuth/widgets/login_window.py:28
msgid "Unlock"
msgstr ""
#: TwoFactorAuth/widgets/account_row.py:164
msgid "Copy the generated code"
msgstr ""
#: TwoFactorAuth/widgets/account_row.py:163
#: TwoFactorAuth/widgets/account_row.py:174
msgid "Remove the account"
msgstr ""
#: TwoFactorAuth/widgets/account_row.py:169
#: TwoFactorAuth/widgets/account_row.py:225
#: TwoFactorAuth/widgets/account_row.py:179
#: TwoFactorAuth/widgets/account_row.py:267
#, python-format
msgid "Expires in %s seconds"
msgstr ""
#: TwoFactorAuth/widgets/account_row.py:175
#: TwoFactorAuth/widgets/account_row.py:185
msgid "Error during the generation of code"
msgstr ""
#: TwoFactorAuth/widgets/account_row.py:221
#: TwoFactorAuth/widgets/account_row.py:230
msgid "Couldn't generate the secret code"
msgstr ""
#: TwoFactorAuth/widgets/account_row.py:256
msgid "Do you really want to remove this account?"
msgstr ""
#: TwoFactorAuth/widgets/settings.py:52
msgid "Behavior"
msgstr ""
@ -198,18 +205,18 @@ msgstr ""
msgid "Secret code generation time (s) :"
msgstr ""
#: TwoFactorAuth/application.py:29
#: TwoFactorAuth/application.py:28
msgid "TwoFactorAuth"
msgstr ""
#: TwoFactorAuth/application.py:73
#: TwoFactorAuth/application.py:68
msgid "Shortcuts"
msgstr ""
#: TwoFactorAuth/application.py:75
#: TwoFactorAuth/application.py:70
msgid "About"
msgstr ""
#: TwoFactorAuth/application.py:76
#: TwoFactorAuth/application.py:71
msgid "Quit"
msgstr ""