#!/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;