Merge dw-nonfree into dw-free

This basically transplants the repository into ext/. There are cleaner ways
we can do this (by actually folding the code into the right places) but this
will suffice for now to solve the problems.
This commit is contained in:
Mark Smith 2022-10-19 15:47:16 +08:00
parent 8a973442be
commit 7b3f26eb0b
362 changed files with 14548 additions and 1 deletions

5
.gitignore vendored
View File

@ -1,7 +1,10 @@
/logs
/temp
/extlib
/ext
/ext/dw-private
/ext/local
/ext/ruby
/ext/yuicompressor
/etc/config*.pl
/build
/locks

View File

@ -45,6 +45,10 @@ licensed under the terms indicated in each file, specifically:
modify it under the same terms as Perl itself. For a copy of the
license, please reference 'perldoc perlartistic' or 'perldoc perlgpl'.
Finally, files in ext/dw-nonfree are not licensed for use or
distribution. They are provided as examples only as they are the
Dreamwidth Studios branding and custom code.
--------
This program is distributed in the hope that it will be useful,

7
bin/tidyall Executable file
View File

@ -0,0 +1,7 @@
#!/bin/bash
cd $LJHOME
perl -I$LJHOME/extlib/lib/perl5 $LJHOME/extlib/bin/tidyall -a
cd $LJHOME/ext/dw-nonfree
perl -I$LJHOME/extlib/lib/perl5 $LJHOME/extlib/bin/tidyall -a

View File

@ -0,0 +1,2 @@
local

View File

@ -0,0 +1,3 @@
[PerlTidy]
select = {bin,cgi-bin,t}/**/*.{pl,pm,t}
argv = -ole=unix -ci=4 -l=100

7
ext/dw-nonfree/LICENSE Normal file
View File

@ -0,0 +1,7 @@
This directory, with the directories and files contained herein recursively,
are not licensed for use or distribution.
These are provided for developers of the Dreamwidth service to work on and
with to build Dreamwidth.
All contents copyright (C) 2008-2022 by Dreamwidth Studios, LLC.

7
ext/dw-nonfree/README Normal file
View File

@ -0,0 +1,7 @@
This directory contains the non-free overlays for Dreamwidth
Studios' installation of the Dreamwidth source code. None of the
code in this directory is licensed for use: it consists of our
branding and of material we cannot license for re-use by others.
The Dreamwidth open source code repository is located in the
directories above this one.

View File

@ -0,0 +1 @@
general /index.bml.create.paymentlink

View File

