Skip to content
This repository was archived by the owner on Jun 19, 2019. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ venv/
__pycache__/
*.py[cod]
*$py.class
.pytest_cache


# Unit test / coverage reports
Expand Down
1 change: 1 addition & 0 deletions config/configs.py → config/all_config_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
configs.from_object('config.default')

try:
print('config file', os.environ['CONFIG_FILE'])
configs.from_envvar('CONFIG_FILE')
except RuntimeError as ex:
logger.warning("Failed to load config from envar")
18 changes: 14 additions & 4 deletions config/awsDev.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from decouple import config

DEBUG = True

PORT = 5000

TOKEN = config('DEV_BOT_TOKEN', default='token')
VERIFICATION_TOKEN = config('DEV_AUTH_TOKEN', default='token')
COMMUNITY_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='community_channel')
MENTORS_INTERNAL_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='mentor_channel')
SLACK_TOKEN = config('DEV_BOT_TOKEN', default='token')
SLACK_VERIFICATION_TOKEN = config('DEV_AUTH_TOKEN', default='token')
SLACK_COMMUNITY_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='community_channel')
SLACK_MENTORS_INTERNAL_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='mentor_channel')

AIRTABLE_BASE_KEY = config('DEV_AIRTABLE_BASE_KEY', default='fake_airtable_base')
AIRTABLE_API_KEY = config('DEV_AIRTABLE_TOKEN', default='fake_airtable_key')
Expand All @@ -16,3 +18,11 @@
DB_DIALECT = config('AWS_DEV_DB_DIALECT', default='sqlite')
DB_ADDR = config('AWS_DEV_DB_ADDR', default='dev.db')
DB_NAME = config('AWS_DEV_DB_NAME', default='')

GOOGLE_RECAPTCHA_SECRET = config('RECAPTCHA_SECRET')

GITHUB_JWT = config('GITHUB_JWT')
GITHUB_REPO_PATH = config('GITHUB_REPO_PATH')

OC_BACKEND_JWT_TOKEN = config('OC_BACKEND_JWT_TOKEN')
OC_BACKEND_URL = config('OC_BACKEND_URL')
18 changes: 12 additions & 6 deletions config/awsProd.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

DEBUG = False

TOKEN = config('PROD_BOT_TOKEN')
VERIFICATION_TOKEN = config('PROD_AUTH_TOKEN')
COMMUNITY_CHANNEL = config('PROD_COMMUNITY_CHANNEL')
MENTORS_INTERNAL_CHANNEL = config('PROD_MENTOR_CHANNEL')
#PORT = 5000

SLACK_TOKEN = config('PROD_BOT_TOKEN')
SLACK_VERIFICATION_TOKEN = config('PROD_AUTH_TOKEN')
SLACK_COMMUNITY_CHANNEL = config('PROD_COMMUNITY_CHANNEL')
SLACK_MENTORS_INTERNAL_CHANNEL = config('PROD_MENTOR_CHANNEL')

AIRTABLE_BASE_KEY = config('PROD_AIRTABLE_BASE_KEY')
AIRTABLE_API_KEY = config('PROD_AIRTABLE_TOKEN')
Expand All @@ -17,6 +19,10 @@
DB_ADDR = config('PROD_DB_ADDR', default='dev.db')
DB_NAME = config('PROD_DB_NAME', default='')

RECAPTCHA_SECRET = config('RECAPTCHA_SECRET')
GOOGLE_RECAPTCHA_SECRET = config('RECAPTCHA_SECRET')

GITHUB_JWT = config('GITHUB_JWT')
GITHUB_REPO_PATH = config('GITHUB_REPO_PATH')
GITHUB_REPO_PATH = config('GITHUB_REPO_PATH')

OC_BACKEND_JWT_TOKEN = config('OC_BACKEND_JWT_TOKEN')
OC_BACKEND_URL = config('OC_BACKEND_URL')
48 changes: 26 additions & 22 deletions config/default.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,28 @@


DEBUG = True

VERIFICATION_TOKEN = 'token'
TOKEN = 'token'
COMMUNITY_CHANNEL = 'community_channel'
MENTORS_INTERNAL_CHANNEL = 'mentor_channel'

AIRTABLE_BASE_KEY = 'fake_airtable_base'
AIRTABLE_API_KEY = 'fake_airtable_key'
AIRTABLE_TABLE_NAME = 'Mentor Request'

# database stuff
DB_USERNAME = ''
DB_PASSWORD = ''
DB_DIALECT = 'sqlite'
DB_ADDR = 'dev.db'
DB_NAME = ''

