Security

Hootu Tech Ecosystem and Culture

At Hootu, engineers operate what they build and make the best use of tools, platforms created by the DevOps team to deploy and manage their services be it, CI/CD Pipeline, Orchestration, Deployment Portals, Service Availability or Health Dashboards etc. We also embrace the ideology of “Build for Failure” to ensure that whether it’s streaming VOD or large scale LIVE events, everything runs smoothly, with very little human intervention needed.

However, a world class infrastructure, needs to have a solid security posture as well. The Hootu security team is a few months old and has brought into sharp focus numerous items that make us even stronger than we were before!

Attack Surface and Challenges

To start with, we realized that we were dealing with a fairly broad attack surface:

20+ cloud accounts

Double-digit Kubernetes Clusters

A key focus for us was to ensure that in the preparation for the big upcoming cricket season, we ensured that the team focused on ensuring a high security posture.

From a security point of view, the following were some of the key areas which we doubled down on.

Internal Resources that are available for Public/Anonymous Access: Developers can deploy, operate, manage their services via AWS Console / Kubernetes deployment manifests / Terraform Scripts and we wante dto put in controls on ingress rules for services and resource-based policies for AWS Resources.

DNS Misconfigurations: Developers can create DNS Records which might go into dis-use, however, without a clean-up, it could lead to subdomain takeover issues.

Violation of Principle of Least Privilege: Reviewing various systems that were used to provision access across various tools to developers to ensure that access was retained as needed and only at levels that were required to do the tasks at hand.

Secret Management: Ensure that secrets were handled sensitively

Accountability & Auditing: All assets should have their owners tagged, access policy defined with auditing capability.

Our philosophy has been to create the least friction possible in the current system. It’s easy to stick to a checklist and create process and controls around it but does it solve the security problems? Not in an engineering driven organization. It’s necessary to strike a balance between security and business needs.