@ -0,0 +1,442 @@
;; -*- coding: utf-8 -*-
entryform.htmlfaq=Supported HTML
entryform.htmlfaq.detail=HTML examples
entryform.htmlfaq.site=Site-specific markup tags
entryform.pollcreator=Poll Creator
invitecodes.userclass.active30d=Accounts active during the past 30 days
invitecodes.userclass.basic_paid=Basic paid accounts
invitecodes.userclass.noinvleft=Accounts with no unused invite codes
invitecodes.userclass.noinvleft_apinv=Accounts with no unused invite codes and at least 1 active, paid, or permanent invitee
invitecodes.userclass.paidusers=Paid users
invitecodes.userclass.permanent_paid=Seed accounts
invitecodes.userclass.permusers=Permanent users
invitecodes.userclass.premium_paid=Premium Paid accounts
langname.en_DW=English
shop.admin.checkmoneyorder.body=[[user]] just sent a check/money order. Receipt is at: [[receipturl]]
shop.admin.checkmoneyorder.subject=New Check/Money Order Pending
shop.anniversarypromoblurb=Dreamwidth is currently offering a Holiday Promotion -- we're giving you 10% more points on all of your orders!
shop.annivpromo.nopoints=This order will not earn you any Dreamwidth Points as part of our Holiday Promotion. Bonus points are only given for orders that cost money.
shop.annivpromo.points=This order will earn you <strong>[[points]] Dreamwidth [[?points|Point|Points]]</strong> to spend on your next order as part of our Holiday Promotion.
shop.cc.charge.from=If you are using someone else's credit card, make sure you get their permission first. Charges will appear on your statement from Dreamwidth Studios, LLC.
shop.email.acct.body.end<<
Best,
Mark, Denise, and the [[sitename]] team
.
shop.email.comm.close<<
Congratulations on your community's paid time! You can see a list of all the premium features you now have access to here:
https://www.dreamwidth.org/support/faqbrowse?faqid=4
Thanks for supporting Dreamwidth, and for making it possible for us to
keep building an awesome service.
.
shop.email.confirm.checkmoneyorder.body<<
Dear [[touser]],
This email confirms your purchase from the [[sitename]] shop. You can view your
receipt here:
[[receipturl]]
Your order will not be processed until we receive your check or money order as
described below:
Amount Due: [[total]]
Payable To: [[payableto]]
Mail To:
[[address]]
Please remember to include both the order number and the PO box number! Also, be sure to sign your check or endorse your money order.
Thank you for your purchase! You can see a list of all the premium features you'll have access to here:
https://www.dreamwidth.org/support/faqbrowse?faqid=4
Thanks for supporting Dreamwidth, and for making it possible for us to
keep building an awesome service.
Best,
Mark, Denise, and the [[sitename]] team
.
shop.email.confirm.paypal.body<<
Dear [[touser]],
This email confirms your purchase from the [[sitename]] shop. You can view your receipt here:
[[receipturl]]
[[statustext]]
Thank you for your purchase! You can see a list of all the premium features
here:
https://www.dreamwidth.org/support/faqbrowse?faqid=4
Thanks for supporting Dreamwidth, and for making it possible for us to
keep building an awesome service.
Best,
Mark, Denise, and the [[sitename]] team
.
shop.email.email.close<<
We look forward to having you on the site! You can see a list of all the premium features you'll have access to here:
https://www.dreamwidth.org/support/faqbrowse?faqid=4
.
shop.email.user.close<<
Congratulations on your paid time! You can see a list of all the premium features you now have access to here:
https://www.dreamwidth.org/support/faqbrowse?faqid=4
Thanks for supporting Dreamwidth, and for making it possible for us to
keep building an awesome service.
.
shop.expiration.comm.0.body<<
Dear [[touser]],
We wanted to let you know that your [[sitename]] community
[[commname]]'s paid time has now expired.
You can add more paid time to the community in the [[sitename]] shop:
[[shopurl]]
If you don't renew your community's paid time, don't worry -- the
community will still be there for you and your members to post in.
You just won't have access to the paid account features anymore.
We really hope that you'll consider renewing your paid time, though.
All of our income comes entirely from your payments -- we don't take
money from any outside investors, just from our users for the
service we provide. If there's anything we could be doing better,
or anything we could do to make you more satisfied with the service,
we'd love to hear from you. You can email us at:
feedback@dreamwidth.org
Even if you decide not to renew your paid [[sitename]] account,
we're still really glad to have you here. Thanks for your support.
Best,
Denise, Mark, and the [[sitename]] team
.
shop.expiration.comm.14.body<<
Dear [[touser]],
We wanted to let you know that your paid [[sitename]] community,
[[commname]], will be expiring in two weeks.
If you'd like, you can add more paid time to your community account
here:
[[shopurl]]
If you don't want to renew your community's paid account, don't worry -- it'll still be there for you to use. You and your community members just
won't have access to all of the paid account features. You can see a list of those paid account features here:
https://www.dreamwidth.org/support/faqbrowse?faqid=4
[[sitename]] is supported entirely by your payments. We aren't owned
by a corporate conglomerate, we haven't taken any venture capital from
outside investors, and we don't accept advertising, so we're 100%
focused on making you happy with our service and our site. If there's
anything at all that you think we're not doing right, or if there's
something that we could do better, we'd love to hear from you. You
can email us at:
feedback@dreamwidth.org
Thank you so much for supporting Dreamwidth and making it possible
for us to build an awesome service.
Best,
Denise, Mark, and the [[sitename]] team
.
shop.expiration.comm.3.body<<
Dear [[touser]],
We just wanted to remind you that your paid [[sitename]] community,
[[commname]], will be expiring in approximately three days.
You can renew your paid account in our Shop:
[[shopurl]]
This is the last reminder we'll send you -- we don't want to nag!
Your community will automatically revert to a free account in
another three days if you don't renew. If that happens, you'll still
be able to use it; you just won't have access to our paid features
anymore. You can see a list of those paid features here:
https://www.dreamwidth.org/support/faqbrowse?faqid=4
Thanks for supporting Dreamwidth, and for making it possible for us
to build an awesome online home.
Best,
Denise, Mark, and the [[sitename]] team
.
shop.expiration.user.0.body<<
Dear [[touser]],
We wanted to let you know that your [[sitename]] account, [[touser]],
has now expired.
You can add more paid time to your account in the [[sitename]] shop:
[[shopurl]]
If you don't renew your paid time, don't worry -- your account is
still there, and you can keep using all of the basic features.
You just won't have access to the paid account features anymore.
We really hope that you'll consider renewing your paid time, though.
All of our income comes entirely from your payments -- we don't take
money from any outside investors, just from our users for the
service we provide. If there's anything we could be doing better,
or anything we could do to make you more satisfied with the service,
we'd love to hear from you. You can email us at:
feedback@dreamwidth.org
Even if you decide not to renew your paid [[sitename]] account,
we're still really glad to have you here. Thanks for your support.
Best,
Denise, Mark, and the [[sitename]] team
.
shop.expiration.user.14.body<<
Dear [[touser]],
We wanted to let you know that your paid [[sitename]] account will be
expiring in two weeks.
If you'd like, you can add more paid time to your account here:
[[shopurl]]
If you don't want to renew your paid account, don't worry -- you can
still keep using the site. You just won't have access to all of the
paid account features. You can see a list of those paid account features
here:
https://www.dreamwidth.org/support/faqbrowse?faqid=4
[[sitename]] is supported entirely by your payments. We aren't owned
by a corporate conglomerate, we haven't taken any venture capital from
outside investors, and we don't accept advertising, so we're 100%
focused on making you happy with our service and our site. If there's
anything at all that you think we're not doing right, or if there's
something that we could do better, we'd love to hear from you. You
can email us at:
feedback@dreamwidth.org
Thank you so much for supporting Dreamwidth and making it possible
for us to build an awesome service.
Best,
Denise, Mark, and the [[sitename]] team
.
shop.expiration.user.3.body<<
Dear [[touser]],
We just wanted to remind you that your paid [[sitename]] account,
[[touser]], will be expiring in approximately three days.
You can renew your paid account in our Shop:
[[shopurl]]
This is the last reminder we'll send you -- we don't want to nag!
Your account will automatically revert to a free account in
another three days if you don't renew. If that happens, you'll still
be able to use it; you just won't have access to our paid features
anymore. You can see a list of those paid features here:
https://www.dreamwidth.org/support/faqbrowse?faqid=4
Thanks for supporting Dreamwidth, and for making it possible for us
to build an awesome online home.
Best,
Denise, Mark, and the [[sitename]] team
.
shop.holidaypromoblurb=Dreamwidth is currently offering a Holiday Promotion! For every 6 months of paid account time that you purchase for somebody else, we will give you 2 months of paid account time for free.
siteskins.tropo-purple.alt=Tropospherical Purple: Black text on light grey background; light and dark purple color highlights
siteskins.tropo-purple.desc=Light grey background for less glare; serif font 75% of the browser default; horizontal, drop-down expanding dynamic menus (requires fine mouse control).
siteskins.tropo-red.alt=Tropospherical Red (default): Black text on light grey background; red and salmon color highlights
siteskins.tropo-red.desc=Light grey background for less glare; serif font 75% of the browser default; horizontal, drop-down expanding dynamic menus (requires fine mouse control).
tropo.accountlinks.account=Account Settings
tropo.accountlinks.btn.login=Log In
tropo.accountlinks.btn.logout=Log Out
tropo.accountlinks.help=Help
tropo.accountlinks.inbox=Inbox
tropo.accountlinks.invitefriend=Invite Someone
tropo.accountlinks.login.forgotpassword=Forgot password?
tropo.accountlinks.login.openid=Log in with OpenID
tropo.accountlinks.login.password=Password:
tropo.accountlinks.login.rememberme=Remember me
tropo.accountlinks.login.username=Account name:
tropo.accountlinks.post=Post
tropo.accountlinks.readinglist=Reading Page
tropo.accountlinks.userpic.alt=Upload Icons
tropo.footer.info=Copyright &copy; 2009-2010 Dreamwidth Studios, LLC. All rights reserved.
tropo.footer.legal.abusepolicy=Abuse Policy
tropo.footer.legal.diversitystatement=Diversity Statement
tropo.footer.legal.guidingprinciples=Guiding Principles
tropo.footer.legal.privacypolicy=Privacy Policy
tropo.footer.legal.tos=Terms of Service
tropo.footer.opensource=Open Source
tropo.footer.sitemap=Site Map
tropo.footer.suggestion=Make a Suggestion
tropo.nav.create=Create
tropo.nav.create.createaccount=Create Account
tropo.nav.create.createcommunity=Create Community
tropo.nav.create.editjournal=Edit Entries
tropo.nav.create.editprofile=Edit Profile
tropo.nav.create.updatejournal=Post Entry
tropo.nav.create.uploaduserpics=Upload Icons ([[num]] of [[max]])
tropo.nav.explore=Explore
tropo.nav.explore.directorysearch=Directory Search
tropo.nav.explore.faq=FAQ
tropo.nav.organize=Organize
tropo.nav.organize.customizestyle=Customize Style
tropo.nav.organize.manageaccount=Manage Account
tropo.nav.organize.managecommunities=Manage Communities
tropo.nav.organize.managefilters=Manage Filters
tropo.nav.organize.managerelationships=Manage Circle
tropo.nav.organize.managetags=Manage Tags
tropo.nav.organize.selectstyle=Select Style
tropo.nav.read=Read
tropo.nav.read.inbox.nounread=Inbox
tropo.nav.read.inbox.unread=Inbox ([[num]])
tropo.nav.read.profile=Profile
tropo.nav.read.readinglist=Reading Page
tropo.nav.read.recentcomments=Recent Comments
tropo.nav.read.syndicatedfeeds=Feeds
tropo.nav.read.tags=Tags
tropo.search=Search&hellip;
tropo.search.btn.go=Go
tropo.search.email=Email
tropo.search.faq=FAQ
tropo.search.iminfo=IM Info
tropo.search.interest=Interest
tropo.search.region=Region
tropo.search.siteuser=Site &amp; User
widget.createaccountentercode.getcode=If you do not have an account creation code, you can find or request one in <?ljcomm dw_codesharing ljcomm?>.
widget.createaccountentercode.info1=To create a new account, enter an account creation code (<a href="https://www.dreamwidth.org/support/faqbrowse?faqid=105">Why?</a>):
widget.importchoosesource.disabled1=Starting a new import is temporarily disabled due to high volume. Existing imports will still be processed in the order they were submitted. New imports will be available again once the import queue clears out a little more. For more information, see <a href="https://dw-maintenance.dreamwidth.org">dw_maintenance</a>.
widget.shopcart.paymentmethod.creditcardpp=[N/A]
widget.shopcart.paymentmethod.paypal=[N/A]

View File