# PythonAnywhere SSH Tunnel Configurations
PA_SSH_USERNAME = 'username'
PA_SSH_PASSWORD = 'password'
PA_SSH_URL = 'url'
PA_SSH_REMOTE_BIND_ADDR = 'addr'
PA_SSH_REMOTE_BIND_PORT = 'port'
PORT = 5000

SLACK_VERIFICATION_TOKEN = 'default'
SLACK_TOKEN = 'default'
SLACK_COMMUNITY_CHANNEL = 'default'
SLACK_MENTORS_INTERNAL_CHANNEL = 'default'

AIRTABLE_BASE_KEY = 'default'
AIRTABLE_API_KEY = 'default'
AIRTABLE_TABLE_NAME = 'defaul'

DB_USERNAME = 'default'
DB_PASSWORD = 'default'
DB_DIALECT = 'defaults'
DB_ADDR = 'default'
DB_NAME = 'default'

GOOGLE_RECAPTCHA_SECRET = 'default'

GITHUB_JWT = 'default'
GITHUB_REPO_PATH = 'default'

OC_BACKEND_JWT_TOKEN = 'default'
OC_BACKEND_URL = 'default'
20 changes: 10 additions & 10 deletions config/development.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from decouple import config

DEBUG = True

PORT = 5000

TOKEN = config('DEV_BOT_TOKEN', default='token')
VERIFICATION_TOKEN = config('DEV_AUTH_TOKEN', default='token')
COMMUNITY_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='community_channel')
MENTORS_INTERNAL_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='mentor_channel')
SLACK_TOKEN = config('DEV_BOT_TOKEN', default='token')
SLACK_VERIFICATION_TOKEN = config('DEV_AUTH_TOKEN', default='token')
SLACK_COMMUNITY_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='community_channel')
SLACK_MENTORS_INTERNAL_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='mentor_channel')

AIRTABLE_BASE_KEY = config('DEV_AIRTABLE_BASE_KEY', default='fake_airtable_base')
AIRTABLE_API_KEY = config('DEV_AIRTABLE_TOKEN', default='fake_airtable_key')
Expand All @@ -17,12 +19,10 @@
DB_ADDR = config('DEV_DB_ADDR', default='dev.db')
DB_NAME = config('DEV_DB_NAME', default='')

PA_SSH_USERNAME = config('PA_SSH_USERNAME', default=None)
PA_SSH_PASSWORD = config('PA_SSH_PASSWORD', default=None)
PA_SSH_URL = config('PA_SSH_URL', default=None)
PA_SSH_REMOTE_BIND_ADDR = config('PA_PG_IP_ADDR', cast=str, default=None)
PA_SSH_REMOTE_BIND_PORT = config('PA_PG_PORT', cast=int, default=0)
GOOGLE_RECAPTCHA_SECRET = config('RECAPTCHA_SECRET')

RECAPTCHA_SECRET = config('RECAPTCHA_SECRET')
GITHUB_JWT = config('GITHUB_JWT')
GITHUB_REPO_PATH = config('DEV_GITHUB_REPO_PATH')

OC_BACKEND_JWT_TOKEN = config('OC_BACKEND_JWT_TOKEN')
OC_BACKEND_URL = config('OC_BACKEND_URL')
20 changes: 11 additions & 9 deletions config/development2.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

PORT = 5000

TOKEN = config('PERSONAL_BOT_TOKEN', default='token')
VERIFICATION_TOKEN = config('APP_VERIFICATION_TOKEN', default='token')
COMMUNITY_CHANNEL = config('PERSONAL_PRIVATE_CHANNEL', default='community_channel')
MENTORS_INTERNAL_CHANNEL = config('PERSONAL_PRIVATE_CHANNEL', default='mentor_channel')
SLACK_TOKEN = config('PERSONAL_BOT_TOKEN', default='token')
SLACK_VERIFICATION_TOKEN = config('APP_VERIFICATION_TOKEN', default='token')
SLACK_COMMUNITY_CHANNEL = config('PERSONAL_PRIVATE_CHANNEL', default='community_channel')
SLACK_MENTORS_INTERNAL_CHANNEL = config('PERSONAL_PRIVATE_CHANNEL', default='mentor_channel')

AIRTABLE_BASE_KEY = config('DEV_AIRTABLE_BASE_KEY', default='fake_airtable_base')
AIRTABLE_API_KEY = config('DEV_AIRTABLE_TOKEN', default='fake_airtable_key')
Expand All @@ -17,8 +17,10 @@
DB_ADDR = config('DEV_DB_ADDR', default='dev.db')
DB_NAME = config('DEV_DB_NAME', default='')

