diff --git a/framework/src/Maveriks/Extension/Restler.php b/framework/src/Maveriks/Extension/Restler.php index 9c0b83105..4d121e7e3 100644 --- a/framework/src/Maveriks/Extension/Restler.php +++ b/framework/src/Maveriks/Extension/Restler.php @@ -18,6 +18,8 @@ class Restler extends \Luracast\Restler\Restler public $responseMultipart = array(); public $inputExecute = ''; + protected $workspace; + public function __construct($productionMode = false, $refreshCache = false) { parent::__construct($productionMode, $refreshCache); @@ -127,4 +129,14 @@ class Restler extends \Luracast\Restler\Restler { $this->message($e); } + + public function setWorkspace($workspace) + { + $this->workspace = $workspace; + } + + public function getWorkspace() + { + return $this->workspace; + } } \ No newline at end of file diff --git a/framework/src/Maveriks/Pattern/Mvc/SmartyView.php b/framework/src/Maveriks/Pattern/Mvc/SmartyView.php new file mode 100644 index 000000000..a477ecf94 --- /dev/null +++ b/framework/src/Maveriks/Pattern/Mvc/SmartyView.php @@ -0,0 +1,29 @@ +smarty = new \Smarty(); + $this->smarty->compile_dir = defined('PATH_SMARTY_C')? PATH_SMARTY_C : sys_get_temp_dir(); + $this->smarty->cache_dir = defined('PATH_SMARTY_CACHE')? PATH_SMARTY_CACHE : sys_get_temp_dir(); + //$this->smarty->config_dir = PATH_THIRDPARTY . 'smarty/configs'; + //$this->smarty->register_function('translate', 'translate'); + } + + public function assign($name, $value) + { + $this->smarty->assign($name, $value); + } + + public function render() + { + $this->smarty->display($this->getTpl()); + } +} diff --git a/framework/src/Maveriks/WebApplication.php b/framework/src/Maveriks/WebApplication.php index 82093ccb5..f98b25907 100644 --- a/framework/src/Maveriks/WebApplication.php +++ b/framework/src/Maveriks/WebApplication.php @@ -96,6 +96,8 @@ class WebApplication */ public function route() { + $this->requestUri = strlen($this->requestUri) > 1? rtrim($this->requestUri, '/'): $this->requestUri; + if ($this->requestUri === "/") { if (file_exists("index.html")) { return self::RUNNING_INDEX; @@ -107,7 +109,47 @@ class WebApplication ) { return self::RUNNING_API; } else { - return self::RUNNING_WORKFLOW; + list($this->requestUri,) = explode('?', $this->requestUri); + $uriParts = explode('/', $this->requestUri); + + if ($uriParts[2] == 'oauth2') { + + if (! isset($uriParts[2])) { + return self::RUNNING_WORKFLOW; + } + + /*$workspace = $uriParts[1]; + $class = 'oauth2'; + $action = isset($uriParts[3])? $uriParts[3]: 'index';*/ + + $uriTemp = explode('/', $_SERVER['REQUEST_URI']); + array_shift($uriTemp); + $workspace = array_shift($uriTemp); + $_SERVER['REQUEST_URI'] = '/' . implode('/', $uriTemp); + + $this->loadEnvironment($workspace); + $this->configureRest($workspace, '1.0'); + //var_dump(class_exists('ProcessMaker\\Services\\OAuth2\\Server')); + $this->rest->addAPIClass('\ProcessMaker\\Services\\OAuth2\\Server', 'oauth2'); + $this->rest->handle(); + + /* + + $this->loadEnvironment($workspace); + + require_once PATH_CONTROLLERS . $class . '.php'; + + if (is_callable(array($class, $action))) { + $controller = new $class(); + $controller->setHttpRequestData($_REQUEST); + $controller->call($action); + } else { + header('location: /errors/error404?url=' . urlencode($this->requestUri)); + }*/ + + } else { + return self::RUNNING_WORKFLOW; + } } } @@ -227,8 +269,6 @@ class WebApplication $apiIniFile = $servicesDir . DS . 'api.ini'; // $authenticationClass - contains the class name that validate the authentication for Restler $authenticationClass = 'ProcessMaker\\Services\\OAuth2\\Server'; - // $pmOauthClientId - contains PM Local OAuth Id (Web Designer) - $pmOauthClientId = 'x-pm-local-client'; /* * Load Api ini file for Rest Service @@ -252,37 +292,9 @@ class WebApplication } } - // Setting current workspace to Api class - Services\Api::setWorkspace(SYS_SYS); - $cacheDir = defined("PATH_C")? PATH_C: sys_get_temp_dir(); - - $sysConfig = \System::getSystemConfiguration(); - - \Luracast\Restler\Defaults::$cacheDirectory = $cacheDir; - $productionMode = (bool) !(isset($sysConfig["service_api_debug"]) && $sysConfig["service_api_debug"]); - - Util\Logger::log("Serving API mode: " . ($productionMode? "production": "development")); - - // create a new Restler instance - //$rest = new \Luracast\Restler\Restler(); - $this->rest = new \Maveriks\Extension\Restler($productionMode); - // setting flag for multipart to Restler - $this->rest->setFlagMultipart($multipart); - // setting api version to Restler - $this->rest->setAPIVersion($version); - // adding $authenticationClass to Restler + $this->configureRest(SYS_SYS, $version, $multipart); $this->rest->addAuthenticationClass($authenticationClass, ''); - // Setting database connection source - list($host, $port) = strpos(DB_HOST, ':') !== false ? explode(':', DB_HOST) : array(DB_HOST, ''); - $port = empty($port) ? '' : ";port=$port"; - Services\OAuth2\Server::setDatabaseSource(DB_USER, DB_PASS, DB_ADAPTER.":host=$host;dbname=".DB_NAME.$port); - - // Setting default OAuth Client id, for local PM Web Designer - Services\OAuth2\Server::setPmClientId($pmOauthClientId); - - $this->rest->setOverridingFormats('JsonFormat', 'UploadFormat'); - $isPluginRequest = strpos($uri, '/plugin-') !== false ? true : false; if ($isPluginRequest) { @@ -340,6 +352,44 @@ class WebApplication } } + public function configureRest($workspace, $version, $multipart = false) + { + // $pmOauthClientId - contains PM Local OAuth Id (Web Designer) + $pmOauthClientId = 'x-pm-local-client'; + + // Setting current workspace to Api class + Services\Api::setWorkspace($workspace); + $cacheDir = defined("PATH_C")? PATH_C: sys_get_temp_dir(); + + $sysConfig = \System::getSystemConfiguration(); + + \Luracast\Restler\Defaults::$cacheDirectory = $cacheDir; + $productionMode = false; //(bool) !(isset($sysConfig["service_api_debug"]) && $sysConfig["service_api_debug"]); + + Util\Logger::log("Serving API mode: " . ($productionMode? "production": "development")); + + // create a new Restler instance + //$rest = new \Luracast\Restler\Restler(); + $this->rest = new \Maveriks\Extension\Restler($productionMode); + $this->rest->setworkspace($workspace); + // setting flag for multipart to Restler + $this->rest->setFlagMultipart($multipart); + // setting api version to Restler + $this->rest->setAPIVersion($version); + // adding $authenticationClass to Restler + + // Setting database connection source + list($host, $port) = strpos(DB_HOST, ':') !== false ? explode(':', DB_HOST) : array(DB_HOST, ''); + $port = empty($port) ? '' : ";port=$port"; + Services\OAuth2\Server::setDatabaseSource(DB_USER, DB_PASS, DB_ADAPTER.":host=$host;dbname=".DB_NAME.$port); + + // Setting default OAuth Client id, for local PM Web Designer + Services\OAuth2\Server::setPmClientId($pmOauthClientId); + Services\OAuth2\Server::setWorkspace($workspace); + + $this->rest->setOverridingFormats('JsonFormat', 'UploadFormat'); + } + public function parseApiRequestUri() { $url = explode("/", $this->requestUri); diff --git a/workflow/engine/controllers/oauth2.php b/workflow/engine/controllers/oauth2.php new file mode 100644 index 000000000..6ba281e5e --- /dev/null +++ b/workflow/engine/controllers/oauth2.php @@ -0,0 +1,118 @@ +/sys/en/neoclassic/oauth2/authorize?response_type=code&client_id={your-client-d}&scope=view_processes%20edit_processes + $this->setVar('applications_link', $applicationsLink); + $this->setVar('authorization_link', $authorizationLink); + + $this->setView('oauth2/index'); + $this->render(); + } + + public function apps() + { + $http = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; + $host = $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] != '80' ? ':' . $_SERVER['SERVER_PORT'] : ''); + + $applicationsLink = sprintf('%s://%s/sys%s/%s/%s/oauth2/applications', $http, $host, SYS_SYS, SYS_LANG, SYS_SKIN); + + header('location: ' . $applicationsLink); + + } + + public function authorize() + { + session_start(); + if (! isset($_SESSION['USER_LOGGED'])) { + $http = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; + $host = $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] != '80' ? ':' . $_SERVER['SERVER_PORT'] : ''); + + $loginLink = sprintf('%s://%s/sys%s/%s/%s/login/login?u=/%s/oauth2/authorize', $http, $host, SYS_SYS, SYS_LANG, SYS_SKIN, SYS_SYS); + header('location: ' . $loginLink); + die; + } + + switch ($_SERVER['REQUEST_METHOD']) { + case 'GET': + require_once PATH_CORE . 'src/ProcessMaker/Services/OAuth2/PmPdo.php'; + + + list($host, $port) = strpos(DB_HOST, ':') !== false ? explode(':', DB_HOST) : array(DB_HOST, ''); + $port = empty($port) ? '' : ";port=$port"; + + $dsn = DB_ADAPTER.':host='.$host.';dbname='.DB_NAME.$port; + $username = DB_USER; + $password = DB_PASS; + + $this->scope = array( + 'view_processes' => 'View Processes', + 'edit_processes' => 'Edit Processes' + ); + + // $dsn is the Data Source Name for your database, for example "mysql:dbname=my_oauth2_db;host=localhost" + $storage = new ProcessMaker\Services\OAuth2\PmPdo(array('dsn' => $dsn, 'username' => $username, 'password' => $password)); + + $clientId = $_GET['client_id']; + $requestedScope = isset($_GET['scope']) ? $_GET['scope'] : ''; + $requestedScope = empty($requestedScope) ? array() : explode(' ', $requestedScope); + + if (! empty($clientId)) { + $client = $storage->getClientDetails($clientId); + // throw error, client does not exist. + } + + //echo '
';print_r($client); echo '
'; + + $client = array('name' => $client['client_name'], 'desc' => $client['client_description']); + + //echo '
';print_r($_SESSION); echo '
'; die; + $user = array('name' => $_SESSION['USR_FULLNAME']); + + $this->setVar('user', $user); + $this->setVar('client', $client); + $this->setVar('postUri', '/' . SYS_SYS . '/oauth2/authorize?' . $_SERVER['QUERY_STRING']); + //$this->setVar('postUri', '/' . SYS_SYS . '/oauth2/authorize'); + //$this->setVar('query_string', $_SERVER['QUERY_STRING']); + $this->setView('oauth2/authorize'); + $this->render(); + break; + + case 'POST': + require_once PATH_CORE . 'src/ProcessMaker/Services/OAuth2/Server.php'; + + list($host, $port) = strpos(DB_HOST, ':') !== false ? explode(':', DB_HOST) : array(DB_HOST, ''); + $port = empty($port) ? '' : ";port=$port"; + + \ProcessMaker\Services\OAuth2\Server::setDatabaseSource(DB_USER, DB_PASS, DB_ADAPTER.":host=$host;dbname=".DB_NAME.$port); + \ProcessMaker\Services\OAuth2\Server::setPmClientId('x-pm-local-client'); + + $oauthServer = new \ProcessMaker\Services\OAuth2\Server(); + $userid = $_SESSION['USER_LOGGED']; + $authorize = array_key_exists('cancel', $_POST)? false: true; + + + $response = $oauthServer->postAuthorize($authorize, $userid, true); + + //$code = substr($response->getHttpHeader('Location'), strpos($response->getHttpHeader('Location'), 'code=')+5, 40); + + //echo 'session_id ' . session_id() . '
'; + //exit("SUCCESS! ==> Authorization Code: $code"); + + die($response->send()); + break; + } + } + + public function token() + { + + } +} \ No newline at end of file diff --git a/workflow/engine/methods/oauth2/grant.php b/workflow/engine/methods/oauth2/grant.php index bd720530b..1bb7ccab6 100644 --- a/workflow/engine/methods/oauth2/grant.php +++ b/workflow/engine/methods/oauth2/grant.php @@ -9,7 +9,7 @@ if (! empty($_GET['error'])) { $http = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; $host = $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] != '80' ? ':' . $_SERVER['SERVER_PORT'] : ''); -$endpoint = sprintf('%s://%s/api/1.0/%s/token', $http, $host, SYS_SYS); +$endpoint = sprintf('%s://%s/%s/oauth2/token', $http, $host, SYS_SYS); $code = empty($_GET['code']) ? 'NN' : $_GET['code']; $clientId = 'x-pm-local-client'; diff --git a/workflow/engine/src/ProcessMaker/Services/OAuth2/PmPdo.php b/workflow/engine/src/ProcessMaker/Services/OAuth2/PmPdo.php index e1d0099de..2f84112bc 100644 --- a/workflow/engine/src/ProcessMaker/Services/OAuth2/PmPdo.php +++ b/workflow/engine/src/ProcessMaker/Services/OAuth2/PmPdo.php @@ -45,7 +45,7 @@ class PmPdo implements \OAuth2\Storage\AuthorizationCodeInterface, 'access_token_table' => 'OAUTH_ACCESS_TOKENS', 'refresh_token_table' => 'OAUTH_REFRESH_TOKENS', 'code_table' => 'OAUTH_AUTHORIZATION_CODES', - 'user_table' => 'OAUTH_USERS', + 'user_table' => 'USERS', 'jwt_table' => 'OAUTH_JWT', ), $config); } @@ -193,12 +193,12 @@ class PmPdo implements \OAuth2\Storage\AuthorizationCodeInterface, // plaintext passwords are bad! Override this for your application protected function checkPassword($user, $password) { - return $user['password'] == sha1($password); + return $user['USR_PASSWORD'] == md5($password); } public function getUser($username) { - $stmt = $this->db->prepare($sql = sprintf('SELECT * FROM %s WHERE USERNAME=:username', $this->config['user_table'])); + $stmt = $this->db->prepare($sql = sprintf('SELECT * FROM %s WHERE USR_USERNAME=:username', $this->config['user_table'])); $stmt->execute(array('username' => $username)); if (!$userInfo = $stmt->fetch()) { diff --git a/workflow/engine/src/ProcessMaker/Services/OAuth2/Server.php b/workflow/engine/src/ProcessMaker/Services/OAuth2/Server.php index d555944dd..385ea16ef 100644 --- a/workflow/engine/src/ProcessMaker/Services/OAuth2/Server.php +++ b/workflow/engine/src/ProcessMaker/Services/OAuth2/Server.php @@ -2,6 +2,7 @@ namespace ProcessMaker\Services\OAuth2; use Luracast\Restler\iAuthenticate; +use Luracast\Restler\RestException; /** @@ -28,6 +29,7 @@ class Server implements iAuthenticate protected static $dbUser; protected static $dbPassword; protected static $dsn; + protected static $workspace; public function __construct() { @@ -35,7 +37,8 @@ class Server implements iAuthenticate $this->scope = array( 'view_processes' => 'View Processes', - 'edit_processes' => 'Edit Processes' + 'edit_processes' => 'Edit Processes', + '*' => '*' ); // $dsn is the Data Source Name for your database, for exmaple "mysql:dbname=my_oauth2_db;host=localhost" @@ -44,7 +47,7 @@ class Server implements iAuthenticate $this->storage = new PmPdo($config); // Pass a storage object or array of storage objects to the OAuth2 server class - $this->server = new \OAuth2\Server($this->storage); + $this->server = new \OAuth2\Server($this->storage, array('allow_implicit' => true)); $this->server->setConfig('enforce_state', false); @@ -52,14 +55,21 @@ class Server implements iAuthenticate $this->server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->storage)); // Add the "Client Credentials" grant type (it is the simplest of the grant types) - //$this->server->addGrantType(new \OAuth2\GrantType\ClientCredentials($this->storage)); + $this->server->addGrantType(new \OAuth2\GrantType\ClientCredentials($this->storage)); // Add the "Refresh token" grant type $this->server->addGrantType(new \OAuth2\GrantType\RefreshToken($this->storage)); - $scope = new \OAuth2\Scope(array( - 'supported_scopes' => array_keys($this->scope) - )); + // create some users in memory + //$users = array('bshaffer' => array('password' => 'brent123', 'first_name' => 'Brent', 'last_name' => 'Shaffer')); + // create a storage object + //$storage = new \OAuth2\Storage\Memory(array('user_credentials' => $users)); + // create the grant type + $grantType = new \OAuth2\GrantType\UserCredentials($this->storage); + // add the grant type to your OAuth server + $this->server->addGrantType($grantType); + + $scope = new \OAuth2\Scope(array('supported_scopes' => array_keys($this->scope))); $this->server->setScopeUtil($scope); } @@ -76,6 +86,28 @@ class Server implements iAuthenticate } } + public static function setWorkspace($workspace) + { + self::$workspace = $workspace; + } + + public function index() + { + $http = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; + $host = $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] != '80' ? ':' . $_SERVER['SERVER_PORT'] : ''); + $host = $http .'://'. $host; + + $applicationsLink = sprintf('%s/%s/oauth2/apps', $host, SYS_SYS); + $authorizationLink = sprintf('%s/%s/oauth2/authorize?response_type=code&client_id=[the-client-id]&scope=*', $host, SYS_SYS); + + $view = new \Maveriks\Pattern\Mvc\SmartyView(PATH_CORE . "templates/oauth2/index.html"); + $view->assign('host', $host); + $view->assign('workspace', self::$workspace); + + $view->render(); + } + + /** * @view oauth2/server/register.php * @format HtmlFormat @@ -91,25 +123,53 @@ class Server implements iAuthenticate * * User responds by accepting or denying * - * @view oauth2/server/authorize.php - * @format HtmlFormat */ public function authorize() { - $clientId = \OAuth2\Request::createFromGlobals()->query('client_id', ''); - $requestedScope = \OAuth2\Request::createFromGlobals()->query('scope', ''); - $requestedScope = empty($requestedScope) ? array() : explode(' ', $requestedScope); + session_start(); - if (! empty($clientId)) { - $clientDetails = $this->storage->getClientDetails(\OAuth2\Request::createFromGlobals()->query('client_id')); + if (! isset($_SESSION['USER_LOGGED'])) { + $http = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; + $host = $http . '://' . $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] != '80' ? ':' . $_SERVER['SERVER_PORT'] : ''); + $redirect = urlencode($host.'/'.self::$workspace.$_SERVER['REQUEST_URI']); + + $loginLink = sprintf('%s/sys%s/%s/%s/login/login?u=%s', $host, SYS_SYS, SYS_LANG, SYS_SKIN, $redirect); + header('location: ' . $loginLink); + die; } - return array( - 'client_details' => $clientDetails, - 'query_string' => $_SERVER['QUERY_STRING'], - 'supportedScope' => $this->scope, - 'requestedScope' => $requestedScope + $this->scope = array( + 'view_processes' => 'View Processes', + 'edit_processes' => 'Edit Processes' ); + + if (! array_key_exists('client_id', $_GET)) { + throw new RestException(400, "Invalid request. The 'client_id' parameter is missing!"); + } + if (! array_key_exists('response_type', $_GET)) { + throw new RestException(400, "Invalid request. The 'response_type' parameter is missing!"); + } + + $clientId = $_GET['client_id']; + $requestedScope = isset($_GET['scope']) ? $_GET['scope'] : '*'; + $requestedScope = empty($requestedScope) ? array() : explode(' ', $requestedScope); + $client = $this->storage->getClientDetails($clientId);; + + if (empty($client)) { + // throw error, client does not exist. + throw new RestException(400, "Error, unknown client. The client with id '".$clientId."' is not registered"); + } + + //echo '
';print_r($client); echo '
'; die; + $client = array('name' => $client['client_name'], 'desc' => $client['client_description']); + $user = array('name' => $_SESSION['USR_FULLNAME']); + + $view = new \Maveriks\Pattern\Mvc\SmartyView(PATH_CORE . "templates/oauth2/authorize.html"); + $view->assign('user', $user); + $view->assign('client', $client); + $view->assign('postUri', '/' . SYS_SYS . '/oauth2/authorize?' . $_SERVER['QUERY_STRING']); + $view->render(); + exit(); } /** @@ -120,15 +180,19 @@ class Server implements iAuthenticate * * On success authorization code is sent along * - * - * @param bool $authorize - * @param string $userId optional user id - * @param bool $returnResponse optional flag to specify if the function should return the Response object - * @return \OAuth2\ResponseInterface * @format JsonFormat,UploadFormat */ - public function postAuthorize($authorize = false, $userId = null, $returnResponse = false) + public function postAuthorize() { + session_start(); + + if (! isset($_SESSION['USER_LOGGED'])) { + throw new RestException(400, "Local Authentication Error, user session is not started."); + } + + $userId = $_SESSION['USER_LOGGED']; + $authorize = array_key_exists('cancel', $_REQUEST)? false: true; + $request = \OAuth2\Request::createFromGlobals(); $response = new \OAuth2\Response(); @@ -139,10 +203,6 @@ class Server implements iAuthenticate $userId ); - if ($returnResponse) { - return $response; - } - die($response->send()); } diff --git a/workflow/engine/templates/oauth2/authorize.html b/workflow/engine/templates/oauth2/authorize.html new file mode 100644 index 000000000..15a52f19c --- /dev/null +++ b/workflow/engine/templates/oauth2/authorize.html @@ -0,0 +1,52 @@ + + + + ProcessMaker Oauth2 Server + + + + + + + + + + + +
+ +
+ +
+ + +
+ +
Authorization Server
+
+
+