@ -0,0 +1,133 @@
MOODTHEME Sina'i Enantia's Dreamy Ds: Dreamy D's by Sina'i Enantia
90 /img/mood/dreamy_ds/accomplished.gif 30 41
1 /img/mood/dreamy_ds/aggravated.gif 30 41
44 /img/mood/dreamy_ds/amused.gif 30 41
2 /img/mood/dreamy_ds/angry.gif 30 41
3 /img/mood/dreamy_ds/annoyed.gif 30 41
4 /img/mood/dreamy_ds/anxious.gif 30 41
114 /img/mood/dreamy_ds/apathetic.gif 30 41
108 /img/mood/dreamy_ds/artistic.gif 30 41
87 /img/mood/dreamy_ds/awake.gif 30 41
110 /img/mood/dreamy_ds/bitchy.gif 30 41
92 /img/mood/dreamy_ds/blah.gif 30 41
113 /img/mood/dreamy_ds/blank.gif 30 41
5 /img/mood/dreamy_ds/bored.gif 30 41
59 /img/mood/dreamy_ds/bouncy.gif 30 41
91 /img/mood/dreamy_ds/busy.gif 30 41
68 /img/mood/dreamy_ds/calm.gif 30 41
125 /img/mood/dreamy_ds/cheerful.gif 30 41
99 /img/mood/dreamy_ds/chipper.gif 30 41
84 /img/mood/dreamy_ds/cold.gif 30 41
63 /img/mood/dreamy_ds/complacent.gif 30 41
6 /img/mood/dreamy_ds/confused.gif 30 41
101 /img/mood/dreamy_ds/contemplative.gif 30 41
64 /img/mood/dreamy_ds/content.gif 30 41
8 /img/mood/dreamy_ds/cranky.gif 30 41
7 /img/mood/dreamy_ds/crappy.gif 30 41
106 /img/mood/dreamy_ds/crazy.gif 30 41
107 /img/mood/dreamy_ds/creative.gif 30 41
129 /img/mood/dreamy_ds/crushed.gif 30 41
56 /img/mood/dreamy_ds/curious.gif 30 41
104 /img/mood/dreamy_ds/cynical.gif 30 41
9 /img/mood/dreamy_ds/depressed.gif 30 41
45 /img/mood/dreamy_ds/determined.gif 30 41
130 /img/mood/dreamy_ds/devious.gif 30 41
119 /img/mood/dreamy_ds/dirty.gif 30 41
55 /img/mood/dreamy_ds/disappointed.gif 30 41
10 /img/mood/dreamy_ds/discontent.gif 30 41
127 /img/mood/dreamy_ds/distressed.gif 30 41
35 /img/mood/dreamy_ds/ditzy.gif 30 41
115 /img/mood/dreamy_ds/dorky.gif 30 41
40 /img/mood/dreamy_ds/drained.gif 30 41
34 /img/mood/dreamy_ds/drunk.gif 30 41
98 /img/mood/dreamy_ds/ecstatic.gif 30 41
79 /img/mood/dreamy_ds/embarrassed.gif 30 41
11 /img/mood/dreamy_ds/energetic.gif 30 41
12 /img/mood/dreamy_ds/enraged.gif 30 41
13 /img/mood/dreamy_ds/enthralled.gif 30 41
80 /img/mood/dreamy_ds/envious.gif 30 41
78 /img/mood/dreamy_ds/exanimate.gif 30 41
41 /img/mood/dreamy_ds/excited.gif 30 41
14 /img/mood/dreamy_ds/exhausted.gif 30 41
67 /img/mood/dreamy_ds/flirty.gif 30 41
47 /img/mood/dreamy_ds/frustrated.gif 30 41
93 /img/mood/dreamy_ds/full.gif 30 41
103 /img/mood/dreamy_ds/geeky.gif 30 41
120 /img/mood/dreamy_ds/giddy.gif 30 41
72 /img/mood/dreamy_ds/giggly.gif 30 41
38 /img/mood/dreamy_ds/gloomy.gif 30 41
126 /img/mood/dreamy_ds/good.gif 30 41
132 /img/mood/dreamy_ds/grateful.gif 30 41
51 /img/mood/dreamy_ds/groggy.gif 30 41
95 /img/mood/dreamy_ds/grumpy.gif 30 41
111 /img/mood/dreamy_ds/guilty.gif 30 41
15 /img/mood/dreamy_ds/happy.gif 30 41
16 /img/mood/dreamy_ds/high.gif 30 41
43 /img/mood/dreamy_ds/hopeful.gif 30 41
17 /img/mood/dreamy_ds/horny.gif 30 41
83 /img/mood/dreamy_ds/hot.gif 30 41
18 /img/mood/dreamy_ds/hungry.gif 30 41
52 /img/mood/dreamy_ds/hyper.gif 30 41
116 /img/mood/dreamy_ds/impressed.gif 30 41
48 /img/mood/dreamy_ds/indescribable.gif 30 41
65 /img/mood/dreamy_ds/indifferent.gif 30 41
19 /img/mood/dreamy_ds/infuriated.gif 30 41
128 /img/mood/dreamy_ds/intimidated.gif 30 41
20 /img/mood/dreamy_ds/irate.gif 30 41
112 /img/mood/dreamy_ds/irritated.gif 30 41
133 /img/mood/dreamy_ds/jealous.gif 30 41
21 /img/mood/dreamy_ds/jubilant.gif 30 41
33 /img/mood/dreamy_ds/lazy.gif 30 41
75 /img/mood/dreamy_ds/lethargic.gif 30 41
76 /img/mood/dreamy_ds/listless.gif 30 41
22 /img/mood/dreamy_ds/lonely.gif 30 41
86 /img/mood/dreamy_ds/loved.gif 30 41
39 /img/mood/dreamy_ds/melancholy.gif 30 41
57 /img/mood/dreamy_ds/mellow.gif 30 41
36 /img/mood/dreamy_ds/mischievous.gif 30 41
23 /img/mood/dreamy_ds/moody.gif 30 41
37 /img/mood/dreamy_ds/morose.gif 30 41
117 /img/mood/dreamy_ds/naughty.gif 30 41
97 /img/mood/dreamy_ds/nauseated.gif 30 41
102 /img/mood/dreamy_ds/nerdy.gif 30 41
134 /img/mood/dreamy_ds/nervous.gif 30 41
60 /img/mood/dreamy_ds/nostalgic.gif 30 41
124 /img/mood/dreamy_ds/numb.gif 30 41
61 /img/mood/dreamy_ds/okay.gif 30 41
70 /img/mood/dreamy_ds/optimistic.gif 30 41
58 /img/mood/dreamy_ds/peaceful.gif 30 41
73 /img/mood/dreamy_ds/pensive.gif 30 41
71 /img/mood/dreamy_ds/pessimistic.gif 30 41
24 /img/mood/dreamy_ds/pissedoff.gif 30 41
109 /img/mood/dreamy_ds/pleased.gif 30 41
118 /img/mood/dreamy_ds/predatory.gif 30 41
89 /img/mood/dreamy_ds/productive.gif 30 41
105 /img/mood/dreamy_ds/quixotic.gif 30 41
77 /img/mood/dreamy_ds/recumbent.gif 30 41
69 /img/mood/dreamy_ds/refreshed.gif 30 41
123 /img/mood/dreamy_ds/rejected.gif 30 41
62 /img/mood/dreamy_ds/rejuvenated.gif 30 41
53 /img/mood/dreamy_ds/relaxed.gif 30 41
42 /img/mood/dreamy_ds/relieved.gif 30 41
54 /img/mood/dreamy_ds/restless.gif 30 41
100 /img/mood/dreamy_ds/rushed.gif 30 41
25 /img/mood/dreamy_ds/sad.gif 30 41
26 /img/mood/dreamy_ds/satisfied.gif 30 41
46 /img/mood/dreamy_ds/scared.gif 30 41
122 /img/mood/dreamy_ds/shocked.gif 30 41
82 /img/mood/dreamy_ds/sick.gif 30 41
66 /img/mood/dreamy_ds/silly.gif 30 41
49 /img/mood/dreamy_ds/sleepy.gif 30 41
27 /img/mood/dreamy_ds/sore.gif 30 41
28 /img/mood/dreamy_ds/stressed.gif 30 41
121 /img/mood/dreamy_ds/surprised.gif 30 41
81 /img/mood/dreamy_ds/sympathetic.gif 30 41
131 /img/mood/dreamy_ds/thankful.gif 30 41
29 /img/mood/dreamy_ds/thirsty.gif 30 41
30 /img/mood/dreamy_ds/thoughtful.gif 30 41
31 /img/mood/dreamy_ds/tired.gif 30 41
32 /img/mood/dreamy_ds/touched.gif 30 41
74 /img/mood/dreamy_ds/uncomfortable.gif 30 41
96 /img/mood/dreamy_ds/weird.gif 30 41
88 /img/mood/dreamy_ds/working.gif 30 41
85 /img/mood/dreamy_ds/worried.gif 30 41

View File

@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
domain:101:journal/news
domain:102:widget
# dreamwidth custom language
lang:100:en_DW:English (DW):sim:en
langdomain:en_DW:general
langdomain:en_DW:faq
langdomain:en_DW:journal/news:1
langdomain:en_DW:widget:1

View File

@ -0,0 +1,95 @@
#!/usr/bin/perl
#
# DW::BusinessRules::Pay
#
# This package contains functions to convert Paid to Premium Paid time
# and vice-versa as needed when applying or removing paid time
#
# Authors:
# Ryan Southwell <teshiron@chaosfire.net>
#
# Copyright (c) 2012 by Dreamwidth Studios, LLC.
#
# This program is NOT free software or open-source; you can use it as an
# example of how to implement your own site-specific extensions to the
# Dreamwidth Studios open-source code, but you cannot use it on your site
# or redistribute it, with or without modifications.
#
package DW::BusinessRules::Pay::DWS;
use strict;
use base 'DW::BusinessRules::Pay';
use Carp qw/ confess /;
use constant SECS_IN_DAY => 86400;
use constant CONVERSION_RATE => 0.7;
################################################################################
#
# DW::BusinessRules::Pay::convert
#
# Converts paid to premium paid time at a rate of 70% for day and second values,
# and a rate of 21 days for each whole month (also 70%). Converts premium paid
# to paid time at a rate of 1/70% (approx 143% or 42.8 days per month).
#
# ARGUMENTS: from_type, dest_type, months, days, seconds
#
# from_type required type of paid time being converted
# dest_type required destination account type
#
# At least one of months, days, or seconds must be supplied. If more than one
# time field is supplied, the fields will be added together before conversion.
#
# RETURN: appropriate amount of paid time in seconds
#
sub convert {
my ( $from_type, $dest_type, $months, $days, $seconds ) = @_;
confess "invalid paid time type $from_type"
unless $from_type =~ /^(?:premium|paid)$/;
confess "invalid destination account type $dest_type"
unless $dest_type =~ /^(?:premium|paid)$/;
confess "redundant conversion from $from_type to $dest_type"
if $from_type eq $dest_type;
confess "no amount of time was specified for conversion"
unless $months || $days || $seconds;
if ( $from_type eq 'paid' and $dest_type eq 'premium' ) { # paid to premium
# first, convert any seconds value supplied
$seconds = int( $seconds * CONVERSION_RATE ) if $seconds;
# convert individual days to seconds and add on
$seconds += int( $days * CONVERSION_RATE * SECS_IN_DAY ) if $days;
# convert months to seconds and add on
# A 30-day month is assumed as per existing business logic
$seconds += int( $months * 30 * CONVERSION_RATE * SECS_IN_DAY ) if $months;
}
else { # premium to paid
# again, first with the seconds.
# remember that dividing by a fraction is the same as multiplying by
# the reciprocal, so dividing by CONVERSION_RATE is the inverse function.
$seconds = int( $seconds / CONVERSION_RATE ) if $seconds;
# then the days
$seconds += int( $days / CONVERSION_RATE * SECS_IN_DAY ) if $days;
# then the months
$seconds += int( $months * 30 / CONVERSION_RATE * SECS_IN_DAY ) if $months;
}
return $seconds;
}
1;

