#!/usr/bin/perl
# This code was forked from the LiveJournal project owned and operated
# by Live Journal, Inc. The code has been modified and expanded by
# Dreamwidth Studios, LLC. These files were originally licensed under
# the terms of the license supplied by Live Journal, Inc, which can
# currently be found at:
#
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
#
# In accordance with the original license, this code and all its
# modifications are provided under the GNU General Public License.
# A copy of that license can be found in the LICENSE file included as
# part of this distribution.
#
#
# Do not edit this file.  You should edit ext/local/etc/config.pl.  If that file
# doesn't exist, copy it from etc/config.pl to ext/local/etc/config.pl and
# edit it there.  This file only provides backup default values for upgrading.
#

use strict;
no strict "vars";

{

    package LJ;
    use Sys::Hostname ();

    $DEFAULT_STYLE ||= {
        'core'   => 'core1',
        'layout' => 'generator/layout',
        'i18n'   => 'generator/en',
    };

    $DEFAULT_FEED_STYLE ||= {
        core   => 'core2',
        layout => 'sitefeeds/layout',
        theme  => 'sitefeeds/default',
    };

    # cluster 0 is no longer supported
    $DEFAULT_CLUSTER ||= 1;
    @CLUSTERS = (1) unless @CLUSTERS;

    $HOME   = $LJ::HOME;
    $HTDOCS = "$HOME/htdocs";
    $BIN    = "$HOME/bin";

    $SERVER_NAME ||= Sys::Hostname::hostname();

    @LANGS = ("en") unless @LANGS;
    $DEFAULT_LANG ||= $LANGS[0];

    $SITENAME ||= "NameNotConfigured.com";
    unless ($SITENAMESHORT) {
        $SITENAMESHORT = $SITENAME;
        $SITENAMESHORT =~ s/\..*//;    # remove .net/.com/etc
    }
    $SITENAMEABBREV ||= "[??]";

    $MSG_READONLY_USER ||= "Database temporarily in read-only mode during maintenance.";

    if ( $IS_DEV_SERVER && $IS_DEV_CONTAINER ) {

        # Do not redirect or set domains; cookies should have no domain
        # so they default to the request host (e.g. localhost)
        $PROTOCOL          = "http";
        $DOMAIN            = "";
        $USER_DOMAIN       = "";
        $DOMAIN_WEB        = "";
        $SITEROOT          = "";
        $SHOPROOT          = "/shop";
        $RELATIVE_SITEROOT = "";
        $COOKIE_DOMAIN     = "";
    }
    else {
        # Should always be https except on dev servers
        $PROTOCOL          ||= "https";
        $DOMAIN_WEB        ||= "www.$DOMAIN";
        $DOMAIN_SHOP       ||= $DOMAIN_WEB;
        $SITEROOT          ||= "$PROTOCOL://$DOMAIN_WEB";
        $SHOPROOT          ||= "$PROTOCOL://$DOMAIN_WEB/shop";
        $RELATIVE_SITEROOT ||= "//$DOMAIN_WEB";
    }
    $IMGPREFIX    ||= "$SITEROOT/img";
    $STATPREFIX   ||= "$SITEROOT/stc";
    $WSTATPREFIX  ||= "$SITEROOT/stc";
    $USERPIC_ROOT ||= "$LJ::SITEROOT/userpic";
    $PALIMGROOT   ||= "$RELATIVE_SITEROOT/palimg";
    $JSPREFIX     ||= "$RELATIVE_SITEROOT/js";

    # roles that slow support queries should use in order of precedence
    @SUPPORT_SLOW_ROLES = ('slow') unless @SUPPORT_SLOW_ROLES;

    # Backward compatibility: if EMAIL_VIA_SES is configured, import it into SMTP_SERVER
    if ( %EMAIL_VIA_SES && !%SMTP_SERVER ) {
        %SMTP_SERVER = %EMAIL_VIA_SES;
    }

    # where we set the cookies (note the period before the domain)
    $COOKIE_DOMAIN ||= ".$DOMAIN";

    $MAX_SCROLLBACK_LASTN   ||= 100;
    $MAX_SCROLLBACK_FRIENDS ||= 1000;
    $MAX_USERPIC_KEYWORDS   ||= 10;
    $MAX_ICONS_PER_PAGE = 50
        unless
        defined $MAX_ICONS_PER_PAGE;    # We want to be able to configure this to unlimited ( 0 )

    $LJ::AUTOSAVE_DRAFT_INTERVAL ||= 3;

    # set to the URL of our server
    $LJ::OPENID_SERVER = "$LJ::SITEROOT/openid/server";

    # set default capability limits if the site maintainer hasn't.
    {
        my %defcap = (
            'checkfriends'                  => 1,
            'checkfriends_interval'         => 60,
            'friendsviewupdate'             => 30,
            'makepoll'                      => 1,
            'maxfriends'                    => 500,
            'moodthemecreate'               => 1,
            'styles'                        => 1,
            's2styles'                      => 1,
            's2props'                       => 1,
            's2viewentry'                   => 1,
            's2viewreply'                   => 1,
            's2stylesmax'                   => 10,
            's2layersmax'                   => 50,
            'userdomain'                    => 0,
            'useremail'                     => 0,
            'userpics'                      => 5,
            'findsim'                       => 1,
            'full_rss'                      => 1,
            'can_post'                      => 1,
            'get_comments'                  => 1,
            'leave_comments'                => 1,
            'mod_queue'                     => 50,
            'mod_queue_per_poster'          => 1,
            'hide_email_after'              => 0,
            'userlinks'                     => 5,
            'maxcomments'                   => 10000,
            'maxcomments-before-captcha'    => 5000,
            'rateperiod-lostinfo'           => 24 * 60,    # 24 hours
            'rateallowed-lostinfo'          => 5,
            'tools_recent_comments_display' => 50,
            'rateperiod-invitefriend'       => 60,         # 1 hour
            'rateallowed-invitefriend'      => 20,
            'subscriptions'                 => 25,
            'usermessage_length'            => 5000,
        );
        foreach my $k ( keys %defcap ) {
            next if ( defined $LJ::CAP_DEF{$k} );
            $LJ::CAP_DEF{$k} = $defcap{$k};
        }
    }

    # FIXME: should forcibly limit userlinks to 255 (tinyint)

    # Send community invites from the admin address unless otherwise specified
    $COMMUNITY_EMAIL ||= $ADMIN_EMAIL;

    # The list of content types that we consider valid for gzip compression.
    %GZIP_OKAY = (
        'text/html'             => 1,    # regular web pages; XHTML 1.0 "may" be this
        'text/xml'              => 1,    # regular XML files
        'application/xml'       => 1,    # XHTML 1.1 "may" be this
        'application/xhtml+xml' => 1,    # XHTML 1.1 "should" be this
    ) unless %GZIP_OKAY;

    # block size is used in stats generation code that gets n rows from the db at a time
    $STATS_BLOCK_SIZE ||= 10_000;

    # Maximum number of comments to display on Recent Comments page
    $TOOLS_RECENT_COMMENTS_MAX ||= 150;

    # setup the mogilefs defaults so we can create the necessary domains
    # and such. it is not recommended that you change the name of the
    # classes. you can feel free to add your own or alter the mindevcount
    # from within etc/config.pl, but the LiveJournal code uses these class
    # names elsewhere and depends on them existing if you're using MogileFS
    # for storage.
    #
    # also note that this won't actually do anything unless you have
    # defined a MOGILEFS_CONFIG hash in etc/config.pl and you explicitly set
    # at least the hosts key to be an arrayref of ip:port combinations
    # indicating where to reach your local MogileFS server.
    $MOGILEFS_CONFIG{domain}  ||= 'livejournal';
    $MOGILEFS_CONFIG{timeout} ||= 3;

    $MOGILEFS_CONFIG{classes}             ||= {};
    $MOGILEFS_CONFIG{classes}->{temp}     ||= 2;
    $MOGILEFS_CONFIG{classes}->{userpics} ||= 3;
    $MOGILEFS_CONFIG{classes}->{vgifts}   ||= 3;
    $MOGILEFS_CONFIG{classes}->{media}    ||= 3;

    # maximum size to cache s2compiled data
    $MAX_S2COMPILED_CACHE_SIZE ||= 7500;    # bytes

    # max content length we should read via ATOM api
    # 25MB
    $MAX_ATOM_UPLOAD ||= 26214400;

    $DEFAULT_EDITOR ||= 'rich';

    unless (@LJ::EVENT_TYPES) {
        @LJ::EVENT_TYPES = map { "LJ::Event::$_" } qw (
            AddedToCircle
            Birthday
            CommunityInvite
            CommunityJoinApprove
            CommunityJoinReject
            CommunityJoinRequest
            CommunityModeratedEntryNew
            ImportStatus
            InvitedFriendJoins
            JournalNewComment
            JournalNewComment::TopLevel
            JournalNewComment::Edited
            JournalNewComment::Reply
            JournalNewEntry
            NewUserpic
            OfficialPost
            PollVote
            RemovedFromCircle
            SecurityAttributeChanged
            UserExpunged
            UserMessageRecvd
            UserMessageSent
            VgiftApproved
            VgiftDelivered
            XPostFailure
            XPostSuccess
        );
    }

    unless (@LJ::NOTIFY_TYPES) {
        @LJ::NOTIFY_TYPES = map { "LJ::NotificationMethod::$_" } qw ( Email );
    }

    # random user defaults to a week
    $RANDOM_USER_PERIOD = 7;

    # how far in advance to send out birthday notifications
    $LJ::BIRTHDAY_NOTIFS_ADVANCE ||= 2 * 24 * 60 * 60;

    # "RPC" URI mappings
    # add default URI handler mappings
    my %ajaxmapping = ();

    foreach my $src ( keys %ajaxmapping ) {
        $LJ::AJAX_URI_MAP{$src} ||= $ajaxmapping{$src};
    }

    # List all countries that have states listed in 'codes' table in DB
    # These countries will be displayed with drop-down menu on Profile edit page
    # 'type' is used as 'type' attribute value in 'codes' table
    # 'save_region_code' specifies what to save in 'state' userprop  -
    # '1' mean save short region code and '0' - save full region name
    %LJ::COUNTRIES_WITH_REGIONS = (
        'US' => { type => 'state',   save_region_code => 1, },
        'RU' => { type => 'stateru', save_region_code => 1, },

        #'AU' => { type => 'stateau', save_region_code => 0, },
        #'CA' => { type => 'stateca', save_region_code => 0, },
        #'DE' => { type => 'statede', save_region_code => 0, },
    );

    if ( $IS_DEV_SERVER && $IS_DEV_CONTAINER ) {

        # Dev container: use path-based journal URLs (/~username)
        $SUBDOMAIN_RULES = {
            P => [ 0, "" ],
            Y => [ 0, "" ],
            C => [ 0, "" ],
        };
    }
    else {
        $SUBDOMAIN_RULES = {
            P => [ 1, "users.$LJ::DOMAIN" ],
            Y => [ 1, "syndicated.$LJ::DOMAIN" ],
            C => [ 1, "community.$LJ::DOMAIN" ],
        };
    }

    $LJ::USERSEARCH_METAFILE_PATH ||= "$HOME/var/usersearch.data";

    # default to limit to 2000 results
    $LJ::MAX_DIR_SEARCH_RESULTS ||= 2000;

    # default to limit to 50,000 watch or trust edges to load
    $LJ::MAX_WT_EDGES_LOAD ||= 50_000;

    # to avoid S2 error "Excessive recursion detected and stopped."
    $S2::MAX_RECURSION ||= 500;

    # limit number of tags to search in intersection mode
    $LJ::TAG_INTERSECTION ||= 20;

    # not expected to need to be changed
    # default priority for libraries and resources in a sitescheme,
    # so that they come before any stylesheets declared by the page itself
    $LJ::LIB_RES_PRIORITY    = 3;
    $LJ::SCHEME_RES_PRIORITY = 3;

    # FIXME: remove the need for this, it's a hack of a hack of a hack
    # it used to be that site scheme pages were called later than page-level CSS
    # so page-level CSS was written with that assumption, and overrode some colors
    # now that site scheme pages are called earlier than page-level CSS
    # (as they should be) some pages look weird.
    # So let us temporarily force old behavior on existing files
    $LJ::OLD_RES_PRIORITY = 5;

    # mapping of captcha type to specific desired implementation
    %CAPTCHA_TYPES = (
        "I" => "recaptcha",    # "I" is for image
    ) unless %CAPTCHA_TYPES;
    $DEFAULT_CAPTCHA_TYPE ||= "I";

    # default location of community posting guidelines
    $DEFAULT_POSTING_GUIDELINES_LOC ||= "N";

    # Secrets
    %SECRETS = () unless %SECRETS;

    # Userpic maximum. No user can have more than this.
    $USERPIC_MAXIMUM ||= 500;

    # number of days to display virtual gifts on the profile - default to two weeks
    $VGIFT_EXPIRE_DAYS ||= 14;

    # Selective screening limit. No user can have more than this.
    $LJ::SEL_SCREEN_LIMIT ||= 500;

    # Maximum length of a username (NB do not change without changing width
    # of database fields to match. And perhaps other stuff.
    $USERNAME_MAXLENGTH = 25;

    # Password size requirements
    $PASSWORD_MINLENGTH = 6;
    $PASSWORD_MAXLENGTH = 72;

    # Cost to set for bcrypt password hash calculations.
    $BCRYPT_COST = 12;

    # Default pepper key -- ONLY SET IF DEV SERVER. If this is production,
    # you MUST set a valid pepper key here!
    if ($LJ::IS_DEV_SERVER) {
        %PASSWORD_PEPPER_KEYS           = ( 1 => "A" x 32, );
        $PASSWORD_PEPPER_KEY_CURRENT_ID = 1;
    }
}

1;