+

{$user.name},

+ The application {$client.name} is requesting access to your account. + +

{$client.client_name}

+ {$client.desc} +

+ +

Do you approve?

+
+
+ +
+
+
+ + +    + +
+
+
+
+ +
diff --git a/workflow/engine/templates/oauth2/index.html b/workflow/engine/templates/oauth2/index.html new file mode 100644 index 000000000..3c36f7a65 --- /dev/null +++ b/workflow/engine/templates/oauth2/index.html @@ -0,0 +1,210 @@ + + + + ProcessMaker Oauth2 Server + + + + + + + + + + +
+ + +
+
+ +
+

Authorization Code

+
+
+

Authorization Code

+ + +
+ +
+

+ The authorization code grant type is used to obtain both access tokens and refresh tokens and is optimized for + confidential clients.
+ +

    +
  1. + Register the application +
    +  GET {$host}/{$workspace}/oauth2/apps
    +
  2. +
  3. + Request Authorization +
    +  GET {$host}/{$workspace}/oauth2/authorize?response_type=code&client_id={literal}{the-client-id}{/literal}&scope=*
    +
  4. +
  5. + Exchange Authorization code by an Access Token. + +
    +  POST {$host}/{$workspace}/oauth2/token
    +  Authorization: Basic eC1wbS1sb2NhbC1jbGllbnQ6MTc5YWQ0NWM2Y2UyY2I5N2NmMTAyOWUyMTIwNDZlODE=
    +
    +  grant_type=code&
    +  code={literal}{the-authorization-code}{/literal}
    +
    +
  6. +