View File

@ -0,0 +1,70 @@
#!/usr/bin/perl
#
# DW::Controller::Dreamwidth::Misc
#
# Controller for Dreamwidth specific miscellaneous pages.
#
# Authors:
# Mark Smith <mark@dreamwidth.org>
#
# Copyright (c) 2009-2016 by Dreamwidth Studios, LLC.
#
# This program is NOT free software or open-source; you can use it as an
# example of how to implement your own site-specific extensions to the
# Dreamwidth Studios open-source code, but you cannot use it on your site
# or redistribute it, with or without modifications.
#
package DW::Controller::Dreamwidth::Misc;
use strict;
use warnings;
use DW::Routing;
DW::Routing->register_static( '/about', 'misc/about.tt', app => 1 );
DW::Routing->register_static( '/site/bot', 'site/bot.tt', app => 1 );
DW::Routing->register_static( '/site/brand', 'site/brand.tt', app => 1 );
DW::Routing->register_static( '/site/policy', 'site/policy.tt', app => 1 );
DW::Routing->register_string( "/internal/local/404", \&error_404_handler, app => 1 );
sub error_404_handler {
my @quips = (
"I accidentally your page :(",
"Invisible Content!",
"We can't stop here... this is 404 country!",
"Not found page is not found.",
"That's no moon - it's a 404!",
"Fetch, or fetch not. There is no 404",
"Quoth the server: four oh four.",
"Tonight, we browse in 404!",
"Curse your sudden but inevitable 404!",
"404: the lights have gone out. Careful, you might get eaten by a grue.",
"Why did the 404 cross the road? Because it couldn't find a page to cross.",
"404: the page is a lie.",
"404 ALL the things?",
"Never gonna run around and 404 you...",
"THERE ... ARE ... 404 ... LIGHTS!",
"We'll always have 404.",
"The sky above the port was the color of television tuned to a 404'd page.",
"There was a PAGE here. it's gone now.",
"Oh dear.",
"It's dangerous to browse alone! Take this.",
"Thank you, Mario! But the page is in another castle.",
"Holy flying 404, Batman!",
"KHAAAAAAAAAAAANNNNNNNNNNN!",
"What is your quest? 404!",
"But WHY is the page gone?",
"Ia! Ia! 404 fthagn!",
"418 I'm A Teapot ... wait, no, 404 Not Found.",
"i'm in ur server, 404ing ur pages",
"These are not the 404s you're looking for.",
"Heisenberg may or may not have 404ed here.",
);
my $quip = $quips[ int( rand( scalar @quips ) ) ];
return DW::Template->render_template( 'error/404.tt', { quip => $quip } );
}
1;

View File

@ -0,0 +1,67 @@
#!/usr/bin/perl
#
# DW::Controller::Dreamwidth::Staff
#
# Controller for Dreamwidth staff page.
#
# Authors:
# Andrea Nall <anall@andreanall.com>
#
# Copyright (c) 2011 by Dreamwidth Studios, LLC.
#
# This program is NOT free software or open-source; you can use it as an
# example of how to implement your own site-specific extensions to the
# Dreamwidth Studios open-source code, but you cannot use it on your site
# or redistribute it, with or without modifications.
#
package DW::Controller::Dreamwidth::Staff;
use strict;
use DW::Routing;
use DW::Template;
use YAML::Any;
DW::Routing->register_string( '/site/staff', \&staff_page, app => 1 );
my $staff_groups = undef;
sub staff_page {
$staff_groups ||= generate_staff_groups();
return DW::Template->render_template( "site/staff.tt", { groups => $staff_groups } );
}
sub generate_staff_groups {
my $groups = YAML::Any::LoadFile( LJ::resolve_file("etc/staff.yaml") );
# This takes the list of usernames, determines if they are a journal or a community
# and makes a list of the ljuser_display under the proper type if the username exists
# otherwise treats it as a journal, and just lists the plain text username.
foreach my $group (@$groups) {
foreach my $person ( @{ $group->{people} } ) {
my $official = $person->{official} || [];
my $result = {};
foreach my $name (@$official) {
my $u = LJ::load_user($name);
my $text = $u ? $u->ljuser_display : $name;
if ( $u && $u->is_community ) {
push @{ $result->{community} }, $text;
}
else {
push @{ $result->{journal} }, $text;
}
}
if ( $result != {} ) {
$person->{official} = $result;
}
else {
delete $person->{official};
}
}
}
return $groups;
}
1;

View File