Whoops! There was an error.
ErrorException (E_WARNING)
file_put_contents(): Only 0 of 183 bytes written, possibly out of free disk space ErrorException thrown with message "file_put_contents(): Only 0 of 183 bytes written, possibly out of free disk space" Stacktrace: #7 ErrorException in /var/www/html/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122 #6 file_put_contents in /var/www/html/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122 #5 Illuminate\Filesystem\Filesystem:put in /var/www/html/vendor/laravel/framework/src/Illuminate/Session/FileSessionHandler.php:83 #4 Illuminate\Session\FileSessionHandler:write in /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Store.php:129 #3 Illuminate\Session\Store:save in /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:87 #2 Illuminate\Session\Middleware\StartSession:terminate in /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:218 #1 Illuminate\Foundation\Http\Kernel:terminateMiddleware in /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:189 #0 Illuminate\Foundation\Http\Kernel:terminate in /var/www/html/public/index.php:81
7
ErrorException
/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php122
6
file_put_contents
/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php122
5
Illuminate\Filesystem\Filesystem put
/vendor/laravel/framework/src/Illuminate/Session/FileSessionHandler.php83
4
Illuminate\Session\FileSessionHandler write
/vendor/laravel/framework/src/Illuminate/Session/Store.php129
3
Illuminate\Session\Store save
/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php87
2
Illuminate\Session\Middleware\StartSession terminate
/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php218
1
Illuminate\Foundation\Http\Kernel terminateMiddleware
/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php189
0
Illuminate\Foundation\Http\Kernel terminate
/public/index.php81
/var/www/html/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php
     *
     * @param  string  $path
     * @return string
     */
    public function hash($path)
    {
        return md5_file($path);
    }
 
    /**
     * Write the contents of a file.
     *
     * @param  string  $path
     * @param  string  $contents
     * @param  bool  $lock
     * @return int
     */
    public function put($path, $contents, $lock = false)
    {
        return file_put_contents($path, $contents, $lock ? LOCK_EX : 0);
    }
 
    /**
     * Prepend to a file.
     *
     * @param  string  $path
     * @param  string  $data
     * @return int
     */
    public function prepend($path, $data)
    {
        if ($this->exists($path)) {
            return $this->put($path, $data.$this->get($path));
        }
 
        return $this->put($path, $data);
    }
 
    /**
     * Append to a file.
Arguments
  1. "file_put_contents(): Only 0 of 183 bytes written, possibly out of free disk space"
    
/var/www/html/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php
     *
     * @param  string  $path
     * @return string
     */
    public function hash($path)
    {
        return md5_file($path);
    }
 
    /**
     * Write the contents of a file.
     *
     * @param  string  $path
     * @param  string  $contents
     * @param  bool  $lock
     * @return int
     */
    public function put($path, $contents, $lock = false)
    {
        return file_put_contents($path, $contents, $lock ? LOCK_EX : 0);
    }
 
    /**
     * Prepend to a file.
     *
     * @param  string  $path
     * @param  string  $data
     * @return int
     */
    public function prepend($path, $data)
    {
        if ($this->exists($path)) {
            return $this->put($path, $data.$this->get($path));
        }
 
        return $this->put($path, $data);
    }
 
    /**
     * Append to a file.
Arguments
  1. "/var/www/html/storage/framework/sessions/233vaiMaIlyR7yta6qhqkfksPJ004XCr7CAFTzzx"
    
  2. "a:3:{s:6:"_token";s:40:"MLBGS4HWyTKZuaPtenmJplgigK5NHXQv8Yc85LbB";s:9:"_previous";a:1:{s:3:"url";s:25:"http://hootu.app/security";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}"
    
  3. 2
    
/var/www/html/vendor/laravel/framework/src/Illuminate/Session/FileSessionHandler.php
    /**
     * {@inheritdoc}
     */
    public function read($sessionId)
    {
        if ($this->files->isFile($path = $this->path.'/'.$sessionId)) {
            if ($this->files->lastModified($path) >= Carbon::now()->subMinutes($this->minutes)->getTimestamp()) {
                return $this->files->sharedGet($path);
            }
        }
 
        return '';
    }
 
    /**
     * {@inheritdoc}
     */
    public function write($sessionId, $data)
    {
        $this->files->put($this->path.'/'.$sessionId, $data, true);
 
        return true;
    }
 
    /**
     * {@inheritdoc}
     */
    public function destroy($sessionId)
    {
        $this->files->delete($this->path.'/'.$sessionId);
 
        return true;
    }
 
    /**
     * {@inheritdoc}
     */
    public function gc($lifetime)
    {
        $files = Finder::create()
Arguments
  1. "/var/www/html/storage/framework/sessions/233vaiMaIlyR7yta6qhqkfksPJ004XCr7CAFTzzx"
    
  2. "a:3:{s:6:"_token";s:40:"MLBGS4HWyTKZuaPtenmJplgigK5NHXQv8Yc85LbB";s:9:"_previous";a:1:{s:3:"url";s:25:"http://hootu.app/security";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}"
    
  3. true
    
/var/www/html/vendor/laravel/framework/src/Illuminate/Session/Store.php
     *
     * @param  string  $data
     * @return string
     */
    protected function prepareForUnserialize($data)
    {
        return $data;
    }
 
    /**
     * Save the session data to storage.
     *
     * @return bool
     */
    public function save()
    {
        $this->ageFlashData();
 
        $this->handler->write($this->getId(), $this->prepareForStorage(
            serialize($this->attributes)
        ));
 
        $this->started = false;
    }
 
    /**
     * Prepare the serialized session data for storage.
     *
     * @param  string  $data
     * @return string
     */
    protected function prepareForStorage($data)
    {
        return $data;
    }
 
    /**
     * Age the flash data for the session.
     *
     * @return void
Arguments
  1. "233vaiMaIlyR7yta6qhqkfksPJ004XCr7CAFTzzx"
    
  2. "a:3:{s:6:"_token";s:40:"MLBGS4HWyTKZuaPtenmJplgigK5NHXQv8Yc85LbB";s:9:"_previous";a:1:{s:3:"url";s:25:"http://hootu.app/security";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}"
    
/var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php
        if ($this->sessionConfigured()) {
            $this->storeCurrentUrl($request, $session);
 
            $this->addCookieToResponse($response, $session);
        }
 
        return $response;
    }
 
    /**
     * Perform any final actions for the request lifecycle.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Symfony\Component\HttpFoundation\Response  $response
     * @return void
     */
    public function terminate($request, $response)
    {
        if ($this->sessionHandled && $this->sessionConfigured() && ! $this->usingCookieSessions()) {
            $this->manager->driver()->save();
        }
    }
 
    /**
     * Start the session for the given request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Contracts\Session\Session
     */
    protected function startSession(Request $request)
    {
        return tap($this->getSession($request), function ($session) use ($request) {
            $session->setRequestOnHandler($request);
 
            $session->start();
        });
    }
 
    /**
     * Get the session implementation from the manager.
/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php
     * @return void
     */
    protected function terminateMiddleware($request, $response)
    {
        $middlewares = $this->app->shouldSkipMiddleware() ? [] : array_merge(
            $this->gatherRouteMiddleware($request),
            $this->middleware
        );
 
        foreach ($middlewares as $middleware) {
            if (! is_string($middleware)) {
                continue;
            }
 
            [$name] = $this->parseMiddleware($middleware);
 
            $instance = $this->app->make($name);
 
            if (method_exists($instance, 'terminate')) {
                $instance->terminate($request, $response);
            }
        }
    }
 
    /**
     * Gather the route middleware for the given request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    protected function gatherRouteMiddleware($request)
    {
        if ($route = $request->route()) {
            return $this->router->gatherRouteMiddleware($route);
        }
 
        return [];
    }
 
    /**
Arguments
  1. Illuminate\Http\Request {#42
      #json: null
      #convertedFiles: null
      #userResolver: Closure($guard = null) {#540 …4}
      #routeResolver: Closure() {#542 …4}
      +attributes: Symfony\Component\HttpFoundation\ParameterBag {#44}
      +request: Symfony\Component\HttpFoundation\ParameterBag {#50}
      +query: Symfony\Component\HttpFoundation\ParameterBag {#50}
      +server: Symfony\Component\HttpFoundation\ServerBag {#46}
      +files: Symfony\Component\HttpFoundation\FileBag {#47}
      +cookies: Symfony\Component\HttpFoundation\ParameterBag {#45}
      +headers: Symfony\Component\HttpFoundation\HeaderBag {#48}
      #content: null
      #languages: null
      #charsets: null
      #encodings: null
      #acceptableContentTypes: array:4 [
        0 => "text/html"
        1 => "application/xhtml+xml"
        2 => "application/xml"
        3 => "*/*"
      ]
      #pathInfo: "/security"
      #requestUri: "/security"
      #baseUrl: ""
      #basePath: null
      #method: "GET"
      #format: null
      #session: Illuminate\Session\Store {#757}
      #locale: null
      #defaultLocale: "en"
      -preferredFormat: null
      -isHostValid: true
      -isForwardedValid: true
      basePath: ""
      format: "html"
    }
    
  2. Illuminate\Http\Response {#834}
    
/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php
     */
    protected function dispatchToRouter()
    {
        return function ($request) {
            $this->app->instance('request', $request);
 
            return $this->router->dispatch($request);
        };
    }
 
    /**
     * Call the terminate method on any terminable middleware.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Http\Response  $response
     * @return void
     */
    public function terminate($request, $response)
    {
        $this->terminateMiddleware($request, $response);
 
        $this->app->terminate();
    }
 
    /**
     * Call the terminate method on any terminable middleware.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Http\Response  $response
     * @return void
     */
    protected function terminateMiddleware($request, $response)
    {
        $middlewares = $this->app->shouldSkipMiddleware() ? [] : array_merge(
            $this->gatherRouteMiddleware($request),
            $this->middleware
        );
 
        foreach ($middlewares as $middleware) {
            if (! is_string($middleware)) {
Arguments
  1. Illuminate\Http\Request {#42
      #json: null
      #convertedFiles: null
      #userResolver: Closure($guard = null) {#540 …4}
      #routeResolver: Closure() {#542 …4}
      +attributes: Symfony\Component\HttpFoundation\ParameterBag {#44}
      +request: Symfony\Component\HttpFoundation\ParameterBag {#50}
      +query: Symfony\Component\HttpFoundation\ParameterBag {#50}
      +server: Symfony\Component\HttpFoundation\ServerBag {#46}
      +files: Symfony\Component\HttpFoundation\FileBag {#47}
      +cookies: Symfony\Component\HttpFoundation\ParameterBag {#45}
      +headers: Symfony\Component\HttpFoundation\HeaderBag {#48}
      #content: null
      #languages: null
      #charsets: null
      #encodings: null
      #acceptableContentTypes: array:4 [
        0 => "text/html"
        1 => "application/xhtml+xml"
        2 => "application/xml"
        3 => "*/*"
      ]
      #pathInfo: "/security"
      #requestUri: "/security"
      #baseUrl: ""
      #basePath: null
      #method: "GET"
      #format: null
      #session: Illuminate\Session\Store {#757}
      #locale: null
      #defaultLocale: "en"
      -preferredFormat: null
      -isHostValid: true
      -isForwardedValid: true
      basePath: ""
      format: "html"
    }
    
  2. Illuminate\Http\Response {#834}
    
/var/www/html/public/index.php
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/
 
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
 
$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);
 
$response->send();
 
$kernel->terminate($request, $response);
 
Arguments
  1. Illuminate\Http\Request {#42
      #json: null
      #convertedFiles: null
      #userResolver: Closure($guard = null) {#540 …4}
      #routeResolver: Closure() {#542 …4}
      +attributes: Symfony\Component\HttpFoundation\ParameterBag {#44}
      +request: Symfony\Component\HttpFoundation\ParameterBag {#50}
      +query: Symfony\Component\HttpFoundation\ParameterBag {#50}
      +server: Symfony\Component\HttpFoundation\ServerBag {#46}
      +files: Symfony\Component\HttpFoundation\FileBag {#47}
      +cookies: Symfony\Component\HttpFoundation\ParameterBag {#45}
      +headers: Symfony\Component\HttpFoundation\HeaderBag {#48}
      #content: null
      #languages: null
      #charsets: null
      #encodings: null
      #acceptableContentTypes: array:4 [
        0 => "text/html"
        1 => "application/xhtml+xml"
        2 => "application/xml"
        3 => "*/*"
      ]
      #pathInfo: "/security"
      #requestUri: "/security"
      #baseUrl: ""
      #basePath: null
      #method: "GET"
      #format: null
      #session: Illuminate\Session\Store {#757}
      #locale: null
      #defaultLocale: "en"
      -preferredFormat: null
      -isHostValid: true
      -isForwardedValid: true
      basePath: ""
      format: "html"
    }
    
  2. Illuminate\Http\Response {#834}
    

Environment & details:

empty
empty
empty
empty
empty
Key Value
REDIRECT_REDIRECT_STATUS
"200"
REDIRECT_STATUS
"200"
HTTP_USER_AGENT
"CCBot/2.0 (https://commoncrawl.org/faq/)"
HTTP_ACCEPT
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
HTTP_ACCEPT_LANGUAGE
"en-US,en;q=0.5"
HTTP_ACCEPT_ENCODING
"br,gzip"
HTTP_HOST
"hootu.app"
HTTP_CONNECTION
"Keep-Alive"
PATH
"/sbin:/usr/sbin:/bin:/usr/bin"
SERVER_SIGNATURE
""
SERVER_SOFTWARE
"Apache/2.4.46 (Amazon) OpenSSL/1.0.2k-fips PHP/7.2.30"
SERVER_NAME
"hootu.app"
SERVER_ADDR
"172.31.18.2"
SERVER_PORT
"80"
REMOTE_ADDR
"3.236.232.99"
DOCUMENT_ROOT
"/var/www/html"
REQUEST_SCHEME
"http"
CONTEXT_PREFIX
""
CONTEXT_DOCUMENT_ROOT
"/var/www/html"
SERVER_ADMIN
"root@localhost"
SCRIPT_FILENAME
"/var/www/html/public/index.php"
REMOTE_PORT
"55078"
REDIRECT_URL
"/public/security"
GATEWAY_INTERFACE
"CGI/1.1"
SERVER_PROTOCOL
"HTTP/1.1"
REQUEST_METHOD
"GET"
QUERY_STRING
""
REQUEST_URI
"/security"
SCRIPT_NAME
"/public/index.php"
PHP_SELF
"/public/index.php"
REQUEST_TIME_FLOAT
1634333440.943
REQUEST_TIME
1634333440
APP_NAME
"Laravel"
APP_ENV
"local"
APP_KEY
"base64:tfQKh3EtXnIIg5F4EON4sZYpD0v8AYrVooReGXvTjIY="
APP_DEBUG
"true"
APP_URL
"https://hootu.app/"
LOG_CHANNEL
"stack"
DB_CONNECTION
"mysql"
DB_HOST
"127.0.0.1"
DB_PORT
"3306"
DB_DATABASE
"hootu"
DB_USERNAME
"root"
DB_PASSWORD
"hootu123*#*"
BROADCAST_DRIVER
"log"
CACHE_DRIVER
"file"
SESSION_DRIVER
"file"
SESSION_LIFETIME
"120"
QUEUE_DRIVER
"sync"
REDIS_HOST
"127.0.0.1"
REDIS_PASSWORD
"null"
REDIS_PORT
"6379"
MAIL_DRIVER
"smtp"
MAIL_HOST
"smtp.gmail.com"
MAIL_PORT
"587"
MAIL_USERNAME
"defcomtech@gmail.com"
MAIL_PASSWORD
"Def@Tech2021"
MAIL_ENCRYPTION
"tls"
MAIL_FROM_ADDRESS
"defcomtech@gmail.com"
MAIL_FROM_NAME
"Hootu"
PUSHER_APP_ID
""
PUSHER_APP_KEY
""
PUSHER_APP_SECRET
""
PUSHER_APP_CLUSTER
"mt1"
REGION
"ap-south-1"
MIX_PUSHER_APP_KEY
""
MIX_PUSHER_APP_CLUSTER
"mt1"
AWS_ACCESS_KEY_ID
"AKIAWIQQOTAAFBTCVEUB"
AWS_SECRET_ACCESS_KEY
"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"
AWS_DEFAULT_REGION
"ap-south-1"
AWS_BUCKET
"hootu-assets"
AWS_URL
"https://hootu-assets.s3-ap-south-1.amazonaws.com"
AWS_ACL
"public-read"
default_image
"hqdefault.jpg"
S3_URL
"https://s3.ap-south-1.amazonaws.com/hootu-assets/"
CLOUD_FRONT_URL
"https://d3gk5a682xa6jl.cloudfront.net/"
FOOTER
"©2020 hootu | All Rights Reserved | Design & Developed By : Excellent Webworld"
LOGO
"https://hootu.app/assets/images/logo-light.png"
favicon
"https://hootu.app/assets/images/logo-light.png"
APPNAME
"hootu - Admin"
SITE_NAME
"hootu"
SITE_EMAIL
"hootu@gmail.com"
FFMPEG_BINARIES
"/opt/ffmpeg/ffmpeg"
FFPROBE_BINARIES
"/opt/ffmpeg/ffprobe"
FILESYSTEM_DRIVER
"s3"
fcm_key
"AIzaSyCqxiis1QbmM6eUgDGlZgCfETKWd4fv_-U"
FACEBOOK_CLIENT_ID
"704500607003630"
FACEBOOK_CLIENT_SECRET
"bbdbfe894f08e9a46a857ada9bdd9ccd"
FACEBOOK_URL
"https://hootu.app/auth/facebook/callback"
TWITTER_CLIENT_ID
""
TWITTER_CLIENT_SECRET
""
TWITTER_URL
"https://127.0.0.1:8000/login/twitter/callback"
GOOGLE_CLIENT_ID
""
GOOGLE_CLIENT_SECRET
""
GOOGLE_URL
"https://hootu.app/auth/google/callback"
PAYSTACK_PUBLIC_KEY
"pk_test_d2a004b64daa3e2204a2bf07306f7dde008106ed"
PAYSTACK_SECRET_KEY
"sk_test_1d02333258d96e7edd8693887a8d1cd36ffabc19"
PAYSTACK_PAYMENT_URL
"https://api.paystack.co"
MERCHANT_EMAIL
"chris@defcomtechnologies.com"
CUSTOM_ENCRYPTION
"Hootu@123*"
PAY_AMOUNT
"NGN"
Key Value
APP_NAME
"Laravel"
APP_ENV
"local"
APP_KEY
"base64:tfQKh3EtXnIIg5F4EON4sZYpD0v8AYrVooReGXvTjIY="
APP_DEBUG
"true"
APP_URL
"https://hootu.app/"
LOG_CHANNEL
"stack"
DB_CONNECTION
"mysql"
DB_HOST
"127.0.0.1"
DB_PORT
"3306"
DB_DATABASE
"hootu"
DB_USERNAME
"root"
DB_PASSWORD
"hootu123*#*"
BROADCAST_DRIVER
"log"
CACHE_DRIVER
"file"
SESSION_DRIVER
"file"
SESSION_LIFETIME
"120"
QUEUE_DRIVER
"sync"
REDIS_HOST
"127.0.0.1"
REDIS_PASSWORD
"null"
REDIS_PORT
"6379"
MAIL_DRIVER
"smtp"
MAIL_HOST
"smtp.gmail.com"
MAIL_PORT
"587"
MAIL_USERNAME
"defcomtech@gmail.com"
MAIL_PASSWORD
"Def@Tech2021"
MAIL_ENCRYPTION
"tls"
MAIL_FROM_ADDRESS
"defcomtech@gmail.com"
MAIL_FROM_NAME
"Hootu"
PUSHER_APP_ID
""
PUSHER_APP_KEY
""
PUSHER_APP_SECRET
""
PUSHER_APP_CLUSTER
"mt1"
REGION
"ap-south-1"
MIX_PUSHER_APP_KEY
""
MIX_PUSHER_APP_CLUSTER
"mt1"
AWS_ACCESS_KEY_ID
"AKIAWIQQOTAAFBTCVEUB"
AWS_SECRET_ACCESS_KEY
"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"
AWS_DEFAULT_REGION
"ap-south-1"
AWS_BUCKET
"hootu-assets"
AWS_URL
"https://hootu-assets.s3-ap-south-1.amazonaws.com"
AWS_ACL
"public-read"
default_image
"hqdefault.jpg"
S3_URL
"https://s3.ap-south-1.amazonaws.com/hootu-assets/"
CLOUD_FRONT_URL
"https://d3gk5a682xa6jl.cloudfront.net/"
FOOTER
"©2020 hootu | All Rights Reserved | Design & Developed By : Excellent Webworld"
LOGO
"https://hootu.app/assets/images/logo-light.png"
favicon
"https://hootu.app/assets/images/logo-light.png"
APPNAME
"hootu - Admin"
SITE_NAME
"hootu"
SITE_EMAIL
"hootu@gmail.com"
FFMPEG_BINARIES
"/opt/ffmpeg/ffmpeg"
FFPROBE_BINARIES
"/opt/ffmpeg/ffprobe"
FILESYSTEM_DRIVER
"s3"
fcm_key
"AIzaSyCqxiis1QbmM6eUgDGlZgCfETKWd4fv_-U"
FACEBOOK_CLIENT_ID
"704500607003630"
FACEBOOK_CLIENT_SECRET
"bbdbfe894f08e9a46a857ada9bdd9ccd"
FACEBOOK_URL
"https://hootu.app/auth/facebook/callback"
TWITTER_CLIENT_ID
""
TWITTER_CLIENT_SECRET
""
TWITTER_URL
"https://127.0.0.1:8000/login/twitter/callback"
GOOGLE_CLIENT_ID
""
GOOGLE_CLIENT_SECRET
""
GOOGLE_URL
"https://hootu.app/auth/google/callback"
PAYSTACK_PUBLIC_KEY
"pk_test_d2a004b64daa3e2204a2bf07306f7dde008106ed"
PAYSTACK_SECRET_KEY
"sk_test_1d02333258d96e7edd8693887a8d1cd36ffabc19"
PAYSTACK_PAYMENT_URL
"https://api.paystack.co"
MERCHANT_EMAIL
"chris@defcomtechnologies.com"
CUSTOM_ENCRYPTION
"Hootu@123*"
PAY_AMOUNT
"NGN"
0. Whoops\Handler\PrettyPageHandler