PA_SSH_USERNAME = config('PA_SSH_USERNAME', default=None)
PA_SSH_PASSWORD = config('PA_SSH_PASSWORD', default=None)
PA_SSH_URL = config('PA_SSH_URL', default=None)
PA_SSH_REMOTE_BIND_ADDR = config('PA_PG_IP_ADDR', cast=str, default=None)
PA_SSH_REMOTE_BIND_PORT = config('PA_PG_PORT', cast=int, default=0)
GOOGLE_RECAPTCHA_SECRET = config('RECAPTCHA_SECRET')

GITHUB_JWT = config('GITHUB_JWT')
GITHUB_REPO_PATH = config('DEV_GITHUB_REPO_PATH')

OC_BACKEND_JWT_TOKEN = config('OC_BACKEND_JWT_TOKEN')
OC_BACKEND_URL = config('OC_BACKEND_URL')
16 changes: 10 additions & 6 deletions config/production.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

DEBUG = False

TOKEN = config('OPCODE_TOKEN')
VERIFICATION_TOKEN = config('OPCODE_VERIFICATION_TOKEN')
COMMUNITY_CHANNEL = config('OPCODE_COMMUNITY_ID')
MENTORS_INTERNAL_CHANNEL = config('OPCODE_MENTORS_INTERNAL_CHANNEL')
SLACK_TOKEN = config('OPCODE_TOKEN')
SLACK_VERIFICATION_TOKEN = config('OPCODE_VERIFICATION_TOKEN')
SLACK_COMMUNITY_CHANNEL = config('OPCODE_COMMUNITY_ID')
SLACK_MENTORS_INTERNAL_CHANNEL = config('OPCODE_MENTORS_INTERNAL_CHANNEL')

AIRTABLE_BASE_KEY = config('OPCODE_AIRTABLE_BASE_KEY')
AIRTABLE_API_KEY = config('OPCODE_AIRTABLE_TOKEN')
Expand All @@ -17,6 +17,10 @@
DB_ADDR = config('PROD_DB_ADDR')
DB_NAME = config('PROD_DB_NAME')

RECAPTCHA_SECRET = config('RECAPTCHA_SECRET')
GOOGLE_RECAPTCHA_SECRET = config('RECAPTCHA_SECRET')

GITHUB_JWT = config('GITHUB_JWT')
GITHUB_REPO_PATH = config('GITHUB_REPO_PATH')
GITHUB_REPO_PATH = config('GITHUB_REPO_PATH')

OC_BACKEND_JWT_TOKEN = config('OC_BACKEND_JWT_TOKEN')
OC_BACKEND_URL = config('OC_BACKEND_URL')
20 changes: 9 additions & 11 deletions config/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

PORT = 5000

TOKEN = 'slack-token'
VERIFICATION_TOKEN = 'token'
COMMUNITY_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='community_channel')
MENTORS_INTERNAL_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='mentor_channel')
SLACK_TOKEN = 'slack-token'
SLACK_VERIFICATION_TOKEN = 'token'
SLACK_COMMUNITY_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='community_channel')
SLACK_MENTORS_INTERNAL_CHANNEL = config('DEV_PRIVATE_CHANNEL', default='mentor_channel')

AIRTABLE_BASE_KEY = config('DEV_AIRTABLE_BASE_KEY', default='fake_airtable_base')
AIRTABLE_API_KEY = config('DEV_AIRTABLE_TOKEN', default='fake_airtable_key')
Expand All @@ -17,12 +17,10 @@
DB_ADDR = config('DEV_DB_ADDR', default='dev.db')
DB_NAME = config('DEV_DB_NAME', default='')

PA_SSH_USERNAME = config('PA_SSH_USERNAME', default=None)
PA_SSH_PASSWORD = config('PA_SSH_PASSWORD', default=None)
PA_SSH_URL = config('PA_SSH_URL', default=None)
PA_SSH_REMOTE_BIND_ADDR = config('PA_PG_IP_ADDR', cast=str, default=None)
PA_SSH_REMOTE_BIND_PORT = config('PA_PG_PORT', cast=int, default=0)
GOOGLE_RECAPTCHA_SECRET = 'secret'

RECAPTCHA_SECRET = 'secret'
GITHUB_JWT = 'jwt'
GITHUB_REPO_PATH = config('DEV_GITHUB_REPO_PATH')
GITHUB_REPO_PATH = config('DEV_GITHUB_REPO_PATH')