@ -0,0 +1,242 @@
#!/usr/bin/perl
#
# DW::Controller::Dreamwidth::Suggest
#
# Controller for the site suggestion form.
#
# Authors:
# Denise Paolucci <denise@dreamwidth.org> -- original version
# Jen Griffin <kareila@livejournal.com> -- controller conversion
#
# Copyright (c) 2009-2016 by Dreamwidth Studios, LLC.
#
# This program is NOT free software or open-source; you can use it as an
# example of how to implement your own site-specific extensions to the
# Dreamwidth Studios open-source code, but you cannot use it on your site
# or redistribute it, with or without modifications.
#
package DW::Controller::Dreamwidth::Suggest;
use strict;
use warnings;
use DW::Routing;
use DW::Template;
use DW::Controller;
DW::Routing->register_string( "/site/suggest", \&suggestion_handler, app => 1 );
sub suggestion_handler {
my ( $ok, $rv ) = controller();
return $rv unless $ok;
my $fatal_err = sub {
return DW::Template->render_template( 'error.tt', { message => $_[0] } );
};
# the community to post to:
my $destination = LJ::load_user($LJ::SUGGESTIONS_COMM);
$rv->{destination} = $destination; # used in template
# the user (which should also be an admin of the community)
# to post the maintainer-only address as:
my $suggestions_bot = LJ::load_user($LJ::SUGGESTIONS_USER);
# verify proper configuration
return $fatal_err->("This feature has not been configured for your site.")
unless $destination
&& $suggestions_bot
&& $destination->is_community
&& $suggestions_bot->can_manage_other($destination);
# make sure the remote user is OK to post
my $remote = $rv->{remote};
return $fatal_err->("Sorry, you must have confirmed your email to make a suggestion.")
unless $remote->is_validated;
return $fatal_err->("Sorry, suspended accounts can't make suggestions.")
if $remote->is_suspended;
my $r = DW::Request->get;
my $post_args = $r->post_args;
my $errors = DW::FormErrors->new;
if ( $r->did_post ) {
my @pieces = qw( title area summary description );
my %ehtml_args;
if ( $post_args->{post} ) {
# verify that all fields are filled out:
foreach my $field (@pieces) {
if ( $post_args->{$field} ) {
$ehtml_args{$field} = LJ::ehtml( $post_args->{$field} );
}
else {
$errors->add_string( $field, "You need to fill out the $field section." );
$ehtml_args{$field} = '';
}
}
# build out the post body including poll
my $suggestion = DW::Template->template_string( "site/suggest_entry.tt",
{ post => \%ehtml_args, include_poll => 1 } );
# We have all the pieces, so let's build the post for DW.
# For this, we're going to post as the user (so they get
# any comments, etc), and we're going to auto-tag it as
# "bugzilla: unmigrated", so the suggestions maintainer
# can find new/untagged posts when they want to.
my ( $response, $response2 ); # for errors returned from postevent
my $journalpost;
unless ( $errors->exist ) {
$journalpost = LJ::Protocol::do_request(
'postevent',
{
'ver' => $LJ::PROTOCOL_VER,
'username' => $remote->user,
'subject' => $post_args->{title},
'event' => $suggestion,
'usejournal' => $destination->user,
'security' => 'public',
'usejournal_okay' => 1,
'props' => {
taglist => 'bugzilla: unmigrated',
opt_noemail => !$post_args->{email},
opt_preformatted => 1,
},
'tz' => 'guess',
},
\$response,
{
'nopassword' => 1,
}
);
}
if ($journalpost) {
# having built the post for public display, we now do
# a second post containing the link to create the new bug
# for the suggestion. we can't use $suggestion that we built,
# because we need to use a different escaping function, but
# that's okay, because we want to format this a little
# differently anyway.
my ( $ghi_subject, $ghi_desc, $ghi_args );
$ghi_subject = LJ::eurl( $post_args->{title} );
$ghi_desc = "Summary%3A%0D%0A%0D%0A";
$ghi_desc .= LJ::eurl( $post_args->{summary} );
$ghi_desc .= "%0D%0A%0D%0ADescription%3A%0D%0A%0D%0A";
$ghi_desc .= LJ::eurl( $post_args->{description} );
$ghi_desc .= "%0D%0A%0D%0ASuggested by%3A%0D%0A%0D%0A";
$ghi_desc .= LJ::eurl( $remote->user );
$ghi_args = "body=$ghi_desc&title=$ghi_subject";
my $ghi_post = DW::Template->template_string( "site/suggest_ghi.tt",
{ ghi_args => $ghi_args, title => $post_args->{title} } );
# and we post that post to the community. (the suggestions_bot
# account should have unmoderated posting ability, so that the
# post is posted directly to the comm without having to go
# through moderation.) for this post, we tag it as
# "admin: unmigrated", so the suggestions maintainer can find
# any/all unposted GitHub links.
# get the user's timzeone and put it into +/-0800 format
# if we can't figure it out, then just guess based on suggestions bot
my ( $remote_tz_sign, $remote_tz_offset ) =
( $remote->timezone =~ m/([+|-])?(\d+)/ );
my $remote_tz =
defined $remote_tz_offset
? sprintf( "%s%02d00", $remote_tz_sign || "+", $remote_tz_offset )
: "guess";
LJ::Protocol::do_request(
'postevent',
{
'ver' => $LJ::PROTOCOL_VER,
'username' => $suggestions_bot->user,
'subject' => $post_args->{title},
'event' => $ghi_post,
'usejournal' => $destination->user,
'security' => 'private',
'usejournal_okay' => 1,
'props' => {
taglist => 'admin: unmigrated',
opt_preformatted => 1,
},
'tz' => $remote_tz,
},
\$response2,
{
'nopassword' => 1,
}
);
}
# once all of that's done, let's tell the user it worked.
# (or, if it didn't work, tell them why.)
if ( $response || $response2 ) {
$errors->add_string( '', LJ::Protocol::error_message( $response || $response2 ) );
}
unless ( $errors->exist ) {
return DW::Controller->render_success(
'site/suggest.tt',
{ commname => $destination->ljuser_display },
[
{
text_ml => ".success.link.another",
url => "$LJ::SITEROOT/site/suggest"
},
{
text_ml => ".success.link.view",
url => $destination->journal_base
},
]
);
}
}
elsif ( $post_args->{preview} ) {
# make preview: first preview the title and text as
# it would show up in the entry later; we don't need
# the poll in here, as the user can't influence it anyway
$ehtml_args{$_} = LJ::html_newlines( LJ::ehtml( $post_args->{$_} ) ) foreach @pieces;
my $suggestion = DW::Template->template_string( "site/suggest_entry.tt",
{ post => \%ehtml_args, include_poll => 0 } );
$rv->{preview} = 1;
$rv->{suggestion} = $suggestion;
if ($LJ::SPELLER) {
my $s = new LJ::SpellCheck {
spellcommand => $LJ::SPELLER,
class => "searchhighlight",
};
my $spellcheck_html = $s->check_html( \$suggestion );
# unescape the <br />s for readability. All other HTML remains untouched.
$spellcheck_html =~ s/&lt;br \/&gt;/<br \/>/g;
$rv->{spellcheck} = $spellcheck_html;
}
}
}
$rv->{errors} = $errors;
$rv->{formdata} = $post_args;
return DW::Template->render_template( 'site/suggest.tt', $rv );
}
1;

View File

@ -0,0 +1,139 @@
#!/usr/bin/perl
#
# DW::Hooks::AnniversaryPromotion
#
# This file explains Dreamwidth's plans for world domination. Be sure to keep it updated!
#
# Authors:
# Mark Smith <mark@dreamwidth.org>
#
# This program is NOT free software or open-source; you can use it as an
# example of how to implement your own site-specific extensions to the
# Dreamwidth Studios open-source code, but you cannot use it on your site
# or redistribute it, with or without modifications.
#
package DW::Hooks::AnniversaryPromotion;
use strict;
use LJ::Hooks;
use LJ::Time;
# use mysql date format: year-month-date hour::min:seconds
my $start_time = LJ::mysqldate_to_time( "2021-12-01 00:00:00", 1 );
my $end_time = LJ::mysqldate_to_time( "2021-12-31 23:59:59", 1 );
# warn sprintf( "Running shop promo from %s to %s\n", scalar gmtime( $start_time ), scalar gmtime( $end_time ) );
# returns if the promotion is valid right now
sub promo_valid {
return 0 if time < $start_time || time > $end_time;
return 1;
}
# returns how many points this cart is eligible for
# clever; depends on the way that 10 points == $1
# so if you buy $1 worth of stuff, you get 1 extra point (==1/10th of what you bought)
sub cart_bonus_points {
return int( $_[0]->total_cash );
}
# promotion HTML
LJ::Hooks::register_hook(
'shop_controller',
sub {
my ($rv) = @_;
# ensure we're a valid promotional period and not anon
return unless promo_valid();
return if $rv->{shop}->anonymous;
# put the note up top so people know
$rv->{cart_display} .=
"<div class='shop-item-highlight message-box'><strong>"
. LJ::Lang::ml('shop.anniversarypromoblurb')
. "</strong></div>\n";
}
);
# put information after the cart is rendered
LJ::Hooks::register_hook(
'shop_cart_render',
sub {
my ( $retref, %opts ) = @_;
return if $opts{admin} || ( $opts{receipt} && !$opts{confirm} );
# promo period and not anonymous
return unless promo_valid();
return unless $opts{cart}->userid;
# determine how many points they get ... basically, 1 point per $1 USD
# spent.. does not get points for spending points!
my $points = cart_bonus_points( $opts{cart} );
# text depends on how many points they get
$$retref .= '<p class="shop-item-highlight shop-account-status">';
if ( $points > 0 ) {
$$retref .= LJ::Lang::ml( 'shop.annivpromo.points', { points => $points } );
}
else {
$$retref .= LJ::Lang::ml('shop.annivpromo.nopoints');
}
$$retref .= '</p>';
}
);
# this is where the magic happens. when a cart enters or leaves the
# paid state, then we have to apply or unapply their bonus points.
LJ::Hooks::register_hook(
'shop_cart_state_change',
sub {
my ( $cart, $newstate ) = @_;
return unless promo_valid();
# if the cart is going INTO the paid state, then we apply the bonus points
# to the user who bought the items
if ( $newstate == $DW::Shop::STATE_PAID ) {
my $points = cart_bonus_points($cart);
my $u = LJ::load_userid( $cart->userid );
return unless $points && $u;
# now give them the points for their bonus
$u->give_shop_points(
amount => $points,
reason => sprintf( 'order %d bonus points', $cart->id )
);
return;
}
# however, if the OLD state was PROCESSED (means we're being refunded or
# something is happening) then we need to email admins. the logic to
# determine if we ever gave the user bonus points is too fickle, for now
# we can just handle point reversals manually.
if ( $cart->state == $DW::Shop::STATE_PROCESSED ) {
LJ::send_mail(
{
to => $LJ::ADMIN_EMAIL,
from => $LJ::BOGUS_EMAIL,
fromname => $LJ::SITENAME,
subject => 'Attention: Order Investigation Needed',
body => <<EOF,
Dear admins,
Order #@{[$cart->id]} has left the PROCESSED state during an active promotion
period and needs to be investigated. The user may need to have bonus points
unapplied from their account.
Best regards,
The $LJ::SITENAMESHORT Payment System
EOF
}
);
}
}
);
1;

View File