+ + +

{$auth_code_link}

+

+
+
+ +

Implicit Grant

+
+
+

Implicit Grant

+ + +
+ +
+

+ The implicit grant type is used to obtain access tokens (it does not support the issuance of refresh tokens) and + is optimized for public clients known to operate a particular redirection URI. + +

GET {$host}/{$workspace}/oauth2/authorize?response_type=token&client_id={literal}{the-client-id}{/literal}&scope=*
+
+
+ +

Resource Owner Password Credentials

+
+
+

Resource Owner Password Credentials

+ + +
+ +
+

+ The resource owner password credentials grant type is suitable in cases where the resource owner has a trust + relationship with the client, such as the device operating system or a highly privileged application.

+ +

+  POST {$host}/{$workspace}/oauth2/token 
+  Content-Type: application/x-www-form-urlencoded
+  Authorization: Basic eC1wbS1sb2NhbC1jbGllbnQ6MTc5YWQ0NWM2Y2UyY2I5N2NmMTAyOWUyMTIwNDZlODE=
+
+  grant_type=password&
+  username=bob&
+  password=secret&
+  scope=offline_access
+                
+

+ +
+
+ +

Client Credentials

+
+
+

Client Credentials

+ + +
+ +
+

+ The client can request an access token using only its client credentials (or other supported means of authentication) + when the client is requesting access to the protected resources under its control, or those of another resource + owner that have been previously arranged with the authorization server.

+ +

+  POST {$host}/{$workspace}/oauth/2/token 
+  Content-Type: application/x-www-form-urlencoded
+  Authorization: Basic eC1wbS1sb2NhbC1jbGllbnQ6MTc5YWQ0NWM2Y2UyY2I5N2NmMTAyOWUyMTIwNDZlODE=
+
+  grant_type=client_credentials
+            
+

+
+
+ +

Refresh Token

+
+
+

Refresh Token

+ + +
+ +
+

+ Refresh tokens are credentials used to obtain access tokens. Refresh + tokens are issued to the client by the authorization server and are + used to obtain a new access token when the current access token + becomes invalid or expires, or to obtain additional access tokens + with identical or narrower scope (access tokens may have a shorter + lifetime and fewer permissions than authorized by the resource + owner). Issuing a refresh token is optional at the discretion of the + authorization server. If the authorization server issues a refresh + token, it is included when issuing an access token.

+ +

+  POST {$host}/{$workspace}/oauth2/token 
+  Content-Type: application/x-www-form-urlencoded
+  Authorization: Basic eC1wbS1sb2NhbC1jbGllbnQ6MTc5YWQ0NWM2Y2UyY2I5N2NmMTAyOWUyMTIwNDZlODE=
+
+  grant_type=refresh_token
+  refresh_token={literal}{your-refresh-token}{/literal}
+            
+