OC_BACKEND_JWT_TOKEN = config('OC_BACKEND_JWT_TOKEN')
OC_BACKEND_URL = config('OC_BACKEND_URL')
25 changes: 25 additions & 0 deletions deploy/curr_prod
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
AWS_DEV_DB_ADDR
AWS_DEV_DB_DIALECT
AWS_DEV_DB_NAME
AWS_DEV_DB_PASSWORD
AWS_DEV_DB_USERNAME
CONFIG_FILE
DEV_AIRTABLE_BASE_KEY
DEV_AIRTABLE_TOKEN
DEV_AUTH_TOKEN
DEV_BOT_TOKEN
DEV_PRIVATE_CHANNEL
GITHUB_JWT
GITHUB_REPO_PATH
PROD_AIRTABLE_BASE_KEY
PROD_AIRTABLE_TOKEN
PROD_AUTH_TOKEN
PROD_BOT_TOKEN
PROD_COMMUNITY_CHANNEL
PROD_DB_ADDR
PROD_DB_DIALECT
PROD_DB_NAME
PROD_DB_PASSWORD
PROD_DB_USERNAME
PROD_MENTOR_CHANNEL
RECAPTCHA_SECRET
7 changes: 7 additions & 0 deletions deploy/env_check
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/bash

AWS_VARS=eb printenv | sed -n 's/ *\([A-Z_]*\) =.*/\1/p'

NEW_PROD_VARS=cat ../config/awsProd.py | sed '/#/d' |sed -n 's/ *\([A-Z_]\) =.*/\1/p'

MISMATCH=comm -1 -3 <sort($AWS_VARS) < sort($NEW_PROD_VARS)
18 changes: 18 additions & 0 deletions deploy/prod
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
DEBUG
SLACK_TOKEN
SLACK_VERIFICATION_TOKEN
SLACK_COMMUNITY_CHANNEL
SLACK_MENTORS_INTERNAL_CHANNEL
AIRTABLE_BASE_KEY
AIRTABLE_API_KEY
AIRTABLE_TABLE_NAME
DB_USERNAME
DB_PASSWORD
DB_DIALECT
DB_ADDR
DB_NAME
GOOGLE_RECAPTCHA_SECRET
GITHUB_JWT
GITHUB_REPO_PATH
OC_BACKEND_JWT_TOKEN
OC_BACKEND_URL
2 changes: 1 addition & 1 deletion ocbot/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import os

from flask import Flask
from config.configs import configs
from config.all_config_loader import configs
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

Expand Down
2 changes: 1 addition & 1 deletion ocbot/external/route_airtable.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from ocbot.external import ResponseContainer
from requests import post, get, patch
from functools import partial
from config.configs import configs
from config.all_config_loader import configs

logger = logging.getLogger(__name__)

Expand Down
62 changes: 62 additions & 0 deletions ocbot/external/route_backend.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import logging

import requests

from config.all_config_loader import configs

logger = logging.getLogger(__name__)
JWT_BACKEND_TOKEN = configs['OC_BACKEND_JWT_TOKEN']
OC_BACKEND_URL = configs['OC_BACKEND_URL']


class OCBackend:
# Store the instance

_back_suffix = 'api/v1/slack_users'
_bearer_token = ''

def __init__(self, *, jwt_token=None):
self._verification_token = jwt_token or JWT_BACKEND_TOKEN
self._bearer_token = f'Bearer {self._verification_token}'

def build_url(self, route_string):
return f'{OC_BACKEND_URL}/{self._back_suffix}/{route_string}'

def check_health(self):
route_url = self.build_url('access')

response = self.do_get(route_url)

if not response.ok:
val = response.json()
raise OCException(response.json()['errors'][0], response.status_code)

return True

def do_get(self, route_url):
return requests.get(route_url, headers={"Authorization": self._bearer_token})


class OCException(Exception):
def __init__(selfself, message, status_code):
bad_response_dict = {'Invalid auth token': UndecodableTokenException,
'Auth token has expired': ExpiredTokenException,
'Auth token is invalid': InvalidTokenException,
}

raise bad_response_dict[message]()


class ExpiredTokenException(OCException):
def __init__(self):
self.message = 'Expired Auth Token'


class InvalidTokenException(OCException):
def __init__(self):
self.message = 'Incorrect JWT token sent'


class UndecodableTokenException(OCException):
def __init__(self):
self.message = 'Server Couldn\'t decode token'
Loading