@ -0,0 +1,115 @@
#!/usr/bin/perl
#
# DW::Hooks::Community
#
# This file contains the hooks used to show DW-specific FAQs and comms
# on community/index.bml.
#
# Authors:
# Denise Paolucci <denise@dreamwidth.org>
#
# Copyright (c) 2011-2013 by Dreamwidth Studios, LLC.
#
# This program is NOT free software or open-source; you can use it as an
# example of how to implement your own site-specific extensions to the
# Dreamwidth Studios open-source code, but you cannot use it on your site
# or redistribute it, with or without modifications.
package DW::Hooks::Community;
use strict;
use LJ::Hooks;
# returns: dreamwidth.org specific FAQs for info on communities. calling
# context should already have the <ul> inside it, so just <li> on each.
LJ::Hooks::register_hook(
'community_faqs',
sub {
my $ret;
my @faqs = qw/ 223 17 201 /;
foreach my $faq (@faqs) {
my $faqobj = LJ::Faq->load($faq);
$ret .=
"<li><a href='$LJ::SITEROOT/support/faqbrowse?faqid="
. $faq . "'>"
. $faqobj->question_html
. "</a></li>"
if $faqobj;
}
return $ret;
}
);
# returns: dreamwidth.org specific FAQs for info on managing communities.
# calling context should already have the <ul> inside it, so just a <li>
# on each.
LJ::Hooks::register_hook(
'community_manage_links',
sub {
my $ret;
my @faqs = qw/ 19 100 208 101 102 109 205 110 111 /;
foreach my $faq (@faqs) {
my $faqobj = LJ::Faq->load($faq);
$ret .=
"<li><a href='$LJ::SITEROOT/support/faqbrowse?faqid="
. $faq . "'>"
. $faqobj->question_html
. "</a></li>"
if $faqobj;
}
return $ret;
}
);
# returns: dw_community_promo, formatted as user tag, with explanation
LJ::Hooks::register_hook(
'community_search_links',
sub {
my $ret;
my $promo = LJ::load_user("dw_community_promo");
return unless $promo;
$ret .= "<li>"
. $promo->ljuser_display . ": "
. LJ::Lang::ml('/community/index.tt.promo.explain') . "</li>";
return $ret;
}
);
# returns: a selection of dreamwidth.org official comms for people to
# subscribe to. (only public-facing official comms, or things that might
# be of use to the general public -- none of the project-specific comms
# that aren't available for general membership.)
LJ::Hooks::register_hook(
'official_comms',
sub {
my $ret;
my @official =
qw/ dw_news dw_maintenance dw_biz dw_suggestions dw_nifty dw_dev dw_styles dw_design /;
$ret .= "<h2>"
. LJ::Lang::ml( '/community/index.tt.official.title',
{ sitename => $LJ::SITENAMESHORT } )
. "</h2>"
. LJ::Lang::ml( '/community/index.tt.official.explain',
{ sitename => $LJ::SITENAMESHORT } )
. "<ul>";
foreach my $comm (@official) {
my $commu = LJ::load_user($comm);
$ret .= "<li>" . $commu->ljuser_display . "</li>" if $commu;
}
$ret .= "</ul>";
return $ret;
}
);
1;

View File

@ -0,0 +1,34 @@
#!/usr/bin/perl
#
# DW::Hooks::CreditCard
#
# This file contains hooks related to credit card transactions.
#
# Authors:
# Denise Paolucci <denise@dreamwidth.org>
#
# Copyright (c) 2013 by Dreamwidth Studios, LLC.
#
# This program is NOT free software or open-source; you can use it as an
# example of how to implement your own site-specific extensions to the
# Dreamwidth Studios open-source code, but you cannot use it on your site
# or redistribute it, with or without modifications.
package DW::Hooks::CreditCard;
use strict;
use LJ::Hooks;
# returns: message about having credit card charge permission +
# info on what the charge will look like on your statement.
LJ::Hooks::register_hook(
'cc_charge_from',
sub {
my $ret;
$ret = "<p>" . LJ::Lang::ml('shop.cc.charge.from') . "</p>";
return $ret;
}
);

View File

@ -0,0 +1,80 @@
# Hooks for the entry form
#
# Authors:
# Afuna <coder.dw@afunamatata.com>
#
# Copyright (c) 2009 by Dreamwidth Studios, LLC.
#
# This program is NOT free software or open-source; you can use it as an
# example of how to implement your own site-specific extensions to the
# Dreamwidth Studios open-source code, but you cannot use it on your site
# or redistribute it, with or without modifications.
#
package DW::Hooks::EntryForm;
use strict;
use warnings;
use LJ::Hooks;
LJ::Hooks::register_hook(
'entryforminfo',
sub {
my ( $journal, $remote ) = @_;
my $make_list = sub {
my $ret = '';
foreach my $link_info (@_) {
$ret .= "<li><a href='$link_info->[0]'>$link_info->[1]</a></li>"
if $link_info->[2];
}
return "<ul>$ret</ul>";
};
my $usejournal = $journal ? "?usejournal=$journal" : "";
my $ju = $journal ? LJ::load_user($journal) : undef;
my $can_make_poll = 0;
$can_make_poll = $remote->can_create_polls if $remote;
$can_make_poll ||= $ju->can_create_polls if $ju;
return $make_list->(
# URL, link text, whether to show or not
[ "/poll/create$usejournal", LJ::Lang::ml('entryform.pollcreator'), $can_make_poll ],
[ "/support/faqbrowse?faqid=103", LJ::Lang::ml('entryform.htmlfaq'), 1 ],
[ "/support/faqbrowse?faqid=155", LJ::Lang::ml('entryform.htmlfaq.detail'), 1 ],
[ "/support/faqbrowse?faqid=82", LJ::Lang::ml('entryform.htmlfaq.site'), 1 ],
);
}
);
LJ::Hooks::register_hook(
'faqlink',
sub {
# This links to the specified faq with the specified link
# text -- not the faq title! -- in a new
# tab (because called from an iframe)
my ( $faqname, $text ) = @_;
my $ret;
# Keep a hash of faqnames => ids because that'll be
# nonfree-specific
my %faqs = (
"alttext" => 207, # "What's the description of an image for?"
);
return unless exists $faqs{$faqname};
my $faq = $faqs{$faqname};
my $faqobj = LJ::Faq->load($faq)
or return;
$ret .= "<a target='blank' href='$LJ::SITEROOT/support/faqbrowse?faqid=$faq'>$text</a>";
return $ret;
}
);
1;

View File

@ -0,0 +1,29 @@
# Hooks to modify the index list for /legal (views/legal/index.tt)
#
# Authors:
# Jen Griffin <kareila@livejournal.com>
#
# Copyright (c) 2010 by Dreamwidth Studios, LLC.
#
# This program is NOT free software or open-source; you can use it as an
# example of how to implement your own site-specific extensions to the
# Dreamwidth Studios open-source code, but you cannot use it on your site
# or redistribute it, with or without modifications.
#
package DW::Hooks::LegalIndex;
use strict;
use warnings;
use LJ::Hooks;
LJ::Hooks::register_hook(
'modify_legal_index',
sub {
my $index = $_[0];
my @extra = qw ( principles diversity dmca );
unshift @$index, @extra;
}
);
1;

View File

@ -0,0 +1,46 @@
# Alert site administrators when someone makes a money order
#
# Authors:
# Afuna <coder.dw@afunamatata.com>
#
# Copyright (c) 2011 by Dreamwidth Studios, LLC.
#
# This program is NOT free software or open-source; you can use it as an
# example of how to implement your own site-specific extensions to the
# Dreamwidth Studios open-source code, but you cannot use it on your site
# or redistribute it, with or without modifications.
#
package DW::Hooks::MailboxAlert;
use strict;
use LJ::Hooks;
LJ::Hooks::register_hook(
'check_money_order_pending',
sub {
my ( $cart, $u ) = @_;
LJ::send_mail(
{
to => $LJ::ACCOUNTS_EMAIL,
from => $LJ::BOGUS_EMAIL,
fromname => $LJ::SITENAME,
subject => LJ::Lang::ml(
'shop.admin.checkmoneyorder.subject',
{ sitename => $LJ::SITENAME }
),
body => LJ::Lang::ml(
'shop.admin.checkmoneyorder.body',
{
user => LJ::isu($u) ? $u->display_name : $cart->email,
receipturl => "$LJ::SITEROOT/shop/receipt?ordernum=" . $cart->ordernum,
}
),
}
);
}
);
1;

View File

@ -0,0 +1,61 @@
# Hooks for the site scheme(s)
#
# Authors:
# Janine Smith <janine@netrophic.com>
# Andrea Nall <anall@andreanall.com>
#
# Copyright (c) 2009-2011 by Dreamwidth Studios, LLC.
#
# This program is NOT free software or open-source; you can use it as an
# example of how to implement your own site-specific extensions to the
# Dreamwidth Studios open-source code, but you cannot use it on your site
# or redistribute it, with or without modifications.
#
package DW::Hooks::SiteScheme;
use strict;
use LJ::Hooks;
use DW::SiteScheme;
LJ::Hooks::register_hook(
'modify_scheme_list',
sub {
my ( $schemes, $merge_func ) = @_;
$merge_func->(
'celerity-local' => { parent => 'celerity', title => "Celerity" },
'dreamwidth' => { parent => 'global', internal => 1 },
'gradation-horizontal-local' =>
{ parent => 'gradation-horizontal', title => "Gradation Horizontal" },
'gradation-vertical-local' =>
{ parent => 'gradation-vertical', title => "Gradation Vertical" },
'tropo-common' => { parent => 'common', internal => 1 },
'tropo-purple' => { parent => 'tropo-common', title => "Tropospherical Purple" },
'tropo-red' => { parent => 'tropo-common', title => "Tropospherical Red" },
);
@{$schemes} = (
{ scheme => "tropo-red" },
{ scheme => "tropo-purple" },
{
scheme => "celerity-local",
alt => 'siteskins.celerity.alt',
desc => 'siteskins.celerity.desc',
},
{
scheme => "gradation-horizontal-local",
alt => 'siteskins.gradation-horizontal.alt',
desc => 'siteskins.gradation-horizontal.desc',
},
{
scheme => "gradation-vertical-local",
alt => 'siteskins.gradation-vertical.alt',
desc => 'siteskins.gradation-vertical.desc',
},
{ scheme => "lynx" },
);
}
);
1;