+ + +
+
+
+ + +
+
+
+ + diff --git a/workflow/public_html/assets/css/base-min.css b/workflow/public_html/assets/css/base-min.css new file mode 100644 index 000000000..79012e7d7 --- /dev/null +++ b/workflow/public_html/assets/css/base-min.css @@ -0,0 +1,11 @@ +/*! +Pure v0.5.0 +Copyright 2014 Yahoo! Inc. All rights reserved. +Licensed under the BSD License. +https://github.com/yui/pure/blob/master/LICENSE.md +*/ +/*! +normalize.css v1.1.3 | MIT License | git.io/normalize +Copyright (c) Nicolas Gallagher and Jonathan Neal +*/ +/*! normalize.css v1.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block} \ No newline at end of file diff --git a/workflow/public_html/assets/css/dialog-modules.css b/workflow/public_html/assets/css/dialog-modules.css new file mode 100644 index 000000000..07d85c1bc --- /dev/null +++ b/workflow/public_html/assets/css/dialog-modules.css @@ -0,0 +1,197 @@ +/** + * Coloring h1 a bit off black, removing bold, and shadowing + * a touch. + */ +h1 { + color: #505050; + text-shadow: 2px 1px 3px rgba(200, 200, 200, 0.43); + font-weight: normal; +} + +/** + * Using some off white for the background color and + * padding the top. + */ +body +{ + background: whitesmoke; + padding-top: 60px; +} + +/** + * Make links smaller, + */ +a +{ + text-shadow: 2px 1px 3px rgba(200, 200, 200, 0.43); + padding-bottom: 5px; + padding-top: 10px; + font-size: 80%; + color: #6464ff; + text-decoration: none; +} + +pre +{ + margin-top: 0px; + margin-bottom: 0px; +} + +.title { + width: 500px; + margin-left: auto; + margin-right: auto; +} + + +/** + * Upper box that contains the title Authorization Server, the UserName, and Password fields + */ +.upper-box { + + width: 350px; + + border-top: 1px solid; + border-left: 1px solid; + border-right: 1px solid; + + border-color: lightgrey; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + + padding-top: 5px; + padding-left: 20px; + padding-bottom: 10px; + + box-shadow: 1px 1px 5px #e7e7e7; + + margin-left: auto; + margin-right: auto; + + /** + * Gradient calculated from gradient calculator of + * http://gradients.glrzad.com/ + */ + background-image: linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -o-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -moz-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -webkit-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -ms-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.21, rgb(249,250,252)), + color-stop(0.67, rgb(245,247,250)), + color-stop(0.94, rgb(247,249,255)) + ); + +} + +/** + * Bottom box that contains the "Sign in" button + */ +.bottom-box { + border:1px solid; + border-color: lightgrey; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + + width: 350px; + padding-top: 15px; + padding-left: 20px; + padding-bottom: 15px; + box-shadow: 1px 3px 1px #e7e7e7; + margin-left: auto; + margin-right: auto; + + /** + * Gradient calculated from gradient calculator of + * http://gradients.glrzad.com/ + */ + background-image: linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -o-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -moz-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -webkit-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -ms-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.21, rgb(242,245,250)), + color-stop(0.67, rgb(242,245,250)), + color-stop(0.94, rgb(242,245,255)) + ); +} + +/** + * Okay, you caught me. It's a hack to make this look centered. + * + * TODO Fix this, can't figure out how to get this to center correctly. + * It's currently anchored to the fieldset and that's causing issues. + */ +.main-text { + padding-left: 100px; + padding-top: 20px; + font-size: 180%; + color: #505050; + text-shadow: 2px 1px 3px rgba(200, 200, 200, 0.43); + font-weight: normal; +} + +/** + * Okay, you caught me. It's a hack to make this look centered. + * + * TODO Fix this, can't figure out how to get this to center correctly. + * It's currently anchored to the fieldset and that's causing issues. + */ +.subtext { + padding-left: 80px; + font-size: 110%; + color: #969696; + text-shadow: 2px 1px 3px rgba(230, 230, 230, 0.42); + font-weight: normal; +} + +/** + * The username and password labels + */ +.labels { + color: #505050; + text-shadow: 2px 1px 3px rgba(200, 200, 200, 0.43); + padding-top: 10px; +} + +/** + * Input fields so I can make it slightly larger than the default, + * and I can also pad anything trying to touch it on the right. + */ +.input-fields { + padding-right: 20px; + font-size: 130%; +} + +/** + * This makes all the placeholder text italic. Nice trick I + * picked up from stack overflow: + * http://stackoverflow.com/questions/16291925/how-to-make-value-text-in-form-be-italic + */ +::-webkit-input-placeholder { font-style: italic; } +::-moz-placeholder { font-style: italic; } +:-ms-input-placeholder { font-style: italic; } + +/** + * Very specific to the sign on button. + */ +.accept-cancel-buttons { + padding-left: 20px; + padding-right: 20px; + text-align: right; +} + +.from-text { + padding-top: 10px; + text-align: center; +} diff --git a/workflow/public_html/assets/css/grids-responsive-min.css b/workflow/public_html/assets/css/grids-responsive-min.css new file mode 100644 index 000000000..7bcfd3280 --- /dev/null +++ b/workflow/public_html/assets/css/grids-responsive-min.css @@ -0,0 +1,7 @@ +/*! +Pure v0.5.0 +Copyright 2014 Yahoo! Inc. All rights reserved. +Licensed under the BSD License. +https://github.com/yui/pure/blob/master/LICENSE.md +*/ +@media screen and (min-width:35.5em){.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-1-2,.pure-u-sm-1-3,.pure-u-sm-2-3,.pure-u-sm-1-4,.pure-u-sm-3-4,.pure-u-sm-1-5,.pure-u-sm-2-5,.pure-u-sm-3-5,.pure-u-sm-4-5,.pure-u-sm-5-5,.pure-u-sm-1-6,.pure-u-sm-5-6,.pure-u-sm-1-8,.pure-u-sm-3-8,.pure-u-sm-5-8,.pure-u-sm-7-8,.pure-u-sm-1-12,.pure-u-sm-5-12,.pure-u-sm-7-12,.pure-u-sm-11-12,.pure-u-sm-1-24,.pure-u-sm-2-24,.pure-u-sm-3-24,.pure-u-sm-4-24,.pure-u-sm-5-24,.pure-u-sm-6-24,.pure-u-sm-7-24,.pure-u-sm-8-24,.pure-u-sm-9-24,.pure-u-sm-10-24,.pure-u-sm-11-24,.pure-u-sm-12-24,.pure-u-sm-13-24,.pure-u-sm-14-24,.pure-u-sm-15-24,.pure-u-sm-16-24,.pure-u-sm-17-24,.pure-u-sm-18-24,.pure-u-sm-19-24,.pure-u-sm-20-24,.pure-u-sm-21-24,.pure-u-sm-22-24,.pure-u-sm-23-24,.pure-u-sm-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-sm-1-24{width:4.1667%;*width:4.1357%}.pure-u-sm-1-12,.pure-u-sm-2-24{width:8.3333%;*width:8.3023%}.pure-u-sm-1-8,.pure-u-sm-3-24{width:12.5%;*width:12.469%}.pure-u-sm-1-6,.pure-u-sm-4-24{width:16.6667%;*width:16.6357%}.pure-u-sm-1-5{width:20%;*width:19.969%}.pure-u-sm-5-24{width:20.8333%;*width:20.8023%}.pure-u-sm-1-4,.pure-u-sm-6-24{width:25%;*width:24.969%}.pure-u-sm-7-24{width:29.1667%;*width:29.1357%}.pure-u-sm-1-3,.pure-u-sm-8-24{width:33.3333%;*width:33.3023%}.pure-u-sm-3-8,.pure-u-sm-9-24{width:37.5%;*width:37.469%}.pure-u-sm-2-5{width:40%;*width:39.969%}.pure-u-sm-5-12,.pure-u-sm-10-24{width:41.6667%;*width:41.6357%}.pure-u-sm-11-24{width:45.8333%;*width:45.8023%}.pure-u-sm-1-2,.pure-u-sm-12-24{width:50%;*width:49.969%}.pure-u-sm-13-24{width:54.1667%;*width:54.1357%}.pure-u-sm-7-12,.pure-u-sm-14-24{width:58.3333%;*width:58.3023%}.pure-u-sm-3-5{width:60%;*width:59.969%}.pure-u-sm-5-8,.pure-u-sm-15-24{width:62.5%;*width:62.469%}.pure-u-sm-2-3,.pure-u-sm-16-24{width:66.6667%;*width:66.6357%}.pure-u-sm-17-24{width:70.8333%;*width:70.8023%}.pure-u-sm-3-4,.pure-u-sm-18-24{width:75%;*width:74.969%}.pure-u-sm-19-24{width:79.1667%;*width:79.1357%}.pure-u-sm-4-5{width:80%;*width:79.969%}.pure-u-sm-5-6,.pure-u-sm-20-24{width:83.3333%;*width:83.3023%}.pure-u-sm-7-8,.pure-u-sm-21-24{width:87.5%;*width:87.469%}.pure-u-sm-11-12,.pure-u-sm-22-24{width:91.6667%;*width:91.6357%}.pure-u-sm-23-24{width:95.8333%;*width:95.8023%}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-5-5,.pure-u-sm-24-24{width:100%}}@media screen and (min-width:48em){.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-1-2,.pure-u-md-1-3,.pure-u-md-2-3,.pure-u-md-1-4,.pure-u-md-3-4,.pure-u-md-1-5,.pure-u-md-2-5,.pure-u-md-3-5,.pure-u-md-4-5,.pure-u-md-5-5,.pure-u-md-1-6,.pure-u-md-5-6,.pure-u-md-1-8,.pure-u-md-3-8,.pure-u-md-5-8,.pure-u-md-7-8,.pure-u-md-1-12,.pure-u-md-5-12,.pure-u-md-7-12,.pure-u-md-11-12,.pure-u-md-1-24,.pure-u-md-2-24,.pure-u-md-3-24,.pure-u-md-4-24,.pure-u-md-5-24,.pure-u-md-6-24,.pure-u-md-7-24,.pure-u-md-8-24,.pure-u-md-9-24,.pure-u-md-10-24,.pure-u-md-11-24,.pure-u-md-12-24,.pure-u-md-13-24,.pure-u-md-14-24,.pure-u-md-15-24,.pure-u-md-16-24,.pure-u-md-17-24,.pure-u-md-18-24,.pure-u-md-19-24,.pure-u-md-20-24,.pure-u-md-21-24,.pure-u-md-22-24,.pure-u-md-23-24,.pure-u-md-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-md-1-24{width:4.1667%;*width:4.1357%}.pure-u-md-1-12,.pure-u-md-2-24{width:8.3333%;*width:8.3023%}.pure-u-md-1-8,.pure-u-md-3-24{width:12.5%;*width:12.469%}.pure-u-md-1-6,.pure-u-md-4-24{width:16.6667%;*width:16.6357%}.pure-u-md-1-5{width:20%;*width:19.969%}.pure-u-md-5-24{width:20.8333%;*width:20.8023%}.pure-u-md-1-4,.pure-u-md-6-24{width:25%;*width:24.969%}.pure-u-md-7-24{width:29.1667%;*width:29.1357%}.pure-u-md-1-3,.pure-u-md-8-24{width:33.3333%;*width:33.3023%}.pure-u-md-3-8,.pure-u-md-9-24{width:37.5%;*width:37.469%}.pure-u-md-2-5{width:40%;*width:39.969%}.pure-u-md-5-12,.pure-u-md-10-24{width:41.6667%;*width:41.6357%}.pure-u-md-11-24{width:45.8333%;*width:45.8023%}.pure-u-md-1-2,.pure-u-md-12-24{width:50%;*width:49.969%}.pure-u-md-13-24{width:54.1667%;*width:54.1357%}.pure-u-md-7-12,.pure-u-md-14-24{width:58.3333%;*width:58.3023%}.pure-u-md-3-5{width:60%;*width:59.969%}.pure-u-md-5-8,.pure-u-md-15-24{width:62.5%;*width:62.469%}.pure-u-md-2-3,.pure-u-md-16-24{width:66.6667%;*width:66.6357%}.pure-u-md-17-24{width:70.8333%;*width:70.8023%}.pure-u-md-3-4,.pure-u-md-18-24{width:75%;*width:74.969%}.pure-u-md-19-24{width:79.1667%;*width:79.1357%}.pure-u-md-4-5{width:80%;*width:79.969%}.pure-u-md-5-6,.pure-u-md-20-24{width:83.3333%;*width:83.3023%}.pure-u-md-7-8,.pure-u-md-21-24{width:87.5%;*width:87.469%}.pure-u-md-11-12,.pure-u-md-22-24{width:91.6667%;*width:91.6357%}.pure-u-md-23-24{width:95.8333%;*width:95.8023%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-5-5,.pure-u-md-24-24{width:100%}}@media screen and (min-width:64em){.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-1-2,.pure-u-lg-1-3,.pure-u-lg-2-3,.pure-u-lg-1-4,.pure-u-lg-3-4,.pure-u-lg-1-5,.pure-u-lg-2-5,.pure-u-lg-3-5,.pure-u-lg-4-5,.pure-u-lg-5-5,.pure-u-lg-1-6,.pure-u-lg-5-6,.pure-u-lg-1-8,.pure-u-lg-3-8,.pure-u-lg-5-8,.pure-u-lg-7-8,.pure-u-lg-1-12,.pure-u-lg-5-12,.pure-u-lg-7-12,.pure-u-lg-11-12,.pure-u-lg-1-24,.pure-u-lg-2-24,.pure-u-lg-3-24,.pure-u-lg-4-24,.pure-u-lg-5-24,.pure-u-lg-6-24,.pure-u-lg-7-24,.pure-u-lg-8-24,.pure-u-lg-9-24,.pure-u-lg-10-24,.pure-u-lg-11-24,.pure-u-lg-12-24,.pure-u-lg-13-24,.pure-u-lg-14-24,.pure-u-lg-15-24,.pure-u-lg-16-24,.pure-u-lg-17-24,.pure-u-lg-18-24,.pure-u-lg-19-24,.pure-u-lg-20-24,.pure-u-lg-21-24,.pure-u-lg-22-24,.pure-u-lg-23-24,.pure-u-lg-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-lg-1-24{width:4.1667%;*width:4.1357%}.pure-u-lg-1-12,.pure-u-lg-2-24{width:8.3333%;*width:8.3023%}.pure-u-lg-1-8,.pure-u-lg-3-24{width:12.5%;*width:12.469%}.pure-u-lg-1-6,.pure-u-lg-4-24{width:16.6667%;*width:16.6357%}.pure-u-lg-1-5{width:20%;*width:19.969%}.pure-u-lg-5-24{width:20.8333%;*width:20.8023%}.pure-u-lg-1-4,.pure-u-lg-6-24{width:25%;*width:24.969%}.pure-u-lg-7-24{width:29.1667%;*width:29.1357%}.pure-u-lg-1-3,.pure-u-lg-8-24{width:33.3333%;*width:33.3023%}.pure-u-lg-3-8,.pure-u-lg-9-24{width:37.5%;*width:37.469%}.pure-u-lg-2-5{width:40%;*width:39.969%}.pure-u-lg-5-12,.pure-u-lg-10-24{width:41.6667%;*width:41.6357%}.pure-u-lg-11-24{width:45.8333%;*width:45.8023%}.pure-u-lg-1-2,.pure-u-lg-12-24{width:50%;*width:49.969%}.pure-u-lg-13-24{width:54.1667%;*width:54.1357%}.pure-u-lg-7-12,.pure-u-lg-14-24{width:58.3333%;*width:58.3023%}.pure-u-lg-3-5{width:60%;*width:59.969%}.pure-u-lg-5-8,.pure-u-lg-15-24{width:62.5%;*width:62.469%}.pure-u-lg-2-3,.pure-u-lg-16-24{width:66.6667%;*width:66.6357%}.pure-u-lg-17-24{width:70.8333%;*width:70.8023%}.pure-u-lg-3-4,.pure-u-lg-18-24{width:75%;*width:74.969%}.pure-u-lg-19-24{width:79.1667%;*width:79.1357%}.pure-u-lg-4-5{width:80%;*width:79.969%}.pure-u-lg-5-6,.pure-u-lg-20-24{width:83.3333%;*width:83.3023%}.pure-u-lg-7-8,.pure-u-lg-21-24{width:87.5%;*width:87.469%}.pure-u-lg-11-12,.pure-u-lg-22-24{width:91.6667%;*width:91.6357%}.pure-u-lg-23-24{width:95.8333%;*width:95.8023%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-5-5,.pure-u-lg-24-24{width:100%}}@media screen and (min-width:80em){.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-1-2,.pure-u-xl-1-3,.pure-u-xl-2-3,.pure-u-xl-1-4,.pure-u-xl-3-4,.pure-u-xl-1-5,.pure-u-xl-2-5,.pure-u-xl-3-5,.pure-u-xl-4-5,.pure-u-xl-5-5,.pure-u-xl-1-6,.pure-u-xl-5-6,.pure-u-xl-1-8,.pure-u-xl-3-8,.pure-u-xl-5-8,.pure-u-xl-7-8,.pure-u-xl-1-12,.pure-u-xl-5-12,.pure-u-xl-7-12,.pure-u-xl-11-12,.pure-u-xl-1-24,.pure-u-xl-2-24,.pure-u-xl-3-24,.pure-u-xl-4-24,.pure-u-xl-5-24,.pure-u-xl-6-24,.pure-u-xl-7-24,.pure-u-xl-8-24,.pure-u-xl-9-24,.pure-u-xl-10-24,.pure-u-xl-11-24,.pure-u-xl-12-24,.pure-u-xl-13-24,.pure-u-xl-14-24,.pure-u-xl-15-24,.pure-u-xl-16-24,.pure-u-xl-17-24,.pure-u-xl-18-24,.pure-u-xl-19-24,.pure-u-xl-20-24,.pure-u-xl-21-24,.pure-u-xl-22-24,.pure-u-xl-23-24,.pure-u-xl-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-xl-1-24{width:4.1667%;*width:4.1357%}.pure-u-xl-1-12,.pure-u-xl-2-24{width:8.3333%;*width:8.3023%}.pure-u-xl-1-8,.pure-u-xl-3-24{width:12.5%;*width:12.469%}.pure-u-xl-1-6,.pure-u-xl-4-24{width:16.6667%;*width:16.6357%}.pure-u-xl-1-5{width:20%;*width:19.969%}.pure-u-xl-5-24{width:20.8333%;*width:20.8023%}.pure-u-xl-1-4,.pure-u-xl-6-24{width:25%;*width:24.969%}.pure-u-xl-7-24{width:29.1667%;*width:29.1357%}.pure-u-xl-1-3,.pure-u-xl-8-24{width:33.3333%;*width:33.3023%}.pure-u-xl-3-8,.pure-u-xl-9-24{width:37.5%;*width:37.469%}.pure-u-xl-2-5{width:40%;*width:39.969%}.pure-u-xl-5-12,.pure-u-xl-10-24{width:41.6667%;*width:41.6357%}.pure-u-xl-11-24{width:45.8333%;*width:45.8023%}.pure-u-xl-1-2,.pure-u-xl-12-24{width:50%;*width:49.969%}.pure-u-xl-13-24{width:54.1667%;*width:54.1357%}.pure-u-xl-7-12,.pure-u-xl-14-24{width:58.3333%;*width:58.3023%}.pure-u-xl-3-5{width:60%;*width:59.969%}.pure-u-xl-5-8,.pure-u-xl-15-24{width:62.5%;*width:62.469%}.pure-u-xl-2-3,.pure-u-xl-16-24{width:66.6667%;*width:66.6357%}.pure-u-xl-17-24{width:70.8333%;*width:70.8023%}.pure-u-xl-3-4,.pure-u-xl-18-24{width:75%;*width:74.969%}.pure-u-xl-19-24{width:79.1667%;*width:79.1357%}.pure-u-xl-4-5{width:80%;*width:79.969%}.pure-u-xl-5-6,.pure-u-xl-20-24{width:83.3333%;*width:83.3023%}.pure-u-xl-7-8,.pure-u-xl-21-24{width:87.5%;*width:87.469%}.pure-u-xl-11-12,.pure-u-xl-22-24{width:91.6667%;*width:91.6357%}.pure-u-xl-23-24{width:95.8333%;*width:95.8023%}.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-5-5,.pure-u-xl-24-24{width:100%}} \ No newline at end of file diff --git a/workflow/public_html/assets/css/oauth2.css b/workflow/public_html/assets/css/oauth2.css new file mode 100644 index 000000000..5d65ed599 --- /dev/null +++ b/workflow/public_html/assets/css/oauth2.css @@ -0,0 +1,368 @@ +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +a { + text-decoration: none; + color: rgb(61, 146, 201); +} +a:hover, +a:focus { + text-decoration: underline; +} + +h3 { + font-weight: 100; +} + +/* LAYOUT CSS */ +.pure-img-responsive { + max-width: 100%; + height: auto; +} + +#layout { + padding: 0; +} + +.header { + text-align: center; + top: auto; + margin: 3em auto; +} + +.sidebar { + background: rgb(61, 79, 93); + color: #fff; +} + +.brand-title, +.brand-tagline { + margin: 0; +} +.brand-title { + text-transform: uppercase; +} +.brand-tagline { + font-weight: 300; + color: rgb(176, 202, 219); +} + +.nav-list { + margin: 0; + padding: 0; + list-style: none; +} +.nav-item { + display: inline-block; + *display: inline; + zoom: 1; +} +.nav-item a { + background: transparent; + border: 2px solid rgb(176, 202, 219); + color: #fff; + margin-top: 1em; + letter-spacing: 0.05em; + text-transform: uppercase; + font-size: 85%; +} +.nav-item a:hover, +.nav-item a:focus { + border: 2px solid rgb(61, 146, 201); + text-decoration: none; +} + +.content-subhead { + text-transform: uppercase; + color: #aaa; + border-bottom: 1px solid #eee; + padding: 0.4em 0; + font-size: 80%; + font-weight: 500; + letter-spacing: 0.1em; +} + +.content { + padding: 2em 1em 0; +} + +.post { + padding-bottom: 2em; +} +.post-title { + font-size: 2em; + color: #222; + margin-bottom: 0.2em; +} +.post-avatar { + border-radius: 50px; + float: right; + margin-left: 1em; +} +.post-description { + font-family: Georgia, "Cambria", serif; + color: #444; + line-height: 1.8em; +} +.post-meta { + color: #999; + font-size: 90%; + margin: 0; +} + +.post-category { + margin: 0 0.1em; + padding: 0.3em 1em; + color: #fff; + background: #999; + font-size: 80%; +} +.post-category-design { + background: #5aba59; +} +.post-category-pure { + background: #4d85d1; +} +.post-category-yui { + background: #8156a7; +} +.post-category-js { + background: #df2d4f; +} + +.post-images { + margin: 1em 0; +} +.post-image-meta { + margin-top: -3.5em; + margin-left: 1em; + color: #fff; + text-shadow: 0 1px 1px #333; +} + +.footer { + text-align: center; + padding: 1em 0; +} +.footer a { + color: #ccc; + font-size: 80%; +} +.footer .pure-menu a:hover, +.footer .pure-menu a:focus { + background: none; +} + +@media (min-width: 48em) { + .content { + padding: 2em 3em 0; + margin-left: 25%; + } + + .header { + margin: 80% 2em 0; + text-align: right; + } + + .sidebar { + position: fixed; + top: 0; + bottom: 0; + } +} + +pre { + font-size: 14px; +} + +/** + * Coloring h1 a bit off black, removing bold, and shadowing + * a touch. + */ +h1 { + color: #505050; + text-shadow: 2px 1px 3px rgba(200, 200, 200, 0.43); + font-weight: normal; +} + +/** + * Using some off white for the background color and + * padding the top. + */ +body +{ + background: whitesmoke; + padding-top: 60px; +} + +/** + * Make links smaller, + */ + +pre +{ + margin-top: 0px; + margin-bottom: 0px; +} + +.title { + width: 500px; + margin-left: auto; + margin-right: auto; +} + + +/** + * Upper box that contains the title Authorization Server, the UserName, and Password fields + */ +.upper-box { + + width: 350px; + + border-top: 1px solid; + border-left: 1px solid; + border-right: 1px solid; + + border-color: lightgrey; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + + padding-top: 5px; + padding-left: 20px; + padding-bottom: 10px; + + box-shadow: 1px 1px 5px #e7e7e7; + + margin-left: auto; + margin-right: auto; + + /** + * Gradient calculated from gradient calculator of + * http://gradients.glrzad.com/ + */ + background-image: linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -o-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -moz-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -webkit-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -ms-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.21, rgb(249,250,252)), + color-stop(0.67, rgb(245,247,250)), + color-stop(0.94, rgb(247,249,255)) + ); + +} + +/** + * Bottom box that contains the "Sign in" button + */ +.bottom-box { + border:1px solid; + border-color: lightgrey; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + + width: 350px; + padding-top: 15px; + padding-left: 20px; + padding-bottom: 15px; + box-shadow: 1px 3px 1px #e7e7e7; + margin-left: auto; + margin-right: auto; + + /** + * Gradient calculated from gradient calculator of + * http://gradients.glrzad.com/ + */ + background-image: linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -o-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -moz-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -webkit-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -ms-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.21, rgb(242,245,250)), + color-stop(0.67, rgb(242,245,250)), + color-stop(0.94, rgb(242,245,255)) + ); +} + +/** + * Okay, you caught me. It's a hack to make this look centered. + * + * TODO Fix this, can't figure out how to get this to center correctly. + * It's currently anchored to the fieldset and that's causing issues. + */ +.main-text { + padding-left: 100px; + padding-top: 20px; + font-size: 180%; + color: #505050; + text-shadow: 2px 1px 3px rgba(200, 200, 200, 0.43); + font-weight: normal; +} + +/** + * Okay, you caught me. It's a hack to make this look centered. + * + * TODO Fix this, can't figure out how to get this to center correctly. + * It's currently anchored to the fieldset and that's causing issues. + */ +.subtext { + padding-left: 80px; + font-size: 110%; + color: #969696; + text-shadow: 2px 1px 3px rgba(230, 230, 230, 0.42); + font-weight: normal; +} + +/** + * The username and password labels + */ +.labels { + color: #505050; + text-shadow: 2px 1px 3px rgba(200, 200, 200, 0.43); + padding-top: 10px; +} + +/** + * Input fields so I can make it slightly larger than the default, + * and I can also pad anything trying to touch it on the right. + */ +.input-fields { + padding-right: 20px; + font-size: 130%; +} + +/** + * This makes all the placeholder text italic. Nice trick I + * picked up from stack overflow: + * http://stackoverflow.com/questions/16291925/how-to-make-value-text-in-form-be-italic + */ +::-webkit-input-placeholder { font-style: italic; } +::-moz-placeholder { font-style: italic; } +:-ms-input-placeholder { font-style: italic; } + +/** + * Very specific to the sign on button. + */ +.accept-cancel-buttons { + padding-left: 20px; + padding-right: 20px; + text-align: right; +} + +.from-text { + padding-top: 10px; + text-align: center; +} diff --git a/workflow/public_html/assets/css/pure-min.css b/workflow/public_html/assets/css/pure-min.css new file mode 100644 index 000000000..39212bf07 --- /dev/null +++ b/workflow/public_html/assets/css/pure-min.css @@ -0,0 +1,11 @@ +/*! +Pure v0.3.0 +Copyright 2013 Yahoo! Inc. All rights reserved. +Licensed under the BSD License. +https://github.com/yui/pure/blob/master/LICENSE.md +*/ +/*! +normalize.css v1.1.2 | MIT License | git.io/normalize +Copyright (c) Nicolas Gallagher and Jonathan Neal +*/ +/*! normalize.css v1.1.2 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}.pure-button{display:inline-block;*display:inline;zoom:1;line-height:normal;white-space:nowrap;vertical-align:baseline;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button{font-size:100%;*font-size:90%;*overflow:visible;padding:.5em 1.5em;color:#444;color:rgba(0,0,0,.8);*color:#444;border:1px solid #999;border:0 rgba(0,0,0,0);background-color:#E6E6E6;text-decoration:none;border-radius:2px;-webkit-transition:.1s linear -webkit-box-shadow;-moz-transition:.1s linear -moz-box-shadow;-ms-transition:.1s linear box-shadow;-o-transition:.1s linear box-shadow;transition:.1s linear box-shadow}.pure-button-hover,.pure-button:hover,.pure-button:focus{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#1a000000', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:-webkit-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:-moz-linear-gradient(top,rgba(0,0,0,.05) 0,rgba(0,0,0,.1));background-image:-ms-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:-o-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset}.pure-button[disabled],.pure-button-disabled,.pure-button-disabled:hover,.pure-button-disabled:focus,.pure-button-disabled:active{border:0;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:alpha(opacity=40);-khtml-opacity:.4;-moz-opacity:.4;opacity:.4;cursor:not-allowed;box-shadow:none}.pure-button-hidden{display:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;font-size:.8em;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-transition:.3s linear border;-moz-transition:.3s linear border;-ms-transition:.3s linear border;-o-transition:.3s linear border;transition:.3s linear border;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input[type=text]:focus,.pure-form input[type=password]:focus,.pure-form input[type=email]:focus,.pure-form input[type=url]:focus,.pure-form input[type=date]:focus,.pure-form input[type=month]:focus,.pure-form input[type=time]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=week]:focus,.pure-form input[type=number]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=color]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;outline:thin dotted \9;border-color:#129FEA}.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus,.pure-form input[type=checkbox]:focus{outline:thin dotted #333;outline:1px auto #129FEA}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=text][disabled],.pure-form input[type=password][disabled],.pure-form input[type=email][disabled],.pure-form input[type=url][disabled],.pure-form input[type=date][disabled],.pure-form input[type=month][disabled],.pure-form input[type=time][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=week][disabled],.pure-form input[type=number][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=color][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form textarea:focus:invalid,.pure-form select:focus:invalid{color:#b94a48;border:1px solid #ee5f5b}.pure-form input:focus:invalid:focus,.pure-form textarea:focus:invalid:focus,.pure-form select:focus:invalid:focus{border-color:#e9322d}.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus,.pure-form input[type=checkbox]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em;font-size:90%}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;font-size:125%;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=text],.pure-form-stacked input[type=password],.pure-form-stacked input[type=email],.pure-form-stacked input[type=url],.pure-form-stacked input[type=date],.pure-form-stacked input[type=month],.pure-form-stacked input[type=time],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=week],.pure-form-stacked input[type=number],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=color],.pure-form-stacked select,.pure-form-stacked label,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned textarea,.pure-form-aligned select,.pure-form-aligned .pure-help-inline,.pure-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 10em}.pure-form input.pure-input-rounded,.pure-form .pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input{display:block;padding:10px;margin:0;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus{z-index:2}.pure-form .pure-group input:first-child{top:1px;border-radius:4px 4px 0 0}.pure-form .pure-group input:last-child{top:-2px;border-radius:0 0 4px 4px}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form .pure-help-inline,.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:90%}.pure-form-message{display:block;color:#666;font-size:90%}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form label{margin-bottom:.3em;display:block}.pure-group input[type=text],.pure-group input[type=password],.pure-group input[type=email],.pure-group input[type=url],.pure-group input[type=date],.pure-group input[type=month],.pure-group input[type=time],.pure-group input[type=datetime],.pure-group input[type=datetime-local],.pure-group input[type=week],.pure-group input[type=number],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=color]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0}.pure-form .pure-help-inline,.pure-form-message-inline,.pure-form-message{display:block;font-size:80%;padding:.2em 0 .8em}}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-flex;-webkit-flex-flow:row wrap;display:-ms-flexbox;-ms-flex-flow:row wrap}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class *="pure-u"]{font-family:sans-serif}.pure-u-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-5-24,.pure-u-7-24,.pure-u-11-24,.pure-u-13-24,.pure-u-17-24,.pure-u-19-24,.pure-u-23-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1{width:100%}.pure-u-1-2{width:50%;*width:49.969%}.pure-u-1-3{width:33.3333%;*width:33.3023%}.pure-u-2-3{width:66.6667%;*width:66.6357%}.pure-u-1-4{width:25%;*width:24.969%}.pure-u-3-4{width:75%;*width:74.969%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-1-6{width:16.6667%;*width:16.6357%}.pure-u-5-6{width:83.3333%;*width:83.3023%}.pure-u-1-8{width:12.5%;*width:12.469%}.pure-u-3-8{width:37.5%;*width:37.469%}.pure-u-5-8{width:62.5%;*width:62.469%}.pure-u-7-8{width:87.5%;*width:87.469%}.pure-u-1-12{width:8.3333%;*width:8.3023%}.pure-u-5-12{width:41.6667%;*width:41.6357%}.pure-u-7-12{width:58.3333%;*width:58.3023%}.pure-u-11-12{width:91.6667%;*width:91.6357%}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-g-r{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-flex;-webkit-flex-flow:row wrap;display:-ms-flexbox;-ms-flex-flow:row wrap}.opera-only :-o-prefocus,.pure-g-r{word-spacing:-.43em}.pure-g-r [class *="pure-u"]{font-family:sans-serif}.pure-g-r img{max-width:100%;height:auto}@media (min-width:980px){.pure-visible-phone{display:none}.pure-visible-tablet{display:none}.pure-hidden-desktop{display:none}}@media (max-width:480px){.pure-g-r>.pure-u,.pure-g-r>[class *="pure-u-"]{width:100%}}@media (max-width:767px){.pure-g-r>.pure-u,.pure-g-r>[class *="pure-u-"]{width:100%}.pure-hidden-phone{display:none}.pure-visible-desktop{display:none}}@media (min-width:768px) and (max-width:979px){.pure-hidden-tablet{display:none}.pure-visible-desktop{display:none}}.pure-menu ul{position:absolute;visibility:hidden}.pure-menu.pure-menu-open{visibility:visible;z-index:2;width:100%}.pure-menu ul{left:-10000px;list-style:none;margin:0;padding:0;top:-10000px;z-index:1}.pure-menu>ul{position:relative}.pure-menu-open>ul{left:0;top:0;visibility:visible}.pure-menu-open>ul:focus{outline:0}.pure-menu li{position:relative}.pure-menu a,.pure-menu .pure-menu-heading{display:block;color:inherit;line-height:1.5em;padding:5px 20px;text-decoration:none;white-space:nowrap}.pure-menu.pure-menu-horizontal>.pure-menu-heading{display:inline-block;*display:inline;zoom:1;margin:0;vertical-align:middle}.pure-menu.pure-menu-horizontal>ul{display:inline-block;*display:inline;zoom:1;vertical-align:middle;height:2.4em}.pure-menu li a{padding:5px 20px}.pure-menu-can-have-children>.pure-menu-label:after{content:'\25B8';float:right;font-family:'Lucida Grande','Lucida Sans Unicode','DejaVu Sans',sans-serif;margin-right:-20px;margin-top:-1px}.pure-menu-can-have-children>.pure-menu-label{padding-right:30px}.pure-menu-separator{background-color:#dfdfdf;display:block;height:1px;font-size:0;margin:7px 2px;overflow:hidden}.pure-menu-hidden{display:none}.pure-menu-fixed{position:fixed;top:0;left:0;width:100%}.pure-menu-horizontal li{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-horizontal li li{display:block}.pure-menu-horizontal>.pure-menu-children>.pure-menu-can-have-children>.pure-menu-label:after{content:"\25BE"}.pure-menu-horizontal>.pure-menu-children>.pure-menu-can-have-children>.pure-menu-label{padding-right:30px}.pure-menu-horizontal li.pure-menu-separator{height:50%;width:1px;margin:0 7px}.pure-menu-horizontal li li.pure-menu-separator{height:1px;width:auto;margin:7px 2px}.pure-menu.pure-menu-open,.pure-menu.pure-menu-horizontal li .pure-menu-children{background:#fff;border:1px solid #b7b7b7}.pure-menu.pure-menu-horizontal,.pure-menu.pure-menu-horizontal .pure-menu-heading{border:0}.pure-menu a{border:1px solid transparent;border-left:0;border-right:0}.pure-menu a,.pure-menu .pure-menu-can-have-children>li:after{color:#777}.pure-menu .pure-menu-can-have-children>li:hover:after{color:#fff}.pure-menu .pure-menu-open{background:#dedede}.pure-menu li a:hover,.pure-menu li a:focus{background:#eee}.pure-menu li.pure-menu-disabled a:hover,.pure-menu li.pure-menu-disabled a:focus{background:#fff;color:#bfbfbf}.pure-menu .pure-menu-disabled>a{background-image:none;border-color:transparent;cursor:default}.pure-menu .pure-menu-disabled>a,.pure-menu .pure-menu-can-have-children.pure-menu-disabled>a:after{color:#bfbfbf}.pure-menu .pure-menu-heading{color:#565d64;text-transform:uppercase;font-size:90%;margin-top:.5em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:#dfdfdf}.pure-menu .pure-menu-selected a{color:#000}.pure-menu.pure-menu-open.pure-menu-fixed{border:0;border-bottom:1px solid #b7b7b7}.pure-paginator{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;list-style:none;margin:0;padding:0}.opera-only :-o-prefocus,.pure-paginator{word-spacing:-.43em}.pure-paginator li{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-paginator .pure-button{border-radius:0;padding:.8em 1.4em;vertical-align:top;height:1.1em}.pure-paginator .pure-button:focus,.pure-paginator .pure-button:active{outline-style:none}.pure-paginator .prev,.pure-paginator .next{color:#C0C1C3;text-shadow:0 -1px 0 rgba(0,0,0,.45)}.pure-paginator .prev{border-radius:2px 0 0 2px}.pure-paginator .next{border-radius:0 2px 2px 0}@media (max-width:480px){.pure-menu-horizontal{width:100%}.pure-menu-children li{display:block;border-bottom:1px solid #000}}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:6px 12px}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child td,.pure-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child td{border-bottom-width:0} \ No newline at end of file diff --git a/workflow/public_html/assets/css/sign-in-modules.css b/workflow/public_html/assets/css/sign-in-modules.css new file mode 100644 index 000000000..977ae9e34 --- /dev/null +++ b/workflow/public_html/assets/css/sign-in-modules.css @@ -0,0 +1,174 @@ +/** + * Coloring h1 a bit off black, removing bold, and shadowing + * a touch. + */ +h1 { + color: #505050; + text-shadow: 2px 1px 3px rgba(200, 200, 200, 0.43); + font-weight: normal; +} + +/** + * Using some off white for the background color and + * padding the top. + */ +body +{ + background: whitesmoke; + padding-top: 60px; +} + +/** + * Make links smaller, + */ +a +{ + text-shadow: 2px 1px 3px rgba(200, 200, 200, 0.43); + padding-bottom: 5px; + padding-top: 10px; + font-size: 80%; + color: #6464ff; + text-decoration: none; +} + +pre +{ + margin-top: 0px; + margin-bottom: 0px; +} + +/** + * Upper box that contains the title Authorization Server, the UserName, and Password fields + */ +.upper-box { + + width: 350px; + + border-top: 1px solid; + border-left: 1px solid; + border-right: 1px solid; + + border-color: lightgrey; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + + padding-top: 5px; + padding-left: 20px; + padding-bottom: 35px; + + box-shadow: 1px 1px 5px #e7e7e7; + + margin-left: auto; + margin-right: auto; + + /** + * Gradient calculated from gradient calculator of + * http://gradients.glrzad.com/ + */ + background-image: linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -o-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -moz-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -webkit-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + background-image: -ms-linear-gradient(bottom, rgb(249,250,252) 21%, rgb(245,247,250) 67%, rgb(247,249,255) 94%); + + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.21, rgb(249,250,252)), + color-stop(0.67, rgb(245,247,250)), + color-stop(0.94, rgb(247,249,255)) + ); + +} + +/** + * Bottom box that contains the "Sign in" button + */ +.bottom-box { + border:1px solid; + border-color: lightgrey; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + + width: 350px; + padding-top: 15px; + padding-left: 20px; + padding-bottom: 15px; + box-shadow: 1px 3px 1px #e7e7e7; + margin-left: auto; + margin-right: auto; + + /** + * Gradient calculated from gradient calculator of + * http://gradients.glrzad.com/ + */ + background-image: linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -o-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -moz-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -webkit-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + background-image: -ms-linear-gradient(bottom, rgb(242,245,250) 21%, rgb(242,245,250) 67%, rgb(242,245,255) 94%); + + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.21, rgb(242,245,250)), + color-stop(0.67, rgb(242,245,250)), + color-stop(0.94, rgb(242,245,255)) + ); +} + +/** + * Okay, you caught me. It's a hack to make this look centered. + * + * TODO Fix this, can't figure out how to get this to center correctly. + * It's currently anchored to the fieldset and that's causing issues. + */ +.title-padding { + padding-left: 15px; +} + +/** + * The username and password labels + */ +.labels { + color: #505050; + text-shadow: 2px 1px 3px rgba(200, 200, 200, 0.43); + padding-bottom: 5px; + padding-top: 10px; +} + +/** + * Input fields so I can make it slightly larger than the default, + * and I can also pad anything trying to touch it on the right. + */ +.input-fields { + padding-right: 20px; + font-size: 130%; + } + +/** + * This makes all the placeholder text italic. Nice trick I + * picked up from stack overflow: + * http://stackoverflow.com/questions/16291925/how-to-make-value-text-in-form-be-italic + */ +::-webkit-input-placeholder { font-style: italic; } +::-moz-placeholder { font-style: italic; } +:-ms-input-placeholder { font-style: italic; } + +/** + * Very specific to the sign on button. + */ +.sign-in-button { + padding-right: 20px; + text-align: right; +} + +/** + * Very specific to the "from website" link + */ +.from-text { + padding-top: 10px; + text-align: center; +} diff --git a/workflow/public_html/assets/css/style.css b/workflow/public_html/assets/css/style.css new file mode 100644 index 000000000..30e047dae --- /dev/null +++ b/workflow/public_html/assets/css/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} \ No newline at end of file diff --git a/workflow/public_html/assets/css/test-modules.css b/workflow/public_html/assets/css/test-modules.css new file mode 100644 index 000000000..802d9df68 --- /dev/null +++ b/workflow/public_html/assets/css/test-modules.css @@ -0,0 +1,238 @@ +body { + color: #777; +} + +.pure-img-responsive { + max-width: 100%; + height: auto; +} + +/* +Add transition to containers so they can push in and out. +*/ +#layout, +#menu, +.menu-link { + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} + +/* +This is the parent `
` that contains the menu and the content area. +*/ +#layout { + position: relative; + padding-left: 0; +} +#layout.active { + position: relative; + left: 150px; +} +#layout.active #menu { + left: 150px; + width: 150px; +} + +#layout.active .menu-link { + left: 150px; +} +/* +The content `
` is where all your content goes. +*/ +.content { + margin: 0; + padding: 0 2em; + max-width: 800px; + margin-bottom: 50px; + line-height: 1.6em; +} + +.header { + margin: 0; + color: #333; + text-align: center; + padding: 2.5em 2em 0; + border-bottom: 1px solid #eee; +} +.header h1 { + margin: 0.2em 0; + font-size: 3em; + font-weight: 300; +} +.header h2 { + font-weight: 300; + color: #ccc; + padding: 0; + margin-top: 0; +} + +.content-subhead { + margin: 50px 0 20px 0; + font-weight: 300; + color: #888; +} + + + +/* +The `#menu` `
` is the parent `
` that contains the `.pure-menu` that +appears on the left side of the page. +*/ + +#menu { + margin-left: -150px; /* "#menu" width */ + width: 150px; + position: fixed; + top: 0; + left: 0; + bottom: 0; + z-index: 1000; /* so the menu or its navicon stays above all content */ + background: #191818; + overflow-y: auto; + -webkit-overflow-scrolling: touch; +} +/* +All anchors inside the menu should be styled like this. +*/ +#menu a { + color: #999; + border: none; + padding: 0.6em 0 0.6em 0.6em; +} + +/* +Remove all background/borders, since we are applying them to #menu. +*/ +#menu .pure-menu, +#menu .pure-menu ul { + border: none; + background: transparent; +} + +/* +Add that light border to separate items into groups. +*/ +#menu .pure-menu ul, +#menu .pure-menu .menu-item-divided { + border-top: 1px solid #333; +} +/* +Change color of the anchor links on hover/focus. +*/ +#menu .pure-menu li a:hover, +#menu .pure-menu li a:focus { + background: #333; +} + +/* +This styles the selected menu item `
  • `. +*/ +#menu .pure-menu-selected, +#menu .pure-menu-heading { + background: #1f8dd6; +} +/* +This styles a link within a selected menu item `
  • `. +*/ +#menu .pure-menu-selected a { + color: #fff; +} + +/* +This styles the menu heading. +*/ +#menu .pure-menu-heading { + font-size: 110%; + color: #fff; + margin: 0; +} + +/* -- Dynamic Button For Responsive Menu -------------------------------------*/ + +/* +The button to open/close the Menu is custom-made and not part of Pure. Here's +how it works: +*/ + +/* +`.menu-link` represents the responsive menu toggle that shows/hides on +small screens. +*/ +.menu-link { + position: fixed; + display: block; /* show this only on small screens */ + top: 0; + left: 0; /* "#menu width" */ + background: #000; + background: rgba(0,0,0,0.7); + font-size: 10px; /* change this value to increase/decrease button size */ + z-index: 10; + width: 2em; + height: auto; + padding: 2.1em 1.6em; +} + +.menu-link:hover, +.menu-link:focus { + background: #000; +} + +.menu-link span { + position: relative; + display: block; +} + +.menu-link span, +.menu-link span:before, +.menu-link span:after { + background-color: #fff; + width: 100%; + height: 0.2em; +} + +.menu-link span:before, +.menu-link span:after { + position: absolute; + margin-top: -0.6em; + content: " "; +} + +.menu-link span:after { + margin-top: 0.6em; +} + + +/* -- Responsive Styles (Media Queries) ------------------------------------- */ + +/* +Hides the menu at `48em`, but modify this based on your app's needs. +*/ +@media (min-width: 48em) { + + .header, + .content { + padding-left: 2em; + padding-right: 2em; + } + + #layout { + padding-left: 150px; /* left col width "#menu" */ + left: 0; + } + #menu { + left: 150px; + } + + .menu-link { + position: fixed; + left: 150px; + display: none; + } + + #layout.active .menu-link { + left: 150px; + } +}