View File

@ -0,0 +1,15 @@
package LJ::S2Theme::sundaymorning;
use base qw( LJ::S2Theme );
use strict;
sub layouts {
(
"1" => "one-column",
"1s" => "one-column-split",
"2l" => "two-columns-left",
"2r" => "two-columns-right"
)
}
sub layout_prop { "layout_type" }
1;

View File

@ -0,0 +1,87 @@
package LJ::S2Theme::transmogrified;
use base qw( LJ::S2Theme );
use strict;
sub layouts {
(
"1" => "one-column",
"1s" => "one-column-split",
"2l" => "two-columns-left",
"2r" => "two-columns-right"
)
}
sub layout_prop { "layout_type" }
sub page_props {
my $self = shift;
my @props = qw( color_page_title_background color_main_background );
return $self->_append_props( "page_props", @props );
}
sub header_props {
my $self = shift;
my @props =
qw( color_header_background color_header_text color_header_hover_background color_header_hover );
return $self->_append_props( "header_props", @props );
}
sub module_props {
my $self = shift;
my @props = qw( color_module_title_background color_module_title_border );
return $self->_append_props( "module_props", @props );
}
sub entry_props {
my $self = shift;
my @props = qw(
color_entry_title_border
color_entry_title_background
color_entry_border_alt
color_entry_background_alt
color_entry_link_alt
color_entry_link_hover_alt
color_entry_link_active_alt
color_entry_link_visited_alt
color_entry_text_alt
color_entry_subject_alt
color_entry_subject_alt_border
color_entry_subject_alt_background
);
return $self->_append_props( "entry_props", @props );
}
sub comment_props {
my $self = shift;
my @props = qw( color_comments_form_border );
return $self->_append_props( "comment_props", @props );
}
sub footer_props {
my $self = shift;
my @props = qw( color_footer_background color_footer_text color_footer_link );
return $self->_append_props( "footer_props", @props );
}
sub archive_props {
my $self = shift;
my @props = qw(
color_archivemonth_background
color_archivemonth_border
color_archivemonth_title_background
color_archivemonth_title_border
color_archivemonth_title
);
return $self->_append_props( "archive_props", @props );
}
sub navigation_props {
my $self = shift;
my @props = qw(
color_navigation_background
color_navigation_text
color_navigation_border
);
return $self->_append_props( "navigation_props", @props );
}
1;

View File

@ -0,0 +1,14 @@
package LJ::S2Theme;
use strict;
use Carp qw(croak);
sub local_default_themes {
return (
colorside => 'colorside/nadeshiko',
modish => 'modish/scarlet',
sundaymorning => 'sundaymorning/greensquiggle',
transmogrified => 'transmogrified/basic',
);
}
1;

19
ext/dw-nonfree/config.rb Normal file
View File

@ -0,0 +1,19 @@
# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "htdocs/stc/css"
sass_dir = "htdocs/scss"
images_dir = "htdocs/img"
javascripts_dir = "htdocs/js"
add_import_path "../../htdocs/scss"
env_from_cli = environment
if (environment.nil?)
environment = :development
else
environment = env_from_cli
end
output_style = (environment == :production) ? :compressed : :expanded
line_comments = (environment == :production) ? false : true

View File

@ -0,0 +1,183 @@
#!/usr/bin/perl
# -*-perl-*-
# THIS FILE IS INTENDED FOR EXAMPLE/DOCUMENTATION PURPOSES ONLY.
# An active site should have a customized version of this file
# located in ext/local/etc. This file exists primarily to document
# what options are being used in production on the main Dreamwidth
# site, for use in development. A more generic etc/config-local.pl
# is available in the dw-free repository.
# Dreamwidth configuration file. Copy this out of the current
# directory to ext/local/etc/config-local.pl and edit as necessary.
# This will separate your active config file from the canonical
# one under version control, and protect it from getting clobbered
# when you upgrade to the newest Dreamwidth code in the future.
# This, and config-private.pl should be the only files you need to
# change to get the Dreamwidth code to run on your site. Variables
# which are set by $DW::PRIVATE::... should be configured in
# config-private.pl instead.
# Use the checkconfig.pl utility to find any other config variables
# that might not be documented here. You should be able to set config
# values here and have the DW code run; if you have to modify the
# code itself, it's a bug and you should report it.
{
package LJ;
# keep this enabled only if this site is a development server
$IS_DEV_SERVER = 1;
# home directory
$HOME = $ENV{'LJHOME'};
# the base domain of your site.
$DOMAIN = $DW::PRIVATE::DOMAIN;
# human readable name of this site as well as shortened versions
# CHANGE THIS
$SITENAME = "Dreamwidth Studios";
$SITENAMESHORT = "Dreamwidth";
$SITENAMEABBREV = "DW";
$SITECOMPANY = "Dreamwidth Studios, LLC";
# supported languages (defaults to qw(en) if none given)
# First element is default language for user interface, untranslated text
@LANGS = qw( en_DW );
# MemCache information, if you have MemCache servers running
@MEMCACHE_SERVERS = ('127.0.0.1:11211');
#$MEMCACHE_COMPRESS_THRESHOLD = 1_000; # bytes
# optional SMTP server if it is to be used instead of sendmail
$SMTP_SERVER = "localhost";
$MAIL_TO_THESCHWARTZ = 1;
# setup recaptcha
%RECAPTCHA = (
public_key => $DW::PRIVATE::RECAPTCHA{public_key},
private_key => $DW::PRIVATE::RECAPTCHA{private_key},
);
# setup textcaptcha
%TEXTCAPTCHA = (
api_key => $DW::PRIVATE::TEXTCAPTCHA{api_key},
);
# PayPal configuration. If you want to use PayPal, uncomment this
# section and make sure to fill in the fields at the bottom of config-private.pl.
#%PAYPAL_CONFIG = (
# # express checkout URL, the token gets appended to this
# url => 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=',
# api_url => 'https://api-3t.sandbox.paypal.com/nvp',
# # credentials for the API
# user => $DW::PRIVATE::PAYPAL{user},
# password => $DW::PRIVATE::PAYPAL{password},
# signature => $DW::PRIVATE::PAYPAL{signature},
# # set this to someone who is responsible for getting emails about
# # various PayPal related events
# email => $DW::PRIVATE::PAYPAL{email},
# );
# YouTube configuration.
# To get access to YouTube APIs, you will need to create a Google API key.
# Uncomment this section and make sure to fill in the fields at the bottom of config-private.pl.
#%YOUTUBE_CONFIG = (
# # api URL, the token gets appended to this
# api_url => 'https://www.googleapis.com/youtube/v3/videos?id=',
#
# # credentials for the API
# apikey => $DW::PRIVATE::YOUTUBE{apikey},
#);
# if you define these, little help bubbles appear next to common
# widgets to the URL you define:
%HELPURL = (
paidaccountinfo => "https://www.dreamwidth.org/support/faqbrowse?faqid=4",
);
# Configuration for suggestions community & adminbot
$SUGGESTIONS_COMM = "dw_suggestions";
$SUGGESTIONS_USER = "suggestions_bot";
# 404 page
# Uncomment if you don't want the (dw-free) default, 404-error.bml
# (Note: you need to provide your own 404-error-local.bml)
$PAGE_404 = "404-error-local.bml";
# additional domain from which to serve the iframes for embedded content
# for security reasons, we strongly recommend that this not be on your $DOMAIN
#$EMBED_MODULE_DOMAIN = "embedded.dreamwidth.net";
# merchandise link
$MERCH_URL = "https://www.zazzle.com/dreamwidth*";
# shop/pricing configuration
%SHOP = (
# key => [ $USD, months, account type, cost in points ],
prem6 => [ 20, 6, 'premium', 200 ],
prem12 => [ 40, 12, 'premium', 400 ],
paid1 => [ 3, 1, 'paid', 30 ],
paid2 => [ 5, 2, 'paid', 50 ],
paid6 => [ 13, 6, 'paid', 130 ],
paid12 => [ 25, 12, 'paid', 250 ],
seed => [ 200, 99, 'seed', 2000 ],
points => [],
rename => [ 15, undef, undef, 150 ],
# vgifts => [], # if present, sell virtual gifts
);
# number of days to display virtual gifts on the profile - default to two weeks
# $VGIFT_EXPIRE_DAYS = 14;
# You can turn on/off community importing here.
$ALLOW_COMM_IMPORTS = 0;
# If this is defined and a number, if someone tries to import more than this many
# comments in a single import, the error specified will be raised and the job will fail.
$COMMENT_IMPORT_MAX = undef;
$COMMENT_IMPORT_ERROR = "Importing more than 10,000 comments is currently disabled.";
# privileges for various email aliases in /admin/sendmail
# make sure these map to existing support categories on your site
%SENDMAIL_ACCOUNTS = (
support => 'supportread:support',
abuse => 'supportread:abuse',
accounts => 'supportread:accounts',
antispam => 'siteadmin:spamreports',
);
# Set the URI for iOS to find the icon it uses for home-screen
# bookmarks on user subdomains (or anything else rendered through
# S2). This file is not part of the dw-free installation, and is
# therefore disabled by default.
$APPLE_TOUCH_ICON = "$LJ::RELATIVE_SITEROOT/apple-touch-icon.png";
# Similarly for the icon used by Facebook for previews on links
$FACEBOOK_PREVIEW_ICON = "$LJ::RELATIVE_SITEROOT/img/Swirly-d-square.png";
# Needed for concatenation of static resources (see bin/build-static.sh)
$STATDOCS = "$HOME/build/static";
# sphinx search daemon
#@SPHINX_SEARCHD = ( '127.0.0.1', 3312 );
# example betafeature config
# %BETA_FEATURES = (
# "updatepage" => {
# start_time => 0,
# end_time => "Inf",
# },
# "s2comments" => {
# start_time => 0,
# end_time => "Inf",
# sitewide => 1,
# },
# );
}
1;

View File

@ -0,0 +1,3 @@
personal_ws-1.1 en 0
Dreamwidth
DW

View File

@ -0,0 +1,131 @@
- name: Dreamwidth Studios, LLC's Owners
people:
- name: Denise Paolucci
img: https://www.dreamwidth.org/userpic/256/6
bio:
- |
(the Suit) began working on the
LiveJournal.com project in 2001. Since then, she's done everything from
customer service to product planning to documentation to user advocacy
to QA testing to falling over exhausted because she's trying to do too
much at once. She left LiveJournal in 2007 to pursue a career in
writing. She hopes that with Dreamwidth Studios, she'll be able to use
her experience to create a place where creative people of all types will
find a home for their expression where they feel safe, welcomed, and
supported.
- |
Denise lives in Baltimore, Maryland, with her long-suffering
wife, who fortunately enjoys the frequent "c'mere, look, isn't
this <em>cool</em>?" invocations, and three cats, who don't care about
the internet as long as they get fed on time.
official:
- denise
- dw_biz
- name: Mark Smith
img: https://www.dreamwidth.org/userpic/257/6
bio:
- |
(the Geek) began volunteering with LiveJournal.com in 2001 in technical
support and code development. He joined the staff in 2004, where he
contributed heavily to all areas of the site and worked on utilities
such as Perlbal and MogileFS that are now used by many other web sites.
After transitioning to Six Apart, Mark worked to design and build out
the systems infrastructure for the Vox.com product launch.
- |
Since those days, Mark has been a MySQL DBA, managed an operations team,
and maintained a cadre of open source projects of his own while working
for companies such as Google, Mozilla, and Bump.
- |
He currently resides near San Francisco, CA with his partner, Ari, and
their two small sons. In his free time, he enjoys motorcycles, tabletop
and LARP gaming, and amateur radio (license KC8BCW).
official:
- mark
- dw_dev
- name: Dreamwidth Studios, LLC's Employees
people:
- name: Alierak
img: https://www.dreamwidth.org/userpic/314317/7805
bio:
- |
is Dreamwidth's backup sysadmin on call, helping Mark wrangle servers
and keeping an eye out for problems. He has approximately two decades of
experience with Unix systems and open source, resulting in ninja-like reflexes
for troubleshooting and bug hunting. He became <s>disillusioned</s> familiar
with the LiveJournal codebase in 2006 when Brad announced a cross-site
scripting contest offering permanent accounts for reporting security bugs
(Alierak won three and maintains a healthy mistrust of our HTML cleaner).
- |
He is also a sysadmin at a major university, husband and father of two, and
enjoys building or fixing things, cooking, and playing with math. He can
often be found singing or playing various instruments in church.
official:
- alierak
- name: Jennifer Griffin
img: https://www.dreamwidth.org/userpic/210571/6
bio:
- |
does Terms of Service enforcement because Mark
asked her to, and submits tons of Bugzilla patches because it's fun. An
MIT graduate, she has been on the internet since before the invention of
this newfangled "World Wide Web" thing. She runs the MU* where Mark &amp;
Janine met, which lets her claim indirect partial responsibility for the
existence of Dreamwidth. You're welcome.
- |
Jen is passionate about computers, communities, crafts, all varieties
of music, speculative fiction, space exploration... basically the whole
damn universe. She grew up and currently lives in the reddest of the
red states, but also spent 12 years residing in the bluest of the blue
states, so she is used to navigating ideological extremes. After spending
several years working as top-tier IT support in a non-profit organization,
she changed gears and is now a full-time mom to two precious, precocious
children.
official:
- dw_tos
- name: Community Project Leaders
note: "People who are currently working on major projects for Dreamwidth!"
people:
- name: Azurelunatic
img: https://www.dreamwidth.org/userpic/529546/6
bio:
- |
came into the LiveJournal volunteer IRC channel during one of the early
data center "power events" to find out what was going on. Denise obtained
another minion shortly thereafter. Azz specializes in thoughtful analysis
of any social media system she immerses herself in, and enjoys finding the
root needs underlying any request for more bells and whistles, and thinking
up a way to fulfil that need that fits in with the site's gestalt and actually
could be implemented. She was in IRC not looking busy enough when Denise and
Mark needed a team leader for spam, and now enjoys squashing spammers.
- |
By day, Azz is a mild-mannered minion in the cloudy part of Silicon Valley
(and lives in the foggy part of the Bay Area). She dreamed of becoming a
Communications Officer like Lt. Uhura when she was a child; now she spends
most of her commute using a suspiciously similar headset. Her hobbies include
talking to Kat, crocheting, IRC, and having bizarre, one-sided conversations
with the characters in her current draft novel.
official:
- dw_antispam
- name: Deborah
img: https://www.dreamwidth.org/userpic/5456520/37793
bio:
- |
co-leads the accessibility team. She spends her time writing accessibility
improvements for the Dreamwidth code, as well as educating the other developers
and designers about accessibility. In her other life she works in library
technology, where she's gained a reputation as That Person Who Will Glare
at You If Your Library Software Isn't Accessible.
official:
- dw_accessibility
- name: Sarah
img: https://www.dreamwidth.org/userpic/529553/6
bio:
- |
serves as Dreamwidth's executive assistant, which involves
much filing of paperwork and weekly trips to the credit union. Yes, she
will get you coffee, but only if she's already getting some for herself.
And if you drink it full-octane. And if she can find a second clean mug.
- |
Sarah's superpowers include paying the bills on time, keeping the taxman
from battering down the door, and keeping the pantry she shares with
Denise well-stocked with Diet Coke with Lime.

View File

@ -0,0 +1,63 @@
<h1>Oops!</h1>
<p>If you've gotten this error, it means that something is currently (and, with luck, temporarily) broken. Please wait five minutes and try again.</p>
<p>If the problem persists after five minutes, please check our <a href="http://twitter.com/dreamwidth">offsite status page</a> to see if we're aware of the problem. If we haven't updated it, <a href="http://www.downforeveryoneorjustme.com/dreamwidth.org">check to see if it's just a problem for you</a>. If it isn't, don't worry -- we'll fix it as soon as we can!</p>
<!--
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-->

View File

@ -0,0 +1,2 @@
DefaultLanguage en_DW
DefaultScheme tropo-red

View File

@ -0,0 +1,13 @@
LookRoot $LJHOME/cgi-bin/bml/scheme
DefaultLanguage en
DefaultScheme blueshift
IncludePath inc/
AllowOldSyntax 0
ExtraConfig _config-local.bml, $LJHOME/cgi-bin/LJ/Global/BMLInit.pm
AllowCode 1
AllowTemplateCode 1
MildXSSProtection 1
SubConfig: guide/, clients/, files/
AllowCode 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -0,0 +1 @@
.staytuned.generic=Send all your feedback to <?ljuser dw_beta ljuser?>. We'll also put up updates about our upcoming beta features in that community. Thank you.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Some files were not shown because too many files have changed in this diff Show More